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

Go語言中文網 2019-08-12
"
Go語言中文網,致力於每日分享編碼、開源等知識,歡迎關注我,會有意想不到的收穫!
"
Go語言中文網,致力於每日分享編碼、開源等知識,歡迎關注我,會有意想不到的收穫!
以太坊源碼分析:共識(3)PoW

前言

Ethash實現了PoW,PoW的精妙在於通過一個隨機數確定,礦工確實做了大量的工作,並且是沒有辦法作弊的。接下來將介紹:

  1. Ethash的挖礦本質。
  2. Ethash是如何挖礦的。
  3. 如何驗證Ethash的隨機數。

Ethash的挖礦本質

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

Rand(hash, nonce) ≤ MaxValue / Difficulty

其中,

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

以上參數中,在得到區塊頭的hash之後,只有nonce是未知的。

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

"
Go語言中文網,致力於每日分享編碼、開源等知識,歡迎關注我,會有意想不到的收穫!
以太坊源碼分析:共識(3)PoW

前言

Ethash實現了PoW,PoW的精妙在於通過一個隨機數確定,礦工確實做了大量的工作,並且是沒有辦法作弊的。接下來將介紹:

  1. Ethash的挖礦本質。
  2. Ethash是如何挖礦的。
  3. 如何驗證Ethash的隨機數。

Ethash的挖礦本質

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

Rand(hash, nonce) ≤ MaxValue / Difficulty

其中,

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

以上參數中,在得到區塊頭的hash之後,只有nonce是未知的。

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

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


以太坊可以通過調整Difficulty來調節當前挖礦的難度,Difficulty越大,挖礦的難度越大。當Difficulty越大時, MaxValue / Difficulty越小,合法的哈希值範圍越小,造成挖礦難度增加。

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

如何挖礦

Ethash挖礦的主要思想是,開啟多個線程去尋找符合條件的Nonce,給每個線程分配一個隨機數,作為本線程的Nonce的初始值,然後每個線程判斷當前的Nonce是否符合上面的公式,如果不符合,則把Nonce加1,再次進行判斷,這樣不定的迭代下去,直到找到一個符合條件的Nonce,或者挖礦被叫停。

接下來介紹挖礦的幾個主要函數的實現,它們是:

  1. 挖礦的入口Seal函數。
  2. 挖礦函數mine函數。
  3. 挖礦需要的數據cache和dataset。
  4. Rand()函數的實現hashimotoFull和hashimoto。

挖礦入口Seal()

Seal是引擎的挖礦入口函數,它是管理崗位,負責管理挖礦的線程。它發起多個線程執行Ethash.mine進行並行挖礦,當要更新或者停止的時候,重新啟動或停止這些線程。

"
Go語言中文網,致力於每日分享編碼、開源等知識,歡迎關注我,會有意想不到的收穫!
以太坊源碼分析:共識(3)PoW

前言

Ethash實現了PoW,PoW的精妙在於通過一個隨機數確定,礦工確實做了大量的工作,並且是沒有辦法作弊的。接下來將介紹:

  1. Ethash的挖礦本質。
  2. Ethash是如何挖礦的。
  3. 如何驗證Ethash的隨機數。

Ethash的挖礦本質

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

Rand(hash, nonce) ≤ MaxValue / Difficulty

其中,

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

以上參數中,在得到區塊頭的hash之後,只有nonce是未知的。

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

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


以太坊可以通過調整Difficulty來調節當前挖礦的難度,Difficulty越大,挖礦的難度越大。當Difficulty越大時, MaxValue / Difficulty越小,合法的哈希值範圍越小,造成挖礦難度增加。

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

如何挖礦

Ethash挖礦的主要思想是,開啟多個線程去尋找符合條件的Nonce,給每個線程分配一個隨機數,作為本線程的Nonce的初始值,然後每個線程判斷當前的Nonce是否符合上面的公式,如果不符合,則把Nonce加1,再次進行判斷,這樣不定的迭代下去,直到找到一個符合條件的Nonce,或者挖礦被叫停。

接下來介紹挖礦的幾個主要函數的實現,它們是:

  1. 挖礦的入口Seal函數。
  2. 挖礦函數mine函數。
  3. 挖礦需要的數據cache和dataset。
  4. Rand()函數的實現hashimotoFull和hashimoto。

挖礦入口Seal()

Seal是引擎的挖礦入口函數,它是管理崗位,負責管理挖礦的線程。它發起多個線程執行Ethash.mine進行並行挖礦,當要更新或者停止的時候,重新啟動或停止這些線程。

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


挖礦函數mine()

