| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 区块链 -> 智能合约学习笔记--随机数攻击复现 -> 正文阅读 |
|
[区块链]智能合约学习笔记--随机数攻击复现 |
智能合约中的随机数在智能合约中随机数经常被用到,但是我们知道,这些生成的随机数都是伪随机数,当生成的随机数不是足够安全的时候就会产生漏洞。随机数攻击,就是针对智能合约的随机数生成算法进行攻击,预测智能合约的随机数。 目前来说常见的随机数获取有两种:使用区块变量生成随机数,使用预言机来生成随机数。 关于使用区块变量生成随机数,需要用到区块中的函数,并用区块变量作为参数来生成随机数。由区块数据生成的随机数可能会限制普通用户预测随机数的可能性,但是并不能限制矿工作恶,矿工可以决定一个区块是否被广播,他们挖出了一个区块不是一定要广播出去也可以直接扔掉,这个就叫矿工的选择性打包。他们可以持续尝试生成随机数,直至得到想要的结果再广播出去。当然,矿工会这样做的前提是有足够的的利益诱惑,例如可以获得一个很大的奖励池中的奖励,因此使用区块变量获取随机数的方法更适合于一些随机数不属于核心业务的应用。 关于使用预言机来生成随机数,预言机是专门为生成随机数种子而搭建的链上或者链下的服务。除了使用第三方服务,也可以由 DApp 开发商自己搭建一个链下服务提供随机数,这种在链上获取链下数据的场景通常是通过链上预言机的方式来实现。这种方法的安全性依赖第三方,所以同样存在安全风险。 在僵尸工厂中,一开始产生僵尸的dna就属于区块变量生成随机数,根据僵尸的名字进行哈希,最后取合适位数作为该僵尸的dna,这里用到的是Ethereum 内部的一个散列函数keccak256,它用了SHA3版本。一个散列函数基本上就是把一个字符串转换为一个256位的16进制数字。字符串的一个微小变化会引起散列数据极大变化。这在 Ethereum 中有很多应用,但是现在我们只是用它造一个伪随机数。虽然这里生成的随机数并不是真随机数,但是安全性足够了并不会造成什么影响,所以这里可以用这种方法生成随机数。 但是有的合约中,随机数的安全性非常重要,当使用可被预测的随机数种子生成随机数的时候,一旦随机数生成的算法被攻击者猜测到,或通过逆向等其他方式拿到,攻击者就可以根据随机数的生成算法,预测游戏即将出现的随机数,实现随机数预测,达到攻击目的。 示例: 猜数字游戏合约游戏玩家随时可以调用一个合约函数 mint(),这时 mint 函数内会产生一个随机数。 被攻击者合约 Random,一句一注释版本:
在线编译器进行编译、部署 攻击者合约 Attack可以看出,这个游戏是必须要求生成的随机数是不可预测的。 攻击目标合约函数 attack(address _random) ,参数是攻击目标合约的地址
攻击合约者 Attack 调用目标合约 Random 的方法时,由于两者处于同一个区块,所以当前区块的 difficulty 和 timestamp 在两个合约中完全相同。于是,攻击者合约 Attack 使用相同的算法,预先计算出随机数,判断能否中奖。如果能够中奖,再调用目标合约 Random,那么肯定能够得到奖励。如果不能中奖,就等待几秒钟,当区块链的下一个区块生成时,再进行测试。 所以,攻击者合约能够事先预知结果,最终会把奖池撸光。 部署实验的时候可以先不进行循环,代码可以改为
编译部署随机数游戏,并在奖池中存入1个ether 因为不是循环,所以又可能会发生几种情况, 最后一种情况是,奖池中的币已经被取完 参考:http://www.codebaoku.com/smartcontract/smartcontract-random.html |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/26 20:59:45- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |