主页 > imtoken下载安装 > 以太坊虚拟机的基本介绍

以太坊虚拟机的基本介绍

imtoken下载安装 2023-03-05 06:56:28

为什么以太坊比比特币交易快_以太坊交易信息获取_以太坊在中国交易合法吗

本文简要介绍了以太坊虚拟机的基本要素。 在以后的文章中,我们将向您展示如何安装应用程序调试等基本技术。

1.1 概述

以太坊虚拟机 (EVM) 是以太坊上智能合约的运行时环境。 这不仅仅是一个沙箱,而是一个完全隔离的环境,这意味着代码在 EVM 中运行,无需网络、文件系统或其他进程。 智能合约甚至被限制访问其他智能合约。

1.2 账户

以太坊中有两种账户共享地址空间:外部账户和合约账户。 外部账户由公钥和私钥(如people)控制,合约账户由存储在账户中的代码控制。

为什么以太坊比比特币交易快_以太坊在中国交易合法吗_以太坊交易信息获取

外部账户的地址由公钥确定,而合约地址是在创建智能合约时确定的(这个地址来源于创建者的地址和发送者发送的交易号,这个号码通常称为“nonce” ")

不管账户有没有code(合约账户有code,外部账户没有),这两个账户就等于EVM。

每个账户都有一个key和value长度为256个字符的键值对的持久存储,称为“存储”。

而且,在以太坊中,每个账户都有一个余额(就是以“Wei”为基本单位),可以通过发送方与以太币的交换来改变。

1.3 交易

交易是一个账户与另一个账户之间的信息交换。 它包含二进制数据(消费数据)和以太数据。 如果目标账户包含代码,一旦代码执行,其消费数据将作为输入数据。 如果目标账户是0账户(地址为0的账户),交易会生成一个新的合约。 这个合约的地址不是0,而是来自sender,然后会发送这个账户的交易数据。 该合约消费将被编译成 EVM 二进制代码并执行。 该执行将作为该合约的代码被持久化。 也就是说:为了创建合约,您不需要将实际代码发送给合约,实际上代码是作为合约代码返回的。 1.4 气体

以太坊交易信息获取_为什么以太坊比比特币交易快_以太坊在中国交易合法吗

以太坊上的每笔交易都会收取一定数量的 Gas。 这是为了限制交易数量并为每笔交易支付额外费用。 当EVM执行一笔交易时,交易发起方会按照定义的规则消耗相应的Gas。

交易的创建者定义 gas 价格。 所以交易发起者每次都需要支付gas_price * gas。 如果执行后还有剩余的gas,将以同样的方式返还给交易发起方。 如果任何时候gas被消耗掉以太坊交易信息获取,就会抛出out-of-gas异常,将当前交易的当前状态回滚到初始状态。

1.5 存储、主存和栈

每个账户都有一个持久化的内存空间,称为storage,它是一个key-value键值对,键和值的长度为256位。 无法从合约中枚举存储。 读取存储中的内容需要一定的成本,修改存储中的内容成本更高。 合约只能读取或修改自己的存储。

第二个内存区域称为主内存。 系统为每个消息调用分配一个新的、清空的主内存空间。 主内存是线性的,以字节为粒度寻址。 读取粒度为32字节(256位),写入可以为1字节(8位)或32字节(256字节)。 当访问内存的一个字(256 位)时,主内存会扩展该字的大小。 当主存扩容时,Gas的消耗也必须付出代价,主存的开销会随着其增长(指数增长)而增加。

EVM 不是基于寄存器的,而是基于堆栈的。 所以所有的计算都是在栈上进行的。 最大大小为 1024 个元素,每个元素是一个 256 位字。 对栈的访问仅限于栈顶,如下所示:允许将栈顶的 16 个元素之一复制到栈顶,或者将栈顶与其下方的 16 个元素之一交换。 所有其他操作从堆栈中获取两个(可以是一个或多个,具体取决于操作)元素,并将操作结果放回堆栈。 当然,也可以将栈中的元素放入存储器或主存中,但不能在不移除上层元素的情况下随意访问下层元素。

以太坊在中国交易合法吗_为什么以太坊比比特币交易快_以太坊交易信息获取

1.6 指令集

为了避免不正确的实现带来的一致性问题,EVM的指令集保留了一个最小集。 所有指令都对 256 位字进行操作。 包含常用的算术运算、位运算、逻辑运算和比较运算。 允许有条件和无条件跳转。 并且合约可以访问当前区块的相关属性,例如数字和时间戳。

1.7 消息调用

合约可以调用其他合约或通过消息调用向非合约账户发送以太币。 消息调用类似于交易,它们都有源、目的地、数据有效负载、以太币、gas 和返回数据。 事实上,每个交易都包含一个顶级消息调用,这反过来又可以创建更多的消息调用。

一个合约可以定义内部消息调用需要消耗多少gas,需要预留多少gas。 如果在内部消息调用中发生 out-of-gas 异常,合约将得到通知,并在堆栈上标记错误值。 在这种情况下,该调用的 gas 已耗尽。 在Solidity中,这种情况下调用合约会造成人为异常,抛出堆栈信息。

如上所述以太坊交易信息获取,调用合约将分配一个新的且已清理的主内存,并且可以访问被调用的负载。 调用有效负载时称为 calldata 的单独区域。 调用结束后,返回一个存储在调用主存空间的数据。 这个存储空间是被调用者预先分配的。 调用深度限制为1024。对于更复杂的操作,我们更喜欢使用循环而不是递归。

以太坊交易信息获取_以太坊在中国交易合法吗_为什么以太坊比比特币交易快

1.8 代理调用/代码调用和库

有一种特殊的消息调用称为代理调用。 与消息调用相同,只是目标地址的代码是在调用者的上下文中执行的,并且 msg.sender 和 msg.value 不改变它们的值。 这意味着合约可以在运行时从其他地址动态加载代码。 存储、当前地址和余额都与调用合约有关。 仅从被调用方获取代码。 这允许我们使用 Solidity 中的库。 例如,为了实现复杂的数据结构,可以将可重用代码应用于合约存储。

1.9日志

我们可以将数据存储在专门索引的数据结构中。 该结构映射到块级别的各个位置。 为了实现这个事件,这个特性在 Solidity 中被称为登录。 合约创建后无法访问日志数据。 但他们可以从区块链外部有效地访问这些数据。 因为部分日志数据存储在布隆过滤器上。 我们可以通过一种高效、安全的加密方式查询这些数据。 无需下载整个区块链数据(轻客户端)即可找到这些日志。

1.10 创作

合约可以通过特殊指令创建其他合约。 这些创建调用指令与普通消息调用的唯一区别是:加载数据被执行,结果以代码形式存储,调用者在栈上接收到新合约的地址。

以太坊交易信息获取_以太坊在中国交易合法吗_为什么以太坊比比特币交易快

1.11 自毁

从区块链中删除代码的唯一方法是合约对其地址执行自毁操作。 该账户中剩余的以太币将被发送到指定的目标,存储和代码将从堆栈中移除。

本文由HPB团队整理

首发于王晓明博客

王小明

HPB芯链创始人,巴比特专栏作家。 十余年金融大数据和区块链技术开发经验,参与创建银联大数据。 创作区块链教学视频节目《名说》30余集,编写《以太坊官网文档中文版》,作为主要作者编写《区块链开发指南》,中国区块链社区ID“蓝莲花” “著名的。