死磕以太坊源码分析之EVM指令集

配合以下代码进行阅读:https://github.com/blockchainGuide/

写文不易,给个小关注,有什么问题可以指出,便于大家交流学习。

以下指令集持续更新,最新文章请参考上面

EVM 指令集概念

EVM执行的是字节码。由于操作码被限制在一个字节以内,所以EVM指令集最多只能容纳256条指令。目前EVM已经定义了100多条指令,还有100多条指令可供以后扩展。这100多条指令包括算术运算指令,比较操作指令,按位运算指令,密码学计算指令,栈、memory、storage操作指令,跳转指令,区块、智能合约相关指令等

EVM指令集

算数运算指令集

0x0

	STOP:       "STOP",
ADD: "ADD", //加法运算
MUL: "MUL", //乘法运算
SUB: "SUB", //减法运算
DIV: "DIV", //无符号整除运算
SDIV: "SDIV", //有符号整除运算
MOD: "MOD", //无符号取模运算
SMOD: "SMOD", //有符号取模运算
EXP: "EXP", //指数运算
NOT: "NOT", //从栈顶弹出两个元素,进行比较,
//然后把结果(1表示true,0表示false)推入栈顶。
//其中LT和GT把弹出的元素解释为无符号整数进行比较,
//SLT和SGT把弹出的元素解释为有符号数进行比较,EQ不关心符号
LT: "LT", //无符号小于比较
GT: "GT", //无符号大于比较
SLT: "SLT", //有符号小于比较
SGT: "SGT", //有符号大于比较
EQ: "EQ", // 等于比较 //SZERO指令从栈顶弹出一个元素,判断它是否为0,如果是,则把1推入栈顶,否则把0推入栈顶
ISZERO: "ISZERO", //布尔取反 //SIGNEXTEND指令从栈顶依次弹出k和x,并
//把x解释为k+1(0 <= k <= 31)字节有符号整数,然
//后把x符号扩展至32字节。比如x是二进制10000000,k是0,
//则符号扩展之后,结果为二进制1111…10000000(共249个1)
SIGNEXTEND: "SIGNEXTEND" //符号位扩展

位运算指令集

0x10

	//AND、OR、XOR指令从栈顶弹出两个元素,进行按位运算,然后把结果推入栈顶
AND: "AND",
OR: "OR",
XOR: "XOR", //BYTE指令先后从栈顶弹出n和x,取x的第n个字节并推入栈顶。
//由于EVM的字长是32个字节,所以n在[0, 31]区间内才有意义,
//否则BYTE的运算结果就是0。另外,字节是从左到右数的,因此第0个字节占据字的最高位8个比特
BYTE: "BYTE", //这三条指令都是先后从栈顶弹出两个数n和x,
//其中x是要进行位移操作顶数,n是位移比特数,然后把结果推入栈顶
SHL: "SHL",
//SHR和SAR的区别在于,前者执行逻辑右移(空缺补0),后者执行算术右移(空缺补符号位)
SHR: "SHR",
SAR: "SAR", ADDMOD: "ADDMOD", //MULMOD指令依次从栈顶弹出x、y、z三个数,
//先计算x和y的乘积(不受溢出限制),再计算乘积和z的模,最后把结果推入栈顶
//假定乘积不会溢出,那么MULMOD(x, y, z)等价于x * y % z
MULMOD: "MULMOD",

加密指令集

0x20

SHA3: "SHA3"

关闭状态指令集

0x30

   ADDRESS:        "ADDRESS",
BALANCE: "BALANCE",
ORIGIN: "ORIGIN",
CALLER: "CALLER",
CALLVALUE: "CALLVALUE",
CALLDATALOAD: "CALLDATALOAD",
CALLDATASIZE: "CALLDATASIZE",
CALLDATACOPY: "CALLDATACOPY",
CODESIZE: "CODESIZE",
CODECOPY: "CODECOPY",
GASPRICE: "GASPRICE",
EXTCODESIZE: "EXTCODESIZE",
EXTCODECOPY: "EXTCODECOPY",
RETURNDATASIZE: "RETURNDATASIZE",
RETURNDATACOPY: "RETURNDATACOPY",
EXTCODEHASH: "EXTCODEHASH",

块操作指令集

0x40

	BLOCKHASH:   "BLOCKHASH",
COINBASE: "COINBASE",
TIMESTAMP: "TIMESTAMP",
NUMBER: "NUMBER",
DIFFICULTY: "DIFFICULTY",
GASLIMIT: "GASLIMIT",
CHAINID: "CHAINID",
SELFBALANCE: "SELFBALANCE"

存储和执行指令集

0x50

	POP: "POP",  // 栈顶弹出元素
MLOAD: "MLOAD",
MSTORE: "MSTORE",
MSTORE8: "MSTORE8",
SLOAD: "SLOAD", //先取出栈顶元素x,然后在storage中取以x为键的值(storage[x])存入栈顶
SSTORE: "SSTORE", //存储storage是一个键值存储,可将256位字映射到256位字
JUMP: "JUMP",
JUMPI: "JUMPI",
PC: "PC",
MSIZE: "MSIZE",
GAS: "GAS",
JUMPDEST: "JUMPDEST"

Push指令集

0x60

	// PUSH系列指令把紧跟在指令后面的N(1 ~ 32)字节元素推入栈顶
