成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

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

huashiou / 1985人閱讀

摘要:在中,該隨機(jī)數(shù)稱(chēng)為,它需要滿(mǎn)足一個(gè)公式其中,去除區(qū)塊頭中生成的哈希值,見(jiàn)。固定值,生成的哈希值的最大取值。哈希值滿(mǎn)足條件的概率是,礦工需要進(jìn)行次的判斷,才有可能找到一個(gè)符合條件的,當(dāng)前以太坊難度為。

前言

Ethash實(shí)現(xiàn)了PoW,PoW的精妙在于通過(guò)一個(gè)隨機(jī)數(shù)確定,礦工確實(shí)做了大量的工作,并且是沒(méi)有辦法作弊的。接下來(lái)將介紹:

Ethash的挖礦本質(zhì)。

Ethash是如何挖礦的。

如何驗(yàn)證Ethash的隨機(jī)數(shù)。

Ethash的挖礦本質(zhì)

挖礦的本質(zhì)是找到一個(gè)隨機(jī)數(shù),證明自己做了很多工作(計(jì)算)。在Ethash中,該隨機(jī)數(shù)稱(chēng)為Nonce,它需要滿(mǎn)足一個(gè)公式:

Rand(hash, nonce) ≤ MaxValue / Difficulty

其中,

hash:去除區(qū)塊頭中Nonce、MixDigest生成的哈希值,見(jiàn)HashNoNonce()。

nonce:待尋找的符合條件的隨機(jī)數(shù)。

MaxValue:固定值2^256,生成的哈希值的最大取值。

Difficulty:挖礦難度。

Rand():使用hash和nonce生成一個(gè)哈希值,這其中包含了很多哈希運(yùn)算。

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

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

以太坊可以通過(guò)調(diào)整Difficulty來(lái)調(diào)節(jié)當(dāng)前挖礦的難度,Difficulty越大,挖礦的難度越大。當(dāng)Difficulty越大時(shí), MaxValue / Difficulty越小,合法的哈希值范圍越小,造成挖礦難度增加。

哈希值滿(mǎn)足條件的概率是 p = (MaxValue / Difficulty) / MaxValue = 1 / Difficulty,礦工需要進(jìn)行1 / p = Difficulty次的判斷,才有可能找到一個(gè)符合條件的Nonce,當(dāng)前以太坊難度為3241847139727150。

如何挖礦

Ethash挖礦的主要思想是,開(kāi)啟多個(gè)線(xiàn)程去尋找符合條件的Nonce,給每個(gè)線(xiàn)程分配一個(gè)隨機(jī)數(shù),作為本線(xiàn)程的Nonce的初始值,然后每個(gè)線(xiàn)程判斷當(dāng)前的Nonce是否符合上面的公式,如果不符合,則把Nonce加1,再次進(jìn)行判斷,這樣不定的迭代下去,直到找到一個(gè)符合條件的Nonce,或者挖礦被叫停。

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

挖礦的入口Seal函數(shù)。

挖礦函數(shù)mine函數(shù)。

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

Rand()函數(shù)的實(shí)現(xiàn)hashimotoFull和hashimoto。

挖礦入口Seal()

Seal是引擎的挖礦入口函數(shù),它是管理崗位,負(fù)責(zé)管理挖礦的線(xiàn)程。它發(fā)起多個(gè)線(xiàn)程執(zhí)行Ethash.mine進(jìn)行并行挖礦,當(dāng)要更新或者停止的時(shí)候,重新啟動(dòng)或停止這些線(xiàn)程。

挖礦函數(shù)mine()

mine函數(shù)負(fù)責(zé)挖礦。Seal在啟動(dòng)每一個(gè)mine的時(shí)候,給它分配了一個(gè)seed,mine會(huì)把它作為Nonce的初始值,然后生成本高度使用的dataset,然后把dataset, hash, nonce傳遞給hashimotoFull函數(shù),這個(gè)函數(shù)可以認(rèn)為是原理介紹中的Rand隨機(jī)函數(shù),他會(huì)生成哈希值Result,當(dāng)Result <= Target的時(shí)候,說(shuō)明哈希值落在符合條件的區(qū)間了,mine找到了符合條件的Nonce,使用Digest和nonce組成新的區(qū)塊后,發(fā)送給Seal,否則驗(yàn)證下一個(gè)Nonce是否是符合條件的。

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

dataset用來(lái)生成Result,而cache用來(lái)生成dataset。至于如何使用dataset生成Resulthashimoto()中講述,本節(jié)介紹如何生成dataset。

