什麼時候可以安全地將 BLOCKHASH 用於隨機數?什麼時候不安全?
我見過更複雜的合約生成隨機數的方法。但乙太坊黃皮書本身提出了一個使用 BLOCKHASH 操作碼的“簡單解決方案”(見下文,粗體字是我的)。
如果合約只需要幾個隨機數(而不是數百個),那麼這種方法的安全性如何?這種方法可以滿足哪些**範例案例?**如果使用了這種方法,哪些案例可以以實際的方式進行攻擊?
隨機數。在確定性系統中提供隨機數自然是一項不可能完成的任務。但是,我們可以利用在交易時通常不知道的數據來近似偽隨機數。此類數據可能包括區塊的雜湊、區塊的時間戳和區塊的受益人地址。為了使惡意礦工難以控制這些值,應該使用 BLOCKHASH 操作,以便將前 256 個塊的雜湊用作偽隨機數。對於一系列這樣的數字,一個簡單的解決方案是添加一些常數並對結果進行散列。
澄清一下,所指的“簡單解決方案”是關於如何從單個隨機種子產生一系列隨機數。
作為一般規則,BLOCKHASH 只能安全地用於隨機數,前提是基於隨機性質量的總價值低於礦工通過探勘單個區塊獲得的收益。
要了解為什麼會這樣,我們可以想像相反的情況,可能數百萬的價值取決於從 BLOCKHASH 操作獲得的隨機性(例如,選擇將贏得該金額的彩票中獎者)。由於涉及大量資金,資金充足的攻擊者將有經濟動機購買一張票,然後生成許多不同的替代塊(可能在短時間內使用數百萬個AWS實例,但成本很高)要計算繪圖的塊高度。當發現一個帶有雜湊值的區塊會導致礦工中獎時,礦工會立即在該區塊之上探勘更多區塊(以確保其成功),然後將其送出給網路,讓他們保證自己獲獎。這種操作可能非常昂貴,但只要獎金足夠大,執行它仍然是一種有利可圖的攻擊。
這是一個極端的例子,但是這種攻擊的無聊版本,一個礦工碰巧挖了一個區塊,檢查他們是否贏了,如果沒有,就扔掉答案,仍然能夠使他們的整體翻倍獲勝的機率,仍然是一種“不公平”的統計操縱,儘管微弱。但是,如果丟棄塊的成本超過任何人希望獲得的成本,那麼任何人都不太可能執行攻擊,這就是我們的一般規則。