除了工作量证明,UTXO也是比特币最为鲜明的特征。它不像我们常用的帐户一样(虽然它在钱包的设计上和常用的帐户一样)是由一个个帐户构成,它是由UTXO来构成的帐本。UTXO(unspent transaction outputs,有结余交易的output)集合。
UTXO模型
上图中可以清楚地看到UTXO集合的特点,更多的可以参看比特币白皮书。一个交易集中有若干的输入和输出,对其遍历后得到余额。
交易output
type TXOutput struct {
Value int
ScriptPubKey string
}
事实上,output保存了“币”(上面的Value)。保存的意思是使用一串无法破解的方式(谜,puzzle)锁住这些币。
还有一个重要的事情是output是不能分割的,所以你不能只引用它的一部分。如果一个output在一个交易中被关联,那么它就会全部消费掉。而如果该output的值是大于交易所需的,那么会有一笔“change”产生并返回发送者(消费者)。这和现实生活中的交易是差不多的,比如花5美元的纸币去买值1美元的东西,那你会收到4美元的找零。
交易input
type TXInput struct {
Txid []byte
Vout int
ScriptSig string
}
input引用了前面的output。Txid存储了交易的id,而Vout则保存该交易的中一个output索引。ScriptSig就是负责提供在与output的ScriptPubKey中对比的数据,如果数据正确,那么这个被引用的output就可以被解锁,而它里面的值可以产生新的output。如果不正确,这个output就不能被这个input引用。这个机制就避免了有人会去消费别人的比特币。
总之,output就是“币”存的位置。每一个output都来自一个解锁了的script,每一个新的交易都必须有一个input和output。而input关联的前面的交易中的output,并且提供数据(ScriptSig字段)去解锁output和它里面的币而后用这些币去创建新的output。