WTF Solidity 合约宁静: S07. 坏随机数

 空投币   2022-11-12  来源:互联网  0 条评论
优质活动 币圈快讯 平台公告 行情分析
最新羊毛 最新空投 链圈挖矿 活动线报
新币上市 币圈空投 国外项目 币链屋
提醒:本站内容均转自网络,仅用于开发者下载测试,请明辨风险,若涉资金安全及隐私,请谨慎!谨慎!再谨慎!一切风险自担,涉及资金交易及个人隐私务必小心并远离,切记千万别投资,勿上当受骗。《本站免责申明》

我迩来正在从新学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讲:伪随机数。

坏随机数案例

上面咱们练习一个有坏随机数马脚的 NFT 合约: BadRandomness.sol。

contractBadRandomnessisERC721{uint256totalSupply;//组织函数,初始化NFT合集的称号、代号constructor()ERC721("",""){}//铸造函数:当输入的luckyNumber等于随机数时才华mintfunctionluckyMint(uint256luckyNumber)external{uint256randomNumber=uint256(keccak256(abi.encodePacked(blockhash(block.number-1),block.timestamp)))%100;//getbadrandomnumberrequire(randomNumber==luckyNumber,"Betterlucknexttime!今天1早上");_mint(msg.sender,totalSupply);//minttotalSupply++;}}

它有一个主要的铸造函数 luckyMint(),用户挪用时输入一个 0-99 的数字,假设以及链上天生的伪随机数 randomNumber 相配,便可铸造运气 NFT。伪随机数利用 blockhash 以及 block.timestamp 声称。这个马脚正在于用户也许完善预计天生的随机数并铸造NFT。

上面咱们写个打击合约 Attack.sol。

contractAttack{functionattackMint(BadRandomnessnftAddr)external{//提早算计随机后天3晚上数uint256luckyNumber=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 自带的 Remix VM没有支柱 blockhash函数,所以你须要将合约摆设到以太坊测试链上施行复现。

摆设 BadRandomness 合约。

摆设 Attack 合约。

将 BadRandomness 合约地方算作参数传入到 Attack 合约的 at明天2下午tackMint() 函数并挪用,告竣打击。

挪用 BadRandomness 合约的 balanceOf 检察Attack 合约NFT余额,确认打击乐成。

小心方式

咱们常常利用预言机项目供给的链下随机数来小心这类马脚,比如 Chainlink VRF。这类随机数从链下天生,然后上传到链上,进而保险随机数弗成预计。更多先容也许赏玩 WTF Solidity极简教程 第39讲:伪随机数。

归纳

这一讲咱们先容了坏随机数马脚,并先容了一个简捷的小心方式:利用预言机项目供给的链下随机数。NFT 以及 GameFi 项目方应避免利用链上伪随机数施行抽奖,以防被黑客运用。

推特:@0xAA_Science|@WTFAcademy_

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

一切代码以及教程开源正在github:github.com/AmazingAng/WTFSolidity

起因:bress

本文地址:http://bilianwu.com/90236.html
版权声明:项目均采集于互联网, 空投币 无法审核全面,且希望大家能赚钱,请谨慎切勿上当受骗!
温馨提示:★★★天上真会掉馅饼!天道酬勤,都是机会!不错过每个空投糖果!真假难以辨认,尽量0撸!
重要提醒:本站内容均转自互联网,请明辨各个项目风险,不构成投资建议,如涉及资金交易,请谨慎操作与自担风险!
《新人必看》 《本站免责申明》

评论已关闭!