以太坊源碼分析:共識(3)Ethash

前言

Ethash實現(xiàn)了PoW嚎京,PoW的精妙在于通過一個隨機數(shù)確定啃擦,礦工確實做了大量的工作起意,并且是沒有辦法作弊的。接下來將介紹:

  1. Ethash的挖礦本質变屁。
  2. Ethash是如何挖礦的眼俊。
  3. 如何驗證Ethash的隨機數(shù)。

Ethash的挖礦本質

挖礦的本質是找到一個隨機數(shù)粟关,證明自己做了很多工作(計算)疮胖。在Ethash中,該隨機數(shù)稱為Nonce闷板,它需要滿足一個公式:

Rand(hash, nonce) ≤ MaxValue / Difficulty

其中澎灸,

  • hash:去除區(qū)塊頭中Nonce、MixDigest生成的哈希值遮晚,見HashNoNonce()性昭。
  • nonce:待尋找的符合條件的隨機數(shù)。
  • MaxValue:固定值2^256县遣,生成的哈希值的最大取值糜颠。
  • Difficulty:挖礦難度汹族。
  • Rand():使用hash和nonce生成一個哈希值,這其中包含了很多哈希運算其兴。

以上參數(shù)中顶瞒,在得到區(qū)塊頭的hash之后,只有nonce是未知的元旬。

公式的含義是榴徐,使用hash和nonce生成的哈希值必須落在合法的區(qū)間。利用下圖介紹一下匀归,Rand()函數(shù)結果取值范圍是[0, MaxValue]坑资,但只有計算出的哈希值在[0, MaxValue / Difficulty]內,才是符合條件的哈希值穆端,進而該Nonce才是符合條件的袱贮,否則只能再去尋找下一個Nonce。

隨機值的判斷

以太坊可以通過調整Difficulty來調節(jié)當前挖礦的難度徙赢,Difficulty越大字柠,挖礦的難度越大探越。當Difficulty越大時狡赐, MaxValue / Difficulty越小,合法的哈希值范圍越小钦幔,造成挖礦難度增加枕屉。

哈希值滿足條件的概率是 p = (MaxValue / Difficulty) / MaxValue = 1 / Difficulty,礦工需要進行1 / p = Difficulty次的判斷鲤氢,才有可能找到一個符合條件的Nonce搀擂,當前以太坊難度為3241847139727150。

如何挖礦

Ethash挖礦的主要思想是卷玉,開啟多個線程去尋找符合條件的Nonce哨颂,給每個線程分配一個隨機數(shù),作為本線程的Nonce的初始值相种,然后每個線程判斷當前的Nonce是否符合上面的公式威恼,如果不符合,則把Nonce加1寝并,再次進行判斷箫措,這樣不定的迭代下去,直到找到一個符合條件的Nonce衬潦,或者挖礦被叫停斤蔓。

接下來介紹挖礦的幾個主要函數(shù)的實現(xiàn),它們是:

  1. 挖礦的入口Seal函數(shù)镀岛。
  2. 挖礦函數(shù)mine函數(shù)弦牡。
  3. 挖礦需要的數(shù)據(jù)cache和dataset友驮。
  4. Rand()函數(shù)的實現(xiàn)hashimotoFull和hashimoto。

挖礦入口Seal()

Seal是引擎的挖礦入口函數(shù)喇伯,它是管理崗位喊儡,負責管理挖礦的線程。它發(fā)起多個線程執(zhí)行Ethash.mine進行并行挖礦稻据,當要更新或者停止的時候艾猜,重新啟動或停止這些線程。

Seal函數(shù):發(fā)布挖礦任務

挖礦函數(shù)mine()

mine函數(shù)負責挖礦捻悯。Seal在啟動每一個mine的時候匆赃,給它分配了一個seedmine會把它作為Nonce的初始值今缚,然后生成本高度使用的dataset算柳,然后把dataset, hash, nonce傳遞給hashimotoFull函數(shù),這個函數(shù)可以認為是原理介紹中的Rand隨機函數(shù)姓言,他會生成哈希值Result瞬项,當Result <= Target的時候,說明哈希值落在符合條件的區(qū)間了何荚,mine找到了符合條件的Nonce囱淋,使用Digest和nonce組成新的區(qū)塊后,發(fā)送給Seal餐塘,否則驗證下一個Nonce是否是符合條件的妥衣。

