木星链 木星链
Ctrl+D收藏木星链

HTT:以太坊虚拟机是如何运行的?

作者:

时间:1900/1/1 0:00:00

译文出自:登链翻译计划

译者:翻译小组

校对:ARC_hunk

如果您曾尝试过在以太坊上开发智能合约,或者至少了解过相关内容,那么你也许会听说过“EVM”,该术语是“以太坊虚拟机”的缩写。就本质而言,虚拟机在代码和机器之间创建了一层抽象,以此提升软件的可移植性,同时确保应用程序与主机、其他应用之间的隔离性。

创建智能合约

智能合约通常使用Solidity编写,这是一种类似于JavaScript和C的语言。其他合约编程语言则包括Vyper和Bamboo等。在Solidity发布之前,Serpent和Mutan也曾被使用过。

智能合约示例(TheGreeter):

pragmasolidity>=0

}contractGreeterisMortal{/*定义greeting变量,它的类型*/stringgreeting;/*合约运行的时候被执行*/constructor(stringmemory_greeting)public{greeting=_greeting;}/*主函数*/functiongreet()publicviewreturns(stringmemory){returngreeting;}}

Solidity这样的智能合约语言无法直接被EVM所执行,他们需先被编译为低级的机器指令。

操作码

从内部来看,EVM通过一组指令来执行特定任务,这组指令被称为操作码。在本文编写之时,目前共有140个不同的操作码,它们使得EVM图灵完备,即在给定足够资源的前提下,足以完成任何计算。由于操作码为1字节大小,最多只可能有256个字节码。简单起见,我们可将所有操作码归为如下几类:

数据:以太坊上DeFi协议总锁仓量588.3亿美元:据欧科云链OKLink数据显示,截至今日16时,以太坊上DeFi协议总锁仓量约合588.3亿美元,环比上升0.63%。

近24小时锁仓量增幅前三名的DeFi协议分别是TrueFi(+109.56%),Mith(+43.52%)以及Kyber(+8.24%)。

当前锁仓量排名前三的DeFi协议分别是WBTC 76.4亿美元(+2.4%),Maker 69.1亿美元(-0.55%)以及Compound 65亿美元(+2.91%)。[2021/3/17 18:53:01]

栈操作相关的字节码

运算/比较/位操作相关的字节码

环境相关的字节码

内存操作字节码

存储操作字节码

程序计数器相关的字节码

终止相关的字节码

Byzantium分支中的全部操作码,包括Constantinople版本所计划的

字节码

为了有效的保存操作码,操作码会被编码为字节码。每个操作码被赋予一个特定字节。我们来看一下这个字节码:0x6001600101

字节码、拆分后的字节、对应的操作码,还有当前的栈

在执行时,字节码会被拆分为多个字节。位于0x60-0x7f范围内的字节,会以其他方式处理,因为它们包含压栈的数据,这些数据会被添在操作码后面,而不会被当作单独的操作码。

第一个指令是0x60,它的含义是PUSH1。因此,我们知道要压入的数据是1字节长,故我们将下一个字节压入到栈上。现在,栈上已包含了一个数据项,我们来执行下一条指令。由于我们知道0x01属于PUSH指令的一部分,下一条我们要执行的指令是另一个0x60,外加同样的数据。此时栈上包含了两个相同的数据项。最后一个指令是0x01,它对应ADD操作码。这一条指令会从栈上取2个数据项,然后将它们之和压入到栈上,使栈上目前只包含一个数据项:0x02.

Pax Treasury在以太坊网络销毁超1304.8万枚PAX:金色财经报道,Whale Alert数据显示,北京时间10月16日00:52,Pax Treasury在以太坊网络销毁13,048,182枚PAX,销毁哈希为:0xfbc9bd212b4c0a4750d8b25a9a1f5a80bcbb6575d8fdca5ba94db0ef69f3a9c8。[2020/10/16]

合约状态

许多流行的高层编程语言允许用户直接给函数传参,与此不同的是,底层的编程语言则常用栈来给函数传递参数。EVM使用基于256位的寄存器栈,这个栈最近的16个数据项可以被直接访问和操作。整个栈最多保存1024个数据项。

