Avive World 算力挖矿系统开发技术
比特币挖矿的工作量证明原理就是,不断尝试计算区块的哈希,直到计算出一个特定的哈希值,它比难度值要小。Avive World 算力挖矿系统开发询 13z 李 4277 森 z558,Avive World 算力挖矿平台开发案例。
比特币使用的 SHA-256 算法可以看作对随机输入产生随机输出,例如,我们对字符串 Hello 再加上一个数字计算两次 SHA-256,根据数字的不同,得到的哈希是完全无规律的 256 位随机数:
hash256("Hello?")=????????????????????????????????????????????????????????????????
大约计算 16 次,我们可以在得到的哈希中找到首位是 0 的哈希值,因为首位是 0 出现的概率是 1/16:
hash256("Hello1")=ffb7a43d629d363026b3309586233ab7ffc1054c4f56f43a92f0054870e7ddc9
hash256("Hello2")=e085bf19353eb3bd1021661a17cee97181b0b369d8e16c10ffb7b01287a77173
hash256("Hello3")=c5061965d37b8ed989529bf42eaf8a90c28fa00c3853c7eec586aa8b3922d404
hash256("Hello4")=42c3104987afc18677179a4a1a984dbfc77e183b414bc6efb00c43b41b213537
hash256("Hello5")=652dcd7b75d499bcdc61d0c4eda96012e3830557de01426da5b01e214b95cd7a
hash256("Hello6")=4cc0fbe28abb820085f390d66880ece06297d74d13a6ddbbab3b664582a7a582
hash256("Hello7")=c3eef05b531b56e79ca38e5f46e6c04f21b0078212a1d8c3500aa38366d9786d
hash256("Hello8")=cf17d3f38036206cfce464cdcb44d9ccea3f005b7059cff1322c0dd8bf398830
hash256("Hello9")=1f22981824c821d4e83246e71f207d0e49ad57755889874d43def42af693a077
hash256("Hello10")=8a1e475d67cfbcea4bcf72d1eee65f15680515f65294c68b203725a9113fa6bf
hash256("Hello11")=769987b3833f082e31476db0f645f60635fa774d2b92bf0bab00e0a539a2dede
hash256("Hello12")=c2acd1bb160b1d1e66d769a403e596b174ffab9a39aa7c44d1e670feaa67ab2d
hash256("Hello13")=dab8b9746f1c0bcf5750e0d878fc17940db446638a477070cf8dca8c3643618a
hash256("Hello14")=51a575773fccbb5278929c08e788c1ce87e5f44ab356b8760776fd816357f6ff
hash256("Hello15")=0442e1c38b810f5d3c022fc2820b1d7999149460b83dc680abdebc9c7bd65cae
如果我们要找出前两位是 0 的哈希值,理论上需要计算 256 次,因为 00 出现的概率是 162=256,实际计算 44 次:
hash256("Hello44")=00e477f95283a544ffac7a8efc7decb887f5c073e0f3b43b3797b5dafabb49b5
如果我们要找出前 3 位是 0 的哈希值,理论上需要计算 163=4096 次,实际计算 6591 次:
hash256("Hello6591")=0008a883dacb7094d6da1a6cefc6e7cbc13635d024ac15152c4eadba7af8d11c
如果我们要找出前 4 位是 0 的哈希值,理论上需要计算 164=6 万 5 千多次,实际计算 6 万 7 千多次:
hash256("Hello67859")=00002e4af0b80d706ae749d22247d91d9b1c2e91547d888e5e7a91bcc0982b87
如果我们要找出前 5 位是 0 的哈希值,理论上需要计算 165=104 万次,实际计算 158 万次:
hash256("Hello1580969")=00000ca640d95329f965bde016b866e75a3e29e1971cf55ffd1344cdb457930e
如果我们要找出前 6 位是 0 的哈希值,理论上需要计算 166=1677 万次,实际计算 1558 万次:
hash256("Hello15583041")=0000009becc5cf8c9e6ba81b1968575a1d15a93112d3bd67f4546f6172ef7e76
对于给定难度的 SHA-256:假设我们用难度 1 表示必须算出首位 1 个 0,难度 2 表示必须算出首位两个 0,难度 N 表示必须算出首位 N 个 0,那么,每增加一个难度,计算量将增加 16 倍。
对于比特币挖矿来说,就是先给定一个难度值,然后不断变换 nonce,计算 Block Hash,直到找到一个比给定难度值低的 Block Hash,就算成功挖矿。
我们用简化的方法来说明难度,例如,必须计算出连续 17 个 0 开头的哈希值,矿工先确定 Prev Hash,Merkle Hash,Timestamp,bits,然后,不断变化 nonce 来计算哈希,直到找出连续 17 个 0 开头的哈希值。我们可以大致推算一下,17 个十六进制的 0 相当于计算了 1617 次,大约需要计算 2.9 万亿亿次。
17 个 0=1617=295147905179352825856=2.9 万亿亿次
实际的难度是根据 bits 由一个公式计算出来,比特币协议要求计算出的区块的哈希值比难度值要小,这个区块才算有效:
Difficulty=402937298
=0x18 0455d2
=0x0455d228(0x18-3)
=106299667504289830835845558415962632664710558339861315584
=0x00000000000000000455d2000000000000000000000000000000000000000000
注意,难度值的数值越小,说明哈希值前面的 0 越多,计算的难度越大。
比特币网络的难度是不断变化的,它的难度保证大约每 10 分钟产生一个区块,而难度值在每 2015 个区块调整一次:如果区块平均生成时间小于 10 分钟,说明全网算力增加,难度也会增加,如果区块平均生成时间大于 10 分钟,说明全网算力减少,难度也会减少。因此,难度随着全网算力的增减会动态调整。
比特币设计时本来打算每 2016 个区块调整一次难度,也就是两周一次,但是由于第一版代码的一个 bug,实际调整周期是 2015 个区块。
根据比特币每个区块的难度值和产出时间,就可以推算出整个比特币网络的全网算力。
比特币网络的全网算力一直在迅速增加。目前,全网算力已经超过了 100EH/每秒,也就是大约每秒钟计算 1 万亿亿次哈希:
全网算力
所以比特币的工作量证明被通俗地称之为挖矿。在同一时间,所有矿工都在努力计算下一个区块的哈希。而挖矿难度取决于全网总算力的百分比。举个例子,假设小明拥有全网总算力的百分之一,那么他挖到下一个区块的可能性就是 1%,或者说,每挖出 100 个区块,大约有 1 个就是小明挖的。
由于目前全网算力超过了 100EH/s,而单机 CPU 算力不过几 M,GPU 算力也不过 1G,所以,单机挖矿的成功率几乎等于 0。比特币挖矿已经从早期的 CPU、GPU 发展到专用的 ASIC 芯片构建的矿池挖矿。
全网算力百分比
当某个矿工成功找到特定哈希的新区块后,他会立刻向全网广播该区块。其他矿工在收到新区块后,会对新区块进行验证,如果有效,就把它添加到区块链的尾部。同时说明,在本轮工作量证明的竞争中,这个矿工胜出,而其他矿工都失败了。失败的矿工会抛弃自己当前正在计算还没有算完的区块,转而开始计算下一个区块,进行下一轮工作量证明的竞争。
为什么区块可以安全广播?因为 Merkle Hash 锁定了该区块的所有交易,而该区块的第一个 coinbase 交易输出地址是该矿工地址。每个矿工在挖矿时产生的区块数据都是不同的,所以无法窃取别人的工作量。
比特币总量被限制为约 2100 万个比特币,初始挖矿奖励为每个区块 50 个比特币,以后每 4 年减半。
共识算法
如果两个矿工在同一时间各自找到了有效区块,注意,这两个区块是不同的,因为 coinbase 交易不同,所以 Merkle Hash 不同,区块哈希也不同。但它们只要符合难度值,就都是有效的。这个时候,网络上的其他矿工应该接收哪个区块并添加到区块链的末尾呢?答案是,都有可能。
通常,矿工接收先收到的有效区块,由于 P2P 网络广播的顺序是不确定的,不同的矿工先收到的区块是有可能的不同的。这个时候,我们说区块发生了分叉:
分叉
在分叉的情况下,有的矿工在绿色的分叉上继续挖矿,有的矿工在蓝色的分叉上继续挖矿:
最长链共识
但是最终,总有一个分叉首先挖到后续区块,这个时候,由于比特币网络采用最长分叉的共识算法,绿色分叉胜出,蓝色分叉被废弃,整个网络上的所有矿工又会继续在最长的链上继续挖矿。
由于区块链虽然最终会保持数据一致,但是,一个交易可能被打包到一个后续被孤立的区块中。所以,要确认一个交易被永久记录到区块链中,需要对交易进行确认。如果后续的区块被追加到区块链上,实际上就会对原有的交易进行确认,因为链越长,修改的难度越大。一般来说,经过 6 个区块确认的交易几乎是不可能被修改的。
评论