主页 > imtoken币不见了 > 《区块链入门笔记》3.1 共识算法——工作量证明

《区块链入门笔记》3.1 共识算法——工作量证明

imtoken币不见了 2023-09-16 05:09:01

为了在整个 P2P 网络中保持相同的数据并保证每个参与者的公平性,整个系统中的所有参与者必须有一个统一的协议(共识算法)。

这些协议规则可以分为两大核心:

共识算法的目的是保证比特币一直运行在最长的链上,从而保证整个记账系统的一致性和可靠性。

1. 工作量证明

工作量证明(POW)可以简单理解为确认你做了一定工作量的证明。

整个过程的监控工作效率极低,证明工作结果已经完成相应的工作量是一种非常高效的方式。

比特币算法软件_比特币挖矿采用的算法_比特币共识算法

比如在现实生活中比特币共识算法,毕业证、驾照等,都是通过检验结果(通过相关考试)来证明的。

1.1 起源

工作量证明系统,一种针对服务攻击和其他服务滥用的经济对策。 它需要发起者进行一定的计算,消耗一定的计算机时间。

Hashcash 是一种工作量证明机制,

Hashcash在反垃圾邮件中的应用:在邮件的邮件头中添加一个Hashcash戳(Hashcash Stamp)哈希值。 散列包含收件人地址、发送时间和盐。 这个哈希值的特殊之处在于至少前 20 位必须为 0 才能成为有效的 Hashcash 戳。 为了得到一个合法的散列值,发送方必须经过多次尝试(改变salt值)才能得到。 邮票生成后,我不希望每个给我发电子邮件的垃圾邮件发送者都能够重复使用它。 因此,Hashcash 邮票是有日期的。 这指定旧邮票是非法的。 此外,Hashcash 的接收方需要实现一个双花数据库来记录邮票的历史信息。

1.2 工作量证明的基本原则

比特币算法软件_比特币共识算法_比特币挖矿采用的算法

工作量证明是指客户端需要做一定难度的工作才能得到一个结果,验证者可以很容易地通过验证结果检查客户端是否做了相应的工作。

该方案的一个核心特征是不对称性:工作对请求者来说是适度的,对验证者来说很容易验证。

它与验证码不同:验证码的设计出发点是人类容易破解而计算机不易破解。

img

图片

示例:给定一个基本字符串“Hello, world!”。 工作量要求是:可以在这个字符串后面加上一个叫做nonce(随机数)的整数值,对加上nonce后的字符串进行SHA-256哈希运算。 如果得到的哈希结果(以十六进制表示,如果以0000开头,则验证通过。为了达到这个工作量证明的目标。计算机需要不断递增nonce值,并对得到的进行SHA-256哈希运算新字符串。根据此规则,需要 4251 次计算才能找到恰好前 4 位为 0 的哈希。为了增加复杂性:验证者可以要求请求者对多个字符串进行 SHA-256。

比特币挖矿采用的算法_比特币算法软件_比特币共识算法

比特币的工作量证明机制类似,但更复杂。

1.3 比特币的工作量证明

如果一个节点生成一个新块并将其写入区块链,它必须解决比特币网络给出的工作量证明难题。

本题的三个关键要素是工作量证明函数、区块和难度值。

工作证明功能是 SHA-256。 块是在工作量证明过程中生成的。 矿工不断构建区块数据,每次检查计算结果是否满足工作量,从而判断区块是否满足网络难度。 区块头是比特币工作量证明的输入数据。

难度值是矿工挖矿的重要参考指标,它决定了矿工需要经过多少次哈希运算才能产生一个合法的区块。

比特币挖矿采用的算法_比特币算法软件_比特币共识算法

比特币区块大约每 10 分钟生成一次。 为了维持这个新块生成的速度,难度值必须根据全网算力的变化进行调整。

每2016个区块,所有节点都会根据统一的公式自动调整难度值。

公式:新难度值=旧难度值*(过去2016个区块花费的时间/20160分钟)

这个公式是通过比较生成最新的2016个区块所花费的时间与预期时间(预期时间为20160分钟,即两周,即按每10分钟一个区块的速率计算的总时间)得出的,根据相应地调整实际持续时间与预期持续时间的比率。

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

目标值=最大目标值/难度值

比特币挖矿采用的算法_比特币算法软件_比特币共识算法

最大目标值是一个常数值:0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

比特币工作量证明的实现是矿工计算出的区块哈希值小于目标值。

比特币工作量证明的过程简单理解为,通过不断改变区块头(即尝试不同的nonce值)并将其作为输入,进行SHA-256哈希运算,找到一个特定格式的哈希值过程(即需要一定数量的前导 0)。 需要的前导 0 越多,就越难。

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

生成一个coinbase交易并与所有其他交易组成交易列表打包进区块,通过Merkle Tree算法生成Merkle Root Hash。 将Merkle Root Hash等相关字段组装成一个区块头,将区块头的80字节数据作为工作量证明的输入。 不断改变区块头中的随机数(即nonce的值)比特币共识算法,对每一个改变的区块头(即SHA256(SHA 256(Block_Header)))进行两次SHA-256运算,对结果值进行hash转和与当前网络目标值对应的十进制字符串进行比较。 如果小于目标值,则问题成功解决,工作量证明完成。

![img](文件:///storage/emulated/0/Note/images/1526699332810.png)