由于这些限制,复杂的操作码会转而使用合约内存来读写数据。然而,内存并非持久化的。当合约执行完成后,内存的内容并不会被保存。因此,栈可以看作函数参数,而内存则可看作声明的变量。

为了能够长久保存数据,并使其可为将来的合约执行所用,我们可以使用存储。合约存储本质上就像是公共数据库,数据可以被外部读取,且无需发送任何交易。但是,比之于写内存,对存储的写入操作则昂贵的多。

合约交互的开销

合约的每次执行,均会在每一个以太坊节点上运行,因此攻击者可以尝试创建那种包含大量计算量的合约,以此来降低网络的速度。为了防止这种攻击发生,每个字节码都有相应的基础gas消耗。此外,一些复杂合约还会收取动态的gas费用。例如,操作码KECCAK256的基础开销是30gas,而其动态开销为6gas/字。比之于简单、直接的指令,计算量高昂的指令会收取更多的gas费用。此外,每笔交易一开始便会收取21000gas。

在执行那些降低状态大小的指令时,gas可以被退还。将一个非零的存储数值设为0,将会退还15000gas;完整的移除一个合约会退还24000gas。仅当合约执行完成之后,才会退还资金,因为合约自己无法执行偿还操作。此外,一笔退款的数额,无法超过当前合约调用所耗费的gas的一半。如果您想对gas有更多了解,您可以阅读这一篇文章,写的很好:什么是Gas?

去中心化预言机网络DOS Network以太坊主网Caelus正式上线:去中心化预言机网络DOS Network以太坊主网Caelus正式上线。DOS Network主网的特性包括:

1. 网络去中心化;

2. 强安全性,实现可验证的随机数引擎的预言机网络及加密签名技术;

3. 实时可验证结果;

4. 高拓展性低成本;

5. 正向奖惩机制,服务网络中完成数据获取或计算任务的诚实节点将获得奖励激励,作恶节点将受到惩罚。

另外,DOS Network的网络浏览器也已上线。[2020/7/11]

注:伦敦分叉中,gas退还机制有所调整,可参考:EIP-3529:减少gas返还。

在部署智能合约的时候,一个常规的交易会被创建,但不会设置地址。此外,一些字节码会被添加到输入数据上,这个字节码充当了构造函数,它会在runtime字节码被拷贝到合约代码前,初始化存储变量。在部署期间,creation字节码仅会运行一次,而runtime字节码会在每一次合约调用时运行。

另一个Solidity合约示例,及部署它所需要的字节码

我们可以把上述字节码拆分成三部分:

构造函数

60806040526001600055348015601457600080fd5b5060358060226000396000f3fe

构造函数将初始值写入存储中,并将runtime字节码拷贝到合约内存中

运行时

6080604052600080fdfe

这部分字节码在合约创建的过程中被写入内存

元数据

a165627a7a723058204e048d6cab20eb0d9f95671510277b55a61a582250e04db7f6587a1bebc134d20029

动态 | 价值550万美元的以太坊多头在BitMEX上清算:金色财经报道,根据分析公司Skew提供的数据,2月26日到2月27日之间,价值550万美元以太坊多头在BitMEX进行了清算。第一轮清算发生在UTC时间2月26日16:00(北京时间2月27日0:00)左右,当时价值300万美元的以太坊多头在BitMEX进行了清算。7个小时后,价值近250万美元的多头头寸被清算。据悉,抛售清算总额为1100万美元,而买入清算总额仅为594万美元[2020/2/28]

Solidity会创建一份元数据文件,它的Swarm哈希会被添加到字节码尾部。Swarm是一个分布式存储平台外,也是内容分发服务,换句话说是一个分布式文件存储系统。尽管Swarm哈希被纳入到了runtime字节码中,它永远不会被EVM解释为操作码,因为它的位置永远不会被执行到。目前,Solidity使用下述格式:

0xa10x65'b''z''z''r''0'0x580x200x000x29

因此,在这个例子,我们可以提取出Swarm的哈希:

4e048d6cab20eb0d9f95671510277b55a61a582250e04db7f6587a1bebc134d2

元数据文件包含了合约的各种信息,比如编译器版本,合约函数等。不幸的是,这是一个实验中的特性,而且并没有很多的合约会公开将元数据文件上传到Swarm网络上。

