03-BTC-协议

目录

前言

比特币的共识协议

如何验证交易的合法性,防止双花攻击(double spending attack)

区块内容

数字货币的发行权

分布式共识(distributed consensus)


前言

学习肖臻老师的《区块链技术与应用》公开课笔记,供学习参考。

比特币的共识协议

比特币作为一种数字货币,它和纸质货币的区别就是数字货币是可以被复制的,这种行为叫做双花攻击(double spending attack)。而比特币作为一种去中心化的数字货币需要解决两个问题:

如何验证交易的合法性,防止双花攻击

数字货币的发行权

如何验证交易的合法性,防止双花攻击(double spending attack)

假设用户A获得了铸币权(Createcoin),他发行了10个比特币,即自己获得了10个比特币。然后他将这10个比特币转给B和C,每个人分5个比特币。接下来B给C 2个货币,给D 3个货币。最后C将所得的7个货币全部给E,这些交易构成一个小型的区块链,如下图。

注: 在比特币中的每个交易都包含输入和输出两部分,输入部分要说明币的来源,输出部分要给出收款人公钥的哈希值。

在图中的区块链中有两种哈希指针,一种哈希指针是连接各个区块的,将它们串成一个链表;另一种哈希指针用来说明币的来源,证明币的来源的合法性,防范双花攻击。

而图中第二个方框中A向B的转账,就需要A的签名和B的地址也就是B的公钥(比特币系统里收款的地址是通过公钥推算出来),同时所有节点也需要知道A的公钥来验证交易的签名以及交易的来源是同一个人,所以区块链上的每一个节点都需要独立验证。这些验证都通过比特币脚本(BitCoin Script)来实现。

区块内容

在上图中的是被简化过的交易系统,实际上每个区块中都可以有很多的交易,这些交易就组成了Merkle tree,而每个区块的内容如下表

块头 version 比特币的哪个版本的协议
hash of previous block header 区块链当中指向前一个区块的指针
merkle root hash 整颗merkle tree 的根哈希值
target 挖矿的难度目标预值
nonce 随机数
块身 transaction list 交易列表

数字货币的发行权

在区块链中,每个账户都可以发布交易,如果每个账户自己在本地维护一个区块链,那么为了保证区块链的一致性,账本的内容要取得分布式共识(distributed consensus)

分布式共识(distributed consensus)

分布式系统中的两个著名的不可能结论

  • FLP

在一个异步的(asynchronous)系统里,(网络传输迟延没有上限就叫异步系统),即使只有一个成员是有问题的(faulty),也不可能取得共识。

  • CAP Theorem

CAP是指分布式系统的三个我们想要的性质:

Consistency【一致性】

Availability【可用性】

Partition tolerance【分区容忍性】

而该结论是说:任何一个分布式系统,比如分布式哈希表,这三个性质中,最多只能满足两个,假如想要前两个性质,那么就不会得到第三个性质。

分布式共识中的著名协议

  • Paxos

 该协议能够保证一致性,即第一个性质。如果该协议打成了共识,那么这个共识一定是一致的,即每个成员所认为的共识都是相同的。但是,某些情况下,该协议可能永远无法达成共识,这种可能性比较小但是客观存在的。

比特币中的共识协议(consensus in BitCoin)

比特币中要解决的一个问题就是在假设系统中大部分节点是好的的情况下,如何取得共识协议?针对这个问题我们提出了两个方案:

  • 按照账户数目投票

将所有交易写入一个候选区块,然后发给所有结点,大家验证这个区块中的交易是否合法的,然后投赞成和反对票,按一定票比通过后将候选区块写入区块链中。但是这种方法是基于投票权有严格要求的情况,而区块链的账户的创建是非常容易的,这里就出现了一个安全漏洞:

如果有一个人不停的创建了很多个账户,当这个人创建的账户超过了账户总数的一半的时候,这个人就会拥有控制区块链写入的权力,这种情况被称为女巫攻击(sybil attack)。

所以区块链使用的另一种方案:

  • 按照计算力来投票

 区块链中的每个节点都可以在本地组装候选区块,将其认为合法的区块装入,尝试各种nonce值,当nonce满足H(block header)≤target时,就说该节点获得了记账权。

但是区块链的的新区块遵循最长合法链(longest valid chain)原则,就是说生成一个新的区块在区块链的中间位置,就可能出现两个交易如下图,A转账给B,以及A转账给自己。这两个交易都是合法的,但是由于生成新的区块不在最长合法链上,所以不接收该区块,这种情况被称为分叉攻击(forking attack),区块链接收的区块应该是扩展最长合法链。

区块链也可能出现两个节点在差不多同一个时间获得记账权的情况,如果出现这种这种情况,根据比特币协议,每个节点是接受它最早收到的那个。不同节点根据在网络上的位置不同,有的节点先听到新生成的其中一个区块,那就接受这个区块;有些节点先听到另一个区块,那就接受另一个区块。就会沿着新生成的区块后面继续拓展区块,表示该区块得到了认可,获得了记账权。

等长的临时性的分岔会维持一段时间,直到一个分岔胜出。也就是哪一个链抢先一步生成了新的区块,哪一条就是最长合法链。另一个作废的就叫orphan block。这两个新区块有可能会各自拉拢,两个区块链看谁的算力强,有时候也是看谁的运气好,就会胜出。

竞争记账权的好处:首先获得记账权的节点本身有一定的权力,可以决定哪些交易写到下一个区块里。但这些不应该被设定为竞争记账权的动力,所以巧妙地建立了一个机制:区块奖励(block reward)。
比特币协议中规定获得记账权的节点在发布的区块里可以有一个特殊的交易:铸币交易。在这个交易里可以发布一定数量的比特币。

因此比特币争夺记账权 ,也就是争夺货币的发行权,这个过程我们称为挖矿(mining),比特币被称为数字黄金(digital gold),争夺记账权的节点被称为矿工(miner)。

到这里我们也就解决了比特币的两个问题。

猜你喜欢

转载自blog.csdn.net/m0_65453249/article/details/125762303
今日推荐