Solidity

一定範圍內的隨機數生成

  • June 29, 2020

我需要在我的智能合約中添加一個隨機數函式。最好使用 Oraclize 和例如 random.org 嗎?這不是彩票,這意味著隨機數生成不需要嚴格的安全性。

回複評論…

雖然你說它不需要高安全性,但我覺得值得一提的是,一個簡單的雜湊函式是可以預測的。例如,keccak256(now)可以通過呼叫您的合約的另一個合約輕鬆計算。通過提前計算,它會提前知道你的雜湊函式會產生什麼。這是有效的,因為在兩種情況下時間都是“現在”(相同)。

拋開可預測性問題不談,您可以將散列函式轉換為 uint,例如uint(keccak256(now)),這將產生一個 0-2^256-1 範圍內的數字。您可以使用除數和偏移量將該數字縮放到所需的範圍和精度。

希望能幫助到你。

更新

縮放是一個通用的程式問題,並不是 Solidity 獨有的。我們將取一個已知範圍的數字並將其調整為另一個範圍。

pragma 堅固性 0.5.1;

contract Randomish {

   uint public constant MAX = uint(0) - uint(1); // using underflow to generate the maximum possible value
   uint public constant SCALE = 500;
   uint public constant SCALIFIER = MAX / SCALE;
   uint public constant OFFSET = 100; 


   // generate a randomish  number between 100 and 600.
   // Warning: It is trivial to know the number this function returns BEFORE calling it. 

   function randomish() public view returns(uint) {
       uint seed = uint(keccak256(abi.encodePacked(now)));
       uint scaled = seed / SCALIFIER;
       uint adjusted = scaled + OFFSET;
       return adjusted;
   }
}

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