跳到主要内容

UTXO

UTXO(Unspent transaction output)

比特币的区块链由一个个区块串联构成,而每个区块又包含一个或多个交易。

比特币中是没有账户这个概念的,所谓一个地址的余额,其实就是统计这个地址相关的所有交易,然后运算出来的。

如果我们观察任何一个交易,它总是由若干个输入(Input)和若干个输出(Output)构成,一个 Input 指向的是前面区块的某个 Output,只有 Coinbase 交易(矿工奖励的铸币交易)没有输入,只有凭空输出。所以,任何交易,总是可以由 Input 溯源到 Coinbase 交易。

还没有被下一个交易花费的 Output 被称为 UTXO:Unspent TX Output,即未花费交易输出。给定任何一个区块,计算当前所有的 UXTO 金额之和,等同于自创世区块到给定区块的挖矿奖励之和。

因此,比特币的交易模型和我们平时使用的银行账号有所不同,它并没有账户这个说法,只有 UTXO。想要确定某个人拥有的比特币,并无法通过某个账户查到,必须知道此人控制的所有 UTXO 金额之和。

小明给小刚转账 1 比特币。整个过程是这样的,小明要收集足够的输入,比如小明的地址对应的以往交易中,找到了一个面值为 0.9 的 UTXO,不够 1 比特币,好在交易中是允许有多个输入的,所以小明又找到了一个面值 0.2 的 UTXO,这样在这次转账的交易中,就会有两个输入。同时输出也会有两个,一个是指向小刚地址,面值是 1 比特币。另一个指向小明的地址,面值是 0.1 比特币,这个输出就是找零了。

梳理一下,整个流程是这样的:小明首先要凑够足够面额的 Input,这里他找到了两个 Input,而这两个 Input 本身都是以往交易的 Output。这两个 Output 在未消费之前,就是 UTXO,但是当前交易一旦生效,它们两个就会被消耗掉,而本交易中又会生成两个新的 UTXO,一个指向小明,一个指向小刚。相当于小明和小刚各种领到手一个硬币,未来可以在其他交易中去消费。而小明和小刚各自地址的余额,其实就是各自对应的所有 UTXO 的总和。

**UTXO 机制使得比特币的每一聪都是“非同质化”的,有望催生不同于以太坊的生态模式。**由于比特币没有账户,比特币的交易创建的输出其实并非一个简单的公钥地址,而是一个脚本。我们可以这样理解,在 Bob 给 Alice 支付 1.5 个 BTC 的这个交易中,Bob 创建的输出脚本中会包含 Alice 的公钥 Hash。整个脚本的意思是,谁能够提供一个签名让这个包含 Alice 的公钥的脚本运行,谁就能花费这笔交易的 1.5 个 BTC。显然,创建签名只能使用 Alice 的私钥,其他私钥创建的签名将无法通过这个脚本的验证,从而确保其他人无法假冒 Alice 来花费这笔输出。也就是说,UTXO 中的 BTC 并不是以余额的方式记录在某人的账户里——每一笔交易发起者通过脚本为这些 BTC 创建了一个锁,而所有者才有钥匙——当然某笔转账的比特币的输入(转账发起者)和输出(转账接收者)可能是由多个历史 UTXO 组合而成,类似不同面值纸币的拼凑。这样做的好处之一是,所有的转账交易都是站在 BTC 流转的角度,不同的 UTXO 之间可以进行并行交易,因为 UTXO 之间是严格区别的。也可以这样理解:UTXO 机制将 BTC 的所有部分(最小单位是“聪”,sats)的流转历程完整记录下来,可以想象每一聪就是一个硬币,在每次流转都获得一个签章来记录轮流历程。

异常

Dust Error

灰尘是指少量的小数代币,通常低于网络/交易费用。当用户来回发送比特币时,比特币协议有时会产生少量的硬币输出。从比特币分叉出来的其他 UTXO(未使用交易输出)区块链也会产生同样的微小输出,例如莱特币(LTC)、狗狗币(DOGE)、比特币现金(BCH)。

灰尘有 3 个负面影响:

  • 用户花费需要较大网络费用来确认交易的资金是无利可图的

  • 它通过不经济的交易使网络超载而污染生态系统(在数据存储和时间方面,小额交易需要与大额交易类似的数据空间存储)

  • 当您将不同钱包中的灰尘合并到一个钱包中时,它会降低您的隐私级别,这会暴露您的钱包身份,其他人可以猜测这些钱包都属于一个人

我怎样才能解决这个灰尘 UTXO 错误?

  • 请勿发送费用较高的小额交易。由于网络将尝试从小交易创建 UTXO,因此交易将会失败。

  • 尝试先向钱包添加更多资金,然后再将其全部发送出去。拥有更大的交易将确保网络立即接受交易。

  • 在发送确认屏幕中选择较低的费用等级

  • 确保在钱包上留下大量剩余余额,以便当您尝试花费剩余余额时网络不会将其视为灰尘交易

BAD-TXNS-MISSINGORSPENT Error