Randomness

未來的區塊雜湊是否可以作為 RNG?

  • June 30, 2017

假設我想簽訂一份賭博契約。任何人都可以呼叫該createWager函式來創建一個新的賭注來擲硬幣。當他們獲勝時,為了收取投注的款項,他們必須呼叫該函式,該函式使用RNG 呼叫collectPayment後 2 個塊的塊雜湊。createWager只有他們贏得了硬幣翻轉,才會collectPayment將錢寄給發件人。這是否可以以任何方式預測?

範常式式碼:

contract Random {
   // Generates a random number from 0 to max based on the last block hash.
   function getRand(uint blockNumber, uint max) constant internal returns(uint) {
       return(uint(sha3(block.blockhash(blockNumber))) % max);
   }
}
function collectPayment() {
   uint256 blockDepth = block.number - wagers[wager_owner].creationBlockNumber;
   if (blockDepth > waitTimeBlocks) {
       // waitTimeBlocks has passed, resolve and payout this wager.
       uint256 payoutBlock = wagers[wager_owner].creationBlockNumber + waitTimeBlocks - 1;
       uint randNum = getRand(payoutBlock, 10000);
       if (randNum < payoutOdds) {
           // Wager wins, payout wager.
           uint256 winnings = safeMult(wagers[wager_owner].wagerWei, 2);
           wagers[wager_owner].active = false;
           wagers[wager_owner].sender.send(winnings))
       } else {
           // Wager loses, disable wager.
           wagers[wager_owner].active = false;
       }
   }

是和不是。使用區塊雜湊作為熵的來源總是存在一些風險——如果賭注的價值遠大於區塊獎勵,礦工可能會稍微博弈一下系統,只要他們挖了一個區塊就丟棄它並沒有給他們一個有利的數字。

另一個複雜之處是,您必須確保collectPayment在“未來”塊的 256 個塊內呼叫該方法——如果不是,塊雜湊將始終返回 0,這也使得結果非常具有可玩性。

如果您對這些風險沒問題(例如,可以對後一種情況進行懲罰),那麼是的,這些可以用作熵的來源。

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