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

By [Fun](https://paragraph.com/@fun-6) · 2023-06-16

---

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

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](https://storage.googleapis.com/papyrus_images/6b77fb38d57ec6d75d123d193245bda0041d7394fe6296e78fd0717f2d1c6e24.png)

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的指令集合

---

*Originally published on [Fun](https://paragraph.com/@fun-6/bool6FAxleQTnwhHzlGe)*
