揭秘EVM Opcodes

news/2024/5/20 13:54:40/文章来源:https://blog.csdn.net/mutourend/article/details/127304954

1. 引言

本文主要源自Macro团队的Gilbert在ETHNewYork 2022分享 Demystifying EVM Opcodes,同时结合evm.codes来理解。

在这里插入图片描述
学习EVM Opcodes,可成为更好的Solidity工程师。
更好的Solidity工程师,意味着:

  • 1)理解Solidity的设计原理。
  • 2)更好的为low-level code做准备。
  • 3)更深入的理解通用设计模式。
  • 4)更深入的理解智能合约在EVM中的运行机制。

2. 何为虚拟机?

在这里插入图片描述

3. EVM介绍

3.1 EVM中的Opcode

与其它虚拟机采用二进制表示Opcode不同,为便于记忆和可读,EVM的所有Opcode都以单个字节来表示,并附加了人类可读名字。
EVM Opcode的基本语法为:
在这里插入图片描述

3.2 EVM中的Stack

EVM是Stack-Based的,执行完下图前三个指令后,相应stack中的内容见下图左侧:
在这里插入图片描述
SWAP2指令是指将stack中的“a,b,c” 转换为 “c,b,a”:【即“0x03,0x04,0x09” -> “0x09,0x04,0x03”】
在这里插入图片描述
ADD指令是指将stack中的top 2 值pop出来,相加后的结果再push回stack中:【0x04+0x03=0x07】
在这里插入图片描述
CALLER指令是指将 the 20-byte address of the caller account 推送到stack中。该账号为 the account that did the last call (except delegate call)。
在这里插入图片描述
在这里插入图片描述
stack中每个元素最多为32字节。当想要操作大于32字节的数据时,使用stack将非常复杂,此时可以考虑使用memory。

3.3 EVM中的Memory

Memory为在EVM中可访问的另一种数据结构,其是一个非常长的数组,其长度最低为0,最长可为任意值,不过事实上不会是任意长,因随着运行最终会out of gas。不过从技术上来说,未对Memory的长度做限制。

以MSTORE指令(向Memory写入数据)为例,首先往stack中推入某些数据:
在这里插入图片描述
MSTORE指令是指取stack中的top 2值,依次为offset和value值,在memory偏移offset个字节中存入相应的value值。上图中,0x20为offset(32个字节),0x03为value值(32字节):
在这里插入图片描述
MSTORE会从stack中pop出top2的2个值,然后值更新到memory中相应的位置:
在这里插入图片描述
MLOAD指令(从Memory中读取数据)是指取stack的top1为offset,从memory中相应的offset位置开始读取32字节:
在这里插入图片描述
MLOAD指令会从stack中pop顶端值为offset,然后再将从memory中对应offset读取的32字节推入stack中:
在这里插入图片描述
在这里插入图片描述
Memory很便宜,但其仅存在于单笔交易中,若需要跨多笔交易存储,此时需要使用Storage。

3.4 EVM中的Storage

storage操作方式与memory类似,memory很便宜,区块链上的storage非常昂贵,如:

  • 单个SSTORE操作需约2900~20000 gas
  • 单个MSTORE操作仅需约3+ gas

因此非必要不使用storage存储,因其非常昂贵。

memory像一个巨大的数组,而storage像key-value数据库。

4. 更简单的Trim语法表示

Trim为小众语言,但具有更易读特性。
Trim的S-Expressions为:
在这里插入图片描述

5. Solidity Opcodes表示

如Solidity中的原语与Opcode的对应关系类似有:

  • msg.sender->CALLER
  • msg.value->CALLVALUE
  • block.timestamp->TIMESTAMP
  • tx.origin->ORIGIN