dataset和cache中存放的都是偽隨機(jī)數(shù),每個(gè)epoch的區(qū)塊使用相同的cache和dataset,并且dataset需要暫用大量的內(nèi)存。剛開(kāi)始時(shí)cache是16MB,dataset是1GB,但每個(gè)epoch它們就會(huì)增大一次,它們的大小分別定義在datasetSizescacheSizes,dataset每次增長(zhǎng)8MB,最大能達(dá)到16GB,所以挖礦的節(jié)點(diǎn)必須有足夠大的內(nèi)存。

使用cache生成dataset。使用cache的部分?jǐn)?shù)據(jù),進(jìn)行哈希和異或運(yùn)算,就能生成一組dataset的item,比如下圖中的cache中黃色塊,能生成dataset中的黃色塊,最后把這些Item拼起來(lái)就生成了完整的Dataset,完成該功能的函數(shù)是generateDataset。

dataset.generate()是dataset的生成函數(shù),該函數(shù)只執(zhí)行一次,先使用generateCache()生成cache,再將cache作為generateDataset()的入?yún)⑸蒬ataset,其中需要重點(diǎn)關(guān)注的是generateDatasetItem(),該函數(shù)是根據(jù)部分cache,生成一組dataset item,驗(yàn)證PoW的nonce的時(shí)候,也需要使用該函數(shù)。

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

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

hashimoto的功能是根據(jù)hash和nonce,以及l(fā)ookup函數(shù)生成DigestResult,lookup函數(shù)能夠返回64字節(jié)的數(shù)據(jù)就行。它把hash和nonce合成種子,然后根據(jù)種子生成混合的數(shù)據(jù)mix,然后進(jìn)入一個(gè)循環(huán),使用mix和seed獲得dataset的行號(hào),使用lookup獲取指定行的數(shù)據(jù),然后把數(shù)據(jù)混合到mix中,混合的方式是使用哈希和異或運(yùn)算,循環(huán)結(jié)束后再使用哈希和異或函數(shù)把mix壓縮為64字節(jié),把mix轉(zhuǎn)為小端模式就得到了Digest,把seed和mix進(jìn)行hash運(yùn)算得到Result。

如何驗(yàn)證

PoW的驗(yàn)證是證明出塊人確實(shí)進(jìn)行了大量的哈希計(jì)算。Ethash驗(yàn)證區(qū)塊頭中的NonceMixDigest是否合法,如果驗(yàn)證通過(guò),則認(rèn)為出塊人確實(shí)進(jìn)行了大量的哈希運(yùn)算。驗(yàn)證方式是確定區(qū)塊頭中的Nonce是否符合公式,并且區(qū)塊頭中的MixDigest是否與使用此Nonce計(jì)算出的是否相同。

驗(yàn)證與挖礦相比,簡(jiǎn)直是毫不費(fèi)力,因?yàn)椋?/p>

時(shí)間節(jié)省。驗(yàn)證只進(jìn)行1次hashimoto運(yùn)算,而挖礦進(jìn)行大約Difficulty次。

空間節(jié)省。驗(yàn)證只需要cache,不需要dataset,也就不需要計(jì)算龐大的dataset,因此不挖礦的驗(yàn)證節(jié)點(diǎn),不需要很高的配置。

接下來(lái)介紹驗(yàn)證函數(shù)VerifySeal(),以及根據(jù)cache生成DigestResulthashimotoLight()。

驗(yàn)證函數(shù)VerifySeal

Ethash.VerifySeal實(shí)現(xiàn)PoW驗(yàn)證功能。首先先判斷區(qū)塊中的Difficulty是否匹配,然后生成(獲?。┊?dāng)前區(qū)塊高度的cache,把cache和nonce傳遞給hashimotoLight,該函數(shù)能根據(jù)cache, hash, nonce生成Digest和Result,然后校驗(yàn)Digest是否匹配以及Result是否符合條件。

hashimotoLight函數(shù)

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

FAQ

Q:每30000個(gè)塊使用同一個(gè)dataset,那可以提前挖出一些合法的Nonce?
A: 不行。提前挖去Nonce,意味著還不知道區(qū)塊頭的hash,因此無(wú)法生成合法的Nonce。

Q:能否根據(jù)符合條件的哈希值,反推出Nonce呢?
A:不行。因?yàn)楣_\(yùn)算具有不可逆性,不能根據(jù)摘要反推出明文,同理根據(jù)哈希值也無(wú)法推出Nonce。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/24396.html

