主页 > imtoken安卓官方版 > 比特币工作量证明机制

比特币工作量证明机制

imtoken安卓官方版 2023-01-17 03:08:06

本节讨论比特币的核心部分,即比特币的共识机制——工作量证明(POW)。你是否了解 PoW 是你掌握比特币原理的分水岭。我看过很多关于比特币的文章,在比特币原理的文章中,很大一部分对比特币工作量证明的描述是错误的或者不完整的,所以如果你想知道有人是否理解比特币原理,你应该首先查看他对证明的理解的工作。

在我们详细描述比特币的工作量证明之前,有必要先谈谈加密哈希函数。

哈希函数是一种数学函数,具有以下三个基本属性:

1.输入可以是任意大小的字符串

2.生成固定大小的输出

3.对于特定的输入字符串,可以在合理的时间内计算出哈希函数的输出

以上特性仅适用于一般哈希函数,加密哈希函数需要四个附加特性:

1.抗碰撞性:如果找不到两个值,x和y,x≠y,且H(x)=H(y),则称哈希函数H具有抗碰撞性.

这里需要注意的是,没有找到碰撞不代表没有碰撞。从前面的基本特征可以看出,哈希函数的输入通常是任意长度的,而输出确实是固定长度的。假设输出长度为 256 位,理论上如果给定 2 的 256 次方 + 1 个不同的输入,必然会发生冲突。

但目前这对人类来说是一个天文数字。也就是说,假设人类制造的所有计算机都在宇宙起源时开始计算,那么到目前为止,发现这次碰撞的概率仍然接近于无穷小。

2. 隐身:只有 y=H(x) 已知时,无法计算输入值 x(x 必须来自去中心化集合)。

保密性保证hash函数是单向函数,不能逆向计算。

3.解谜友好:对于 H(x)=y,如果 y 已知,没有任何解策略比随机尝试 x 的值更容易找到 x 的值,将此哈希函数称为 a神秘话题友好。

这个特性保证了哈希函数的计算除了反复尝试外没有捷径,也就是暴力计算,这是比特币挖矿的一个重要特性。

4.雪崩效应:当哈希函数的输入值变化很小时,也会导致输出结果发生剧烈变化。

雪崩效应保证了哈希函数的输出结果具有良好的随机化特性,使得仅从输出结果很难推测输入值。

比特币工作机制

比特币中广泛使用的哈希函数是SHA-256(Secure Hash Algorithm 256),输出长度为256位,这个哈希函数是由美国国家安全局(NSA)设计的(原理哈希函数属于密码学的范畴,不在我们讨论的范围内)。2009年比特币发布时,SHA-256是当时最先进的哈希加密算法。之后,美国国家安全局发布了SHA- 384. 更安全的加密算法,例如 SHA-512(输出中的位数越多,就越难发现冲突)。

SHA-256 广泛用于比特币。总结一下 SHA-256 函数在比特币中使用的地方:

•工作证明

•将比特币公钥转换为公钥哈希

•交易的输入和输出部分(交易id、交易脚本等)

•比特币区块头上一个区块哈希

•默克尔树

比特币工作证明

比特币的工作量证明是通过改变区块头中的Nonce值比特币工作机制,不断计算不同Nonce值的区块头的hash值,直到找到一个小于指定的hash值难度值,然后通过发布发布这个结果是完成工作量的证明。

让我们回顾一下比特币区块头的结构:

尺寸

字段

说明

4 个字节

版本

比特币工作机制

区块版本号,目前为2

32 字节

上一个区块哈希

前一个区块(父区块)的区块头Hash,哈希算法为double-SHA256

32 字节

默克尔根

区块中的交易默克尔树根

4 个字节

时间戳

块创建 UNIX 时间戳

4 个字节

难度目标

工作量证明算法难度

4 个字节

随机数

比特币工作机制

通过改变计数器来达到工作量证明要求的结果

