Solidity

計算難度並驗證雜湊作為解決方案

  • June 21, 2016

我現在有一個計劃,個人承諾通過契約解決類似於比特幣的工作量證明協議的問題。這是基本流程……合約計算種子雜湊,個人嘗試對其進行雜湊(僅使用自己的設備在鏈外)同時增加隨機數,直到他們在 256 位範圍的某個子集內找到解決方案(0到 2^256 - 1)。我試圖弄清楚(1)如果我希望雜湊能力為 1 MH/s 的人有 95% 的機會在一周內解決問題,以及(2)檢查是否送出的正確方法解決方案滿足在預定範圍內的要求。

對於(1),這是我計算難度 D 的方式:

1 - ((D - 1) / D) ^ H = 0.95

所以 D 可以被認為是代表骰子的邊數。第一個“1”代表 100% 的可能性,“((D - 1) / D)”代表不正確結果的子集,H 代表擲骰子的次數。因此,例如,如果我想計算在 4 次中擲出 1 的機率,我有 6/6 - (5/6)^4 = 671/1296 = ~51.7%。

我試圖將此推斷為散列。在這種情況下,D 表示 2^256 範圍被分割成多少塊餅,H 表示執行的雜湊數。1 週 @ 1MH/s = 604.8 gigahashes。求解 D 得到了 ~201,887,199,781 塊餡餅。我的第一個問題是這些計算有意義嗎?1 MH/s 的人需要大約一周的時間才能在一片餡餅中找到解決方案嗎?

對於 (2) 我正在編寫一個 ETH 合約,該合約需要計算送出的解決方案是否在給定難度的指定範圍內。這是我的計算方法:

if (uint(sha3(finalSeed, _nonce)) <  2 ** 256 / difficulty )

因此,我將整個 2^256 範圍除以餅圖切片的數量,以得出單個切片中可以容納多少數字。那麼解決方案必須在的範圍是零到一塊餅的大小減去 1。這有意義嗎?是否需要轉換為 uint 才能執行此操作?“2 ** 256 / 難度”計算是否浪費了大量資源?有沒有更簡單的方法來完成這一切?

任何幫助將不勝感激。

你的計算是正確的。

假設X=1事件雜湊是“有效的”,X=0如果是無效的(X 稱為“伯努利隨機變數”伯努利分佈)。現在我們有P(X=1) = D/2^256其中 D 是有效解決方案的數量(和P(X=0) = 1 - D/2^256)。

假設您可以每週進行 H 雜湊。然後我們有X_1, X_2,…X_H表示 k-ism 雜湊是否有效。如果我們說Y = X_1 + X_2 + ..+ X_H. 你想估計 D 這樣P(Y>=1) >= 0.95

在這裡我們可以使用P(Y>=1) = 1 - P(Y=0). 至少有一個有效的雜湊值與沒有有效的雜湊值相反。現在因為每個散列的有效性是獨立於其他的P(Y=0) = P(X_1=0)...P(X_H=0) = (1 - D/2^256)^H

把所有這些放在一起,我們就有了P(Y>=1) = 1 - P(Y=0) = 1 - (1 - D/2^256)^H >= 0.95

然後我們有0.05 >= (1 - D/2^256)^H ==> (0.05)^(1/H) >= 1-D/2^256 ==> D/2^256 = 1 - (0.05)^(1/H). 解決H = 604800000000我得到D>=573548326756918809146437109998407756092224692540954418775767121920. 現在你的困難將2^256 / D <= 201,887,240,944.5476與你的計算非常接近。

謝謝你的提問!這對我的機率論考試來說是一個非常好的練習。

引用自:https://ethereum.stackexchange.com/questions/3814