一、分布式共识理论
1. FLP不可能原理
在一个异步的系统中,网络延时没有上限,即使只有一个成员有问题,也不可能取得共识。
FLP 不可能原理告诉我们,不要浪费时间,去试图为异步分布式系统设计面向任意场景的共识算法。但是我们在实际工程当中可以付出一些代价来做到共识。
2. CAP定理
任何一个分布式系统无法同时满足一致性(Consistency)、可用性(Availability)和分区容忍性(Partition tolerance),往往需要弱化某一个特性的需求。例如Paxos算法可以达成一致性,但是存在某种情况会一直无法达成共识。
二、比特币的共识设计
比特币的共识设计没有拘泥于传统的分布式共识理论,引入了经济博弈机制,采用挖矿奖励来达成区块链的共识。
1. 区块设计
完整的区块包括区块头(Block header)和区块体(Block body),区块头包括版本信息、上一个区块头的哈希、Merkle根哈希、挖矿目标阈值、nonce值;区块体则是交易列表组成,所有交易组成Merkle tree,计算出根哈希,也就是区块头中的Merkle根哈希(详解见默克尔树(Merkle tree)章节)。
2. 交易信息设计(Tx)
双花攻击(double spending attack)
双花攻击是数字货币领域中的一个比较常见的问题,顾名思义,就是将数字货币付给两个人或多个人,以谋取个人不正当利益。
交易信息
在比特币中,采用独有的设计去除双花攻击、交易伪造等数字货币常见问题。一笔交易包含的信息如下图所示:
- 每一笔交易需要说明交易来源,因此当本次转账完成后,交易来源也就自动失效,不能再花费了,也就不存在双花攻击的问题;
- 另外还需要A的签名,别人无法获取你的私钥,也就无法伪造你的签名,也就不能将你的货币花费出去;
- B的地址指明转账的目标人,转账的货币就将属于B,只有B可以支配或转账他人。
3. 轻节点与全节点
在比特币的系统中,存在轻节点和全节点两种节点,轻节点只需要保存区块头,占用很少的存储空间,通常用户所用的比特币钱包就是轻节点;而全节点除了保存区块头还需要保存区块体,里面包含所有交易信息,也就是交易列表。
4. 计算力投票(挖矿)
计算力投票过程需要计算出区块头中每一个域的信息,包括Merkle Root Hash,这就需要存储所有交易数据,因此挖矿只能由所有全节点参与,轻节点则从全节点获取区块信息。
挖矿计算公式为:H(block header) ≤ target,全节点不断尝试区块头中的nonce值,直到哈希结果在target阈值范围内,找到符合要求的nonce值,也就获得了记账权。将挖出的区块广播给其他全节点,其他全节点会验证区块是否符合要求。
5. 最长合法链
共识协议规定所有接受的区块必须在最长合法链上,因为这样才能保证区块链的最终一致性,也就不会产生大量的分叉。
最长合法链还能够防止分叉攻击,分叉攻击就是在较旧的区块后面挖矿,原有链上后面的区块内的也就失效了。如果所有全节点维护最长合法链,那么某一些作恶全节点尝试在旧区块后面挖矿就将失败,因为作恶节点挖矿将大概率没有诚实节点速度快,也就永远不会成为最长合法链。一般情况下比特币转账操作需要等待6个区块的确认也是同样的道理。
6. 区块奖励
全节点在挖矿的时候,会在交易列表里加入铸币交易,如果幸运地挖到区块,并且所有节点达成共识存储该区块,里面的铸币交易也随之生效,这就是常说的区块奖励。
hash rate表示每秒钟能够尝试nonce的数目,代表着投票的权重,也就更可能获得奖励。
区块奖励每21万个区块减半,最一开始是50BTC,后来是25BTC,目前的区块奖励已减至12.5。所有比特币的产生均是通过区块奖励产生的,我们可以计算出比特币的总量是2100万个。
由于比特币总量是固定的,以及尝试nonce值的挖矿过程类似于19世纪的加利福利亚淘金热,我们也将比特币称为数字黄金。
来源:CSDN
作者:ice_fire_x
链接:https://blog.csdn.net/ice_fire_x/article/details/104146376