📜  Solidity 中使用 keccak256 的随机数生成器

📅  最后修改于: 2022-05-13 01:55:25.603000             🧑  作者: Mango

Solidity 中使用 keccak256 的随机数生成器

随机数是在具有以下两个强制性条件的序列中出现的数字:

  1. 这些值在设定的间隔内均匀分布。
  2. 人们无法根据过去的输出预测未来的价值。

示例:在下面的示例中,我们创建了一个带有生成随机数函数的合约。以下是要遵循的整个过程的分步说明。

第 1 步:采用now实例、 msg.sender和一个递增的nonce

第 2 步:“打包”输入并使用keccak256()转换为 256 位哈希。

第 3 步:将该散列转换为 uint,然后使用 % 100 仅取最后 2 位数字。这会给我们一个 0 到 99 之间的完全随机数。



Solidity
// Solidity program to
// demonstrate on how
// to generate a random number
pragma solidity ^0.6.6;
 
// Creating a contract
contract GeeksForGeeksRandom
{
 
// Initializing the state variable
uint randNonce = 0;
 
// Defining a function to generate
// a random number
function randMod(uint _modulus) internal returns(uint)
{
   // increase nonce
   randNonce++; 
   return uint(keccak256(abi.encodePacked(now,
                                          msg.sender,
                                          randNonce))) % _
                                          modulus;
 }
}



输入:

100 

输出:

这种方法可能的攻击:



在以太坊中,所有节点都在努力解决问题并验证交易。一旦节点验证它,它就会将它广播到网络。

假设我们创建了一个 DApp,在其中我们抛硬币,正面是获胜的一面。我们使用上述函数来预测正面或反面。如果我正在运行一个节点,我只能将事务发布到我自己的节点而不是共享它。我将运行 randMod函数或硬币翻转函数,直到我愿意并且只有在我获胜后才会共享交易。

解决此问题的一种方法是使用预言机从以太坊区块链外部访问随机数函数。还有其他密码算法和第三方功能可以使用,但它们不安全或应该被审计。