Randomness
未來的區塊雜湊是否可以作為 RNG?
假設我想簽訂一份賭博契約。任何人都可以呼叫該
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,這也使得結果非常具有可玩性。如果您對這些風險沒問題(例如,可以對後一種情況進行懲罰),那麼是的,這些可以用作熵的來源。