主页 > imtoken钱包安卓版下载步骤 > 以太坊虚拟机(EVM)区块链技术分享

以太坊虚拟机(EVM)区块链技术分享

以太坊是交易驱动的账户状态机模型,那么我们先从账户说起。

以太坊账户又分为外部拥有账户和合约账户。 账户状态包括4个属性:Nonce、Balance、StorageRoot、CodeHash。

其中区块链技术来源于以太坊,Nonce为序号,表示该账户创建了多少笔交易或合约。 对于每一次交易或创建,序列化都会加1,可以有效防止重放攻击。

余额是账户有多少余额。

StorageRoot 和 CodeHash 只对合约账户有效。 StorageRoot是一棵MPT树的根哈希,将合约存储的数据组织成树状结构,便于存在性证明和寻址。

CodeHash 存储合约的 EVM(以太坊虚拟机)代码的哈希值。

除了CodeHash,其他的我们都已经详细讲过了,所以这篇文章就讲一下CodeHash。 顾名思义,理解CodeHash主要是理解EVM(Ethereum Virtual Machine)。 首先申明,因为我们的目的不是编程,所以我们学习EVM也只是尝尝(关键是我了解的不多。。。)。

虚拟机就是虚拟计算机,以太坊以软件的形式实现了虚拟机分布在各个节点上。 每个节点上的虚拟机都是一样的,也就是说同一条指令进入虚拟机,结果是一样的。 所以可以说以太坊是用区块链实现的世界计算机。

当然,出于安全考虑,这个虚拟机在节点上是完全隔离的,是一个完全独立的“沙箱”。 虚拟机的作用是执行以太坊智能合约,也就是智能合约运行的环境。

对于整个以太坊系统来说,EVM其实就是一个函数。 智能合约的部署和调用是由交易驱动的。 当有这样的需求时,交易会调用EVM函数,然后EVM会一条条执行相关指令。

EVM 和比特币的脚本系统一样,也是以栈的方式实现的。 堆栈可以参考0627的文章。EVM的堆栈深度限制为1024层,也就是说堆栈最多可以叠加1024条数据,每个堆栈项的数据长度为32字节,这与我们在上一篇文章中提到的合约账户的数据存储长度相匹配。 因此,大家把以太坊虚拟机称为图灵完备的256位虚拟机。

EVM 有自己的字节码,每条指令都是一个字节。 当然,我们在写智能合约的时候,不会直接使用字节码,因为人类阅读起来太难了。 我们通常使用类似于solidity的高级语言,然后通过编译器将高级语言转换成EVM函数。 可读的字节码。

最后,让我们看一下最简单的指令,看看EVM是如何执行的。

这条指令的高级语言形式是这样的:

uint256 x = 1

这条指令的意思就是定义一个uint256类型的数据x区块链技术来源于以太坊,并赋值1,就是这么简单的事情。

但是这条指令编译后,到了EVM就变成了一堆指令(方框是注释):

推(0x1)

将1压入栈中,这个1就是要赋值的1

推(0x0)

将 0 压入堆栈。 这个0表示数据x会存储在合约账户数据存储的位置0(见上一篇)。这两句执行完后,栈中从上到下会有0和1两条数据。

dup2

在栈中从上往下复制第二项,所以此时栈从上往上有1、0、1三个数据

交换 1

交换栈顶的两项数据。 此时栈从上到下依次存储0、1、1。

商店

从栈顶开始倒数,将第二项数据存入第一项数据标识的位置,同时将这两项数据出栈。 这里是把数据1存到位置0,因为x已经绑定到位置0,所以x=1的赋值就完成了。 此时栈中只剩下一层数据:1

流行音乐

丢弃栈顶的数据,栈变空,等待下一条指令的执行

其实仔细一看,发现dup2、swap1、pop这三个指令完全可以省略,效果是一样的。 不清楚编译后为什么要用这种多余的方法,可能还有其他原因。