反编译字节码

为了让字节码更便于阅读,一些项目提供了相应的工具,比如,你可以使用eveem.org或ethervm.io来反编译主网上的合约。不幸的是,由于编译器优化的缘故,原始合约中的一些信息会丢失,比如函数名、事件名等。尽管如此,多数函数名还是可以通过对常用的函数名、事件名称进行暴力枚举来取得。

动态 | 比特大陆以太坊矿机E3算力下降6倍,预计将于4月停止挖矿:据2Miners矿池在2月24日发布的报告称,比特大陆以太坊矿机E3将在4月停止ETH挖矿。据了解,比特大陆的蚂蚁矿机E3曾是世界上最强大的ETH挖矿硬件,据矿池2Miners在2月24日发布的一份报告称,E3将在2020年4月停止以太坊挖矿工作。

2月21日,2Miners开始收到关于E3矿机在ETC pool上性能显著下降的第一个报告,有用户在ETC pool上报告蚂蚁矿机E3挖矿数据显示其算力下降了6倍:从此前宣布的180 MH/s到低至30 MH/s。

经过内部调查,2Miners发现全球的ETC矿池的算力都出现了相同的下降。与此同时,2Miners表示,E3矿机在以太坊矿池上仍然表现良好。该团队立即提出,这个问题可能与有向无环图 (DAG) 有关。DAG文件每个纪元(epoch)都会改变。一个纪元(epoch)是 30000个区块,称为一个挖矿纪元。

2Miners也确认了是DAG文件的增长限制了E3的使用。比特大陆也表示,ASIC矿机E3仍然包含4GB的视频卡,而DAG文件已经接近这个阈值。

比特大陆对此表示:Antminer E3是一个4GB的显卡。E3与ETH算法相关,DDR容量已达上限,E3将无法继续挖矿。意思是估计E3只能挖到 2020 年1月了,然后就不能在继续挖矿了。

根据 2Miners 的计算,Antminer E3将在2020年4月8日左右停止以太坊挖矿。(cointelegraph)[2020/2/25]

合约调用通常需要一个"ABI"(应用程序二进制接口),这是一份描述了所有函数和事件的文档,包含了它们的输入输出信息。当调用合约函数的时候,函数的签名通过对函数名及其输入参数进行哈希并截取前4个字节得到。

Solidity合约示例,及ABI

如上图所示,HelloWorld函数生成的签名哈希是0x7fffb7bd。如果我们想调用这个函数,交易数据的开头就要设置为0x7fffb7bd。函数所需要的参数会按32字节大小,即数据字的大小,添加到交易数据中签名哈希的后面。如果一个参数包含了超过32字节的数据,例如数组或字符串,该参数将被拆分为多个数据字,并添加到输入数据中所有其他参数之后。此外,这些数据字的数目,则会单独编码到一个数据字中,放在具体内容的数据字前面。在这个参数所对应的位置,放入了参数数据字的起始位置。

总结

以太坊为那些使用Solidity和EVM的应用开发者提供了一套去中心化的生态系统。比之于在传统服务器上运行程序,使用智能合约来和EVM交互会昂贵一些,但仍然有很多场景,这些场景中,去中心化要比开销更为重要。如果这篇文章使你对学习开发智能合约产生兴趣,可以看下这篇优秀文章:智能合约入门,深入学习Solidity运行原理。感谢阅读!

参考文章

Wood,G.(2014).Ethereum:AsecuredecentralisedgeneralisedtransactionledgerEthereumFoundation.(2016).SolidityDocumentationSantander,A.,&Arias,L.(2018).DeconstructingaSolidityContractHoward.(2017).DivingIntoTheEthereumVirtualMachine

本翻译由CellNetwork赞助支持。

参考资料

登链翻译计划:https://github.com/lbc-team/Pioneer

翻译小组:https://learnblockchain.cn/people/412

ARC_hunk:https://learnblockchain.cn/people/3904

Solidity:https://github.com/ethereum/solidity

Vyper:https://github.com/ethereum/vyper

Bamboo:https://github.com/cornellblockchain/bamboo

Serpent:https://github.com/ethereum/serpent