mine函數負責挖礦。Seal在啟動每一個mine的時候,給它分配了一個seed,mine會把它作為Nonce的初始值,然後生成本高度使用的dataset,然後把dataset, hash, nonce傳遞給hashimotoFull函數,這個函數可以認為是原理介紹中的Rand隨機函數,他會生成哈希值Result,當Result <= Target的時候,說明哈希值落在符合條件的區間了,mine找到了符合條件的Nonce,使用Digest和nonce組成新的區塊後,發送給Seal,否則驗證下一個Nonce是否是符合條件的。

"
Go語言中文網,致力於每日分享編碼、開源等知識,歡迎關注我,會有意想不到的收穫!
以太坊源碼分析:共識(3)PoW

前言

Ethash實現了PoW,PoW的精妙在於通過一個隨機數確定,礦工確實做了大量的工作,並且是沒有辦法作弊的。接下來將介紹:

  1. Ethash的挖礦本質。
  2. Ethash是如何挖礦的。
  3. 如何驗證Ethash的隨機數。

Ethash的挖礦本質

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

Rand(hash, nonce) ≤ MaxValue / Difficulty

其中,

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

以上參數中,在得到區塊頭的hash之後,只有nonce是未知的。

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

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


以太坊可以通過調整Difficulty來調節當前挖礦的難度,Difficulty越大,挖礦的難度越大。當Difficulty越大時, MaxValue / Difficulty越小,合法的哈希值範圍越小,造成挖礦難度增加。

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

如何挖礦

Ethash挖礦的主要思想是,開啟多個線程去尋找符合條件的Nonce,給每個線程分配一個隨機數,作為本線程的Nonce的初始值,然後每個線程判斷當前的Nonce是否符合上面的公式,如果不符合,則把Nonce加1,再次進行判斷,這樣不定的迭代下去,直到找到一個符合條件的Nonce,或者挖礦被叫停。

接下來介紹挖礦的幾個主要函數的實現,它們是:

  1. 挖礦的入口Seal函數。
  2. 挖礦函數mine函數。
  3. 挖礦需要的數據cache和dataset。
  4. Rand()函數的實現hashimotoFull和hashimoto。

挖礦入口Seal()

Seal是引擎的挖礦入口函數,它是管理崗位,負責管理挖礦的線程。它發起多個線程執行Ethash.mine進行並行挖礦,當要更新或者停止的時候,重新啟動或停止這些線程。

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


挖礦函數mine()

mine函數負責挖礦。Seal在啟動每一個mine的時候,給它分配了一個seed,mine會把它作為Nonce的初始值,然後生成本高度使用的dataset,然後把dataset, hash, nonce傳遞給hashimotoFull函數,這個函數可以認為是原理介紹中的Rand隨機函數,他會生成哈希值Result,當Result <= Target的時候,說明哈希值落在符合條件的區間了,mine找到了符合條件的Nonce,使用Digest和nonce組成新的區塊後,發送給Seal,否則驗證下一個Nonce是否是符合條件的。

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


挖礦需要的數據cache和dataset

dataset用來生成Result,而cache用來生成dataset。至於如何使用dataset生成Result在hashimoto()中講述,本節介紹如何生成dataset。

dataset和cache中存放的都是偽隨機數,每個epoch的區塊使用相同的cache和dataset,並且dataset需要暫用大量的內存。剛開始時cache是16MB,dataset是1GB,但每個epoch它們就會增大一次,它們的大小分別定義在datasetSizes和cacheSizes,dataset每次增長8MB,最大能達到16GB,所以挖礦的節點必須有足夠大的內存。

使用cache生成dataset。使用cache的部分數據,進行哈希和異或運算,就能生成一組dataset的item,比如下圖中的cache中黃色塊,能生成dataset中的黃色塊,最後把這些Item拼起來就生成了完整的Dataset,完成該功能的函數是generateDataset。

"
Go語言中文網,致力於每日分享編碼、開源等知識,歡迎關注我,會有意想不到的收穫!
以太坊源碼分析:共識(3)PoW

前言

Ethash實現了PoW,PoW的精妙在於通過一個隨機數確定,礦工確實做了大量的工作,並且是沒有辦法作弊的。接下來將介紹:

  1. Ethash的挖礦本質。
  2. Ethash是如何挖礦的。
  3. 如何驗證Ethash的隨機數。

Ethash的挖礦本質

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

Rand(hash, nonce) ≤ MaxValue / Difficulty

其中,

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

以上參數中,在得到區塊頭的hash之後,只有nonce是未知的。

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

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


以太坊可以通過調整Difficulty來調節當前挖礦的難度,Difficulty越大,挖礦的難度越大。當Difficulty越大時, MaxValue / Difficulty越小,合法的哈希值範圍越小,造成挖礦難度增加。

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

如何挖礦