相關(guān)文章

  • 以太源碼分析共識(shí)(2)引擎

    摘要:前言是以太坊封定義的一個(gè)接口,它的功能可以分為類(lèi)驗(yàn)證區(qū)塊類(lèi),主要用在將區(qū)塊加入到區(qū)塊鏈前,對(duì)區(qū)塊進(jìn)行共識(shí)驗(yàn)證。輔助類(lèi)生成以太坊共識(shí)相關(guān)的。被使用,是以太坊狀態(tài)管理服務(wù),當(dāng)報(bào)告數(shù)據(jù)的時(shí)候,需要獲取區(qū)塊的信息。 前言 engine是以太坊封定義的一個(gè)接口,它的功能可以分為3類(lèi): 驗(yàn)證區(qū)塊類(lèi),主要用在將區(qū)塊加入到區(qū)塊鏈前,對(duì)區(qū)塊進(jìn)行共識(shí)驗(yàn)證。 產(chǎn)生區(qū)塊類(lèi),主要用在挖礦時(shí)。 輔助類(lèi)。 接下...

    YuboonaZhang 評(píng)論0 收藏0
  • 以太源碼分析Ethash共識(shí)算法

    摘要:當(dāng)前和一樣,采用基于工作量證明的共識(shí)算法來(lái)產(chǎn)生新的區(qū)塊。源碼解析生成通過(guò)方法生成,首先是生成,再?gòu)纳赏诘V在挖礦與共識(shí)中提到了,共識(shí)算法通過(guò)實(shí)現(xiàn)接口,來(lái)實(shí)現(xiàn)挖礦算法也不例外。 Ethereum當(dāng)前和Bitcoin一樣,采用基于工作量證明(Proof of Work,PoW)的共識(shí)算法來(lái)產(chǎn)生新的區(qū)塊。與Bitcoin不同的是,Ethereum采用的共識(shí)算法可以抵御ASIC礦機(jī)對(duì)挖礦工作的...

    EddieChan 評(píng)論0 收藏0
  • 以太POA共識(shí)機(jī)制Clique源碼分析

    摘要:以太坊中除了基于運(yùn)算能力的外,還有基于權(quán)利證明的共識(shí)機(jī)制,是以太坊的共識(shí)算法的實(shí)現(xiàn),這里主要對(duì)的相關(guān)源碼做一個(gè)解讀分析。檢查包頭中包含的簽名是否滿(mǎn)足共識(shí)協(xié)議 以太坊中除了基于運(yùn)算能力的POW(Ethash)外,還有基于權(quán)利證明的POA共識(shí)機(jī)制,Clique是以太坊的POA共識(shí)算法的實(shí)現(xiàn),這里主要對(duì)POA的Clique相關(guān)源碼做一個(gè)解讀分析。 Clique的初始化在 Ethereum.S...

    Stardustsky 評(píng)論0 收藏0
  • 以太源碼分析—挖礦與共識(shí)

    摘要:下面來(lái)看看具體是怎么實(shí)現(xiàn)接口的可以看到,啟動(dòng)了多個(gè)線(xiàn)程調(diào)用函數(shù),當(dāng)有線(xiàn)程挖到時(shí),會(huì)通過(guò)傳入的通道傳出結(jié)果??梢钥吹皆谥饕h(huán)中,不斷遞增的值,調(diào)用函數(shù)計(jì)算上面公式中的左邊,而則是公式的右邊。 前言 挖礦(mine)是指礦工節(jié)點(diǎn)互相競(jìng)爭(zhēng)生成新區(qū)塊以寫(xiě)入整個(gè)區(qū)塊鏈獲得獎(jiǎng)勵(lì)的過(guò)程.共識(shí)(consensus)是指區(qū)塊鏈各個(gè)節(jié)點(diǎn)對(duì)下一個(gè)區(qū)塊的內(nèi)容形成一致的過(guò)程在以太坊中, miner包向外提供挖...

    walterrwu 評(píng)論0 收藏0
  • 以太創(chuàng)世區(qū)塊與鏈配置載入分析

    摘要:本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接以太坊創(chuàng)世區(qū)塊與鏈配置載入分析,原文已更新,請(qǐng)讀者前往原文閱讀。以太坊允許通過(guò)創(chuàng)世配置文件來(lái)初始化創(chuàng)世區(qū)塊,也可使用選擇使用內(nèi)置的多個(gè)網(wǎng)絡(luò)環(huán)境的創(chuàng)世配置。再準(zhǔn)備兩個(gè)以太坊賬戶(hù),以便在創(chuàng)世時(shí)存入資產(chǎn)。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:以太坊創(chuàng)世區(qū)塊與鏈配置載入分析,原文已更新,請(qǐng)讀者前往原文閱讀。 創(chuàng)世區(qū)塊作為第零個(gè)區(qū)塊,其他區(qū)塊直接或間接引用到...

    姘擱『 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<