# EVM 接口

EVM的接口主要是用来完成创建交易（包括部署合约交易和调用合约交易），估算调用交易需要支付的gas（gas会在执行时，通过支付交易费1:1进行兑换；以及相关查询。

## 1 估算部署交易或者调用交易需要的gas

**调用接口**

```
rpc QueryChain(ChainExecutor) returns (Reply) {}
```

**参数：**

```
message ChainExecutor {
    string driver    = 1;
    string funcName  = 2;
    bytes  stateHash = 3;
    bytes  param     = 4;
    bytes  extra     = 5;
}
message EstimateEVMGasReq {
    string tx     = 1;
    string from   = 2;
}
```

**参数说明：**

| 参数      | 类型   | 是否必填 | 说明                                                         |
| :-------- | :----- | :------- | :----------------------------------------------------------- |
| driver    | bytes  | 是       | 执行器名称, 这里固定为 evm，如果是在平行链上则需要加上前缀，比如user.p.game.evm |
| funcName  | string | 是       | 操作名称, 这里固定为 EstimateGas                             |
| stateHash | bytes  | 否       | 所有交易在对应的执行器执行后写入KVDB中重新计算得到的新state的哈希值 |
| param     | bytes  | 是       | types.Encode(&EstimateEVMGasReq)                             |
| extra     | bytes  | 否       | 扩展字段，用于额外的用途                                     |
| tx        | string | 是       | 部署合约交易或者调用合约交易的序列化后的字符串               |
| from      | string | 是       | 合约交易调用者地址                                           |

**返回数据：**

```
message EstimateEVMGasResp {
    uint64 gas = 1;
}
```

**参数说明：**

| 参数 | 类型   | 说明              |
| :--- | :----- | :---------------- |
| gas  | uint64 | 估算需要的gas数值 |

## 2 创建部署合约交易 CreateDeployTx

程序员小哥哥正在努力研发中…

## 3 创建调用合约交易 CreateCallTx

程序员小哥哥正在努力研发中…

## 4 获取合约地址 CalcNewContractAddr

程序员小哥哥正在努力研发中…

## 5 查询合约地址是否存在 CheckAddrExists

**调用接口**

```
rpc QueryChain(ChainExecutor) returns (Reply) {}
```

**参数：**

```
message ChainExecutor {
    string driver    = 1;
    string funcName  = 2;
    bytes  stateHash = 3;
    bytes  param     = 4;
    bytes  extra     = 5;
}
message CheckEVMAddrReq {
    string addr = 1;
}
```

**参数说明：**

| 参数      | 类型   | 是否必填 | 说明                                                         |
| :-------- | :----- | :------- | :----------------------------------------------------------- |
| driver    | bytes  | 是       | 执行器名称, 这里固定为 evm，如果是在平行链上则需要加上前缀，比如user.p.game.evm |
| funcName  | string | 是       | 操作名称, 这里固定为 CheckAddrExists                         |
| stateHash | bytes  | 否       | 所有交易在对应的执行器执行后写入KVDB中重新计算得到的新state的哈希值 |
| param     | bytes  | 是       | types.Encode(&CheckEVMAddrReq)                               |
| extra     | bytes  | 否       | 扩展字段，用于额外的用途                                     |
| addr      | string | 是       | 被查询的合约地址                                             |

**返回数据：**

```
message CheckEVMAddrResp {
    bool   contract     = 1;
    string contractAddr = 2;
    string contractName = 3;
    string aliasName    = 4;
}
```

**参数说明：**

| 参数         | 类型   | 说明                                   |
| :----------- | :----- | :------------------------------------- |
| contract     | bool   | 合约地址是否存在, 1 为存在, 0 为不存在 |
| contractAddr | string | 合约地址                               |
| contractName | string | 合约名称                               |
| aliasName    | string | 合约别名                               |

## 6 查询合约信息 GetPackData Query GetUnpackData

### 6.1 GetPackData

**调用接口**

```
rpc QueryChain(ChainExecutor) returns (Reply) {}
```

**参数：**

```
message ChainExecutor {
    string driver    = 1;
    string funcName  = 2;
    bytes  stateHash = 3;
    bytes  param     = 4;
    bytes  extra     = 5;
}
message EvmGetPackDataReq {
    string abi          = 1;
    string parameter    = 2;
}
```

**参数说明：**

