什么是UTXO
我们日常生活中的账本一般会记录当前用户的账户余额等状态,但是bitcoin不同,它并不存在一个统一维护的当前状态。它采用了一种名为UTXO(Unspent Transaction Output)的账户模式。Bitcoin中一笔交易(Transaction)最基本的组成是:若干的输入、若干个输出。这里的输入来自于交易发起者之前所收到的来自其他交易人的输出(比如说A转账10元给B,那么B下次进行交易转账的时候,交易中包含的输入为10)。交易输出即对此次交易输入总和进行重新分配。
值得注意的是,由于需要支付矿工手续费,重新重新分配后的总和必定小于之前的交易输入总和,而其中的差值便是交易手续费。当一笔交易输出未被下一次的交易调用时(还没被花掉),这个输出就成了UTXO,就比如B接收的10元输入没出现在之后任何一个交易中。文字描述比较绕,可见下图(省略手续费): 
UTXO的特点就是每次被交易调用后,必须全部花光,花不光的部分以找零的方式重新构造一个新的UTXO(如图中输出给John的5块钱)。至于如何确认某个用户有多少余额,最直观的做法就是遍历所有当前的UTXO,其总和便是余额(具体细节以后再深入学习,留坑)。
交易中的脚本
真正的交易结构不像上面的图那么简单。在bitcoin中,系统需要保证Bob在引用John给他的UTXO时的合法性(即John能合法的引用此UTXO,而别人无法正常引用)。在bitcoin中,使用了一种满足图灵非完备性的脚本语言来保证UTXO使用的合法性。具体的分为两类脚本:一个锁定脚本和一个解锁脚本。
锁定脚本位于交易的输出部分(UTXO),这样就可以把交易输出看成如下结构[1]: 而解锁脚本位于交易的输出部分,解锁脚本用于解锁此次交易所需要的UTXO的锁定脚本,具体结构如下图[1]:  解锁脚本和锁定脚本相互协作,就保证了UTXO使用的合法性。其协作的过程可以用下图表示。如图所示,解锁脚本包含了UTXO引用者的签名和公钥,而锁定脚本包含了正确引用者的公钥哈希。将这两个脚本语言如此拼接,便完成了一个完整的验证脚本。若脚本的执行结果为True,则此次引用合法。 
参考文献
[1] https://www.huweihuang.com/blockchain-notes/blockchain/blockchain-transactions.html
|