快速學習-以太坊難度調整

以太坊難度調整

什麼是難度

  • 難度(Difficulty) 一詞來源於區塊鏈技術的先驅比特幣,用來度量挖出一個區塊平均需要的運算次數。
  • 挖礦本質上就是在求解一個謎題,不同的電子幣設置了不同的謎題。比特幣使用SHA-256、萊特幣使用Scrypt、以太坊使用Ethash。一個謎題的解的所有可能取值被稱爲解的空間,挖礦就是在這些可能的取值中尋找一個解
  • 這些謎題都有如下共同的特點:
  • 沒有比窮舉法更有效的求解方法
  • 解在空間中均勻分佈,從而使每一次窮舉嘗試找到一個解的概率基本一致
  • 解的空間足夠大,保證一定能夠找到解
  • 現在我們爲謎題設置一個參數 Difficulty,那麼謎題就變成了求解某個空間內符合 x<Difficulty 的 x,這個參數Difficulty 就是所謂的難度
  • 難度(Difficulty) 通過控制合格的解在空間中的數量來控制平均求解所需要嘗試的次數,也就可以間接的控制產生一個區塊需要的時間,這樣就可以使區塊以一個合理而穩定的速度產生
  • 當挖礦的人很多,單位時間能夠嘗試更多次時,難度就會增大,當挖礦的人減少,單位時間能夠嘗試的次數變少時,難度就降低。這樣產生一個區塊需要的時間就可以做到穩定

以太坊中的難度計算

難度計算的規則

  • 以太坊中有三種計算難度的規則,分別對應着以太坊中三個不同階段的版本:Frontier,Homestead 和 Metropolis,現在用的方法叫做calcDifficultyByzantium (),對應大都會的拜占庭階段
  • 計算一個區塊的難度時,需要以下輸入:
  • parent_timestamp:上一個區塊產生的時間
  • parent_diff:上一個區塊的難度
  • block_timestamp:當前區塊產生的時間
  • block_number:當前區塊的序號

計算步驟

  • block_diff = parent_diff + 難度調整 + 難度炸彈
  • 難度調整 = parent_diff / 2048 * max((2 if len(parent.uncles) else 1) - ((timestamp - parent.timestamp) // 9), -99))
  • 難度炸彈 = 2^((parent.Number - bombDelay) //100000 - 2)
  • 目前拜占庭階段, bombDelay = 3000000
  • 另外,區塊難度不能低於以太坊的創世區塊,創世區塊的難度爲131072,這是以太坊難度的下限。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章