上一篇中初步介绍了一下EVM的结构,这篇文章主要是介绍solidity高级语言编写的智能合约编译成字节码过程及EVM执行过程
在这之前,为什么理解EVM对我们来说很重要:
1、solidity高级语言编写的智能合约是如何在EVM上执行的
2、理解EVM是如何组织数据、存储和操作的
3、如何编写出更优Gas的智能合约
使用solidity开发出来的合约(人能够理解的)会被编译成上图中右则的字节码(它是一种用16进制表示的编码,是EVM能够理解的语言),EVM在执行的时候实际上是把字节码翻译成上图左边的带有操作指令的汇编码。在EOA在调用合约时,EVM按照解释出来的操作指令顺序执行,直到结束或者遇到错误后停止或者gas不足后中断。
对于人来说我们可以理解一条条的语句,对于EVM来说是怎么理解要执行的那串东西?我们知道EVM是一个虚拟机堆栈机,它是一个运算虚拟机器,只要把要执行的东西丢进去它就能给出对应的结果。
EVM之所以能理解那一串操作,是人为设置了一些预定义指令叫做操作码,有了这个操作码之后,EVM就知道把操作数放入哪些存储位置和如何操作了。
使用1个字节定义了最多256个操作指令,具体可以参考
-
EIP-150 操作码 Gas 成本
定义的操作指令及花费情况
或者到 https://www.evm.codes/?fork=shanghai这里看