揭秘EVM Opcodes

这篇具有很好参考价值的文章主要介绍了揭秘EVM Opcodes。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 引言

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

下图摘自Evolution of the EVM Pt. 1:
揭秘EVM Opcodes,区块链,区块链
揭秘EVM Opcodes,区块链,区块链

一个很赞的理解Opcodes的资料见EVM opcodes谜题:

  • Learning Ethereum Virtual Machine Opcodes With EVM Puzzles(https://github.com/fvictorio/evm-puzzles javascript)

揭秘EVM Opcodes,区块链,区块链
学习EVM Opcodes,可成为更好的Solidity工程师。
更好的Solidity工程师,意味着:

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

2. 何为虚拟机?

揭秘EVM Opcodes,区块链,区块链
在计算机科学中,“bytecode”为一种由源代码编译而来的计算机语言,其运行在虚拟机中。bytecode不是human-readable的,但确实computer-readable的。基本的流程为:
源代码-》bytecode-》Machine code

[Flow]
Source Code -> Bytecode -> Machine Code
Source Code: File written in programming language such as Java, Solidity. 
Bytecode: Compiled from source code and run on Virtual Machine such as JVM, EVM
Machine Code: Code that only operating system can read. Bytecode is converted to Machine Code and finally executed.

3. EVM介绍

3.1 EVM中的Opcode

与其它虚拟机采用二进制表示Opcode不同,为便于记忆和可读,EVM的所有Opcode都以单个字节来表示,并附加了人类可读名字。
EVM Opcode的基本语法为:
揭秘EVM Opcodes,区块链,区块链

3.2 EVM中的Stack

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

3.3 EVM中的Memory

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

以MSTORE指令(向Memory写入数据)为例,首先往stack中推入某些数据:
揭秘EVM Opcodes,区块链,区块链
MSTORE指令是指取stack中的top 2值,依次为offset和value值,在memory偏移offset个字节中存入相应的value值。上图中,0x20为offset(32个字节),0x03为value值(32字节):
揭秘EVM Opcodes,区块链,区块链
MSTORE会从stack中pop出top2的2个值,然后值更新到memory中相应的位置:
揭秘EVM Opcodes,区块链,区块链
MLOAD指令(从Memory中读取数据)是指取stack的top1为offset,从memory中相应的offset位置开始读取32字节:
揭秘EVM Opcodes,区块链,区块链
MLOAD指令会从stack中pop顶端值为offset,然后再将从memory中对应offset读取的32字节推入stack中:
揭秘EVM Opcodes,区块链,区块链
揭秘EVM Opcodes,区块链,区块链
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为:
揭秘EVM Opcodes,区块链,区块链

5. Solidity Opcodes表示

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

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

揭秘EVM Opcodes,区块链,区块链

5.1 Solidity payable关键字

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中的某个位置,因此很容易跳转到指定位置的代码,而不需要数字节数 或 手工输入相应的数字:
揭秘EVM Opcodes,区块链,区块链
对于每个未标记payable的函数,都会有以上代码生成。因此,对于标记了payable的函数,不会生成以上代码,从而实际上可减少合约编译出来的code size:
揭秘EVM Opcodes,区块链,区块链

5.2 Solidity Storage变量

Solidity Storage变量:Storage变量仅在使用时才编译,而不是在定义时就编译。因此,可定义任意多的Storage变量,但事实上并不会给编译的合约增加任何code。原因在于,Storage是key-value数据库,在使用之前,无需对key进行初始化。若想读某个之前从未用过的key,返回相应的值为0,并不为抛错误。
Solidity源代码中的变量为index spaced,与变量名无关。
揭秘EVM Opcodes,区块链,区块链
当做合约升级的时候,应注意不要对合约中的storage变量重新排序,否则影响历史数据与变量的对应关系:
揭秘EVM Opcodes,区块链,区块链

5.3 Solidity Compact Storage变量

若有多个连续storage变量,其size均小于256 bit(对应32byte,为EVM的word size)。Solidity会将这些小于256 bit的Storage变量压缩存储在同一storage slot中:
揭秘EVM Opcodes,区块链,区块链
这样的压缩会带来一定的好处,如下图中,在同一storage slot 0中同时有 x , y x,y x,y变量,因此可用bit mask来选择指定的变量。
揭秘EVM Opcodes,区块链,区块链
采用Compact Storage的主要好处在于:【第一次SLOAD某slot为cold SLOAD,后续对同一slot的SLOAD均为Hot SLOAD。】

  • Cold SLOAD需2100 gas
  • Hot SLOAD需100 gas

5.4 Solidity If Statement

Solidity中的If条件判断:
揭秘EVM Opcodes,区块链,区块链
不过有趣的一点在于,在0.8.x Solidity版本时,x = x + 7;这样的引用并未优化,会对应有一次Hot SLOAD,若想避免这种情况,可引入本地变量来优化:uint tmp=x + 7; x = tmp;

5.5 Solidity External和Internal Function Calls

EVM中的外部调用 与 内部调用非常不同。事实上,EVM并没有内部调用的概念。所谓内部调用和外部调用,是Solidity层面的概念。

外部调用示例:【从FnCalls合约中外部调用token合约的transfer函数】
揭秘EVM Opcodes,区块链,区块链
内部调用示例为:
揭秘EVM Opcodes,区块链,区块链
EVM中的内部调用是指跳转到bytecode中的指定位置执行完成后,再跳转回去。上图为内部调用的伪代码。
下图与上图不同之处在于,内部调用的函数具有参数,即意味着在jump之前,需将函数参数push到stack中:
揭秘EVM Opcodes,区块链,区块链

参考资料

[1] ETHNewYork 2022分享 Demystifying EVM Opcodes
[2] Explaining core system Ethereum Virtual Machine文章来源地址https://www.toymoban.com/news/detail-666787.html

到了这里,关于揭秘EVM Opcodes的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 区块链知识系列 - 系统学习EVM(一)-架构与执行流程

    EVM有一个基于栈的架构,在一个栈中保存了所有内存数值。EVM的数据处理单位被定义为256位的“字”( 这主要是为了方便处理哈希运算和椭圆曲线运算操作 ) 这里所说的内存数值是指那些EVM字节码运行所需要的输入、输出参数数据和智能合约程序运行中所需要的局部变量等

    2024年02月02日
    浏览(40)
  • 供应链与区块链:差异揭秘与融合前景

    《供应链与区块链:差异揭秘与融合前景》 1. 供应链是一种由多个实体组成的网络,这些实体在生产、分销最终产品的过程中相互关联。它涵盖了从原材料采购到最终产品交付给消费者的所有活动。供应链管理的目标是通过优化信息流、物流和资金流,提高效率、降低成本。

    2024年04月13日
    浏览(40)
  • 区块链之光:揭秘Web3时代的创新契机

    随着技术的不断演进,区块链技术正逐渐引领着数字化时代的新潮流。Web3作为区块链技术的核心,为我们带来了前所未有的创新契机。本文将深入揭秘Web3时代的创新契机,探讨区块链之光如何改变我们的世界。 区块链技术作为一种去中心化的分布式账本技术,旨在实现信息

    2024年02月21日
    浏览(60)
  • 揭秘区块链的奥秘:链上智能如何诊断加密生态系统的健康状况

    作者:shelly@footprint.network 数据源:Wallet Profile 在加密市场中,波动是家常便饭。就拿 2022 年来说,像 Terra、Celsius 和 FTX 这样的主要项目相继崩盘,搞得市场一片狼藉。这些情况往往让人措手不及,直到出事才知道出了问题。 与其等到出事才应对,如果能够持续地诊断加密生

    2024年02月02日
    浏览(49)
  • 你真的了解区块链吗?揭秘白名单背后的技术原理(附白名单实战教程)

    文末有实战教程,评论区留下你的实战心得吧! 在我们今天所知道和喜爱的区块链出现之前,默克尔树一直是密码学和计算机科学领域的一个方面。如今,我们开始慢慢看到它们在链上更频繁地 被用于数据验证 的目的。 默克尔树是一种树状结构,树上的每个节点都由一个值

    2024年04月22日
    浏览(46)
  • Ethereum EVM简介

    首先需了解以下基本概念: 1)区块链 2)世界状态 3)账号 4)交易 5)消息 6)去中心化账本 7)原子性和顺序性 以太坊可看成是基于交易的状态机,交易代表了2个状态间的valid arc: 将多笔交易整理打包为区块,区块为package of data: 从状态的角度来看,可将以太坊看成是状

    2023年04月09日
    浏览(39)
  • 了解以太坊虚拟机(EVM)

    以太坊虚拟机(Ethereum Virtual Machine,简称EVM) 是以太坊网络的核心组件之一,它承担着 智能合约执行 的重要任务 智能合约执行环境 :EVM提供了一个安全的环境,用于 执行智能合约 。这些合约以 Solidity 等高级编程语言编写,并在以太坊区块链上部署和执行 不可篡改性 :

    2024年04月26日
    浏览(30)
  • TI毫米波级联雷达评估板 MMWCAS-DSP-EVM 和MMWCAS-RF-EVM

    本文主要是TI的MMWCAS-DSP-EVM 和MMWCAS-RF-EVM 两块评估板的一些使用心得和毫米波雷达的学习总结。 毫米波(mmWave)是一类使用短波长电磁波的特殊雷达技术。通过捕捉反射的信号,雷达系统可以确定物体的距离、速度和角度。毫米波雷达可发射波长为毫米量级的信号,短波长让所需

    2024年01月16日
    浏览(65)
  • 以太坊虚拟机 EVM 的原理

    作者:禅与计算机程序设计艺术 以太坊虚拟机(Ethereum Virtual Machine,简称EVM)是一个运行在以太坊区块链网络上执行智能合约、存储数据的软件。它负责部署、验证、执行智能合约的代码,并维护所有账户信息。用户可以通过发送交易数据到网络中请求执行智能合约。EVM是一

    2024年02月08日
    浏览(47)
  • 以太坊EVM源码分析学习记录

    analysis.go common.go contract.go contracts.go doc.go eips.go errors.go evm.go gas.go gas_table.go instructions.go interface.go interpreter.go jump_table.go logger.go memory.go memory_table.go opcodes.go operations_acl.go stack.go stack_table.go 2020年版本的evm结构 大致流程 编写合约 生成abi 解析abi得出指令集 指令通过opcode来映射成

    2024年02月01日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包