Avive World算力挖礦系統開發|中本聰模式挖礦案例

搭建猿punk2558發表於2023-05-12

比特幣挖礦的工作量證明原理就是,不斷嘗試計算區塊的雜湊,直到計算出一個特定的雜湊值,它比難度值要小。

比特幣使用的SHA-256演演算法可以看作對隨機輸入產生隨機輸出,例如,我們對字串Hello再加上一個數字計算兩次SHA-256,根據數字的不同,得到的雜湊是完全無規律的256位隨機數:

hash256("Hello?")=????

大約計算16次,可以得到的雜湊中找到首位是0的雜湊值,Avive World算力挖礦系統132開4277發2558,因為首位是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

=0x0455d2*28*(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個區塊確認的交易幾乎是不可能被修改的。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70020115/viewspace-2951696/,如需轉載,請註明出處,否則將追究法律責任。

相關文章