在这里插入图片描述
payable为Solidity的feature,若想get paid from a function,需为该函数添加payable关键字。payable不是an evm related concept,而是a solidity related concept。若函数为标记payable关键字,solidity可借此来decide to block your functions from receiving Ether,因此,对应non-payble函数,存在一些粗略等价的opcodes。首先获取CALLVALUE值,判断其是否为0;若CALLVALUE不为0,则跳转到某处来revert该hashtag syntax,相应的hashtag synax在Trim中称为label,label为bytecode中的某个位置,因此很容易跳转到指定位置的代码,而不需要数字节数 或 手工输入相应的数字:
在这里插入图片描述
对于每个未标记payable的函数,都会有以上代码生成。因此,对于标记了payable的函数,不会生成以上代码,从而实际上可减少合约编译出来的code size:
在这里插入图片描述

参考资料

[1] ETHNewYork 2022分享 Demystifying EVM Opcodes

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_589164.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【新手向】Rock5B官方Debian系统设置中文环境(简单设置)和远程桌面连接

一、环境与说明 Rock5B的系统:官方Debian11(2022-10-01版本) 前面的两篇文章都是在2022-09-19版本镜像中操作的,2022-10-01版本内置了中文字体,不要自己下载了。目前Rock5B的硬件版本是v1.42,大概在23年初…

一致性哈希原理

一致性哈希原理 分布式系统将数据分布到不同的节点来存储,比如一个分布式KV(key-value)缓存系统,某个key应该到哪个节点上获得,最直观的方法是使用哈希算法(hash(key)%n),对key进行…

python--绘制WRF模式近地面风场以及辐射

使用python自动化绘制WRF模式输出的风场以及辐射 本脚本主要用来自动化处理WRF模式数据,可以根据自己指定的时间范围以及时间步长绘制相应的数据 1 导入库 import cmaps import numpy as np import glob from netCDF4 import Dataset import matplotlib.pyplot a…

【C++】从零开始的CS:GO逆向分析3——写出一个透视

【C++】从零开始的CS:GO逆向分析3——写出一个透视本篇内容包括:1. 透视实现的方法介绍2. 通过进程名获取进程id和进程句柄3. 通过进程id获取进程中的模块信息(模块大小,模块地址,模块句柄)4. 读取游戏内存(人物ViewMatrix,敌人坐标,敌人生命值,敌人阵营)5. 三维坐标…

Java项目本地部署搭建实战SpringBoot高校宿舍管理系统源码

大家好啊,我是测评君,欢迎来到web测评。 本期给大家带来一套Java开发的SpringBoot高校宿舍管理系统源码。 技术架构 技术框架:SpringBoot2.0.0 Mybatis1.3.2 Mysql5.7 layui运行环境:jdk8 IntelliJ IDEA maven3 宝塔面板 …

触摸屏分类和触摸屏校准原理

一、触摸屏分类 常用触摸屏分两种 1、电阻触摸屏校正原理:导电ITO层及整个电路电阻值会随时间电压等轻微偏移,为了更精确与LCD显示屏上的功能图案相对应,重新校正计算标准位置。不校正可能会线性偏移,好的触摸屏一般无需校正&am…

【面经】360大数据开发面经