从块头的结构中可以看到一个Nonce值是4个字节。 Nonce 值的变化会影响整个区块头的哈希值。挖矿节点尝试不同的Nonce值(一般从0开始,每添加1)次,寻找小于Difficulty Target指定难度值的hash值。

下面是一个简单的例子

假设现在有一个字符串“Satoshi Nakamoto is my dad.”,我们设定一个目标:通过在这句话的末尾附加一个数字来计算一个哈希值,这个哈希值的十六进制值表示它开始与 00。

中本聪是我爸爸。0 => 90c27bad9a86c1eb6357a9f651ab0e2fb308616e7ea0f9720d7a255491c181bc

中本聪是我爸爸。1 => edd3247a8c56979d7741f8e98d18d729c4336f4a0234b3fd6fae3c3a943f0b6a

中本聪是我爸爸。2 => 2b622e4cf522982bd2c7c087640e6024d856875bab97ff6329df42c19254f131

中本聪是我爸爸。3 => cafff550474d1af4757001a5e907f74ab63607fa8bf324838d8dec530be86f0a

中本聪是我爸爸。4 => d8468facea81c3c5964f0728f321bccbc1d76a00a23261ef158290f9ce694375

中本聪是我爸爸。5 => f166cd0d391d1130fa866c5e9f935392dd6563f29e8e860f6e7245c43cba6c9f

中本聪是我爸爸。6 => b2f255fe5d91abf496bafd12988283a745bd1131e223f37a7bcb8e2517636c15

中本聪是我爸爸。7 => b53d901baf3b621362b6a1de6e0f435182b2fda45b305446f0c29b45f00c6d9f

中本聪是我爸爸。8 => e8d41c9d69119890377983da4da97b307339a05ee3a601aeb82645422d4eab1e

中本聪是我爸爸。9 => 008015b7e59b53a34b60785b4722002a1d7a4134e4970957beaac7fe8969ac42

最后经过10次计算,我们发现数字9可以得到从00开始的hash值,完成了工作量证明的hash计算。

比特币工作机制

比特币挖矿的挑战和上面的例子类似,区块头信息是“中本聪是我爸爸”,后面加的数字9就是Nonce值。可以预见比特币工作机制,如果我们选择的目标值开头的0个数越多,就越难找到结果。

挖矿难度目标及难度调整

比特币挖矿难度的调整方法很简单。难度目标调整是不断降低256位难度值。例如,277315块的难度值用16进制表示为:

0x0000000000000003A30C0000000000000000000000000000000000000000000

这个数字的前 60 位在二进制表示中都是 0。如果你想增加难度,你只需要减少这个值。随着难度值的降低,初始0的数量增加,可以找到的哈希值范围越小,越难挖掘。

那么问题来了:谁来调整这个难度值?如何调整?

比特币保持平均每 10 分钟一个出块率恒定,随着算力快速增加,挖矿难度必须根据这些变化进行调整。

挖矿难度的调整在每个全节点独立完成。每 2016 个区块(约 2 周)所有节点都会检查并调整难度,每个节点会输出 2016 个区块的总产出。出块时间与 20160 分钟进行比较。如果大于20160分钟,难度会降低,如果小于20160分钟,难度会增加。

难度调整公式为:

新目标 = 旧目标 *(最后 2016 个区块的实际时间 / 20160 分钟)

为了防止难度变化太大,每个周期的调整范围不能超过4次。如果算力变化超过4倍,超出部分将在下一个周期进行调整。

注意:虽然目标调整是每 2016 个区块发生一次,但由于 Bitcoin Core 客户端的一个 bug,它实际上是基于之前 2015 个区块(不是 2016 年)的总时间,导致调整偏差向更高的方向增加难度0.05%。

当挖矿节点在第一时间成功找到使区块头的哈希值小于目标值的Nonce值时,会将Nonce写入区块头并立即广播给相邻节点,其他节点将验证它是否正确。然后将新块记录在区块链上并尝试完成下一个块的工作量证明。

例如区块277315的Nonce值为4215469401,区块头哈希值为:

0000000000000002a7bbd25a417c0374cc55261021e8a9ca74442b01284f0569

比特币工作机制

这个值小于难度目标值:

0000000000000003A30C00000000000000000000000000000000000000000000

一个值得进一步考虑的问题

1. 观察区块头的结构。你有没有想过,所有节点的区块头内容似乎都一样。在这种情况下,如果所有节点都尝试从 0 开始的 Nonce 值,那么它不会永远是所有高算力的节点都先计算出有效结果,而低算力的节点永远都不希望挖矿成功?

答案显然是否定的。让我们仔细看看块头的结构。确实大部分信息是相同的,但是每个节点的 Merkle Root 肯定是不同的。从上一节的内容我们可以知道,每个节点都会有自己的 Coinbase 交易,其中包含了节点矿工的地址。这个地址对于每个独立的挖矿节点都是不同的。根据散列函数的雪崩效应,可以看出每个独立节点的默克尔根一定有一个显着值。区别。

2.比特币的工作量证明计算有一个重要的特点,就是计算难,但容易验证。每完成一次工作量证明,都需要进行大量的哈希计算,而验证只需要进行一次哈希计算,这样每个节点就可以高效地就结果达成共识。

工作量证明经常出现在我们的日常生活中。比如我们的考试成绩、毕业证、技能证明,都是工作量的证明,其实就是努力的证明。这些东西可能很难得到,但很容易验证,大大提高了社会的信任效率。

3.在上一节中,我了解到,如果平均每十分钟产生一个区块,比特币理论上将在 2140 年左右不再产生新币。当时,我说这个时候有它可能会提前,因为挖矿难度的调整不是实时的,而是每2016个区块。试想一下,如果算力增加得更快,出块速度会加快,那么2016个块的产生时间往往不到20160分钟,最终产生2100万比特币的时间也会缩短。

4.了解了工作量证明之后,这个时候恐怕你会认为比特币挖矿节点为了争夺记账权而不断地完成哈希计算。这种计算对人类来说似乎毫无价值。这是一种资源浪费。这里我提供一些辩证的思路供大家参考:

(1)比特币挖矿的目的,表面上是为了获得比特币奖励,但实际作用是让比特币网络更加安全。在现实生活中,我们的目标是安全(网络安全,财产安全,生命安全……)付出了巨大的代价,为什么没有人认为这是一种浪费?

(2)比特币网络独立完成安全造币、交易等一系列任务。在现实生活中,这些任务通常由银行来完成,而银行的运营也付出了巨大的成本,为什么没有人认为银行是一种浪费?

(3)人们努力寻找和开采黄金,往往只是因为它有价值,这与比特币矿工的逐利思维相同。黄金开采也破坏了自然环境,但比特币开采通常使用可再生能源能源也将许多电力过剩的发电厂变成了利润,创造了新的就业机会。为什么没有人认为黄金开采更浪费资源?

到最后,我们很容易被眼前固化的事实蒙蔽双眼,总是无法理解新事物的本质,产生一种天生的抵抗力。对于人类来说,信任是有代价的,挖矿所消耗的资源就是这个代价。消耗的资源越多(矿工越多),信任越强(去中心化程度越高)。

当然,我也希望看到未来有技术可以利用挖矿所消耗的算力。已经有一些尝试,比如利用算力找素数,进行人工智能计算等等。或者有更好的共识算法可以减少资源的消耗。目前的POS、DPOS等算法都是这方面的尝试,但是否真的更好还有待时间验证。

总而言之,我认为我们不应该为此批评比特币挖矿,比特币挖矿是一种资源浪费,这根本不正确。

好的,恭喜你,你了解了比特币去中心化系统最重要的部分——POW共识机制,也了解了我对比特币挖矿的长期思考,希望对你有所帮助。以后我们会讨论更多的共识算法,加油!