Ethash挖礦的主要思想是,開啟多個線程去尋找符合條件的Nonce,給每個線程分配一個隨機數,作為本線程的Nonce的初始值,然後每個線程判斷當前的Nonce是否符合上面的公式,如果不符合,則把Nonce加1,再次進行判斷,這樣不定的迭代下去,直到找到一個符合條件的Nonce,或者挖礦被叫停。

接下來介紹挖礦的幾個主要函數的實現,它們是:

  1. 挖礦的入口Seal函數。
  2. 挖礦函數mine函數。
  3. 挖礦需要的數據cache和dataset。
  4. Rand()函數的實現hashimotoFull和hashimoto。

挖礦入口Seal()

Seal是引擎的挖礦入口函數,它是管理崗位,負責管理挖礦的線程。它發起多個線程執行Ethash.mine進行並行挖礦,當要更新或者停止的時候,重新啟動或停止這些線程。

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


挖礦函數mine()

mine函數負責挖礦。Seal在啟動每一個mine的時候,給它分配了一個seed,mine會把它作為Nonce的初始值,然後生成本高度使用的dataset,然後把dataset, hash, nonce傳遞給hashimotoFull函數,這個函數可以認為是原理介紹中的Rand隨機函數,他會生成哈希值Result,當Result <= Target的時候,說明哈希值落在符合條件的區間了,mine找到了符合條件的Nonce,使用Digest和nonce組成新的區塊後,發送給Seal,否則驗證下一個Nonce是否是符合條件的。

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


挖礦需要的數據cache和dataset

dataset用來生成Result,而cache用來生成dataset。至於如何使用dataset生成Result在hashimoto()中講述,本節介紹如何生成dataset。

dataset和cache中存放的都是偽隨機數,每個epoch的區塊使用相同的cache和dataset,並且dataset需要暫用大量的內存。剛開始時cache是16MB,dataset是1GB,但每個epoch它們就會增大一次,它們的大小分別定義在datasetSizes和cacheSizes,dataset每次增長8MB,最大能達到16GB,所以挖礦的節點必須有足夠大的內存。

使用cache生成dataset。使用cache的部分數據,進行哈希和異或運算,就能生成一組dataset的item,比如下圖中的cache中黃色塊,能生成dataset中的黃色塊,最後把這些Item拼起來就生成了完整的Dataset,完成該功能的函數是generateDataset。

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


dataset.generate()是dataset的生成函數,該函數只執行一次,先使用generateCache()生成cache,再將cache作為generateDataset()的入參生成dataset,其中需要重點關注的是generateDatasetItem(),該函數是根據部分cache,生成一組dataset item,驗證PoW的nonce的時候,也需要使用該函數。

"
Go語言中文網,致力於每日分享編碼、開源等知識,歡迎關注我,會有意想不到的收穫!
以太坊源碼分析:共識(3)PoW

前言

Ethash實現了PoW,PoW的精妙在於通過一個隨機數確定,礦工確實做了大量的工作,並且是沒有辦法作弊的。接下來將介紹:

  1. Ethash的挖礦本質。
  2. Ethash是如何挖礦的。
  3. 如何驗證Ethash的隨機數。

Ethash的挖礦本質

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

Rand(hash, nonce) ≤ MaxValue / Difficulty

其中,

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

以上參數中,在得到區塊頭的hash之後,只有nonce是未知的。

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

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


以太坊可以通過調整Difficulty來調節當前挖礦的難度,Difficulty越大,挖礦的難度越大。當Difficulty越大時, MaxValue / Difficulty越小,合法的哈希值範圍越小,造成挖礦難度增加。

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

如何挖礦

Ethash挖礦的主要思想是,開啟多個線程去尋找符合條件的Nonce,給每個線程分配一個隨機數,作為本線程的Nonce的初始值,然後每個線程判斷當前的Nonce是否符合上面的公式,如果不符合,則把Nonce加1,再次進行判斷,這樣不定的迭代下去,直到找到一個符合條件的Nonce,或者挖礦被叫停。

接下來介紹挖礦的幾個主要函數的實現,它們是:

  1. 挖礦的入口Seal函數。
  2. 挖礦函數mine函數。
  3. 挖礦需要的數據cache和dataset。
  4. Rand()函數的實現hashimotoFull和hashimoto。

挖礦入口Seal()

Seal是引擎的挖礦入口函數,它是管理崗位,負責管理挖礦的線程。它發起多個線程執行Ethash.mine進行並行挖礦,當要更新或者停止的時候,重新啟動或停止這些線程。

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


挖礦函數mine()

mine函數負責挖礦。Seal在啟動每一個mine的時候,給它分配了一個seed,mine會把它作為Nonce的初始值,然後生成本高度使用的dataset,然後把dataset, hash, nonce傳遞給hashimotoFull函數,這個函數可以認為是原理介紹中的Rand隨機函數,他會生成哈希值Result,當Result <= Target的時候,說明哈希值落在符合條件的區間了,mine找到了符合條件的Nonce,使用Digest和nonce組成新的區塊後,發送給Seal,否則驗證下一個Nonce是否是符合條件的。

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


挖礦需要的數據cache和dataset

dataset用來生成Result,而cache用來生成dataset。至於如何使用dataset生成Result在hashimoto()中講述,本節介紹如何生成dataset。

dataset和cache中存放的都是偽隨機數,每個epoch的區塊使用相同的cache和dataset,並且dataset需要暫用大量的內存。剛開始時cache是16MB,dataset是1GB,但每個epoch它們就會增大一次,它們的大小分別定義在datasetSizes和cacheSizes,dataset每次增長8MB,最大能達到16GB,所以挖礦的節點必須有足夠大的內存。

使用cache生成dataset。使用cache的部分數據,進行哈希和異或運算,就能生成一組dataset的item,比如下圖中的cache中黃色塊,能生成dataset中的黃色塊,最後把這些Item拼起來就生成了完整的Dataset,完成該功能的函數是generateDataset。

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


dataset.generate()是dataset的生成函數,該函數只執行一次,先使用generateCache()生成cache,再將cache作為generateDataset()的入參生成dataset,其中需要重點關注的是generateDatasetItem(),該函數是根據部分cache,生成一組dataset item,驗證PoW的nonce的時候,也需要使用該函數。

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


Rand()的實現hashimotoFull()和hashimoto()

hashimotoFull功能是使用dataset、hash和nonce生成Digest和Result。它創建一個獲取dataset部分數據的lookup函數,該函數能夠返回連續的64字節dataset中的數據,然後把lookup函數、hash和nonce傳遞給hashimoto。

"
Go語言中文網,致力於每日分享編碼、開源等知識,歡迎關注我,會有意想不到的收穫!
以太坊源碼分析:共識(3)PoW

前言

Ethash實現了PoW,PoW的精妙在於通過一個隨機數確定,礦工確實做了大量的工作,並且是沒有辦法作弊的。接下來將介紹:

  1. Ethash的挖礦本質。
  2. Ethash是如何挖礦的。
  3. 如何驗證Ethash的隨機數。

Ethash的挖礦本質

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

Rand(hash, nonce) ≤ MaxValue / Difficulty

其中,

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

以上參數中,在得到區塊頭的hash之後,只有nonce是未知的。

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

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


以太坊可以通過調整Difficulty來調節當前挖礦的難度,Difficulty越大,挖礦的難度越大。當Difficulty越大時, MaxValue / Difficulty越小,合法的哈希值範圍越小,造成挖礦難度增加。

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

如何挖礦

Ethash挖礦的主要思想是,開啟多個線程去尋找符合條件的Nonce,給每個線程分配一個隨機數,作為本線程的Nonce的初始值,然後每個線程判斷當前的Nonce是否符合上面的公式,如果不符合,則把Nonce加1,再次進行判斷,這樣不定的迭代下去,直到找到一個符合條件的Nonce,或者挖礦被叫停。

接下來介紹挖礦的幾個主要函數的實現,它們是:

  1. 挖礦的入口Seal函數。
  2. 挖礦函數mine函數。
  3. 挖礦需要的數據cache和dataset。
  4. Rand()函數的實現hashimotoFull和hashimoto。

挖礦入口Seal()

Seal是引擎的挖礦入口函數,它是管理崗位,負責管理挖礦的線程。它發起多個線程執行Ethash.mine進行並行挖礦,當要更新或者停止的時候,重新啟動或停止這些線程。

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


挖礦函數mine()

mine函數負責挖礦。Seal在啟動每一個mine的時候,給它分配了一個seed,mine會把它作為Nonce的初始值,然後生成本高度使用的dataset,然後把dataset, hash, nonce傳遞給hashimotoFull函數,這個函數可以認為是原理介紹中的Rand隨機函數,他會生成哈希值Result,當Result <= Target的時候,說明哈希值落在符合條件的區間了,mine找到了符合條件的Nonce,使用Digest和nonce組成新的區塊後,發送給Seal,否則驗證下一個Nonce是否是符合條件的。

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


挖礦需要的數據cache和dataset

dataset用來生成Result,而cache用來生成dataset。至於如何使用dataset生成Result在hashimoto()中講述,本節介紹如何生成dataset。

dataset和cache中存放的都是偽隨機數,每個epoch的區塊使用相同的cache和dataset,並且dataset需要暫用大量的內存。剛開始時cache是16MB,dataset是1GB,但每個epoch它們就會增大一次,它們的大小分別定義在datasetSizes和cacheSizes,dataset每次增長8MB,最大能達到16GB,所以挖礦的節點必須有足夠大的內存。

使用cache生成dataset。使用cache的部分數據,進行哈希和異或運算,就能生成一組dataset的item,比如下圖中的cache中黃色塊,能生成dataset中的黃色塊,最後把這些Item拼起來就生成了完整的Dataset,完成該功能的函數是generateDataset。

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


dataset.generate()是dataset的生成函數,該函數只執行一次,先使用generateCache()生成cache,再將cache作為generateDataset()的入參生成dataset,其中需要重點關注的是generateDatasetItem(),該函數是根據部分cache,生成一組dataset item,驗證PoW的nonce的時候,也需要使用該函數。

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


Rand()的實現hashimotoFull()和hashimoto()

hashimotoFull功能是使用dataset、hash和nonce生成Digest和Result。它創建一個獲取dataset部分數據的lookup函數,該函數能夠返回連續的64字節dataset中的數據,然後把lookup函數、hash和nonce傳遞給hashimoto。

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


hashimoto的功能是根據hash和nonce,以及lookup函數生成Digest和Result,lookup函數能夠返回64字節的數據就行。它把hash和nonce合成種子,然後根據種子生成混合的數據mix,然後進入一個循環,使用mix和seed獲得dataset的行號,使用lookup獲取指定行的數據,然後把數據混合到mix中,混合的方式是使用哈希和異或運算,循環結束後再使用哈希和異或函數把mix壓縮為64字節,把mix轉為小端模式就得到了Digest,把seed和mix進行hash運算得到Result。

"
Go語言中文網,致力於每日分享編碼、開源等知識,歡迎關注我,會有意想不到的收穫!
以太坊源碼分析:共識(3)PoW

前言

Ethash實現了PoW,PoW的精妙在於通過一個隨機數確定,礦工確實做了大量的工作,並且是沒有辦法作弊的。接下來將介紹:

  1. Ethash的挖礦本質。
  2. Ethash是如何挖礦的。
  3. 如何驗證Ethash的隨機數。

Ethash的挖礦本質

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

Rand(hash, nonce) ≤ MaxValue / Difficulty

其中,

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

以上參數中,在得到區塊頭的hash之後,只有nonce是未知的。

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

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


以太坊可以通過調整Difficulty來調節當前挖礦的難度,Difficulty越大,挖礦的難度越大。當Difficulty越大時, MaxValue / Difficulty越小,合法的哈希值範圍越小,造成挖礦難度增加。

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

如何挖礦

Ethash挖礦的主要思想是,開啟多個線程去尋找符合條件的Nonce,給每個線程分配一個隨機數,作為本線程的Nonce的初始值,然後每個線程判斷當前的Nonce是否符合上面的公式,如果不符合,則把Nonce加1,再次進行判斷,這樣不定的迭代下去,直到找到一個符合條件的Nonce,或者挖礦被叫停。

接下來介紹挖礦的幾個主要函數的實現,它們是:

  1. 挖礦的入口Seal函數。
  2. 挖礦函數mine函數。
  3. 挖礦需要的數據cache和dataset。
  4. Rand()函數的實現hashimotoFull和hashimoto。

挖礦入口Seal()

Seal是引擎的挖礦入口函數,它是管理崗位,負責管理挖礦的線程。它發起多個線程執行Ethash.mine進行並行挖礦,當要更新或者停止的時候,重新啟動或停止這些線程。

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


挖礦函數mine()

mine函數負責挖礦。Seal在啟動每一個mine的時候,給它分配了一個seed,mine會把它作為Nonce的初始值,然後生成本高度使用的dataset,然後把dataset, hash, nonce傳遞給hashimotoFull函數,這個函數可以認為是原理介紹中的Rand隨機函數,他會生成哈希值Result,當Result <= Target的時候,說明哈希值落在符合條件的區間了,mine找到了符合條件的Nonce,使用Digest和nonce組成新的區塊後,發送給Seal,否則驗證下一個Nonce是否是符合條件的。

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


挖礦需要的數據cache和dataset

dataset用來生成Result,而cache用來生成dataset。至於如何使用dataset生成Result在hashimoto()中講述,本節介紹如何生成dataset。

dataset和cache中存放的都是偽隨機數,每個epoch的區塊使用相同的cache和dataset,並且dataset需要暫用大量的內存。剛開始時cache是16MB,dataset是1GB,但每個epoch它們就會增大一次,它們的大小分別定義在datasetSizes和cacheSizes,dataset每次增長8MB,最大能達到16GB,所以挖礦的節點必須有足夠大的內存。

使用cache生成dataset。使用cache的部分數據,進行哈希和異或運算,就能生成一組dataset的item,比如下圖中的cache中黃色塊,能生成dataset中的黃色塊,最後把這些Item拼起來就生成了完整的Dataset,完成該功能的函數是generateDataset。

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


