# 挖矿接口

代码位置: `github.com/33cn/plugin/plugin/dapp/ticket/proto`

## 1 获取执行器地址 ConvertExectoAddr

迁移到[执行器接口](../grpcAPI/executorAPI.md)

## 2 绑定挖矿地址 CreateBindMiner

**调用接口**

```
rpc CreateBindMiner(ReqBindMiner) returns (ReplyBindMiner) {}
```

**参数：**

```
message ReqBindMiner {
    string bindAddr     = 1;
    string originAddr   = 2;
    int64  amount       = 3;
    bool   checkBalance = 4;
}
```

**参数说明：**

| 参数         | 类型   | 是否必填 | 说明                    |
| :----------- | :----- | :------- | :---------------------- |
| bindAddr     | string | 是       | 挖矿绑定地址            |
| originAddr   | string | 是       | 原始地址                |
| amount       | int64  | 是       | 用于购买ticket的bty数量 |
| checkBalance | bool   | 是       | 是否进行额度检查        |

**返回数据：**

```
message ReplyBindMiner {
    string txHex = 1;
}
```

**参数说明：**

| 参数  | 类型   | 说明               |
| :---- | :----- | :----------------- |
| txhex | string | 交易十六进制字符串 |

## 3 设置自动挖矿 SetAutoMining

**调用接口**

```
rpc SetAutoMining(MinerFlag) returns (Reply) {}
```

**参数：**

```
message MinerFlag {
    int32 flag    = 1;
    int64 reserve = 2;
}
```

**参数说明：**

| 参数    | 类型  | 是否必填 | 说明                                         |
| :------ | :---- | :------- | :------------------------------------------- |
| flag    | int32 | 是       | 标识符，1 为开启自动挖矿，0 为关闭自动挖矿。 |
| reserve | int64 | 否       | 保留字段                                     |

**返回数据：**

```
message Reply {
    bool  isOk = 1;
    bytes msg  = 2;
}
```

**参数说明：**

| 参数 | 类型  | 说明                                      |
| :--- | :---- | :---------------------------------------- |
| isok | bool  | 在成功时，返回 true；失败时，返回 false。 |
| msg  | bytes | 在成功时，为空；失败时，返回错误信息。    |

## 4 获取Ticket的数量 GetTicketCount

**调用接口**

```
rpc GetTicketCount(types.ReqNil) returns (Int64) {}
```

**参数：**
nil

**返回数据：**

```
Int64
```

**参数说明：**

| 参数   | 类型  | 说明             |
| :----- | :---- | :--------------- |
| result | int64 | 返回ticket的数量 |

## 5 获取绑定的挖矿地址

**调用接口**

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

**参数：**

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

**参数说明：**

| 参数      | 类型   | 是否必须 | 说明                                                         |
| :-------- | :----- | :------- | :----------------------------------------------------------- |
| driver    | bytes  | 是       | 执行器名称, 这里固定为 ticket                                |
| funcName  | string | 是       | 操作名称, 这里固定为 MinerAddress                            |
| stateHash | bytes  | 否       | 所有交易在对应的执行器执行后写入KVDB中重新计算得到的新state的哈希值 |
| param     | bytes  | 是       | types.Encode(&ReqString)                                     |
| extra     | bytes  | 否       | 扩展字段，用于额外的用途                                     |
| data      | string | 是       | 函数参数,data:冷钱包地址                                     |

**返回数据：**

```
message ReplyStrings {    repeated string datas = 1;}
```

**参数说明：**

| 参数  | 类型     | 说明         |
| :---- | :------- | :----------- |
| datas | []string | 返回挖矿地址 |

## 6 获取矿工地址的对应的冷钱包地址

**调用接口**

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

**参数：**

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

**参数说明：**

| 参数      | 类型   | 是否必须 | 说明                                                         |
| :-------- | :----- | :------- | :----------------------------------------------------------- |
| driver    | bytes  | 是       | 执行器名称, 这里固定为 ticket                                |
| funcName  | string | 是       | 操作名称, 这里固定为 MinerSourceList                         |
| stateHash | bytes  | 否       | 所有交易在对应的执行器执行后写入KVDB中重新计算得到的新state的哈希值 |
| param     | bytes  | 是       | types.Encode(&ReqString)                                     |
| extra     | bytes  | 否       | 扩展字段，用于额外的用途                                     |
| data      | string | 是       | 函数参数,data:矿工地址                                       |

**返回数据：**

```
message ReplyStrings {    repeated string datas = 1;}
```

**参数说明：**

| 参数  | 类型     | 说明           |
| :---- | :------- | :------------- |
| datas | []string | 冷钱包地址列表 |

## 7 关闭指定账户绑定的tickets

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

## 8 构造买票交易 ticket open

**调用接口**

```
rpc CreateTransaction(CreateTxIn) returns (UnsignTx) {}
```

**参数：**

```
message CreateTxIn {
    bytes  execer     = 1;
    string actionName = 2;
    bytes  payload    = 3;
}
message TicketOpen {
    string minerAddress      = 1;
    int32 count              = 2;
    string returnAddress     = 3;
    int64 randSeed           = 4;
    repeated bytes pubHashes = 5;
}
```

**参数说明：**

| 参数                  | 类型    | 是否必填 | 说明                                                         |
| :-------------------- | :------ | :------- | :----------------------------------------------------------- |
| execer                | bytes   | 是       | ticket                                                       |
| actionName            | string  | 是       | Topen                                                        |
| payload               | bytes   | 是       | TicketOpen结构, Topen需要的参数                              |
| payload.minerAddress  | string  | 是       | 用户挖矿的ticket 地址                                        |
| payload.returnAddress | string  | 是       | 收益地址/币实际存储的地址，(非委托挖矿时，和挖矿地址一致)    |
| payload.count         | int32   | 是       | 购买ticket的数目                                             |
| payload.randSeed      | int64   | 否       | 随机数种子                                                   |
| payload.pubHashes     | []bytes | 是       | 数组长度为count, 每个pubHash 用随机的源字符串通过SHA256算法生成。 挖矿时需要公布生成pubHash的源字符串，源字符串用于生成链上随机数 |

> 注意： 实现需要保留生成的pubHash的源字符串， 一般将这个功能集成到钱包， 由钱包来管理的随机字符串

**返回数据：**

```
message UnsignTx {    bytes data = 1;}
```

**参数说明：**

| 参数 | 类型  | 说明       |
| :--- | :---- | :--------- |
| data | bytes | 待签名数据 |

## 9 构造挖矿交易 ticket miner

1. 由于挖矿交易放在区块的第一个交易， 由挖矿时生成， 不需要构造接口。