网易首页 > 网易号 > 正文 申请入驻

识链大学|智能合约开发入门第三步:认识以太坊虚拟机EVM

0
分享至

概述

以太坊虚拟机 EVM 是智能合约的运行环境。它不仅是沙盒封装的,而且是完全隔离的,也就是说在 EVM 中运行代码是无法访问网络、文件系统和其他进程的。甚至智能合约之间的访问也是受限的。

账户

以太坊中有两类账户(它们共用同一个地址空间):外部账户由公钥-私钥对(也就是人)控制;合约账户由和账户一起存储的代码控制.

外部账户的地址是由公钥决定的,而合约账户的地址是在创建该合约时确定的(这个地址通过合约创建者的地址和从该地址发出过的交易数量计算得到的,也就是所谓的“nonce”)

无论帐户是否存储代码,这两类账户对 EVM 来说是一样的。

每个账户都有一个键值对形式的持久化存储。其中 key 和 value 的长度都是256位,我们称之为存储。

此外,每个账户有一个以太币余额(balance)(单位是“Wei”),余额会因为发送包含以太币的交易而改变。

交易

交易可以看作是从一个帐户发送到另一个帐户的消息(这里的账户,可能是相同的或特殊的零帐户,请参阅下文)。它能包含一个二进制数据(合约负载)和以太币。

如果目标账户含有代码,此代码会被执行,并以 payload 作为入参。

如果目标账户是零账户(账户地址为0),此交易将创建一个新合约。 如前文所述,合约的地址不是零地址,而是通过合约创建者的地址和从该地址发出过的交易数量计算得到的(所谓的“nonce”)。 这个用来创建合约的交易的 payload 会被转换为 EVM 字节码并执行。执行的输出将作为合约代码被永久存储。这意味着,为创建一个合约,你不需要发送实际的合约代码,而是发送能够产生合约代码的代码。

Gas

一经创建,每笔交易都收取一定数量的gas,目的是限制执行交易所需要的工作量和为交易支付手续费。EVM 执行交易时,gas 将按特定规则逐渐耗尽。

gas price是交易发送者设置的一个值,发送者账户需要预付的手续费=gas_price*gas。如果交易执行后还有剩余, gas 会原路返还。

无论执行到什么位置,一旦 gas 被耗尽(比如降为负值),将会触发一个 out-of-gas 异常。当前调用帧(call frame)所做的所有状态修改都将被回滚。

译者注:调用帧(call frame),指的是下文讲到的EVM的运行栈(stack)中当前操作所需要的若干元素。

存储,内存和栈

每个账户有一块持久化内存区称为存储。 存储是将256位字映射到256位字的键值存储区。 在合约中枚举存储是不可能的,且读存储的相对开销很高,修改存储的开销甚至更高。合约只能读写存储区内属于自己的部分。

第二个内存区称为内存,合约会试图为每一次消息调用获取一块被重新擦拭干净的内存实例。 内存是线性的,可按字节级寻址,但读的长度被限制为256位,而写的长度可以是8位或256位。当访问(无论是读还是写)之前从未访问过的内存字(word)时(无论是偏移到该字内的任何位置),内存将按字进行扩展(每个字是256位)。扩容也将消耗一定的gas。 随着内存使用量的增长,其费用也会增高(以平方级别)。

EVM 不是基于寄存器的,而是基于栈的,因此所有的计算都在一个被称为栈(stack)的区域执行。 栈最大有1024个元素,每个元素长度是一个字(256位)。对栈的访问只限于其顶端,限制方式为:允许拷贝最顶端的16个元素中的一个到栈顶,或者是交换栈顶元素和下面16个元素中的一个。所有其他操作都只能取最顶的两个(或一个,或更多,取决于具体的操作)元素,运算后,把结果压入栈顶。当然可以把栈上的元素放到存储或内存中。但是无法只访问栈上指定深度的那个元素,除非先从栈顶移除其他元素。

指令集