dataset.generate()是dataset的生成函數,該函數只執行一次,先使用generateCache()生成cache,再將cache作為generateDataset()的入參生成dataset,其中需要重點關注的是generateDatasetItem(),該函數是根據部分cache,生成一組dataset item,驗證PoW的nonce的時候,也需要使用該函數。

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


Rand()的實現hashimotoFull()和hashimoto()

hashimotoFull功能是使用dataset、hash和nonce生成Digest和Result。它創建一個獲取dataset部分數據的lookup函數,該函數能夠返回連續的64字節dataset中的數據,然後把lookup函數、hash和nonce傳遞給hashimoto。

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


hashimoto的功能是根據hash和nonce,以及lookup函數生成Digest和Result,lookup函數能夠返回64字節的數據就行。它把hash和nonce合成種子,然後根據種子生成混合的數據mix,然後進入一個循環,使用mix和seed獲得dataset的行號,使用lookup獲取指定行的數據,然後把數據混合到mix中,混合的方式是使用哈希和異或運算,循環結束後再使用哈希和異或函數把mix壓縮為64字節,把mix轉為小端模式就得到了Digest,把seed和mix進行hash運算得到Result。

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


如何驗證

PoW的驗證是證明出塊人確實進行了大量的哈希計算。Ethash驗證區塊頭中的Nonce和MixDigest是否合法,如果驗證通過,則認為出塊人確實進行了大量的哈希運算。驗證方式是確定區塊頭中的Nonce是否符合公式,並且區塊頭中的MixDigest是否與使用此Nonce計算出的是否相同。

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

  1. 時間節省。驗證只進行1次hashimoto運算,而挖礦進行大約Difficulty次。
  2. 空間節省。驗證只需要cache,不需要dataset,也就不需要計算龐大的dataset,因此不挖礦的驗證節點,不需要很高的配置。

接下來介紹驗證函數VerifySeal(),以及根據cache生成Digest和Result的hashimotoLight()。

驗證函數VerifySeal

Ethash.VerifySeal實現PoW驗證功能。首先先判斷區塊中的Difficulty是否匹配,然後生成(獲取)當前區塊高度的cache,把cache和nonce傳遞給hashimotoLight,該函數能根據cache, hash, nonce生成Digest和Result,然後校驗Digest是否匹配以及Result是否符合條件。

"
Go語言中文網,致力於每日分享編碼、開源等知識,歡迎關注我,會有意想不到的收穫!
以太坊源碼分析:共識(3)PoW

前言

Ethash實現了PoW,PoW的精妙在於通過一個隨機數確定,礦工確實做了大量的工作,並且是沒有辦法作弊的。接下來將介紹:

  1. Ethash的挖礦本質。
  2. Ethash是如何挖礦的。
  3. 如何驗證Ethash的隨機數。

Ethash的挖礦本質

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

Rand(hash, nonce) ≤ MaxValue / Difficulty

其中,

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

以上參數中,在得到區塊頭的hash之後,只有nonce是未知的。

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

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


以太坊可以通過調整Difficulty來調節當前挖礦的難度,Difficulty越大,挖礦的難度越大。當Difficulty越大時, MaxValue / Difficulty越小,合法的哈希值範圍越小,造成挖礦難度增加。

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

如何挖礦

Ethash挖礦的主要思想是,開啟多個線程去尋找符合條件的Nonce,給每個線程分配一個隨機數,作為本線程的Nonce的初始值,然後每個線程判斷當前的Nonce是否符合上面的公式,如果不符合,則把Nonce加1,再次進行判斷,這樣不定的迭代下去,直到找到一個符合條件的Nonce,或者挖礦被叫停。

接下來介紹挖礦的幾個主要函數的實現,它們是:

  1. 挖礦的入口Seal函數。
  2. 挖礦函數mine函數。
  3. 挖礦需要的數據cache和dataset。
  4. Rand()函數的實現hashimotoFull和hashimoto。

挖礦入口Seal()

Seal是引擎的挖礦入口函數,它是管理崗位,負責管理挖礦的線程。它發起多個線程執行Ethash.mine進行並行挖礦,當要更新或者停止的時候,重新啟動或停止這些線程。

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


挖礦函數mine()

mine函數負責挖礦。Seal在啟動每一個mine的時候,給它分配了一個seed,mine會把它作為Nonce的初始值,然後生成本高度使用的dataset,然後把dataset, hash, nonce傳遞給hashimotoFull函數,這個函數可以認為是原理介紹中的Rand隨機函數,他會生成哈希值Result,當Result <= Target的時候,說明哈希值落在符合條件的區間了,mine找到了符合條件的Nonce,使用Digest和nonce組成新的區塊後,發送給Seal,否則驗證下一個Nonce是否是符合條件的。

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


挖礦需要的數據cache和dataset

