UTXO

UTXO模型 什么是UXTO? 在区块链里,账本里记录的是一笔又一笔的交易。每笔交易都有若干交易输入,也就是资金来源;也有若干交易输出,也就是资金去向。一般来说,每一笔交易都要花费一笔输入,产生一笔输出,而当其所产生的输出,并被其他交易所花费时,这笔输出就可以被称为 “未花费过的交易输出”,也就是UTXO。 比特币中交易过程的实现 在比特币的世界里,记录交易记录正是基于UTXO模型。要理解UTXO,最简单的方法就是把一枚比特币从诞生到交易的经历描述一下。 假设,张三通过挖矿得到了12.5枚比特币。过了几天,他把其中2.5枚比特币交给了李四。再过几天,他和李四各出资2.5比特币凑成5比特币给王五,整个交易过程再UTXO模型里的记录是这样的: 从图上可以看出,当张三付给李四2.5个比特币时这笔交易时,收款人有两个,分别是李四和张三他自己,张三收到了余额10枚比特币,李四收到了2.5枚比特币,此时,张三原有的挖矿所得的12.5的记录因为以及消费,已经不能算是UTXO的记录了,因此,张三此时的余额就是10枚比特币。 可以看出,从消费这一点来看,UTXO类似日常生活中的纸币消费,当你拿10块钱买了3块钱的肥宅快乐水时,你需要付给老板3块,同时老板会找零给你7块。此时你原来的10块钱就不存在了。 当李四给了王五2.5枚比特币之后,李四的已经没有比特币了,因此没有李四的交易输出了;同时,王五同时收到了两个人的比特币,收款数额直接计算总数,并合并成一条数额为5的记录。这里似乎是可以不合并分开成两条输出记录的,待确定 !!! 由上面的例子说明,其实并没有什么比特币,只有 UTXO。当我们说张三拥有10枚比特币的时候,我实际上是说,当前区块链账本中,有若干笔交易的UTXO 项收款人写的是张三的地址,而这些UTXO项的数额总和是 10。 注意点 Coinbase交易是指矿工挖矿所得比特币的交易,这种交易比较特殊,交易输入并不是来自前面某一个或者某几个交易的UTXO。 每一笔交易的交易输入必须等于交易输出 计算某个人的账户余额时,只计算 未花费的 交易输出 怎么确定交易输入是有效的? 当节点接收到一笔交易的时候,它需要去 UTXO 数据库里查,看看这笔交易所引用的 UTXO 是否存在,它的收款人(拥有者)是不是当前新交易的付款者。 怎么保证一笔交易所引用的UTXO没有被重复消费? 当某一笔比特币交易被创建—签名—广播到区块链网络之中后,每一个节点(比特币交易参与者)会对这笔交易进行验证,看交易的输出是否存在于UTXO。 如果A拥有1枚比特币被证实确实是“未花费过的交易输出”,他要是将这1枚比特币同事转账给B1、B2两个人,挖矿节点会选择性的记录一笔交易,或许是最先收到的,或许是手续费更高的。 情况1: 如果这两笔交易是先后被挖矿节点接收到的,那依据时间戳(时间戳是矿工打包区块时的时间),先被接收到的交易会被验证成功,而后被接收到的交易则会因交易输入已经不存在于UTXO而验证失败。 情况2: 如果两个挖矿节点分别 同时 记录了这两笔交易,并且这两笔交易被分别证明是合法的,此时这两个挖矿节点会将各自挖到的新区块广播到全网。这时链就会 分叉。当其中一笔交易(是交易被确认还是新区块被确认???)被6个节点确认后,它将获得最终的确认,成为最长链,记录在最长链上的交易最终会被认证是成功的,而记录在另一条链上的交易则不会被认证。 UTXO模型是怎么计算余额的? 我们知道,要计算A的余额,在UTXO模型里,其实就是计算有多少笔交易的收款人的地址写的A,且这条交易输出没有被花费,那么这个余额怎么才能快速计算出来呢? 比特币客户端的实现维护一个UTXO数据库,也称UTXO池,是区块链中所有未支付交易输出的集合。“UTXO池”的名字听上去与交易池相似,但它代表了不同的数据集。UTXO池不同于交易池和孤立交易池的地方在于,它在初始化时不为空,而是包含了数以百万计的未支付交易输出条目,有些条目的历史甚至可以追溯至2009年。UTXO池可能会被安置在本地内存,或者作为一个包含索引的数据库表安置在永久性存储设备中。

October 4, 2018 · 1 min · Theme PaperMod