时间:2023-08-15|浏览:200
那么,以太坊虚拟机是什么?请耐心听我一一道来。
第一:以太坊账户 以太坊中有两类账户,一类是外部账户,一类是合约账户。它们之间的区别在于控制权的不同。外部账户由公钥-私钥对控制,而合约账户内部的代码控制。不过,它们共用一个地址空间。外部账户的地址由公钥决定,合约账户的地址在创建合约时确定(根据合约创建者的地址和发出的交易数量计算得到,也称为"nonce")。合约账户中存储了代码,而外部账户没有。除此之外,两类账户几乎没有其他区别。
第二:以太坊交易 一笔交易是从一个账户发送到另一个账户的消息(可以是同一个账户或者零账户)。交易可以携带二进制数据(payload)和以太币。如果目标账户包含代码,该代码将被执行,payload即为输入数据。如果目标账户的地址是0,那么交易将创建一个新的合约。新合约的地址不是0,记住这一点很重要,因为接下来我们会为此进行工作。新合约的地址根据合约创建者的地址和发出的交易数量(也称为nonce)计算得到。创建合约交易的payload将执行的结果将永久存储下来。这意味着,创建合约时,你无需将真正的合约代码发送给合约,只需发送一个能够返回真正代码的代码即可。
第三:Gas Gas可以理解为传统金融业务中的手续费。在以太坊网络中,每笔交易都会收取一定数量的gas,gas的作用是限制执行交易的工作量,并为执行支付费用。在EVM执行交易时,gas将按照特定规则逐渐消耗。交易的创建者设置gasprice(以太币计),发送账户需要预付交易费用=gasprice×gasamount。如果执行结束后还有剩余的gas,这些gas将退还给发送账户。但一旦gas被耗尽(比如变为负值),将触发一个out-of-gas异常,当前调用帧所做的所有状态修改都将被回滚。
第四:存储、主存和栈 每个账户都有一个持久化的存储区域,叫做存储。存储以键值对的形式存在,键和值都是256位长。在合约中,不能直接遍历账户的存储。相对于其他操作,存储的读取操作相对较慢,修改操作更是如此。一个合约只能对自己的存储进行读写。第二个内存区域叫做主存。每次消息调用时,都会有一个新的、被清除过的主存。主存可以逐字节进行寻址,但读写操作以32字节(256位)为单位。操作主存的开销随着其规模增长而增加(平方级别)。
通过以上介绍,可以得出一个重要信息,那就是EVM是基于栈而不是寄存器的虚拟机。所有的计算都在一个叫做栈的区域执行。栈最多可以有1024个元素,每个元素有256位。对栈的访问仅限于栈顶,可以将栈顶的16个元素之一复制到栈顶,或者将栈顶元素和下面的16个元素之一交换。其他操作只能取栈顶的两个元素并将结果压入栈顶。当然,可以将栈上的元素存储到存储或主存中,但无法直接访问栈中指定深度的元素,必须先移除指定深度之上的所有元素才能访问。
用通俗的话来解释以太坊虚拟机,举个例子,想象一下你要装修房子,但装修不是一次性把所有的家具摆放在一起,这样会显得杂乱无章、不美观。为了避免这种情况,我们会提前制定装修计划,或者使用SketchUp软件模拟一个三维空间来绘制规划图纸。
以太坊虚拟机就扮演着这样的角色,它生成现有操作系统的虚拟镜像,具有和真实操作系统完全一样的功能。这为区块链应用的开发提供了一种虚拟的测试环境,因此在区块链的技术支持方面非常重要。
在这个框架下,ORION集成了EVM模块,并使用Substrate的contract pallet来支持Solidity智能合约的开发和运行。这不仅有利于快速开发和调用链上智能合约,也为与以太坊的跨链互操作提供了兼容性。
猎户座在虚拟机和区块链的其他部分之间提供了一个环境无关的接口。通过统一的猎户座API,区块链软件的各个组件可以使用一种通用语言进行通信,而无需学习新技巧。使用猎户座,其他软件组件无需针对特殊情况、异常或奇怪的代码进行编程,猎户座提供了一个稳定、安全且前瞻性的平台来集成不同的虚拟机,而无需了解任何虚拟机的代码。
在猎户座中,可以执行智能合约代码,合约的状态或内存存储在智能合约地址中。可以将这种存储看作是位于智能合约地址上的无限长度的数据结构数组。存储机制确保存储位置不冲突,并遵循一组规则。使用这些规则,可以解码任何合约的状态。要解码存储在映射中的数据,需要了解所使用的密钥。