dataset用來生成Result,而cache用來生成dataset。至於如何使用dataset生成Result在hashimoto()中講述,本節介紹如何生成dataset。

dataset和cache中存放的都是偽隨機數,每個epoch的區塊使用相同的cache和dataset,並且dataset需要暫用大量的內存。剛開始時cache是16MB,dataset是1GB,但每個epoch它們就會增大一次,它們的大小分別定義在datasetSizes和cacheSizes,dataset每次增長8MB,最大能達到16GB,所以挖礦的節點必須有足夠大的內存。

使用cache生成dataset。使用cache的部分數據,進行哈希和異或運算,就能生成一組dataset的item,比如下圖中的cache中黃色塊,能生成dataset中的黃色塊,最後把這些Item拼起來就生成了完整的Dataset,完成該功能的函數是generateDataset。

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


dataset.generate()是dataset的生成函數,該函數只執行一次,先使用generateCache()生成cache,再將cache作為generateDataset()的入參生成dataset,其中需要重點關注的是generateDatasetItem(),該函數是根據部分cache,生成一組dataset item,驗證PoW的nonce的時候,也需要使用該函數。

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


Rand()的實現hashimotoFull()和hashimoto()

hashimotoFull功能是使用dataset、hash和nonce生成Digest和Result。它創建一個獲取dataset部分數據的lookup函數,該函數能夠返回連續的64字節dataset中的數據,然後把lookup函數、hash和nonce傳遞給hashimoto。

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


hashimoto的功能是根據hash和nonce,以及lookup函數生成Digest和Result,lookup函數能夠返回64字節的數據就行。它把hash和nonce合成種子,然後根據種子生成混合的數據mix,然後進入一個循環,使用mix和seed獲得dataset的行號,使用lookup獲取指定行的數據,然後把數據混合到mix中,混合的方式是使用哈希和異或運算,循環結束後再使用哈希和異或函數把mix壓縮為64字節,把mix轉為小端模式就得到了Digest,把seed和mix進行hash運算得到Result。

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


如何驗證

PoW的驗證是證明出塊人確實進行了大量的哈希計算。Ethash驗證區塊頭中的Nonce和MixDigest是否合法,如果驗證通過,則認為出塊人確實進行了大量的哈希運算。驗證方式是確定區塊頭中的Nonce是否符合公式,並且區塊頭中的MixDigest是否與使用此Nonce計算出的是否相同。

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

  1. 時間節省。驗證只進行1次hashimoto運算,而挖礦進行大約Difficulty次。
  2. 空間節省。驗證只需要cache,不需要dataset,也就不需要計算龐大的dataset,因此不挖礦的驗證節點,不需要很高的配置。

接下來介紹驗證函數VerifySeal(),以及根據cache生成Digest和Result的hashimotoLight()。

驗證函數VerifySeal

Ethash.VerifySeal實現PoW驗證功能。首先先判斷區塊中的Difficulty是否匹配,然後生成(獲取)當前區塊高度的cache,把cache和nonce傳遞給hashimotoLight,該函數能根據cache, hash, nonce生成Digest和Result,然後校驗Digest是否匹配以及Result是否符合條件。

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


hashimotoLight函數

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

"
Go語言中文網,致力於每日分享編碼、開源等知識,歡迎關注我,會有意想不到的收穫!
以太坊源碼分析:共識(3)PoW

前言

Ethash實現了PoW,PoW的精妙在於通過一個隨機數確定,礦工確實做了大量的工作,並且是沒有辦法作弊的。接下來將介紹:

  1. Ethash的挖礦本質。
  2. Ethash是如何挖礦的。
  3. 如何驗證Ethash的隨機數。

Ethash的挖礦本質

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

Rand(hash, nonce) ≤ MaxValue / Difficulty

其中,

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

以上參數中,在得到區塊頭的hash之後,只有nonce是未知的。

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

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


以太坊可以通過調整Difficulty來調節當前挖礦的難度,Difficulty越大,挖礦的難度越大。當Difficulty越大時, MaxValue / Difficulty越小,合法的哈希值範圍越小,造成挖礦難度增加。

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

如何挖礦

Ethash挖礦的主要思想是,開啟多個線程去尋找符合條件的Nonce,給每個線程分配一個隨機數,作為本線程的Nonce的初始值,然後每個線程判斷當前的Nonce是否符合上面的公式,如果不符合,則把Nonce加1,再次進行判斷,這樣不定的迭代下去,直到找到一個符合條件的Nonce,或者挖礦被叫停。

接下來介紹挖礦的幾個主要函數的實現,它們是:

  1. 挖礦的入口Seal函數。
  2. 挖礦函數mine函數。
  3. 挖礦需要的數據cache和dataset。
  4. Rand()函數的實現hashimotoFull和hashimoto。

挖礦入口Seal()

