5. POW 算法

掷骰子游戏

5.1. 矿工节点挖矿

5.1.1. 监控网络新的区块

所有的节点时刻监听着传播到比特币网络的新区块。而这些新加入的区块对挖矿节点有着特殊的意 义。矿工间的竞争以新区块的传播而结束,如同宣布谁是最后的赢家。对于矿工们来说,收到一个新区块进行验证意味着别人已经赢了,而自己则输了这场竞争。

5.1.2. 节点同步区块后,去除交易池中的已成交交易,准备挖下一个块

接收并验证区块277,315后,节点会检查内存池中的全部交易,并移除已经在区块277,315中出现过的交易记录,确保任何留在内存池中的交易都是未确认的,等待被记 录到新区块中。

5.1.3. 收集交易,准备出块

收到新的交易后,验证交易,添加到自己的内存池(交易池),取出交易整合到一个候选区块中

5.1.4. 创币交易

区块中的第一笔交易是笔特殊交易,称为创币交易或者coinbase交易。这个交易是出块节点A构造并用来奖励矿工节点A所做的贡献的。 挖出区块获得的奖励金额是coinbase奖励(12.5个全新的比特币)和区块中全部交易矿工费的总和。

与常规交易不同,创币交易没有输入,不消耗UTXO。它只包含一个被称作coinbase的输入,仅仅用来创建新的比特币。创币交易有一个输出,支付到这个矿工的比特币地址。

创币交易需要100个区块确认高度,一般的需要6个区块确认高度

5.1.5. 构建区块头

最后一个字段是nonce,初始值为0。

区块头完成全部的字段填充后,挖矿就可以开始进行了。挖矿的目标是找到一个使区块头哈希值小于难度目标的 nonce。挖矿节点通常需要尝试数十亿甚至数万亿个不同的nonce取值,直到找到一个满足条件的nonce值。

5.1.6. 构建区块

比特币挖矿过程使用的是 SHA256哈希函数。

用最简单的术语来说,挖矿就是重复计算区块头的哈希值,不断修改该参数,直到与哈希值匹配的一个过程。哈希函数 的结果无法提前得知,也没有能得到一个特定哈希值的模式。哈希函数的这个特性意味着:得到哈希值的唯一方法是不断的尝试,每次随机修改输入,直到出现适当的哈希值。

维护链的方式: 最长链,最长链又有2种方式,依据出块速度,依据块的难度

DPOS 节点作恶,不按排程产生区块的超级节点将在下一轮被投票剔除,被没收缴纳的保证金。

  • 拒绝出块,使区块处于停滞状态,其它节点会补足

  • 伪造交易,修改链上状态,其它节点无法通过校验

Pow

5.2. POW 算法

比特币的共识算法不适合于私有链和联盟链。其原因首先是它是一个最终一致性共识算法,不是一个强一致性共识算法。第二个原因是其共识效率低。提供共识效率又会牺牲共识协议的安全性。

工作证明必须产生小于目标的哈希值。 更高的目标意味着找到低于目标的哈希是不太困难的。 较低的目标意味着在目标下方找到哈希更难。 目标和难度是成反比。