Solidity

從未經驗證的合約中生成偽隨機數

  • May 12, 2022

我知道,由於可靠性的偽隨機性是確定性的,礦工和黑客將能夠逆向工程或操縱這些碎片來強迫他們動手。但是,如果我有一個單獨的合約,它只是使用過於復雜的計算來確定隨機性,而這在 etherscan 上是未經驗證的,(人們看不到程式碼),這是否足夠安全?如果沒有,你能幫我理解為什麼嗎?我會使用chainlink VRF,但它對於我想要做的事情來說太貴了。

謝謝

這取決於您的隨機性來源。執行一些混淆程式碼的未經驗證的合約不會提供任何額外的安全性,因為可以在本地模擬交易(他們不需要知道合約的內部結構)。如果合約能夠與你的合約互動,他們甚至可以簡單地發送一個帶有 require 語句的交易,如果沒有達到他們想要的結果,該語句將恢復。

假設只有外部擁有的賬戶能夠與你的合約互動,你可以求助於一些偽隨機源,比如 blockhash。由於區塊雜湊不能用於目前區塊,因此人們有時間(理論上)先模擬交易,然後仍將其放入下一個區塊。如果您綁定了僅由最新塊確定的內容(block.timestamp 或我也看過 block.difficulty),您最終會限制您的隨機性,因為它現在更可預測。你仍然容易受到礦工的攻擊,因為他們有能力在一定程度上影響區塊雜湊和時間戳等值。

您絕對希望避免使用者對隨機性進行任何控制(例如基於他們提供或可以影響的任何值,例如 gasleft())並限制可預測性。一種方法(我認為這是一個相當好的權衡)是有一個兩步過程(chainlink也是一個兩步過程),使用者將他們的選擇送出給未來的某個區塊(比如下一個區塊) 並且您使用生成的塊雜湊作為隨機源。請注意,礦工仍然可以自由決定結果(如果激勵足夠大,他們會這樣做)。

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