| 参数      | 类型   | 是否必填 | 说明                                                         |
| :-------- | :----- | :------- | :----------------------------------------------------------- |
| driver    | bytes  | 是       | 执行器名称, 这里固定为 evm，如果是在平行链上则需要加上前缀，比如user.p.game.evm |
| funcName  | string | 是       | 操作名称, 这里固定为 GetPackData                             |
| stateHash | bytes  | 否       | 所有交易在对应的执行器执行后写入KVDB中重新计算得到的新state的哈希值 |
| param     | bytes  | 是       | types.Encode(&EvmGetPackDataReq)                             |
| extra     | bytes  | 否       | 扩展字段，用于额外的用途                                     |
| abi       | string | 是       | 合约abi                                                      |
| parameter | string | 是       | 查询的参数信息                                               |

**返回数据：**

```
message EvmGetPackDataRespose {
    string packData     = 1;
}
```

**参数说明：**

| 参数     | 类型   | 说明                         |
| :------- | :----- | :--------------------------- |
| packData | string | 需要查询的信息 pack 后的数据 |

### 6.2 Query

**调用接口**

```
rpc QueryChain(ChainExecutor) returns (Reply) {}
```

**参数：**

```
message ChainExecutor {
    string driver    = 1;
    string funcName  = 2;
    bytes  stateHash = 3;
    bytes  param     = 4;
    bytes  extra     = 5;
}
message EvmQueryReq {
    string address = 1;
    string input   = 2;
    string caller  = 3;
}
```

**参数说明：**

| 参数      | 类型   | 是否必填 | 说明                                                         |
| :-------- | :----- | :------- | :----------------------------------------------------------- |
| driver    | bytes  | 是       | 执行器名称, 这里固定为 evm，如果是在平行链上则需要加上前缀，比如user.p.game.evm |
| funcName  | string | 是       | 操作名称, 这里固定为 Query                                   |
| stateHash | bytes  | 否       | 所有交易在对应的执行器执行后写入KVDB中重新计算得到的新state的哈希值 |
| param     | bytes  | 是       | types.Encode(&EvmQueryReq)                                   |
| extra     | bytes  | 否       | 扩展字段，用于额外的用途                                     |
| address   | string | 是       | 合约地址                                                     |
| input     | string | 是       | 需要查询的信息 pack 后的数据                                 |
| caller    | string | 是       | 合约部署者地址                                               |

**返回数据：**

```
message EvmQueryResp {
    string address  = 1;
    string input    = 2;
    string caller   = 3;
    string rawData  = 4;
    string jsonData = 5;
}
```

**参数说明：**

| 参数     | 类型   | 说明                         |
| :------- | :----- | :--------------------------- |
| address  | string | 合约地址                     |
| input    | string | 需要查询的信息 pack 后的数据 |
| caller   | string | 合约部署者地址               |
| rawData  | string | 查询到的结果                 |
| jsonData | string | json数据                     |

### 6.3 GetUnpackData

**调用接口**

```
rpc QueryChain(ChainExecutor) returns (Reply) {}
```

**参数：**

```
message ChainExecutor {
    string driver    = 1;
    string funcName  = 2;
    bytes  stateHash = 3;
    bytes  param     = 4;
    bytes  extra     = 5;
}
message EvmGetUnpackDataReq {
    string abi          = 1;
    string parameter    = 2;
    string data         = 3;
}
```

**参数说明：**

| 参数       | 类型   | 是否必填 | 说明                                                         |
| :--------- | :----- | :------- | :----------------------------------------------------------- |
| driver     | bytes  | 是       | 执行器名称, 这里固定为 evm，如果是在平行链上则需要加上前缀，比如user.p.game.evm |
| funcName   | string | 是       | 操作名称, 这里固定为 GetUnpackData                           |
| stateHash  | bytes  | 否       | 所有交易在对应的执行器执行后写入KVDB中重新计算得到的新state的哈希值 |
| param      | bytes  | 是       | types.Encode(&EvmGetUnpackDataReq)                           |
| extra      | bytes  | 否       | 扩展字段，用于额外的用途                                     |
| abi        | string | 是       | 合约abi                                                      |
| methodName | string | 是       | 方法名称                                                     |
| data       | string | 是       | 需要 Unpack 的数据                                           |

**返回数据：**

```
message EvmGetUnpackDataRespose {
    repeated string unpackData     = 1;
}
```

**参数说明：**

| 参数       | 类型     | 说明          |
| :--------- | :------- | :------------ |
| unpackData | []string | Unpack 的数据 |