EVM的指令集量应尽量少,以最大限度地避免可能导致共识问题的错误实现。所有的指令都是针对"256位的字(word)"这个基本的数据类型来进行操作。具备常用的算术、位、逻辑和比较操作。也可以做到有条件和无条件跳转。此外,合约可以访问当前区块的相关属性,比如它的编号和时间戳。

消息调用

合约可以通过消息调用的方式来调用其它合约或者发送以太币到非合约账户。消息调用和交易非常类似,它们都有一个源、目标、数据、以太币、gas和返回数据。事实上每个交易都由一个顶层消息调用组成,这个消息调用又可创建更多的消息调用。

合约可以决定在其内部的消息调用中,对于剩余的gas,应发送和保留多少。如果在内部消息调用时发生了out-of-gas异常(或其他任何异常),这将由一个被压入栈顶的错误值所指明。此时,只有与该内部消息调用一起发送的gas会被消耗掉。并且,Solidity中,发起调用的合约默认会触发一个手工的异常,以便异常可以从调用栈里“冒泡出来”。 如前文所述,被调用的合约(可以和调用者是同一个合约)会获得一块刚刚清空过的内存,并可以访问调用的payload——由被称为 calldata 的独立区域所提供的数据。调用执行结束后,返回数据将被存放在调用方预先分配好的一块内存中。 调用深度被限制为 1024 ,因此对于更加复杂的操作,我们应使用循环而不是递归。

委托调用/代码调用和库

有一种特殊类型的消息调用,被称为委托调用(delegatecall)。它和一般的消息调用的区别在于,目标地址的代码将在发起调用的合约的上下文中执行,并且msg.sender和msg.value不变。 这意味着一个合约可以在运行时从另外一个地址动态加载代码。存储、当前地址和余额都指向发起调用的合约,只有代码是从被调用地址获取的。 这使得 Solidity 可以实现”库“能力:可复用的代码库可以放在一个合约的存储上,如用来实现复杂的数据结构的库。

日志

有一种特殊的可索引的数据结构,其存储的数据可以一路映射直到区块层级。这个特性被称为日志(logs),Solidity用它来实现事件(events)。合约创建之后就无法访问日志数据,但是这些数据可以从区块链外高效的访问。因为部分日志数据被存储在布隆过滤器(Bloom filter)中,我们可以高效并且加密安全地搜索日志,所以那些没有下载整个区块链的网络节点(轻客户端)也可以找到这些日志。

创建

合约甚至可以通过一个特殊的指令来创建其他合约(不是简单的调用零地址)。创建合约的调用create calls和普通消息调用的唯一区别在于,负载会被执行,执行的结果被存储为合约代码,调用者/创建者在栈上得到新合约的地址。

自毁

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

如果你想学习更多关于区块链的技术内容,可以持续关注我们。

国内领先的Web3.0倡导者

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
大S丑态曝光!具俊晔公布妻子居家状态,随意睡地板不顾形象

大S丑态曝光!具俊晔公布妻子居家状态,随意睡地板不顾形象

青芳草
2024-07-02 16:24:11
市花白玉兰没存在感?要逆袭了!上海将建一座市级公园,“优先考虑选址在中心城区”

市花白玉兰没存在感?要逆袭了!上海将建一座市级公园,“优先考虑选址在中心城区”

上观新闻
2024-07-03 22:26:11
太心酸了!就业形势有多严峻?网友:已经颠成我不敢想象的样子了

太心酸了!就业形势有多严峻?网友:已经颠成我不敢想象的样子了

时尚的弄潮
2024-06-28 00:45:46
勒庞:当我上台时,我将在整个法国禁止戴头巾

勒庞:当我上台时,我将在整个法国禁止戴头巾

桂系007
2024-07-03 17:33:39
中超乱了套!足协新决定,2-1战果悬了,前2名排名或生变

中超乱了套!足协新决定,2-1战果悬了,前2名排名或生变