Miner函數(shù)

挖礦需要的數(shù)據(jù)cache和dataset

dataset用來生成Result,而cache用來生成dataset戒傻。至于如何使用dataset生成Resulthashimoto()中講述税手,本節(jié)介紹如何生成dataset。

dataset和cache中存放的都是偽隨機數(shù)需纳,每個epoch的區(qū)塊使用相同的cache和dataset芦倒,并且dataset需要暫用大量的內存。剛開始時cache是16MB不翩,dataset是1GB兵扬,但每個epoch它們就會增大一次,它們的大小分別定義在datasetSizescacheSizes慌盯,dataset每次增長8MB周霉,最大能達到16GB,所以挖礦的節(jié)點必須有足夠大的內存亚皂。

使用cache生成dataset俱箱。使用cache的部分數(shù)據(jù),進行哈希和異或運算灭必,就能生成一組dataset的item狞谱,比如下圖中的cache中黃色塊乃摹,能生成dataset中的黃色塊,最后把這些Item拼起來就生成了完整的Dataset跟衅,完成該功能的函數(shù)是generateDataset孵睬。

cache和Dataset

dataset.generate()是dataset的生成函數(shù),該函數(shù)只執(zhí)行一次伶跷,先使用generateCache()生成cache掰读,再將cache作為generateDataset()的入?yún)⑸蒬ataset,其中需要重點關注的是generateDatasetItem()叭莫,該函數(shù)是根據(jù)部分cache蹈集,生成一組dataset item,驗證PoW的nonce的時候雇初,也需要使用該函數(shù)拢肆。

Dataset的生成

Rand()的實現(xiàn)hashimotoFull()和hashimoto()

hashimotoFull功能是使用dataset、hash和nonce生成Digest和Result靖诗。它創(chuàng)建一個獲取dataset部分數(shù)據(jù)的lookup函數(shù)郭怪,該函數(shù)能夠返回連續(xù)的64字節(jié)dataset中的數(shù)據(jù),然后把lookup函數(shù)刊橘、hash和nonce傳遞給hashimoto米辐。

hashimotoFull

hashimoto的功能是根據(jù)hash和nonce琼富,以及l(fā)ookup函數(shù)生成DigestResult侠坎,lookup函數(shù)能夠返回64字節(jié)的數(shù)據(jù)就行杀餐。它把hash和nonce合成種子据途,然后根據(jù)種子生成混合的數(shù)據(jù)mix绞愚,然后進入一個循環(huán),使用mix和seed獲得dataset的行號颖医,使用lookup獲取指定行的數(shù)據(jù)位衩,然后把數(shù)據(jù)混合到mix中,混合的方式是使用哈希和異或運算熔萧,循環(huán)結束后再使用哈希和異或函數(shù)把mix壓縮為64字節(jié)糖驴,把mix轉為小端模式就得到了Digest,把seed和mix進行hash運算得到Result佛致。

hashimoto

如何驗證

PoW的驗證是證明出塊人確實進行了大量的哈希計算贮缕。Ethash驗證區(qū)塊頭中的NonceMixDigest是否合法,如果驗證通過俺榆,則認為出塊人確實進行了大量的哈希運算感昼。驗證方式是確定區(qū)塊頭中的Nonce是否符合公式,并且區(qū)塊頭中的MixDigest是否與使用此Nonce計算出的是否相同罐脊。

驗證與挖礦相比定嗓,簡直是毫不費力蜕琴,因為:

  1. 時間節(jié)省。驗證只進行1次hashimoto運算宵溅,而挖礦進行大約Difficulty次凌简。
  2. 空間節(jié)省。驗證只需要cache恃逻,不需要dataset雏搂,也就不需要計算龐大的dataset,因此不挖礦的驗證節(jié)點寇损,不需要很高的配置畔派。

接下來介紹驗證函數(shù)VerifySeal(),以及根據(jù)cache生成DigestResulthashimotoLight()润绵。

驗證函數(shù)VerifySeal

Ethash.VerifySeal實現(xiàn)PoW驗證功能线椰。首先先判斷區(qū)塊中的Difficulty是否匹配,然后生成(獲瘸九巍)當前區(qū)塊高度的cache憨愉,把cache和nonce傳遞給hashimotoLight,該函數(shù)能根據(jù)cache, hash, nonce生成Digest和Result卿捎,然后校驗Digest是否匹配以及Result是否符合條件配紫。