Seal是引擎的挖礦入口函數,它是管理崗位,負責管理挖礦的線程。它發起多個線程執行Ethash.mine進行並行挖礦,當要更新或者停止的時候,重新啟動或停止這些線程。

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


挖礦函數mine()

mine函數負責挖礦。Seal在啟動每一個mine的時候,給它分配了一個seed,mine會把它作為Nonce的初始值,然後生成本高度使用的dataset,然後把dataset, hash, nonce傳遞給hashimotoFull函數,這個函數可以認為是原理介紹中的Rand隨機函數,他會生成哈希值Result,當Result <= Target的時候,說明哈希值落在符合條件的區間了,mine找到了符合條件的Nonce,使用Digest和nonce組成新的區塊後,發送給Seal,否則驗證下一個Nonce是否是符合條件的。

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


挖礦需要的數據cache和dataset

dataset用來生成Result,而cache用來生成dataset。至於如何使用dataset生成Result在hashimoto()中講述,本節介紹如何生成dataset。

dataset和cache中存放的都是偽隨機數,每個epoch的區塊使用相同的cache和dataset,並且dataset需要暫用大量的內存。剛開始時cache是16MB,dataset是1GB,但每個epoch它們就會增大一次,它們的大小分別定義在datasetSizes和cacheSizes,dataset每次增長8MB,最大能達到16GB,所以挖礦的節點必須有足夠大的內存。

使用cache生成dataset。使用cache的部分數據,進行哈希和異或運算,就能生成一組dataset的item,比如下圖中的cache中黃色塊,能生成dataset中的黃色塊,最後把這些Item拼起來就生成了完整的Dataset,完成該功能的函數是generateDataset。

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


dataset.generate()是dataset的生成函數,該函數只執行一次,先使用generateCache()生成cache,再將cache作為generateDataset()的入參生成dataset,其中需要重點關注的是generateDatasetItem(),該函數是根據部分cache,生成一組dataset item,驗證PoW的nonce的時候,也需要使用該函數。

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


Rand()的實現hashimotoFull()和hashimoto()

hashimotoFull功能是使用dataset、hash和nonce生成Digest和Result。它創建一個獲取dataset部分數據的lookup函數,該函數能夠返回連續的64字節dataset中的數據,然後把lookup函數、hash和nonce傳遞給hashimoto。

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


hashimoto的功能是根據hash和nonce,以及lookup函數生成Digest和Result,lookup函數能夠返回64字節的數據就行。它把hash和nonce合成種子,然後根據種子生成混合的數據mix,然後進入一個循環,使用mix和seed獲得dataset的行號,使用lookup獲取指定行的數據,然後把數據混合到mix中,混合的方式是使用哈希和異或運算,循環結束後再使用哈希和異或函數把mix壓縮為64字節,把mix轉為小端模式就得到了Digest,把seed和mix進行hash運算得到Result。

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


如何驗證

PoW的驗證是證明出塊人確實進行了大量的哈希計算。Ethash驗證區塊頭中的Nonce和MixDigest是否合法,如果驗證通過,則認為出塊人確實進行了大量的哈希運算。驗證方式是確定區塊頭中的Nonce是否符合公式,並且區塊頭中的MixDigest是否與使用此Nonce計算出的是否相同。

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

  1. 時間節省。驗證只進行1次hashimoto運算,而挖礦進行大約Difficulty次。
  2. 空間節省。驗證只需要cache,不需要dataset,也就不需要計算龐大的dataset,因此不挖礦的驗證節點,不需要很高的配置。

接下來介紹驗證函數VerifySeal(),以及根據cache生成Digest和Result的hashimotoLight()。

驗證函數VerifySeal

Ethash.VerifySeal實現PoW驗證功能。首先先判斷區塊中的Difficulty是否匹配,然後生成(獲取)當前區塊高度的cache,把cache和nonce傳遞給hashimotoLight,該函數能根據cache, hash, nonce生成Digest和Result,然後校驗Digest是否匹配以及Result是否符合條件。

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


hashimotoLight函數

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

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


FAQ

  • Q:每30000個塊使用同一個dataset,那可以提前挖出一些合法的Nonce?
  • A: 不行。提前挖去Nonce,意味著還不知道區塊頭的hash,因此無法生成合法的Nonce。
  • Q:能否根據符合條件的哈希值,反推出Nonce呢?
  • A:不行。因為哈希運算具有不可逆性,不能根據摘要反推出明文,同理根據哈希值也無法推出Nonce。
如果這篇文章對你有幫助,不妨關注下我的Github,有文章會收到通知。本文作者:大彬,原創授權發佈如果喜歡本文,隨意轉載,但請保留此原文鏈接:http://lessisbetter.site/2018/06/22/ethereum-code-consensus-3/
"

相關推薦

推薦中...