Blockchain
Blockhash:註冊區塊號
我正在閱讀來自網站的以下文章: bad randomness
在 Blockhash 的上下文中,作者說:例如,一個好的協議(將隨機試驗制定為“賭注”)如下:
• 接受投注,付款,註冊投注交易的區塊號
• 在以後的交易中,計算較早註冊的區塊號的區塊雜湊,並用它來確定賭注的成功。
有人請指導我註冊的塊號是什麼意思。
祖爾菲。
措辭有點奇怪。你基本上必須儲存一個未來要使用的區塊雜湊編號,例如,只是目前區塊編號 + 2。這個區塊雜湊在交易時是完全未知的,只能在一定程度上受到乙太坊礦工的影響,因此提供了一個很好的-一些協議的足夠隨機性來源。
該方法基本上是:
- 將未來的區塊號儲存在最後接受的賭注中。
- 在確定獲勝者函式內部,根據塊編號評估塊雜湊併計算獲勝者。如果沒有人在儲存的塊號之後超過 256 個塊呼叫此函式,也要處理這種情況(請參閱您的另一個問題:Blockhash Minus-256 Problem)。
這是一個使用 ETH 賭博的簡單範例:
mapping (address => uint256) gameWeiValues; mapping (address => uint256) blockHashesToBeUsed; function playGame() public { if (!blockHashesToBeUsed[msg.sender]) { // first run, determine block hash to be used blockHashesToBeUsed[msg.sender] = block.number + 2; // use 2 or more gameWeiValues[msg.sender] = msg.value; return; } uint256 randomNumber = uint256(blockhash(blockHashesToBeUsed[msg.sender])); blockHashesToBeUsed[msg.sender] = 0; gameWeiValues[msg.sender] = 0; // randomNumber = 0 means expired blockhash, player looses if (randomNumber != 0 || randomNumber % 2 == 0) { uint256 winningAmount = gameWeiValues[msg.sender] * 2; msg.sender.transfer(winningAmount); } }
另請參閱https://soliditydeveloper.com/2019-06-23-randomness-blockchain。