VerifySeal

hashimotoLight函數(shù)

hashimotoLight使用cache, hash, nonce生成DigestResult生成Digest和Result只需要部分的dataset數(shù)據(jù)午阵,而這些部分dataset數(shù)據(jù)時可以通過cache生成躺孝,因此也就不需要完整的dataset。它把generateDatasetItem函數(shù)封裝成了獲取部分dataset數(shù)據(jù)的lookup函數(shù)底桂,然后傳遞給hashimoto計算出Digest和Result植袍。

hashimotoLight

FAQ

  • Q:每30000個塊使用同一個dataset,那可以提前挖出一些合法的Nonce籽懦?
    A: 不行于个。提前挖去Nonce,意味著還不知道區(qū)塊頭的hash暮顺,因此無法生成合法的Nonce厅篓。
  • Q:能否根據(jù)符合條件的哈希值,反推出Nonce呢捶码?
    A:不行羽氮。因為哈希運算具有不可逆性,不能根據(jù)摘要反推出明文惫恼,同理根據(jù)哈希值也無法推出Nonce档押。
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子汇荐,更是在濱河造成了極大的恐慌洞就,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件掀淘,死亡現(xiàn)場離奇詭異旬蟋,居然都是意外死亡,警方通過查閱死者的電腦和手機革娄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進店門倾贰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人拦惋,你說我怎么就攤上這事匆浙。” “怎么了厕妖?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵首尼,是天一觀的道長。 經(jīng)常有香客問我言秸,道長软能,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任举畸,我火速辦了婚禮查排,結果婚禮上,老公的妹妹穿的比我還像新娘抄沮。我一直安慰自己跋核,他們只是感情好,可當我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布叛买。 她就那樣靜靜地躺著砂代,像睡著了一般。 火紅的嫁衣襯著肌膚如雪聪全。 梳的紋絲不亂的頭發(fā)上泊藕,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天辅辩,我揣著相機與錄音难礼,去河邊找鬼。 笑死玫锋,一個胖子當著我的面吹牛蛾茉,可吹牛的內容都是我干的。 我是一名探鬼主播撩鹿,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼谦炬,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起键思,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤础爬,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后吼鳞,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體看蚜,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年赔桌,在試婚紗的時候發(fā)現(xiàn)自己被綠了供炎。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡疾党,死狀恐怖音诫,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情雪位,我是刑警寧澤竭钝,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站雹洗,受9級特大地震影響蜓氨,放射性物質發(fā)生泄漏。R本人自食惡果不足惜队伟,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一穴吹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧嗜侮,春花似錦港令、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至击吱,卻和暖如春淋淀,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背覆醇。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工朵纷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人永脓。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓袍辞,卻偏偏與公主長得像,于是被迫代替她去往敵國和親常摧。 傳聞我的和親對象是個殘疾皇子搅吁,可洞房花燭夜當晚...
    茶點故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內容

  • 相信大家都清楚的知道以太坊是什么威创,但是并不知道內部使用的算法,今天就來介紹一下以太坊所以用的算法谎懦,Ethash E...
    d71841265e33閱讀 2,369評論 0 0
  • 挖礦(mine)是指礦工節(jié)點互相競爭生成新區(qū)塊以寫入整個區(qū)塊鏈獲得獎勵的過程.共識(consensus)是指區(qū)塊鏈...
    187J3X1閱讀 2,519評論 2 4
  • 剛剛老媽大發(fā)脾氣肚豺,教育了謊稱作業(yè)做完的妹妹,而數(shù)學作業(yè)實際上只是亂寫了答案界拦。此時已經(jīng)是周日晚上9點鐘详炬。 妹妹9歲,...
    洪智閱讀 374評論 0 1
  • Vue.js組件化開發(fā) 所謂組件化開發(fā)寞奸,就是將各個不同的view和業(yè)務邏輯封裝到不同的component中呛谜,com...
    劉昊2018閱讀 569評論 0 1
  • 文 | 螞蟻先生 當母親因高利貸而被催債人百般辱罵隐岛,甚至在自己面前被凌辱,22歲的于歡拿起了刀瓷翻,捅向催債人杜志浩一...
    Mr_Ant螞蟻先生閱讀 577評論 2 5