主页 > imtoken官网下载教程 > 从零到一学习共识算法第八讲:比特币工作量证明

从零到一学习共识算法第八讲:比特币工作量证明

imtoken官网下载教程 2023-03-14 07:47:29

比特币的共识机制_比特币共识算法_比特币的共识

比特币网络中的任何一个节点比特币共识算法,如果要生成一个新的区块并将其写入区块链,就必须解决比特币网络的工作量证明难题。 本题的三个关键要素是工作量证明函数、区块和难度值。 工作量证明函数是这道题的计算方式,区块决定了这道题的输入数据,难度值决定了这道题需要的计算量。

工作证明功能

SHA 是 Secure Hash Algorithm 的缩写,它是密码哈希函数家族。 这套函数由美国国家安全局(NSA)设计,美国国家标准与技术研究院(NIST)发布,主要适用于数字签名标准。 SHA256 是该函数族之一,它是一种哈希算法,输出值为 256 位。 到目前为止,还没有针对SHA256算法的有效攻击。

堵塞

比特币区块由区块头和区块中包含的交易列表组成。 区块头大小为80字节,其组成包括:

4字节:版本号 32字节:前一个区块的哈希值 32字节:交易列表的Merkle根哈希值 4字节:当前时间戳 4字节:当前难度值 4字节:随机数 Nonce值为80字节的区块header,这是Bitcoin Pow算法的输入字符串。 交易列表附加在区块头之后,第一笔交易是矿工获得奖励和手续费的特殊交易。

bitcoin-0.15.1源码中的区块头和区块定义

比特币的共识_比特币的共识机制_比特币共识算法

难度值

难度值(difficulty)是矿工挖矿时的一个重要参考指标。 它决定了矿工需要经过多少次哈希运算才能生成一个合法的区块。 大约每 10 分钟生成一个比特币块。 如果要在不同的网络算力条件下都保持这个速率产生新区块,就必须根据网络算力的变化来调整难度值。 简单地说,难度值设置为每 10 分钟出一个新区块的速率,与挖矿能力无关。

难度调整在每个完整节点内独立且自动发生。 每2016个区块,所有节点都会根据统一的公式自动调整难度。 这个公式是根据最近2016个区块花费的时间和预期时间(预期时间为20160分钟或两周,以每10分钟一个区块为准。根据实际时长与预期时长的比值, 做相应的调整(或做难或易),也就是说出块速度快于10分钟,难度就会增加,慢于10分钟,难度就会降低。

这个公式可以总结如下:

新难度 = 旧难度 *(过去 2016 个区块的持续时间 / 20160 分钟)

工作证明需要有一个目标值。 比特币工作量证明的目标值(Target)计算公式如下:

目标值=最大目标值/难度值 其中最大目标值为常数值:0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

目标值的大小与难度值成反比。 比特币工作量证明的实现是矿工计算的区块哈希值必须小于目标值。

比特币工作量证明的过程是不断改变区块头(即尝试不同的nouce值)作为输入进行SHA256哈希运算,找出特定格式的哈希值(即需要一定数量的前导)的过程0). 需要的前导 0 越多,难度就越大。

bitcoin-0.15.1源码中计算挖矿难度的代码如下:

比特币的共识_比特币的共识机制_比特币共识算法

比特币共识算法_比特币的共识_比特币的共识机制

工作流程证明

我们可以大致总结比特币矿工为解决这个工作量证明难题所采取的步骤如下:

1.

生成一笔Coinbase交易并与所有其他交易组成交易列表打包进区块比特币共识算法,通过Merkle Tree算法生成Merkle Root Hash

2.

将Merkle Root Hash等相关字段组装成一个区块头,将区块头的80字节数据(Block Header)作为工作量证明的输入

3.

不断改变区块头中的随机数,即nonce的值,对每一个改变的区块头进行两次SHA256运算(即SHA256(SHA256(Block_Header))),并将结果值与目标值进行比较当前网络相比之下,如果小于目标值,则问题成功解决,工作量证明完成。

Pow 完成的区块向全网广播,其他节点将验证其是否符合规则。 如果验证有效,其他节点将收到该块并将其附加到现有的区块链上。 然后进入下一轮挖矿。

bitcoin-0.15.1源码中Pow算法的实现:

比特币的共识_比特币的共识机制_比特币共识算法

比特币的共识机制_比特币的共识_比特币共识算法

比特币共识算法_比特币的共识机制_比特币的共识

比特币共识算法_比特币的共识_比特币的共识机制

比特币的共识机制_比特币的共识_比特币共识算法

比特币的共识_比特币的共识机制_比特币共识算法