Blockchain

Blockhash:註冊區塊號

  • June 1, 2020

我正在閱讀來自網站的以下文章: bad randomness

在 Blockhash 的上下文中,作者說:例如,一個好的協議(將隨機試驗制定為“賭注”)如下:

• 接受投注,付款,註冊投注交易的區塊號

• 在以後的交易中,計算較早註冊的區塊號的區塊雜湊,並用它來確定賭注的成功。

有人請指導我註冊的塊號是什麼意思。

祖爾菲。

措辭有點奇怪。你基本上必須儲存一個未來要使用的區塊雜湊編號,例如,只是目前區塊編號 + 2。這個區塊雜湊在交易時是完全未知的,只能在一定程度上受到乙太坊礦工的影響,因此提供了一個很好的-一些協議的足夠隨機性來源。

該方法基本上是:

  1. 將未來的區塊號儲存在最後接受的賭注中。
  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

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