体坛老帽
2024-07-04 11:37:49
大疆跨界首发 DJI Avinox 自行车电助力系统,续航可达 157 公里

大疆跨界首发 DJI Avinox 自行车电助力系统,续航可达 157 公里

IT之家
2024-07-03 15:56:51
比亚迪:2024年6月新能源车销量为34.17万辆

比亚迪:2024年6月新能源车销量为34.17万辆

南方都市报
2024-07-01 22:18:22
2024年,公积金终于从12%降到了5%,真的太棒了!

2024年,公积金终于从12%降到了5%,真的太棒了!

楚楚聊职场
2024-07-03 09:19:03
女生私处「小花瓣」长什么样,才正常?

女生私处「小花瓣」长什么样,才正常?

喜马拉雅主播暮霭
2024-06-09 13:13:48
“简直是禽兽”,湖南农民做大便改道手术,出院后对医生破口大骂

“简直是禽兽”,湖南农民做大便改道手术,出院后对医生破口大骂

忠于法纪
2024-06-28 18:50:01
网上发表不实言论,5人被处罚

网上发表不实言论,5人被处罚

蓝鲸探长
2024-07-03 23:48:30
2024年失业潮到底有多可怕

2024年失业潮到底有多可怕

景来律师
2024-06-22 00:09:30
刚刚!重磅利好!

刚刚!重磅利好!

券商中国
2024-07-04 07:47:20
太阳报:西蒙尼被拍到戴着护膝在伊维萨岛度假

太阳报:西蒙尼被拍到戴着护膝在伊维萨岛度假

直播吧
2024-07-04 10:04:09
从三上悠亚下海,看近些年INS走红的“港区女子”生态

从三上悠亚下海,看近些年INS走红的“港区女子”生态

BB姬
2024-07-03 22:08:34
招工压力太大?网传苏州某公司要求从国内挖掘人力去越南做普工…

招工压力太大?网传苏州某公司要求从国内挖掘人力去越南做普工…

火山诗话
2024-07-03 06:32:15
突然失速!全国唯一的“负数”,这个大省怎么了?

突然失速!全国唯一的“负数”,这个大省怎么了?

智谷趋势
2024-07-03 20:36:29
美大选一夜生变!下任总统板上钉钉?拜登终于表态,最大赢家曝光

美大选一夜生变!下任总统板上钉钉?拜登终于表态,最大赢家曝光

好笑娱乐君每一天
2024-07-03 17:54:42
原来新冠疫情已被写进历史书了!128个字讲述3年,家长们五味杂陈

原来新冠疫情已被写进历史书了!128个字讲述3年,家长们五味杂陈

户外阿毽
2024-06-14 22:50:19
朝鲜出兵乌克兰正式参战?派出2万大军开赴前线,战斗力远超乌军

朝鲜出兵乌克兰正式参战?派出2万大军开赴前线,战斗力远超乌军

谈芯说科技
2024-07-02 20:21:55
2024-07-04 13:32:49
识链科技
识链科技
国内领先的Web3倡导者
38文章数 2关注度
往期回顾 全部

科技要闻

何小鹏第三次闯入险滩

头条要闻

知了猴大量出现不少人已经"行动" 有人报价800元/公斤

头条要闻

知了猴大量出现不少人已经"行动" 有人报价800元/公斤

体育要闻

我不用当体育老师了,我去踢欧洲杯了!

娱乐要闻

胡歌打败范伟,又一个内娱黑幕?

财经要闻

理想裁员闹笑话,蔚来裁员闹风波?

汽车要闻

巴黎4S店价格对比 同款车型中国售价打对折

态度原创

房产
健康
时尚
手机
公开课

房产要闻

海南楼市第二轮新政潮开启!这次救市的药,来得更猛!

人类为何至今无法攻克渐冻症?

把通勤装穿出好质感,套路很easy

手机要闻

小米科技暑促季雪糕派对开启!20万根雪糕免费送

公开课

连中三元是哪三元?

无障碍浏览 进入关怀版