比特币的实现

概述

  • Unspent Transaction Output(UTXO)
  • 出块概率
  • 交易的确认

Unspent Transaction Output(UTXO)

UTXO 是 BTC 交易的基本单位,也就是说其不可分割,每一笔交易都会产生新的UTXO,一个 UTXO 可以包含的BTC可以是一聪的任意整数倍。

聪:BTC 的基本单位。

Full node需要在内存中维护UTXO以保证可以快速检测Double spending attack。

除了coinbase交易以外,任何一笔交易都会有一个输入和若干个输出,$输入的BTC=输出的BTC+手续费$。

张三和李四拥有的UTXO如下:

现在张三要给李四转 4 个 BTC,首先张三拥有的 UTXO 中没有正好包含 4 个 BTC 的 UTXO,但是张三可以选择将包含 5 个 BTC 的 UTXO,转账给李四 4 个 BTC,然后转账给自己 1 个 BTC,就完成了一笔交易。本地交易的输入为张三持有的包含 5 个 BTC 的 UTXO,输入给下图中绿色的 UTXO。

我们称这种模式为 Transactor-base ledger。

出块概率

挖矿的过程就是不断尝试各种 nonce 来求解 puzzle,每次尝试 nonce 都可以看作一个 Bernoulli trial:a random experiment with binary outcome(伯努利试验:一个二元结果的随机试验)。伯努利实验的经典案例是抛硬币,如果硬币不均匀,每次实验,正面的概率就是 p,反面的概率是 1-p。对于挖矿来说,这两个概率相差甚远,每次尝试一个nonce,成功的概率是微乎其微的,大概率不行的,如果我们做大量的伯努利实验,每个实验都是随机的,那么这些伯努利实验就构成了一个 Bernoulli process:a sequence of independent Bernoulli trial(伯努利过程:一系列独立伯努利试验)。Bernoulli process 的一个特性是无记忆性(memoryless),意思是说做大量实验,前面的实验结果对后面的结果没有影响,挖矿过程就是不断尝试nonce,这种情况下   Bernoulli process可以用 Poisson process 来近似,实验次数很多,每次成功的概率很小就可以用 Poisson process 来近似。我们关心的是出块时间,也就是系统里产生下一个区块的时间,这个在概率上可以推导出来,服从指数分布。

注意,上图的出块时间是整个系统的出块时间,并不是矿工的出块时间,整个系统的平均出块时间是10分钟,平均时间是比特币协议规定的,通过定期调整挖矿难度,使得平均出块时间维持在10分钟左右,具体到每一个矿工,出块时间取决于矿工的算力,算力大,概率就大,出块时间就短。指数分布也是无记忆的,概率密度曲线的特点有:从任何一个地方把它截断,剩下曲线的形状仍然和原来一样,仍然服从指数分布,这就是无记忆的性质,假如过去了10分钟,仍然没有人找到区块,那么接下来还要等多久呢?还是平均下来10分钟,这个和直觉不太一致。这个概率分析告诉我们将来还要挖多少时间和过去挖了多少时间是没有关系的,仍然是服从指数分布,平均还要10分钟,这个性质也叫 Progress free。

Progress free 或者 Memoryless 有什么作用?

设想一下,如果有某个 puzzle 不满足这个性质会出现什么情况,比如说过去做的工作越多,接下来尝试 nonce 的时候成功的概率越大,相当于抛硬币的时候每次结果不是随机的,过去抛了好多次,都是反面朝上,下次再抛硬币的时候,正面朝上的概率会增加。如果有某一个加密货币设计出这样的 puzzle,会有什么结果?算力强的矿工会有不成比例的优势,因为算力强的矿工过去的工作量更大。什么是不成比例的优势?比如系统中有两个矿工,一个的算力是另一个的10倍,理想状况下,算力强的矿工能挖到矿的概率应该是另一个矿工的10倍,这才算公平,因为算力强的矿工能尝试的nonce是另一个的10倍,这就是我们说的Progress free 或者 Memoryless 所保证的,如果不是这样的话,算力强的矿工获得记账权的概率就会超过10倍,因为它过去尝试了更多的不成功 nonce,那么下次成功的概率就会增大,这就是不成比例的优势。所以 Progress free 或者 Memoryless 保证了挖矿公平性。

交易的确认

当一笔交易刚刚被写到区块中的时候交易并不会完全被确认的,此时是 One confirmation,此时可能会出现分叉攻击,即在前一个区块后面发布一个不相同的区块来造成分叉,如果攻击者的链条称为最长合法链后则这笔交易就不在最长合法链中,交易会被回滚。


解决的方法是交易的确认需要 Six confirmation。此时攻击者发起的分叉攻击就几乎不可能追赶上六个区块了,除非这个攻击者拥有全网半数以上的算力,这种攻击也称「51%算力攻击」。

参考资料

本文作者:ADD-SP
本文链接https://www.addesp.com/archives/127
版权声明:本博客所有文章除特别声明外,均默认采用 CC-BY-NC-SA 4.0 许可协议。
暂无评论

发送评论 编辑评论


上一篇
下一篇