Cover photo

智能合约如何在以太坊虚拟机中运行

智能合约如何在以太坊虚拟机中运行

1.什么是智能合约

  • 一段代码集合(类似与java)

    • java 通过 Java虚拟机将代码解释字节,进行执行

    • eth 则是通过 以太坊虚拟机运行

  • 2.智能合约有自己的地址(账户)

  • 3.在事件的驱使下,自动的完成一些早已经定义好的功能

2.ETH虚拟机(EVM)

在区块链上,用户通过运行部署在区块链上的合约,完成需要共识的操作。以太坊虚拟机,是智能合约代码的执行器。

  • 1.当智能合约被编译成二进制文件后,被部署到区块链上。

  • 2.用户通过调用智能合约的接口,来触发智能合约的执行操作。

  • 3.EVM执行智能合约的代码,修改当前区块链上的数据(状态)。

  • 4.被修改的数据,会被共识,确保一致性。

  • 这里是先执行智能合约,然后对于结果进行共识,达成一致性

EVMC:Ethereum Client-VM Connector API

  • 新版本的以太坊,EVM与节点的交互,抽象出EVMC接口标准

  • 通过EVMC,节点可以对接多种虚拟机,而不仅限于传统的基于solidity的虚拟机。

    • 优势:实现多种类的虚拟机连接

既然是接口标准,那么都有哪些标准?

1.EVMC接口

  • 定义的调用接口

    • Instance接口:节点调用EVM的接口

    • Callback接口:EVM回调节点的接口

EVM本身不保存状态数据,节点通过instance接口操作EVM,EVM反过来,调Callback接口,对节点的状态进行操作。

EVMC
EVMC

Instance 接口

定义了节点对虚拟机的操作,包括创建,销毁,设置等。

接口定义在evmc_instance(evmc.h)中

  • abi_version

  • name

  • version

  • destroy

  • execute

  • set_tracer

  • set_option

Callback接口

定义了EVM对节点的操作,主要是对state读写、区块信息的读写等。

接口定义在evmc_context_fn_table(evmc.h)中。

  • evmc_account_exists_fn account_exists

  • evmc_get_storage_fn get_storage

  • evmc_set_storage_fn set_storage

  • evmc_get_balance_fn get_balance

  • evmc_get_code_size_fn get_code_size

  • evmc_get_code_hash_fn get_code_hash

  • evmc_copy_code_fn copy_code

  • evmc_selfdestruct_fn selfdestruct

  • evmc_call_fn call

  • evmc_get_tx_context_fn get_tx_context

  • evmc_get_block_hash_fn get_block_hash

  • evmc_emit_log_fn emit_log

solidity 编译生成的二进制文件就是 EVM的指令集合