Mutan:https://github.com/obscuren/mutan

TheGreeter:https://ethereum.org/en/developers/

图灵完备:https://en.wikipedia.org/wiki/Turing_completeness

什么是Gas?:https://support.mycrypto.com/gas/what-is-gas-ethereum.html

EIP-3529:减少gas返还:https://learnblockchain.cn/article/2529

元数据文件:https://solidity.readthedocs.io/en/v0.5.2/metadata.html

Swarm哈希:https://github.com/ethereum/wiki/wiki/Swarm-Hash

eveem.org:https://eveem.org/

ethervm.io:https://ethervm.io/

4byte.directory:https://www.4byte.directory/

keccak256:https://en.wikipedia.org/wiki/SHA-3

智能合约入门:https://learnblockchain.cn/docs/solidity/solidity-by-example.html

Wood,G.(2014).Ethereum:Asecuredecentralisedgeneralisedtransactionledger:https://ethereum.github.io/yellowpaper/paper.pdf

EthereumFoundation.(2016).SolidityDocumentation:https://solidity.readthedocs.io/en/latest/

Santander,A.,&Arias,L.(2018).DeconstructingaSolidityContract:https://blog.zeppelin.solutions/deconstructing-a-solidity-contract-part-i-introduction-832efd2d7737

Howard.(2017).DivingIntoTheEthereumVirtualMachine:https://blog.qtum.org/ping-into-the-ethereum-vm-6e8d5d2f3c30

CellNetwork:https://www.cellnetwork.io/?utm_souce=learnblockchain

免责声明:作为区块链信息平台,本站所发布文章仅代表作者个人观点,与链闻ChainNews立场无关。文章内的信息、意见等均仅供参考,并非作为或被视为实际投资建议。

本文来源于非小号媒体平台:

登链社区

现已在非小号资讯平台发布105篇作品,

非小号开放平台欢迎币圈作者入驻

入驻指南:

/apply_guide/

本文网址:

/news/10458012.html

免责声明:

1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险

2.本文版权归属原作所有,仅代表作者本人观点,不代表非小号的观点或立场

上一篇:

每周编辑精选WeeklyEditors'Picks

标签:HTTTHETPSDITCHTTLetheanhttps://etherscan.ioUnited Credit Chain

比特币价格热门资讯
区块链:区块链投资深受欢迎的原因

投资领域内针对性更强的区块链投资还是非常受欢迎的,因为其所能够带来的投资收益和投资乐趣都让很多的投资者愿意一试,能够真正在满足投资研究和回报需求的实现上更具其特有的新兴发展特点.

1900/1/1 0:00:00
比特币:加密市场投机过热 ,SHIB 领涨 Meme 板块

Coingecko数据显示,截至10月28日凌晨5时许,比特币的24H最低价在58000美元附近,这是继比特币在10月20日创下67000美元的历史新高后首次大幅下跌,7日最大跌幅为13%.

1900/1/1 0:00:00
SDN:AAX将上线Shiden Network(SDN),充币&理财瓜分10,000SDN

AAX将上线ShidenNetwork(SDN),充币&理财瓜分10,000SDN作者AAXManager一周前已更新亲爱的用户,AAX将上线ShidenNetwork(SDN).

1900/1/1 0:00:00
KEX:BKEX Global 关于ETP专区LINK5S、SAND3S、STORJ3S等9种标的进行份额合并的公告

尊敬的用户:??由于ETP专区部分标的触发了BKEXETP产品份额合并机制。BKEX将在2021年11月2日14:00对ETP专区部分标的进行合并操作,详情如下:合并后新份额的名称、简称、交易对.

1900/1/1 0:00:00
BTC:盘中宝——元宇宙持续火爆;V 神发文探讨城市代币

市场回顾币赢研究院在10月28日文章《盘中宝——Meme板块表现强势,市场投机或已至临界点》中对于大盘的判断依然有效,即年底前基本保持上涨态势.

1900/1/1 0:00:00
EFI:Shambala 向 GameFi 主流游戏迈开“进击”步伐

2021年,游戏大举进入NFT领域,我们可以看到有越来越多的游戏开发团队在积极探索基于区块链技术.

1900/1/1 0:00:00