目錄
區(qū)塊鏈中怎么懲罰虛假信息的礦工
工作量證明POW
什么是工作量證明?
現(xiàn)在出現(xiàn)了另一個問題:如果其他人偷看了小明的答案并且搶答了怎么辦??
為什么區(qū)塊可以安全廣播?
共識算法
小結(jié)
區(qū)塊鏈中怎么懲罰虛假信息的礦工
1. 共識機制懲罰:礦工通過提交多個區(qū)塊的作弊行為,扣除該礦工的所有抵押幣種,存儲算力清零且不可恢復(fù)。
2.時空證明出錯懲罰:如果節(jié)點提交的時空證明與對應(yīng)的周期不符合,將會處以出錯罰金。
3.未提交時空證明:在證明周期內(nèi)節(jié)點沒有提交時空證明時,那么將會被罰沒所有質(zhì)押物,算力清零。
4.違背合約懲罰:節(jié)點未能按照合約要求履行存儲服務(wù),將會被要求返還客戶的費用,并罰沒相應(yīng)的儲存質(zhì)押。
工作量證明POW
什么是工作量證明?
????????比特幣的工作量證明需要歸結(jié)為計算機計算,也就是數(shù)學(xué)問題。如何構(gòu)造一個數(shù)學(xué)問題來實現(xiàn)工作量證明?我們來看一個簡單的例子。
????????假設(shè)某個學(xué)校的一個班里,只有一個女生叫小紅,其他都是男生。每個男生都想約小紅看電影,但是,能實現(xiàn)愿望的只能有一個男生。
????????到底選哪個男生呢?本著公平原則,小紅需要考察每個男生的誠意,考察的方法是,出一道數(shù)學(xué)題,比如說解方程,誰第一個解出這個方程,誰就有資格陪小紅看電影:
????????因為解高次方程沒有固定的公式,需要進行大量的計算,才能算出正確的結(jié)果,這個計算過程就需要一定的工作量。假設(shè)小明率先計算出了結(jié)果x=2.5,小紅可以簡單地驗證這個結(jié)果是否正確:
????????可以看出,解方程很困難,但是,驗證結(jié)果卻比較簡單。所以,一個有效的工作量證明在于:計算過程非常復(fù)雜,需要消耗一定的時間,但是,驗證過程相對簡單,幾乎可以瞬間完成。
現(xiàn)在出現(xiàn)了另一個問題:如果其他人偷看了小明的答案并且搶答了怎么辦??
要解決這個問題也很容易,小紅可以按照男生的編號,給不同的男生發(fā)送不同的方程,方程的第一項的系數(shù)就是編號。這樣,每個人要解的方程都是不一樣的。小明解出的x=2.5對于小軍來說是無效的,因為小軍的編號是3,用小明的結(jié)果驗證小軍的方程是無法通過驗證的。
事實上如果某個方程被驗證通過了,小紅可以直接從方程的第一項系數(shù)得知是誰解出的方程。所以,竊取別人的工作量證明的結(jié)果是沒有用的。
通過工作量證明,可以有效地驗證每個人確實都必須花費一定時間做了計算。
在比特幣網(wǎng)絡(luò)中,礦工的挖礦也是一種工作量證明,但是,不能用解多項式方程來實現(xiàn),因為解多項式方程對人來說很難計算,對計算機來說非常容易,可以在1秒鐘以內(nèi)完成。
要讓計算機實現(xiàn)工作量證明,必須找到一種工作量算法,讓計算機無法在短時間內(nèi)算出來。這種算法就是哈希算法。
通過改變區(qū)塊頭部的一個nonce
字段的值,計算機可以計算出不同的區(qū)塊哈希值:
直到計算出某個特定的哈希值的時候,計算結(jié)束。這個哈希和其他的哈希相比,它的特點是前面有好幾個0:
hash256(block data, nonce=0) = 291656f37cdcf493c4bb7b926e46fee5c14f9b76aff28f9d00f5cca0e54f376f
hash256(block data, nonce=1) = f7b2c15c4de7f482edee9e8db7287a6c5def1c99354108ef33947f34d891ea8d
hash256(block data, nonce=2) = b6eebc5faa4c44d9f5232631f39ddf4211443d819208da110229b644d2a99e12
hash256(block data, nonce=3) = 00aeaaf01166a93a2217fe01021395b066dd3a81daffcd16626c308c644c5246
hash256(block data, nonce=4) = 26d33671119c9180594a91a2f1f0eb08bdd0b595e3724050acb68703dc99f9b5
hash256(block data, nonce=5) = 4e8a3dcab619a7ce5c68e8f4abdc49f98de1a71e58f0ce9a0d95e024cce7c81a
hash256(block data, nonce=6) = 185f634d50b17eba93b260a911ba6dbe9427b72f74f8248774930c0d8588c193
hash256(block data, nonce=7) = 09b19f3d32e3e5771bddc5f0e1ee3c1bac1ba4a85e7b2cc30833a120e41272ed
...
hash256(block data, nonce=124709132) = 00000000fba7277ef31c8ecd1f3fef071cf993485fe5eab08e4f7647f47be95c
比特幣挖礦的工作量證明原理就是,不斷嘗試計算區(qū)塊的哈希,直到計算出一個特定的哈希值,它比難度值要小。
比特幣使用的SHA-256算法可以看作對隨機輸入產(chǎn)生隨機輸出,例如,我們對字符串
Hello
再加上一個數(shù)字計算兩次SHA-256,根據(jù)數(shù)字的不同,得到的哈希是完全無規(guī)律的256位隨機數(shù):
hash256("Hello?") = ????????????????????????????????????????????????????????????????
大約計算16次,我們可以在得到的哈希中找到首位是0
的哈希值,因為首位是0出現(xiàn)的概率是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
出現(xiàn)的概率是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:假設(shè)我們用難度1表示必須算出首位1個
0
,難度2表示必須算出首位兩個0
,難度N表示必須算出首位N個0
,那么,每增加一個難度,計算量將增加16倍。
對于比特幣挖礦來說,就是先給定一個難度值,然后不斷變換nonce
,計算Block Hash,直到找到一個比給定難度值低的Block Hash,就算成功挖礦。
我們用簡化的方法來說明難度,例如,必須計算出連續(xù)17個0
開頭的哈希值,礦工先確定Prev Hash,Merkle Hash,Timestamp,bits,然后,不斷變化nonce
來計算哈希,直到找出連續(xù)17個0
開頭的哈希值。我們可以大致推算一下,17個十六進制的0
相當于計算了1617次,大約需要計算2.9萬億億次。
17個0 = 1617 = 295147905179352825856 = 2.9萬億億次
實際的難度是根據(jù)bits
由一個公式計算出來,比特幣協(xié)議要求計算出的區(qū)塊的哈希值比難度值要小,這個區(qū)塊才算有效:
Difficulty = 402937298
= 0x18 0455d2
= 0x0455d2 * 28 * (0x18 - 3)
= 106299667504289830835845558415962632664710558339861315584
= 0x00000000000000000455d2000000000000000000000000000000000000000000
注意,難度值越小,說明哈希值前面的0
越多,計算難度越大。
比特幣網(wǎng)絡(luò)的難度值是不斷變化的,它的難度值保證大約每10分鐘產(chǎn)生一個區(qū)塊,而難度值在每2015個區(qū)塊調(diào)整一次:如果區(qū)塊平均生成時間小于10分鐘,說明全網(wǎng)算力增加,難度值也會增加,如果區(qū)塊平均生成時間大于10分鐘,說明全網(wǎng)算力減少,難度值也會減少。因此,難度值隨著全網(wǎng)算力的增減會動態(tài)調(diào)整。
比特幣設(shè)計時本來打算每2016個區(qū)塊調(diào)整一次難度,也就是兩周一次,但是由于第一版代碼的一個bug,實際調(diào)整周期是2015個區(qū)塊。
所以比特幣的工作量證明被通俗地稱之為挖礦。在同一時間,所有礦工都在努力計算下一個區(qū)塊的哈希。而挖礦難度取決于全網(wǎng)總算力的百分比。舉個例子,假設(shè)小明擁有全網(wǎng)總算力的百分之一,那么他挖到下一個區(qū)塊的可能性就是1%,或者說,每挖出100個區(qū)塊,大約有1個就是小明挖的。
由于目前全網(wǎng)算力超過了100EH/s,而單機CPU算力不過幾M,GPU算力也不過1G,所以,單機挖礦的成功率幾乎等于0。比特幣挖礦已經(jīng)從早期的CPU、GPU發(fā)展到專用的ASIC芯片構(gòu)建的礦池挖礦。
當某個礦工成功找到特定哈希的新區(qū)塊后,他會立刻向全網(wǎng)廣播該區(qū)塊。其他礦工在收到新區(qū)塊后,會對新區(qū)塊進行驗證,如果有效,就把它添加到區(qū)塊鏈的尾部。同時說明,在本輪工作量證明的競爭中,這個礦工勝出,而其他礦工都失敗了。失敗的礦工會拋棄自己當前正在計算還沒有算完的區(qū)塊,轉(zhuǎn)而開始計算下一個區(qū)塊,進行下一輪工作量證明的競爭。
為什么區(qū)塊可以安全廣播?
因為Merkle Hash鎖定了該區(qū)塊的所有交易,而該區(qū)塊的第一個coinbase交易輸出地址是該礦工地址。每個礦工在挖礦時產(chǎn)生的區(qū)塊數(shù)據(jù)都是不同的,所以無法竊取別人的工作量。
比特幣總量被限制為約2100萬個比特幣,初始挖礦獎勵為每個區(qū)塊50個比特幣,以后每4年減半。
共識算法
如果兩個礦工在同一時間各自找到了有效區(qū)塊,注意,這兩個區(qū)塊是不同的,因為coinbase交易不同,所以Merkle Hash不同,區(qū)塊哈希也不同。但它們只要符合難度值,就都是有效的。這個時候,網(wǎng)絡(luò)上的其他礦工應(yīng)該接收哪個區(qū)塊并添加到區(qū)塊鏈的末尾呢?
答案是,都有可能。
通常,礦工接收先收到的有效區(qū)塊,由于P2P網(wǎng)絡(luò)廣播的順序是不確定的,不同的礦工先收到的區(qū)塊是有可能的不同的。這個時候,我們說區(qū)塊發(fā)生了分叉:
在分叉的情況下,
有的礦工在綠色的分叉上繼續(xù)挖礦,有的礦工在藍色的分叉上繼續(xù)挖礦:
????????但是最終,總有一個分叉首先挖到后續(xù)區(qū)塊,這個時候,由于比特幣網(wǎng)絡(luò)采用最長分叉的共識算法,綠色分叉勝出,藍色分叉被廢棄,整個網(wǎng)絡(luò)上的所有礦工又會繼續(xù)在最長的鏈上繼續(xù)挖礦。
????????由于區(qū)塊鏈雖然最終會保持數(shù)據(jù)一致,但是,一個交易可能被打包到一個后續(xù)被孤立的區(qū)塊中。所以,要確認一個交易被永久記錄到區(qū)塊鏈中,需要對交易進行確認。如果后續(xù)的區(qū)塊被追加到區(qū)塊鏈上,實際上就會對原有的交易進行確認,因為鏈越長,修改的難度越大。一般來說,經(jīng)過6個區(qū)塊確認的交易幾乎是不可能被修改的。
小結(jié)
比特幣挖礦是一種帶經(jīng)濟激勵的工作量證明機制;
工作量證明保證了修改區(qū)塊鏈需要極高的成本,從而使得區(qū)塊鏈的不可篡改特性得到保護;文章來源:http://www.zghlxwxcb.cn/news/detail-667644.html
比特幣的網(wǎng)絡(luò)安全實際上就是依靠強大的算力保障的。文章來源地址http://www.zghlxwxcb.cn/news/detail-667644.html
到了這里,關(guān)于區(qū)塊鏈中怎么懲罰虛假信息的礦工,工作量證明POW,共識算法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!