比特币UTXO交易模型

1. 双花问题

因为比特币网络有个天然的问题:分叉问题,总是可能出现多个比特币矿工挖出合法区块,然后在链上产生分叉。在这个时候比特币有一条规则:多条分叉链出现时,最长链(积累工作量最多的链)是有效的。如果你挖出一条比现有的诚实链更长的攻击链,那大家就会承认你的攻击链是有效的,诚实链会被作废。

这个时候就会产生双花问题。要实现双花就必须掌握全网51%的算力,因此又叫做51%攻击。

2. 什么是51%攻击

所谓51%攻击,就是利用比特币使用算力作为竞争条件的特点,使用算力优势撤销自己已经发生的付款交易。比特币发动51%攻击具体思路,大致如下:

准备工作:

  1. 既然是51%攻击,就必须首先掌握足够的算力,无论是控制矿池,还是利用其它计算资源,总之必须使你的算力领先与现在网络总算力,领先的幅度越大,成功的可能性越高;

  2. 拿到足够的BTC作为筹码,无论是自己挖到的,还是从任何渠道买的,都可以;

模拟攻击:

  • 攻击者拥有私钥privKey0001,私钥拥有对应可花费比特币10000个

  • 当前区块的高度是999999

  • 攻击者与商户交易了10000个比特币,在商户看到1000000区块中包含了此次交易后,坐上飞机驾驶员位置,开走了商户一架飞机。

  • 攻击者因为拥有较高算力,从999999区块再次计算区块(此时,排除自己的10000个比特币买飞机的交易),迅速的计算出了1000000/1000001/1000002/1000003…区块,其它节点拉取最长链节点的区块,同步了攻击者的含有恶意攻击的区块信息。运用手中的算力,从自己对外付款交易之前的区块开始,忽略自己所有对外的付款交易,重新构造后面的区块,利用算力优势与全网赛跑,当最终创建的区块长度超过原主分支区块,成为新的主分支,至此,攻击完成。

  • 因为攻击者买飞机的交易没有被区块包含,因此,可以再次到商户那里买上一架飞机开走。

可行性评估:

现在比特币全网算力差不多90T,而且还会快速增长,现在看来只有现在的几大矿池联合,才具有发动51%攻击的实力,普通个人或机构实施此攻击的可能性越来越小。

过去几年比特币网络的算力悄无声息的增长到了无比之大,这大大增加了比特币成功的可能性。反之也可以解释为什么山寨币不靠谱,太容易被51%攻击啦。在依赖密码学的数字货币领域,先发优势是非常明显的。

谁需要担心51%攻击

交易支付者不要担心。51%攻击可以撤销交易,不可以在没有私钥的情况下,控制私钥对应的比特币地址,因此不能无(私钥)中生有交易。支付者放心吧,在别人51%攻击时,你也有可能来一次双花商家。

交易接收者需要注意被别人51%攻击,预防攻击,多等待几个区块的确认。

攻击悖论

攻击是为了利益,既然攻击者持有了这么高的算力,诚实的挖矿带来利益是不是更好?攻击必然打击投资者对比特币系统信心,对攻击者来说是一件好事吗?


3. SPV简易支付验证

SPV这个词的意思Simplified Payment Vertification,重点在于支付验证,而不是交易验证。只是确认下这笔支付是否存在。这里面有一个merkle tree的数据结构,比特币的区块头是一个80个字节的定长,这个区块头中包含有merkle tree的根节点。这个根节点的作用可以用来验证区块是否包含这笔交易。

区块头结构:

content size
版本号 4字节
父区块的哈希 32字节
Merkle根值 32字节
时间戳 4字节
难度目标值 4字节
Nonce 4字节

区块头一直有80个字节,当钱包生成交易时,并向邻近节点传播。节点对收到的交易进行验证,并丢弃不合法的交易。(对于节点来说,对交易进行验证是一种义务,不然千辛万苦挖出来的矿当全网广播时,其他节点进行验证时会发现这是一个错误信息。)
交易的验证包括以下几项:

  • 交易的size要小于区块size的上限
  • 交易的输入UTXO是存在的
  • 交易输入UTXO没有被其他其他交易引用(防止双花Double Spending)
  • 输入总金额 > 输出总金额
  • 解锁脚本验证

将合格的交易加入到本地的Transaction数据库,并将合法的交易转给临近节点。

矿工在挖矿前必须要组建区块,将coinbase交易打包进区块,将交易池中的高优先级的交易打包进区块(优先级 = 交易的额度 * UTXO的深度 / 交易的size),这样做的原因可能是为了防止粉尘攻击。

挖矿的过程就是不断变换区块头中的Nonce值使得区块头部的哈希值小于给定的目标难度值。挖矿成功后,将计算出来的随机数Nonce填入区块头部,向临近节点广播。

4. UTXO的模型技术

它不用传统的基于account的记账模式,传统的交易模型都是采用这个模型存储用户的数据,因为基于传统的关系数据库,有事务的支持可以很轻松的实现。而在区块链网络上,不可能采用这种中心化数据库的方式来解决的。它换了一个思路,就是记录交易的流转过程,就想以前看过那种从山上利用竹管接水,引到山下。传统的账户模式,本质上是只记录结果。这种方式不但复杂,且容易出错。比特币的思想,本身就是,数据不可篡改,不可篡改最重要的实现就是记录整个流转过程,就像时间一样,任何事情都是有序的,git的版本原理,任何的修改都会被记录下来。用编程的术语可以理解为:面向过程,重视过程而不只是结果。因为有了过程自然就有结果。

下面来看一组交易的数据:
Bicoin Transaction
比特币UTXO交易模型
比特币UTXO交易模型
交易4089e6ac***8081的第0个输出,将0.61692481 BTC发给1Hvn…;
交易4089e6ac***8081的第1个输出,将1.88497646 BTC发给18df…;
交易总输入Total Input 2.50807052 BTC
交易总输出Total Output 2.50190127 BTC
矿工Fees 0.00616925 BTC

在比特币的世界里面其实不存在钱包的概念,有的只是未花费的交易输出(UTXO),钱包只是为我们管理显示了我们的UTXO。

相关文章: