以太坊学习-以太坊虚拟机(二)

EVM介绍

以太坊虚拟机EVM是智能合约的运行环境

作为区块验证协议的一部分,参与网络的每个节点都会运行EVM。他们会查看正在验证的块中列出的交易,并运行由EVM中的交易触发的代码

EVM不仅是沙盒,而且是完全隔离的,也就是说在EVM中运行的代码时无法访问网络、文件系统和其他进程的,甚至智能合约之间的访问也是受限的

合约以字节的格式存放在区块链上;合约通常以高级语言编写,通过EVM编译器编译为字节码,最终通过客户端上载部署到区块链网络中

EVM和交易

交易可以看作从一个账户发送到另一个账户消息,它可以包含二进制数据和以太币

如果目标账户有代码,代码会在EVM中执行,并以payload作为入参

如果目标账户是零账户,此交易就将创建一个新合约,用来创建合约的交易的payload会被转换为EVM,执行的输出作为合约代码永久存储

EVM和gas

合约被交易触发调用,指令会在全网每个节点上执行:这需要消耗算力成本;

一经创建,每笔交易都按照一定数量的gas预付一笔费用,目的是限制执行交易所需要的工作量和为交易支付手续费

EVM执行交易,gas按照特定规则逐渐消耗

gas price是交易发送者设置一个值,作为发送者预付手续费的单价。如果交易执行后还有剩余,gas会原路返还

EVM数据存储

Storage

        每个账户都有一块持久化的存储空间,将256位字映射到256位字的key-value存储区,相当于合约的数据库

        永久存储在区块链中,由于会永久保存合约状态变量,所以读写gas的开销很大

Memory

        每一次消息调用,合约会临时获取一块干净的内存空间

        生命周期仅为整个方法执行期间,函数调用后回收,因为仅保存临时变量,故读写gas开销较小

Stack

        EVM不是基于寄存器的,而是基于栈的,因此所有的计算都存在Stack上

        存放部分布局值类型变量,几乎免费使用的内存,有数量限制

EVM指令集

        所有的指令都是针对“256位的字”这个基本的数据类型来进行操作

        具备常用的算术、位、逻辑和比较操作,也可以做到有条件和无条件跳转

        合约可以访问当前区块的相关属性,比如他的块高度和时间戳

    委托调用

        一种特殊类型的消息调用

        目标地址的代码将在发起调用的合约上下文中执行,并且msg.sender和msg.value不变

        可以由此实现“库”:可复用的代码可以放在一个合约的存储上,通过委托调用引入相应代码

    合约的创建和自毁

      通过一个特殊的消息调用create calls,合约可以创建其他合约

      合约代码从区块链上移除的唯一方式是合约在合约地址上的执行自毁操作;合约账户上剩余的以太币会发送给指定的目标,然后其存储和代码从状态中被移除

发布了12 篇原创文章 · 获赞 5 · 访问量 5743

猜你喜欢

转载自blog.csdn.net/u010471976/article/details/105029076