PUSH1: "PUSH1",
...
PUSH32: "PUSH32", //DUP系列指令复制从栈顶开始数的第N(1 ~ 16)个元素,并把复制后的元素推入栈顶
DUP1: "DUP1",
DUP2: "DUP2",
...
DUP16: "DUP16", //SWAP系列指令把栈顶元素和从栈顶开始数的第N(1 ~ 16)+ 1 个元素进行交换。
SWAP1: "SWAP1",
...
SWAP16: "SWAP16", LOG0: "LOG0",
...
LOG4: "LOG4",

参考

https://mindcarver.cn

https://github.com/blockchainGuide

死磕以太坊源码分析之EVM指令集的更多相关文章

  1. 死磕以太坊源码分析之EVM固定长度数据类型表示

    死磕以太坊源码分析之EVM固定长度数据类型表示 配合以下代码进行阅读:https://github.com/blockchainGuide/ 写文不易,给个小关注,有什么问题可以指出,便于大家交流学习 ...

  2. 死磕以太坊源码分析之EVM动态数据类型

    死磕以太坊源码分析之EVM动态数据类型 配合以下代码进行阅读:https://github.com/blockchainGuide/ 写文不易,给个小关注,有什么问题可以指出,便于大家交流学习. So ...

  3. 死磕以太坊源码分析之EVM如何调用ABI编码的外部方法

    死磕以太坊源码分析之EVM如何调用ABI编码的外部方法 配合以下代码进行阅读:https://github.com/blockchainGuide/ 写文不易,给个小关注,有什么问题可以指出,便于大家 ...

  4. 死磕以太坊源码分析之Kademlia算法

    死磕以太坊源码分析之Kademlia算法 KAD 算法概述 Kademlia是一种点对点分布式哈希表(DHT),它在容易出错的环境中也具有可证明的一致性和性能.使用一种基于异或指标的拓扑结构来路由查询 ...

  5. 死磕以太坊源码分析之p2p节点发现

    死磕以太坊源码分析之p2p节点发现 在阅读节点发现源码之前必须要理解kadmilia算法,可以参考:KAD算法详解. 节点发现概述 节点发现,使本地节点得知其他节点的信息,进而加入到p2p网络中. 以 ...

  6. 死磕以太坊源码分析之rlpx协议

    死磕以太坊源码分析之rlpx协议 本文主要参考自eth官方文档:rlpx协议 符号 X || Y:表示X和Y的串联 X ^ Y: X和Y按位异或 X[:N]:X的前N个字节 [X, Y, Z, ... ...

  7. 死磕以太坊源码分析之Fetcher同步

    死磕以太坊源码分析之Fetcher同步 Fetcher 功能概述 区块数据同步分为被动同步和主动同步: 被动同步是指本地节点收到其他节点的一些广播的消息,然后请求区块信息. 主动同步是指节点主动向其他 ...

  8. 死磕以太坊源码分析之Ethash共识算法

    死磕以太坊源码分析之Ethash共识算法 代码分支:https://github.com/ethereum/go-ethereum/tree/v1.9.9 引言 目前以太坊中有两个共识算法的实现:cl ...

  9. 死磕以太坊源码分析之downloader同步

    死磕以太坊源码分析之downloader同步 需要配合注释代码看:https://github.com/blockchainGuide/ 这篇文章篇幅较长,能看下去的是条汉子,建议收藏 希望读者在阅读 ...

随机推荐

  1. 十四:SpringBoot-配置MongoDB数据库,实现增删改查逻辑

    SpringBoot-配置MongoDB数据库,实现增删改查逻辑 1.MongoDB数据库 1.1 MongoDB简介 1.2 MongoDB特点 2.SpringBoot整合MongoDB 2.1 ...

  2. Tomcat优化,JNDI,连接池,数据源

    什么是JNDI? JNDI的简单应用 什么是连接池技术? 连接池 性能 连接池技术与传统数据库连接的比较 连接池技术工作原理 为什么使用连接池? 传统数据库连接方式的不足 企业级开发需要稳健和高效的数 ...

  3. CF662C Binary Table【FWT】

    CF662C Binary Table 题意: 给出一个\(n\times m\)的\(01\)矩阵,每次可以反转一行或者一列,问经过若干次反转之后,最少有多少个\(1\) \(n\le 20, m\ ...

  4. HDU6661 Acesrc and String Theory【SA】

    Acesrc and String Theory Problem Description Acesrc is a famous string theorist at Nanjing Universit ...

  5. 病毒侵袭持续中 HDU - 3065 AC自动机

    小t非常感谢大家帮忙解决了他的上一个问题.然而病毒侵袭持续中.在小t的不懈努力下,他发现了网路中的"万恶之源".这是一个庞大的病毒网站,他有着好多好多的病毒,但是这个网站包含的病毒 ...

  6. 一篇文章图文并茂地带你轻松学完 JavaScript 设计模式(一)

    JavaScript 设计模式(一) 本文需要读者至少拥有基础的 ES6 知识,包括 Proxy, Reflect 以及 Generator 函数等. 至于这次为什么分了两篇文章,有损传统以及标题的正 ...

  7. 1.ASP.NET Core 管道、中间件、依赖注入

    自定义中间件(基于工厂) 自定义中间件(注入到第三方容器)

  8. Xtrabackup 物理备份

    目录 Xtrabackup 安装 Xtrabackup 备份介绍 Xtrabackup全量备份 准备备份目录 全量备份 查看全量备份内容 Xtrabackup 全量备份恢复数据 删除所有数据库 停止数 ...

  9. HDU - 4722 Good Numbers 【找规律 or 数位dp模板】

    If we sum up every digit of a number and the result can be exactly divided by 10, we say this number ...

  10. codeforces 875B

    B. Sorting the Coins time limit per test 1 second memory limit per test 512 megabytes input standard ...