30 分钟,不做题。 欢迎点击此处关注公众号,每天分享大数据开发面经 介绍实习项目 会涉及平台开发吗 平时常用的语言 回答了 Java。 Python 用过吗 Java 实现一个单例要注意什么 懒汉式: public class Singleton {private static Sing…

钢铁行业经销商商城系统:完善钢材管控方案,轻松实现控价和防伪

钢铁工业是全球经济发展的核心,也是现代社会可持续发展的核心。根据数据显示,2020年中国钢材产量为13.25亿吨,同比增长9.96%;生铁产量为8.88亿吨,同比增长9.77%;粗钢产量为10.53亿吨,同比增长5.72%。 图片来源&#xf…

网络编程之TCP模型

1. TCP模型 2. socket 最早的socket和消息队列、共享内存、管道一致,只能实现一台主机多个进程间通信,后期加入了tcp/ip协议,使得支持不同主机的进程间通信 socket本质上是一个编程接口给(API),是对TCP/IP协议的封装…

利用表面肌电信号对手部抓取动作分类的新型卷积网络模型

利用表面肌电信号对手部抓取动作分类的新型卷积网络模型 文章目录利用表面肌电信号对手部抓取动作分类的新型卷积网络模型一.相关研究二.材料和方法2.1 数据集2.2 数据预处理2.3 1D-1D-CNN三.实验结果分析四.相关研究对比参考文献一.相关研究 肌电信号号代表肌肉功能的特征&…

ReentrantLock可重入、可打断、锁超时实现原理

述 前面讲解了ReentrantLock加锁和解锁的原理实现,但是没有阐述它的可重入、可打断以及超时获取锁失败的原理,本文就重点讲解这三种情况。 可重入 可重入是指一个线程如果获取了锁,那么它就是锁的主人,那么它可以再次获取这把锁…

神经网络损失函数不下降,神经网络参数优化算法

1、matlab支持向量机预测数据怎么减小相对误差 采用网格搜索法。基于长短时记忆神经网络算法的支持向量机的预测方法,为了保证支持向量机预测结果的准确性减小相对误差,选用网格搜索法对支持向量机参数进行优化处理。为了减小在预测算法中,由…

如何快速制作一个自己心目中的可视化大屏?

从来没有接触过可视化的软件,也没有什么基础,我应该怎么开始学习可视化呢?遇到过不少朋友问:我从来没有接触过可视化的软件,也没有什么基础,我应该怎么开始学习可视化呢? 其实很简单,现在市面上有很多公司研发的可视化软件/编辑网站已经不再像过去一样要求使用者是专业…

linux下挂载新的磁盘

1、前提条件 虚拟机上已经新增了新的磁盘。 物理机上已经接好了新的硬盘。 2、挂载步骤 查看系统磁盘情况。使用以下命令:(如果没出现新增磁盘,重启系统) fdisk -l可以看到新增的磁盘/dev/sdb下还没有进行分区。 对新增的磁…

我终于读懂了设计模式的七大原则。。。

文章目录💥🐒设计模式的目的🐴什么叫单一职责原则?🐤什么叫接口隔离原则?🐫什么叫做依赖倒转原则?🐑什么是里氏替换原则?🐘什么叫开闭原则&#x…

拒绝项目经理沟通崩溃瞬间,驾驭项目复杂性

如何一句话终结和项目经理的聊天?这还需要凭实力?这不是信手拈来的事,分分钟让项目经理怒气值加满、停止沟通。来整两句:  紧急需要不停歇——深夜10点,客户:“这个新需求明天必须上。”  方案最后都是…

多测师肖sir_高级讲师_第2个月第27讲解jmeter性能硬件指标

jmeter性能硬件指标 一、采集硬件指标的工具nmon 1、基本介绍 nmon,帮助在一个屏幕上显示所有重要的性能优化信息,并动态地对其进行更新。 2、收集那些数据: nmon 工具可以为 AIX 和 Linux 性能专家提供监视和分析性能数据的功能&#xff0c…

枚举

目录枚举枚举的定义枚举的使用枚举的常用方法枚举的构造方法枚举的优缺点枚举与反射用反射能拿到枚举的实例对象吗?为什么枚举实现的单例模式是安全的?(面试问题)枚举 枚举的定义 枚举是在JDK1.5以后引入的。主要用途是:将一组常量组织起来…

TRC丨艾美捷TRC N-去羟乙基达沙替尼说明书

艾美捷TRC N-去羟乙基达沙替尼:达沙替尼的代谢产物。用于治疗癌症和免疫疾病。 艾美捷TRC N-去羟乙基达沙替尼化学性质: 目录号D290000 化学名称N-去羟乙基达沙替尼 同义词N-(2-氯-6-甲基苯基)-2-[[2-甲基-6-(1-哌嗪基)-4-嘧啶基]氨基]-5-噻唑甲酰胺&…

【漏洞复现-骑士cms-代码执行】vulfocus/骑士cms_cve_2020_35339

目录 一、靶场环境 1.1、平台: 1.2、知识: 1.3、描述: 二、漏洞验证 2.1、分析 2.4、解题: 一、靶场环境 1.1、平台: Vulfocus 漏洞威胁分析平台 123.58.224.8:57171 123.58.224.8:36168 ​ 123.58.224.8:36168 ​ 1.2、知…