## autonomy 接口

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

### 1 自治系统参数默认值以及范围

#### 1.1 可修改参数

```
 // 默认公示周期,以区块高度计算,换算成时间大概一周
    publicPeriod         int32 = 17280 * 7  
    // 最小公示周期
    minPublicPeriod      int32 = 17280 * 7
    // 最大公示周期
    maxPublicPeriod      int32 = 17280 * 14
    // 默认重大项目公示金阈值
    largeProjectAmount         = types.Coin * 100 * 10000 
    // 最小重大项公示金目阈值
    minLargeProjectAmount      = types.Coin * 100 * 10000
    // 最大重大项公示金目阈值
    maxLargeProjectAmount      = types.Coin * 300 * 10000
    // 默认提案金
    proposalAmount             = types.Coin * 500         
    // 最小提案金
    minProposalAmount          = types.Coin * 20
    // 最大提案金
    maxProposalAmount          = types.Coin * 2000
    // 默认董事会成员赞成率，以%计
    boardApproveRatio   int32 = 51                       
    // 最小董事会赞成率
    minBoardApproveRatio      = 50
    // 最大董事会赞成率
    maxBoardApproveRatio      = 66
    // 默认全体持票人否决率，以%计
    pubOpposeRatio      int32 = 33                     
    // 最小全体持票人否决率
    minPubOpposeRatio   int32 = 33
    // 最大全体持票人否决率
    maxPubOpposeRatio   int32 = 50
    // 可以调整，但是可能需要进行范围的限制：参与率最低设置为 50%， 最高设置为 80%，赞成率，最低 50.1%，最高80%
    // 不能设置太低和太高，太低就容易作弊，太高则有可能很难达到
    // 最小全体持票人参与率
    minPubAttendRatio = 50
    // 最大全体持票人参与率
    maxPubAttendRatio = 80
    // 最小全体持票人赞成率
    minPubApproveRatio = 50
    // 最大全体持票人赞成率
    maxPubApproveRatio = 80
```

#### 1.2 不可修改参数

```
  // 董事会成员数范围
    minBoards                 = 20
    maxBoards                 = 40
```

### 2 提案董事会成员

#### 2.1 提案董事会成员 PropBoard

**调用接口**

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

**参数：**

```
message CreateTxIn {
    bytes  execer     = 1;
    string actionName = 2;
    bytes  payload    = 3;
}
message ProposalBoard {
    int32 year               = 1;
    int32 month              = 2;
    int32 day                = 3;
    bool update              = 4;
    repeated string boards   = 5;
    int64 startBlockHeight   = 6; // 提案开始投票高度
    int64 endBlockHeight     = 7; // 提案结束投票高度
    int64 realEndBlockHeight = 8; // 实际提案结束投票高度
    BoardUpdate boardUpdate  = 9;
}
enum BoardUpdate {
    INV = 0;
    //新增
    ADDBoard = 1;
    //剔除
    DELBoard = 2;
    //整体替换
    REPLACEALL = 3;
}
```

**参数说明：**

| 参数               | 类型     | 是否必须 | 说明                                                         |
| :----------------- | :------- | :------- | :----------------------------------------------------------- |
| execer             | bytes    | 是       | 执行器名称, 这里固定为 autonomy                              |
| actionName         | string   | 是       | 操作名称, 这里固定为 PropBoard                               |
| payload            | bytes    | 是       | types.Encode(&ProposalBoard)                                 |
| year               | int32    | 否       | 提案年                                                       |
| month              | int32    | 否       | 提案月                                                       |
| day                | int32    | 否       | 提案日                                                       |
| update             | bool     | 否       | 是否更新, 已弃用                                             |
| boards             | []string | 是       | 提案董事会成员                                               |
| startBlockHeight   | int64    | 是       | 开始投票高度                                                 |
| endBlockHeight     | int64    | 是       | 结束投票高度, endBlockHeight > startBlockHeight + 720 (自治系统中所有涉及提案都需要满足) |
| realEndBlockHeight | int64    | 否       | 实际投票结束高度, 不需要填写                                 |
| boardUpdate        | int32    | 是       | 1:新增, 2:删除, 3:整体更新                                   |

**返回数据：**

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

**参数说明：**

| 参数 | 类型  | 说明                     |
| :--- | :---- | :----------------------- |
| data | bytes | 交易十六进制编码后的数据 |

#### 2.2 撤销提案董事会成员 RvkPropBoard

**调用接口**

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

**参数：**

```
message CreateTxIn {
    bytes  execer     = 1;
    string actionName = 2;
    bytes  payload    = 3;
}
message RevokeProposalBoard {
    string proposalID = 1;
}
```

**参数说明：**

| 参数       | 类型   | 是否必须 | 说明                               |
| :--------- | :----- | :------- | :--------------------------------- |
| execer     | bytes  | 是       | 执行器名称, 这里固定为 autonomy    |
| actionName | string | 是       | 操作名称, 这里固定为 RvkPropBoard  |
| payload    | bytes  | 是       | types.Encode(&RevokeProposalBoard) |
| proposalID | string | 是       | 提案ID, 即PropBoard的交易hash      |

**返回数据：**

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

**参数说明：**

| 参数 | 类型  | 说明                     |
| :--- | :---- | :----------------------- |
| data | bytes | 交易十六进制编码后的数据 |

#### 2.3 投票提案董事会成员 VotePropBoard

**调用接口**

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

**参数：**

```
message CreateTxIn {
    bytes  execer     = 1;
    string actionName = 2;
    bytes  payload    = 3;
}
message VoteProposalBoard {
    string   proposalID        = 1;
    bool     approve           = 2;
    //真正投票地址
    repeated string originAddr = 3;
    //代替approve，并增加了弃权选项
    AutonomyVoteOption voteOption      = 4;
}
//三种投票选项
enum AutonomyVoteOption {
    NOJOIN = 0;
    //支持
    APPROVE = 1;
    //反对
    OPPOSE  = 2;
    //弃权
    QUIT    = 3;
}
```

**参数说明：**

| 参数       | 类型     | 是否必须 | 说明                                       |
| :--------- | :------- | :------- | :----------------------------------------- |
| execer     | bytes    | 是       | 执行器名称, 这里固定为 autonomy            |
| actionName | string   | 是       | 操作名称, 这里固定为 VotePropBoard         |
| payload    | bytes    | 是       | types.Encode(&VoteProposalBoard)           |
| proposalID | string   | 是       | 提案ID, 即PropBoard的交易hash              |
| voteOption | int32    | 是       | 投票提案, 1:赞成, 2:反对, 3:弃权           |
| originAddr | []string | 否       | 如果有绑定挖矿的可以将挖矿地址填入进行投票 |

**返回数据：**

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

**参数说明：**

| 参数 | 类型  | 说明                     |
| :--- | :---- | :----------------------- |
| data | bytes | 交易十六进制编码后的数据 |

#### 2.4 终止董事会成员提案 TmintPropBoard

**调用接口**

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

**参数：**

```
message CreateTxIn {
    bytes  execer     = 1;
    string actionName = 2;
    bytes  payload    = 3;
}
message TerminateProposalBoard {
    string proposalID = 1;
}
```

**参数说明：**

| 参数       | 类型   | 是否必须 | 说明                                  |
| :--------- | :----- | :------- | :------------------------------------ |
| execer     | bytes  | 是       | 执行器名称, 这里固定为 autonomy       |
| actionName | string | 是       | 操作名称, 这里固定为 TmintPropBoard   |
| payload    | bytes  | 是       | types.Encode(&TerminateProposalBoard) |
| proposalID | string | 是       | 提案ID, 即PropBoard的交易hash         |

**返回数据：**

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

**参数说明：**

| 参数 | 类型  | 说明                     |
| :--- | :---- | :----------------------- |
| data | bytes | 交易十六进制编码后的数据 |

#### 2.5 查询提案

##### 2.5.1 通过 proposalID 查询提案 GetProposalBoard

**调用接口**

```
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  | 是       | 执行器名称, 这里固定为 autonomy                              |
| funcName  | string | 是       | 操作名称, 这里固定为 GetProposalBoard                        |
| stateHash | bytes  | 否       | 所有交易在对应的执行器执行后写入KVDB中重新计算得到的新state的哈希值 |
| param     | bytes  | 是       | types.Encode(&ReqString)                                     |
| extra     | bytes  | 否       | 扩展字段，用于额外的用途                                     |
| data      | string | 是       | 提案ID, 即PropBoard的交易hash                                |

##### 2.5.2 通过状态或者地址以及状态地址查询提案 ListProposalBoard

**调用接口**

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

**参数：**

```
message ChainExecutor {
    string driver    = 1;
    string funcName  = 2;
    bytes  stateHash = 3;
    bytes  param     = 4;
    //扩展字段，用于额外的用途
    bytes extra = 5;
}
message ReqQueryProposalBoard {
    int32  status    = 1;
    string addr      = 2;
    int32  count     = 3;
    int32  direction = 4;
    int64  height    = 5;
    int32  index     = 6;
}
```

**参数说明：**

| 参数      | 类型   | 是否必须 | 说明                                                         |
| :-------- | :----- | :------- | :----------------------------------------------------------- |
| driver    | bytes  | 是       | 执行器名称, 这里固定为 autonomy                              |
| funcName  | string | 是       | 操作名称, 这里固定为 ListProposalBoard                       |
| status    | int32  | 是       | 提案状态, 1:提案申请状态, 2:提案撤销状态, 3:提案投票状态, 4:提案结束状态 |
| addr      | string | 否       | 提案地址                                                     |
| count     | int32  | 是       | 查询数量                                                     |
| direction | int32  | 是       | 查询方向, 0:降序, 1:升序                                     |
| height    | int64  | 否       | 查询量大翻页查询时候需要输入从某个高度开始                   |
| index     | int32  | 否       | 查询量大翻页查询时候需要输入从某个index开始                  |

**返回数据：**

```
message ReplyQueryProposalBoard {
    repeated AutonomyProposalBoard propBoards = 1;
}
message AutonomyProposalBoard {
    ProposalBoard propBoard = 1;
    // 投票该提案的规则
    RuleConfig curRule = 2;
    // 投票董事会
    ActiveBoard board = 3;
    // 全体持票人投票结果
    VoteResult voteResult = 4;
    // 状态
    int32  status     = 5;
    string address    = 6;
    int64  height     = 7;
    int32  index      = 8;
    string proposalID = 9;
}
message ActiveBoard {
    repeated string boards      = 1;
    repeated string revboards   = 2;
    int64           amount      = 3;
    int64           startHeight = 4;
}
message VoteResult {
    // 总票数
    int32 totalVotes = 1;
    // 赞成票
    int32 approveVotes = 2;
    // 反对票
    int32 opposeVotes = 3;
    // 是否通过
    bool pass = 4;
    //弃权票
    int32 quitVotes = 5;
}
```

**参数说明：**

| 参数                       | 类型     | 说明                               |
| :------------------------- | :------- | :--------------------------------- |
| propBoard                  | json     | 参见(1)                            |
| curRule.boardApproveRatio  | int32    | 董事会赞成率                       |
| curRule.pubAttendRatio     | int32    | 全体持票人参与率                   |
| curRule.pubApproveRatio    | int32    | 全体持票人赞成率                   |
| curRule.pubOpposeRatio     | int32    | 全体持票人否决率                   |
| curRule.proposalAmount     | int64    | 提案金                             |
| curRule.largeProjectAmount | int64    | 重大项目阈值                       |
| curRule.publicPeriod       | int32    | 公示期                             |
| board.boards               | []string | 有投票权的boards                   |
| board.revboards            | []string | 无投票权的boards                   |
| board.amount               | int64    | 该boards在当前周期已经审批的项目金 |
| board.startHeight          | int64    | 当前周期的起始区块高度             |
| voteResult.totalVotes      | int32    | 总票数                             |
| voteResult.approveVotes    | int32    | 赞成票                             |
| voteResult.opposeVotes     | int32    | 反对票                             |
| voteResult.pass            | bool     | 是否通过, true:通过, false:未通过  |
| status                     | int32    | 提案状态                           |
| address                    | string   | 提案地址                           |
| height                     | int64    | 提案高度                           |
| index                      | int32    | 提案index                          |
| proposalID                 | string   | 提案ID                             |

#### 2.6 查询有效的董事会成员 GetActiveBoard

**调用接口**

```
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  | 是       | 执行器名称, 这里固定为 autonomy     |
| funcName | string | 是       | 操作名称, 这里固定为 GetActiveBoard |
| data     | string | 是       | “1”                                 |

**返回数据：**

```
message ActiveBoard {
    repeated string boards      = 1;
    repeated string revboards   = 2;
    int64           amount      = 3;
    int64           startHeight = 4;
}
```

**参数说明：**

| 参数        | 类型     | 说明                               |
| :---------- | :------- | :--------------------------------- |
| boards      | []string | 有投票权的boards                   |
| revboards   | []string | 无投票权的boards                   |
| amount      | int64    | 该boards在当前周期已经审批的项目金 |
| startHeight | int64    | 当前周期的起始区块高度             |

### 3 提案项目

#### 3.1 提案项目 PropProject

**调用接口**

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

**参数：**

```
message CreateTxIn {
    bytes  execer     = 1;
    string actionName = 2;
    bytes  payload    = 3;
}
message ProposalProject {
    // 提案时间
    int32 year  = 1;
    int32 month = 2;
    int32 day   = 3;
    // 项目相关
    string firstStage   = 4;  // 第一阶段提案项目hash
    string lastStage    = 5;  // 上一阶段提案项目hash
    string production   = 6;  // 项目地址
    string description  = 7;  // 项目阶段性简述
    string contractor   = 8;  // 承包人
    int64  amount       = 9;  // 项目经费
    string amountDetail = 10; // 经费细则
    // 支付相关
    string toAddr = 11; // 收款地址
    // 投票相关
    int64 startBlockHeight    = 12; // 提案开始投票高度
    int64 endBlockHeight      = 13; // 提案结束投票高度
    int64 realEndBlockHeight  = 14; // 实际提案结束投票高度
    int32 projectNeedBlockNum = 15; // 以提案结束投票高度为准，需要项目需要消耗的区块数目所对应的时间
}
```

**参数说明：**

| 参数                | 类型   | 是否必须 | 说明                                                         |
| :------------------ | :----- | :------- | :----------------------------------------------------------- |
| execer              | bytes  | 是       | 执行器名称, 这里固定为 autonomy                              |
| actionName          | string | 是       | 操作名称, 这里固定为 PropProject                             |
| payload             | bytes  | 是       | types.Encode(&ProposalProject)                               |
| year                | int32  | 否       | 提案年                                                       |
| month               | int32  | 否       | 提案月                                                       |
| day                 | int32  | 否       | 提案日                                                       |
| firstStage          | string | 否       | 第一阶段提案项目hash                                         |
| lastStage           | string | 否       | 上一阶段提案项目hash                                         |
| production          | string | 否       | 项目地址                                                     |
| description         | string | 否       | 项目阶段性简述                                               |
| contractor          | string | 否       | 承包人                                                       |
| amount              | int64  | 是       | 项目经费                                                     |
| amountDetail        | string | 否       | 经费细则                                                     |
| toAddr              | string | 是       | 收款地址                                                     |
| startBlockHeight    | int64  | 是       | 开始投票高度                                                 |
| endBlockHeight      | int64  | 是       | 结束投票高度, endBlockHeight > startBlockHeight + 720 (自治系统中所有涉及提案都需要满足) |
| realEndBlockHeight  | int64  | 否       | 实际投票结束高度, 不需要填写                                 |
| projectNeedBlockNum | int64  | 否       | 项目耗时预估（以区块计算）                                   |

**返回数据：**

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

**参数说明：**

| 参数 | 类型  | 说明                     |
| :--- | :---- | :----------------------- |
| data | bytes | 交易十六进制编码后的数据 |

#### 3.2 撤销提案项目 RvkPropProject

**调用接口**

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

**参数：**

```
message CreateTxIn {
    bytes  execer     = 1;
    string actionName = 2;
    bytes  payload    = 3;
}
message RevokeProposalProject {
    string proposalID = 1;
}
```

**参数说明：**

| 参数       | 类型   | 是否必须 | 说明                                 |
| :--------- | :----- | :------- | :----------------------------------- |
| execer     | bytes  | 是       | 执行器名称, 这里固定为 autonomy      |
| actionName | string | 是       | 操作名称, 这里固定为 RvkPropProject  |
| payload    | bytes  | 是       | types.Encode(&RevokeProposalProject) |
| proposalID | string | 是       | 提案ID, 即PropProject的交易hash      |

**返回数据：**

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

**参数说明：**

| 参数 | 类型  | 说明                     |
| :--- | :---- | :----------------------- |
| data | bytes | 交易十六进制编码后的数据 |

#### 3.3 投票提案项目 VotePropProject

**调用接口**

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

**参数：**

```
message CreateTxIn {
    bytes  execer     = 1;
    string actionName = 2;
    bytes  payload    = 3;
}
message VoteProposalProject {
    string proposalID = 1;
    bool   approve    = 2;
    AutonomyVoteOption vote   = 3;
}
```

**参数说明：**

| 参数       | 类型   | 是否必须 | 说明                                 |
| :--------- | :----- | :------- | :----------------------------------- |
| execer     | bytes  | 是       | 执行器名称, 这里固定为 autonomy      |
| actionName | string | 是       | 操作名称, 这里固定为 VotePropProject |
| payload    | bytes  | 是       | types.Encode(&VoteProposalProject)   |
| proposalID | string | 是       | 提案ID, 即PropProject的交易hash      |
| vote       | int32  | 是       | 投票提案, 1:赞成, 2:反对, 3:弃权     |

**返回数据：**

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

**参数说明：**

| 参数 | 类型  | 说明                     |
| :--- | :---- | :----------------------- |
| data | bytes | 交易十六进制编码后的数据 |

#### 3.4 投票反对提案项目 PubVotePropProject

**调用接口**

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

**参数：**

```
message CreateTxIn {
    bytes  execer     = 1;
    string actionName = 2;
    bytes  payload    = 3;
}
message PubVoteProposalProject {
    string   proposalID        = 1;
    bool     oppose            = 2;
    repeated string originAddr = 3;
}
```

**参数说明：**

| 参数       | 类型     | 是否必须 | 说明                                       |
| :--------- | :------- | :------- | :----------------------------------------- |
| execer     | bytes    | 是       | 执行器名称, 这里固定为 autonomy            |
| actionName | string   | 是       | 操作名称, 这里固定为 PubVotePropProject    |
| payload    | bytes    | 是       | types.Encode(&PubVoteProposalProject)      |
| proposalID | string   | 是       | 提案ID, 即PropProject的交易hash            |
| oppose     | bool     | 是       | 是否反对该提案, true:反对, false:不反对    |
| originAddr | []string | 否       | 如果有绑定挖矿的可以将挖矿地址填入进行投票 |

**返回数据：**

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

**参数说明：**

| 参数 | 类型  | 说明                     |
| :--- | :---- | :----------------------- |
| data | bytes | 交易十六进制编码后的数据 |

#### 3.5 终止提案项目 TmintPropProject

**调用接口**

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

**参数：**

```
message CreateTxIn {
    bytes  execer     = 1;
    string actionName = 2;
    bytes  payload    = 3;
}
message TerminateProposalProject {
    string proposalID = 1;
}
```

**参数说明：**

| 参数       | 类型   | 是否必须 | 说明                                    |
| :--------- | :----- | :------- | :-------------------------------------- |
| execer     | bytes  | 是       | 执行器名称, 这里固定为 autonomy         |
| actionName | string | 是       | 操作名称, 这里固定为 TmintPropProject   |
| payload    | bytes  | 是       | types.Encode(&TerminateProposalProject) |
| proposalID | string | 是       | 提案ID, 即PropProject的交易hash         |

**返回数据：**

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

**参数说明：**

| 参数 | 类型  | 说明                     |
| :--- | :---- | :----------------------- |
| data | bytes | 交易十六进制编码后的数据 |

#### 3.5 查询提案

##### 3.5.1 通过 proposalID 查询提案 GetProposalProject

**调用接口**

```
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  | 是       | 执行器名称, 这里固定为 autonomy         |
| funcName | string | 是       | 操作名称, 这里固定为 GetProposalProject |
| data     | string | 是       | 提案ID, 即PropProject的交易hash         |

##### 3.5.2 通过状态或者地址以及状态地址查询提案 ListProposalProject

**调用接口**

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

**参数：**

```
message ChainExecutor {
    string driver    = 1;
    string funcName  = 2;
    bytes  stateHash = 3;
    bytes  param     = 4;
    //扩展字段，用于额外的用途
    bytes extra = 5;
}
message ReqQueryProposalProject {
    int32  status    = 1;
    string addr      = 2;
    int32  count     = 3;
    int32  direction = 4;
    int64  height    = 5;
    int32  index     = 6;
}
```

**参数说明：**

| 参数      | 类型   | 是否必须 | 说明                                                         |
| :-------- | :----- | :------- | :----------------------------------------------------------- |
| driver    | bytes  | 是       | 执行器名称, 这里固定为 autonomy                              |
| funcName  | string | 是       | 操作名称, 这里固定为 ListProposalProject                     |
| status    | int32  | 是       | 提案状态, 1:提案申请状态, 2:提案撤销状态, 3:董事会投票状态, 4:全体持票人投票状态, 5:提案结束状态 |
| addr      | string | 否       | 提案地址                                                     |
| count     | int32  | 是       | 查询数量                                                     |
| direction | int32  | 是       | 查询方向, 0:降序, 1:升序                                     |
| height    | int64  | 否       | 查询量大翻页查询时候需要输入从某个高度开始                   |
| index     | int32  | 否       | 查询量大翻页查询时候需要输入从某个index开始                  |

**返回数据：**

```
message AutonomyProposalProject {
    ProposalProject propProject = 1;
    // 投票该提案的规则
    RuleConfig curRule = 2;
    // 投票该提案的董事会成员
    repeated string boards = 3;
    // 董事会投票结果
    VoteResult boardVoteRes = 4;
    // 公示投票
    PublicVote pubVote = 5;
    // 状态
    int32  status     = 6;
    string address    = 7;
    int64  height     = 8;
    int32  index      = 9;
    string proposalID = 10;
}
```

**参数说明：**

| 参数                       | 类型     | 说明                                  |
| :------------------------- | :------- | :------------------------------------ |
| propProject                | json     | 参见(1)                               |
| curRule.boardApproveRatio  | int32    | 董事会赞成率                          |
| curRule.pubAttendRatio     | int32    | 全体持票人参与率                      |
| curRule.pubApproveRatio    | int32    | 全体持票人赞成率                      |
| curRule.pubOpposeRatio     | int32    | 全体持票人否决率                      |
| curRule.proposalAmount     | int64    | 提案金                                |
| curRule.largeProjectAmount | int64    | 重大项目阈值                          |
| curRule.publicPeriod       | int32    | 公示期                                |
| boards                     | []string | 投票该提案的董事会成员                |
| boardVoteRes.totalVotes    | int32    | 总票数                                |
| boardVoteRes.approveVotes  | int32    | 赞成票                                |
| boardVoteRes.opposeVotes   | int32    | 反对票                                |
| boardVoteRes.pass          | bool     | 是否通过, true:通过, false:未通过     |
| pubVote.publicity          | int32    | 全体持票数                            |
| pubVote.totalVotes         | int32    | 赞成票                                |
| pubVote.opposeVotes        | int32    | 反对票, 反对票率决定是否通过          |
| pubVote.pubPass            | bool     | 最总是否通过, true:通过, false:未通过 |
| status                     | int32    | 提案状态                              |
| address                    | string   | 提案地址                              |
| height                     | int64    | 提案高度                              |
| index                      | int32    | 提案index                             |
| proposalID                 | string   | 提案ID                                |

### 4 提案系统参数修改

#### 4.1 提案系统参数修改 PropRule

**调用接口**

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

**参数：**

```
message CreateTxIn {
    bytes  execer     = 1;
    string actionName = 2;
    bytes  payload    = 3;
}
message ProposalRule {
    // 提案时间
    int32 year  = 1;
    int32 month = 2;
    int32 day   = 3;
    // 规则可修改项,如果某项不修改则置为-1
    RuleConfig ruleCfg = 4;
    // 投票相关
    int64 startBlockHeight   = 5; // 提案开始投票高度
    int64 endBlockHeight     = 6; // 提案结束投票高度
    int64 realEndBlockHeight = 7; // 实际提案结束投票高度
}
message RuleConfig {
    // 董事会成员赞成率,以%为单位,只保留整数部分
    int32 boardApproveRatio = 1;
    // 全体持票人否决率
    int32 pubOpposeRatio = 2;
    // 提案金额
    int64 proposalAmount = 3;
    // 重大项目公示金额阈值
    int64 largeProjectAmount = 4;
    // 重大项目公示时间（以区块数为单位）
    int32 publicPeriod = 5;
    // 全体持票人参与率
    int32 pubAttendRatio = 6;
    // 全体持票人赞成率
    int32 pubApproveRatio = 7;
}
```

**参数说明：**

| 参数                       | 类型   | 是否必须 | 说明                                                         |
| :------------------------- | :----- | :------- | :----------------------------------------------------------- |
| execer                     | bytes  | 是       | 执行器名称, 这里固定为 autonomy                              |
| actionName                 | string | 是       | 操作名称, 这里固定为 PropRule                                |
| payload                    | bytes  | 是       | types.Encode(&RuleConfig)                                    |
| year                       | int32  | 否       | 提案年                                                       |
| month                      | int32  | 否       | 提案月                                                       |
| day                        | int32  | 否       | 提案日                                                       |
| ruleCfg.boardApproveRatio  | int32  | 否       | 董事会赞成率                                                 |
| ruleCfg.pubAttendRatio     | int32  | 否       | 全体持票人参与率                                             |
| ruleCfg.pubApproveRatio    | int32  | 否       | 全体持票人赞成率                                             |
| ruleCfg.pubOpposeRatio     | int32  | 否       | 全体持票人否决率                                             |
| ruleCfg.proposalAmount     | int64  | 否       | 提案金                                                       |
| ruleCfg.largeProjectAmount | int64  | 否       | 重大项目阈值                                                 |
| ruleCfg.publicPeriod       | int32  | 否       | 公示期                                                       |
| startBlockHeight           | int64  | 是       | 开始投票高度                                                 |
| endBlockHeight             | int64  | 是       | 结束投票高度, endBlockHeight > startBlockHeight + 720 (自治系统中所有涉及提案都需要满足) |
| realEndBlockHeight         | int64  | 否       | 实际投票高度, 不需要填写                                     |

**返回数据：**

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

**参数说明：**

| 参数 | 类型  | 说明                     |
| :--- | :---- | :----------------------- |
| data | bytes | 交易十六进制编码后的数据 |

#### 4.2 撤销提案系统参数修改 RvkPropRule

**调用接口**

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

**参数：**

```
message CreateTxIn {
    bytes  execer     = 1;
    string actionName = 2;
    bytes  payload    = 3;
}
message RevokeProposalRule {
    string proposalID = 1;
}
```

**参数说明：**

| 参数       | 类型   | 是否必须 | 说明                              |
| :--------- | :----- | :------- | :-------------------------------- |
| execer     | bytes  | 是       | 执行器名称, 这里固定为 autonomy   |
| actionName | string | 是       | 操作名称, 这里固定为 RvkPropRule  |
| payload    | bytes  | 是       | types.Encode(&RevokeProposalRule) |
| proposalID | string | 是       | 提案ID, 即PropRule的交易hash      |

**返回数据：**

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

**参数说明：**

| 参数 | 类型  | 说明                     |
| :--- | :---- | :----------------------- |
| data | bytes | 交易十六进制编码后的数据 |

#### 4.3 投票提案系统参数修改 VotePropRule

**调用接口**

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

**参数：**

```
message CreateTxIn {
    bytes  execer     = 1;
    string actionName = 2;
    bytes  payload    = 3;
}
message VoteProposalRule {
    string   proposalID        = 1;
    bool     approve           = 2;
    repeated string originAddr = 3;
    AutonomyVoteOption vote            = 4;
}
```

**参数说明：**

| 参数       | 类型     | 是否必须 | 说明                                       |
| :--------- | :------- | :------- | :----------------------------------------- |
| execer     | bytes    | 是       | 执行器名称, 这里固定为 autonomy            |
| actionName | string   | 是       | 操作名称, 这里固定为 VotePropRule          |
| payload    | bytes    | 是       | types.Encode(&VoteProposalRule)            |
| proposalID | string   | 是       | 提案ID, 即PropRule的交易hash               |
| vote       | int32    | 是       | 投票提案, 1:赞成, 2:反对, 3:弃权           |
| originAddr | []string | 否       | 如果有绑定挖矿的可以将挖矿地址填入进行投票 |

**返回数据：**

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

**参数说明：**

| 参数 | 类型  | 说明                     |
| :--- | :---- | :----------------------- |
| data | bytes | 交易十六进制编码后的数据 |

#### 4.4 终止提案系统参数修改 TmintPropRule

**调用接口**

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

**参数：**

```
message CreateTxIn {
    bytes  execer     = 1;
    string actionName = 2;
    bytes  payload    = 3;
}
message TerminateProposalRule {
    string proposalID = 1;
}
```

**参数说明：**

| 参数       | 类型   | 是否必须 | 说明                                 |
| :--------- | :----- | :------- | :----------------------------------- |
| execer     | bytes  | 是       | 执行器名称, 这里固定为 autonomy      |
| actionName | string | 是       | 操作名称, 这里固定为 TmintPropRule   |
| payload    | bytes  | 是       | types.Encode(&TerminateProposalRule) |
| proposalID | string | 是       | 提案ID, 即PropRule的交易hash         |

**返回数据：**

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

**参数说明：**

| 参数 | 类型  | 说明                     |
| :--- | :---- | :----------------------- |
| data | bytes | 交易十六进制编码后的数据 |

#### 4.5 查询提案

##### 4.5.1 通过 proposalID 查询提案 GetProposalRule

**调用接口**

```
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  | 是       | 执行器名称, 这里固定为 autonomy      |
| funcName | string | 是       | 操作名称, 这里固定为 GetProposalRule |
| data     | string | 是       | 提案ID, 即PropRule的交易hash         |

##### 4.5.2 通过状态或者地址以及状态地址查询提案 ListProposalRule

**调用接口**

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

**参数：**

```
message ChainExecutor {
    string driver    = 1;
    string funcName  = 2;
    bytes  stateHash = 3;
    bytes  param     = 4;
    //扩展字段，用于额外的用途
    bytes extra = 5;
}
message ReqQueryProposalRule {
    int32  status    = 1;
    string addr      = 2;
    int32  count     = 3;
    int32  direction = 4;
    int64  height    = 5;
    int32  index     = 6;
}
```

**参数说明：**

| 参数      | 类型   | 是否必须 | 说明                                                         |
| :-------- | :----- | :------- | :----------------------------------------------------------- |
| driver    | bytes  | 是       | 执行器名称, 这里固定为 autonomy                              |
| funcName  | string | 是       | 操作名称, 这里固定为 ListProposalRule                        |
| status    | int32  | 是       | 提案状态, 1:提案申请状态, 2:提案撤销状态, 3:提案投票状态, 4:提案结束状态 |
| addr      | string | 否       | 提案地址                                                     |
| count     | int32  | 是       | 查询数量                                                     |
| direction | int32  | 是       | 查询方向, 0:降序, 1:升序                                     |
| height    | int64  | 否       | 查询量大翻页查询时候需要输入从某个高度开始                   |
| index     | int32  | 否       | 查询量大翻页查询时候需要输入从某个index开始                  |

**返回数据：**

```
message ReplyQueryProposalRule {
    repeated AutonomyProposalRule propRules = 1;
}
message AutonomyProposalRule {
    ProposalRule propRule = 1;
    RuleConfig   curRule  = 2;
    // 全体持票人投票结果
    VoteResult voteResult = 3;
    // 状态
    int32  status     = 4;
    string address    = 5;
    int64  height     = 6;
    int32  index      = 7;
    string proposalID = 8;
}
```

**参数说明：**

| 参数                    | 类型   | 说明                              |
| :---------------------- | :----- | :-------------------------------- |
| propRule                | json   | 参见(1)                           |
| curRule                 | json   | 参见(1)                           |
| voteResult.totalVotes   | int32  | 总票数                            |
| voteResult.approveVotes | int32  | 赞成票                            |
| voteResult.opposeVotes  | int32  | 反对票                            |
| voteResult.pass         | bool   | 是否通过, true:通过, false:未通过 |
| status                  | int32  | 提案状态                          |
| address                 | string | 提案地址                          |
| height                  | int64  | 提案高度                          |
| index                   | int32  | 提案index                         |
| proposalID              | string | 提案ID                            |

#### 4.6 查询有效系统参数 GetActiveRule

**调用接口**

```
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  | 是       | 执行器名称, 这里固定为 autonomy    |
| funcName | string | 是       | 操作名称, 这里固定为 GetActiveRule |
| data     | string | 是       | “1”                                |

**返回数据：**

```
message RuleConfig {
    // 董事会成员赞成率,以%为单位,只保留整数部分
    int32 boardApproveRatio = 1;
    // 全体持票人否决率
    int32 pubOpposeRatio = 2;
    // 提案金额
    int64 proposalAmount = 3;
    // 重大项目公示金额阈值
    int64 largeProjectAmount = 4;
    // 重大项目公示时间（以区块数为单位）
    int32 publicPeriod = 5;   
    // 全体持票人参与率
    int32 pubAttendRatio = 6;
    // 全体持票人赞成率
    int32 pubApproveRatio = 7;
}
```

**参数说明：**

| 参数               | 类型  | 说明             |
| :----------------- | :---- | :--------------- |
| boardApproveRatio  | int32 | 董事会赞成率     |
| pubAttendRatio     | int32 | 全体持票人参与率 |
| pubApproveRatio    | int32 | 全体持票人赞成率 |
| pubOpposeRatio     | int32 | 全体持票人否决率 |
| proposalAmount     | int64 | 提案金           |
| largeProjectAmount | int64 | 重大项目阈值     |
| publicPeriod       | int32 | 公示期           |

### 5 提案董事会成员修改

#### 5.1 提案董事会成员修改 PropChange

**调用接口**

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

**参数：**

```
message CreateTxIn {
    bytes  execer     = 1;
    string actionName = 2;
    bytes  payload    = 3;
}
message ProposalChange {
    // 提案时间
    int32 year  = 1;
    int32 month = 2;
    int32 day   = 3;
    // 修改董事会成员
    repeated Change changes = 4;
    // 投票相关
    int64 startBlockHeight   = 5; // 提案开始投票高度
    int64 endBlockHeight     = 6; // 提案结束投票高度
    int64 realEndBlockHeight = 7; // 实际提案结束投票高度
}
```

**参数说明：**

| 参数               | 类型    | 是否必须 | 说明                                                         |
| :----------------- | :------ | :------- | :----------------------------------------------------------- |
| execer             | bytes   | 是       | 执行器名称, 这里固定为 autonomy                              |
| actionName         | string  | 是       | 操作名称, 这里固定为 PropChange                              |
| payload            | bytes   | 是       | types.Encode(&ProposalChange)                                |
| year               | int32   | 否       | 提案年                                                       |
| month              | int32   | 否       | 提案月                                                       |
| day                | int32   | 否       | 提案日                                                       |
| changes            | strings | 是       | 一个成员只允许替换一个新的, 只能填一个                       |
| changes.cancel     | bool    | 是       | true, 只允许替换, 不允许恢复操作                             |
| changes.addr       | string  | 是       | 撤销或者添加董事会的地址                                     |
| startBlockHeight   | int64   | 是       | 开始投票高度                                                 |
| endBlockHeight     | int64   | 是       | 结束投票高度, endBlockHeight > startBlockHeight + 720 (自治系统中所有涉及提案都需要满足) |
| realEndBlockHeight | int64   | 否       | 实际投票结束高度, 不需要填写                                 |

**返回数据：**

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

**参数说明：**

| 参数 | 类型  | 说明                     |
| :--- | :---- | :----------------------- |
| data | bytes | 交易十六进制编码后的数据 |

#### 5.2 撤销提案董事会成员修改 RvkPropChange

**调用接口**

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

**参数：**

```
message CreateTxIn {
    bytes  execer     = 1;
    string actionName = 2;
    bytes  payload    = 3;
}
message RevokeProposalChange {
    string proposalID = 1;
}
```

**参数说明：**

| 参数       | 类型   | 是否必须 | 说明                                |
| :--------- | :----- | :------- | :---------------------------------- |
| execer     | bytes  | 是       | 执行器名称, 这里固定为 autonomy     |
| actionName | string | 是       | 操作名称, 这里固定为 RvkPropChange  |
| payload    | bytes  | 是       | types.Encode(&RevokeProposalChange) |
| proposalID | string | 是       | 提案ID, 即PropChange的交易hash      |

**返回数据：**

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

**参数说明：**

| 参数 | 类型  | 说明                     |
| :--- | :---- | :----------------------- |
| data | bytes | 交易十六进制编码后的数据 |

#### 5.3 投票提案董事会成员修改 VotePropChange

**调用接口**

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

**参数：**

```
message CreateTxIn {
    bytes  execer     = 1;
    string actionName = 2;
    bytes  payload    = 3;
}
message VoteProposalChange {
    string proposalID = 1;
    bool   approve    = 2;
    AutonomyVoteOption vote   = 3;
}
```

**参数说明：**

| 参数       | 类型   | 是否必须 | 说明                                |
| :--------- | :----- | :------- | :---------------------------------- |
| execer     | bytes  | 是       | 执行器名称, 这里固定为 autonomy     |
| actionName | string | 是       | 操作名称, 这里固定为 VotePropChange |
| payload    | bytes  | 是       | types.Encode(&VoteProposalChange)   |
| proposalID | string | 是       | 提案ID, 即PropChange的交易hash      |
| vote       | bool   | 是       | 投票提案, 1:赞成, 2:反对, 3:弃权    |

**返回数据：**

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

**参数说明：**

| 参数 | 类型  | 说明                     |
| :--- | :---- | :----------------------- |
| data | bytes | 交易十六进制编码后的数据 |

#### 5.4 终止提案董事会成员修改 TmintPropChange

**调用接口**

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

**参数：**

```
message CreateTxIn {
    bytes  execer     = 1;
    string actionName = 2;
    bytes  payload    = 3;
}
message TerminateProposalChange {
    string proposalID = 1;
}
```

**参数说明：**

| 参数       | 类型   | 是否必须 | 说明                                   |
| :--------- | :----- | :------- | :------------------------------------- |
| execer     | bytes  | 是       | 执行器名称, 这里固定为 autonomy        |
| actionName | string | 是       | 操作名称, 这里固定为 TmintPropChange   |
| payload    | bytes  | 是       | types.Encode(&TerminateProposalChange) |
| proposalID | string | 是       | 提案ID, 即PropChange的交易hash         |

**返回数据：**

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

**参数说明：**

| 参数 | 类型  | 说明                     |
| :--- | :---- | :----------------------- |
| data | bytes | 交易十六进制编码后的数据 |

#### 5.5 查询提案

##### 5.5.1 通过 proposalID 查询提案 GetProposalChange

**调用接口**

```
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  | 是       | 执行器名称, 这里固定为 autonomy        |
| funcName | string | 是       | 操作名称, 这里固定为 GetProposalChange |
| data     | string | 是       | 提案ID, 即PropChange的交易hash         |

##### 5.5.2 通过状态或者地址以及状态地址查询提案 ListProposalChange

**调用接口**

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

**参数：**

```
message ChainExecutor {
    string driver    = 1;
    string funcName  = 2;
    bytes  stateHash = 3;
    bytes  param     = 4;
    //扩展字段，用于额外的用途
    bytes extra = 5;
}
message ReqQueryProposalChange {
    int32  status    = 1;
    string addr      = 2;
    int32  count     = 3;
    int32  direction = 4;
    int64  height    = 5;
    int32  index     = 6;
}
```

**参数说明：**

| 参数      | 类型   | 是否必须 | 说明                                                         |
| :-------- | :----- | :------- | :----------------------------------------------------------- |
| driver    | bytes  | 是       | 执行器名称, 这里固定为 autonomy                              |
| funcName  | string | 是       | 操作名称, 这里固定为 ListProposalChange                      |
| status    | int32  | 是       | 提案状态, 1:提案申请状态, 2:提案撤销状态, 3:提案投票状态, 4:提案结束状态 |
| addr      | string | 否       | 提案地址                                                     |
| count     | int32  | 是       | 查询数量                                                     |
| direction | int32  | 是       | 查询方向, 0降序, 1升序                                       |
| height    | int64  | 否       | 查询量大翻页查询时候需要输入从某个高度开始                   |
| index     | int32  | 否       | 查询量大翻页查询时候需要输入从某个index开始                  |

**返回数据：**

```
message ReplyQueryProposalChange {
    repeated AutonomyProposalChange propChanges = 1;
}
message AutonomyProposalChange {
    ProposalChange propChange = 1;
    // 投票该提案的规则
    RuleConfig curRule = 2;
    // 投票董事会
    ActiveBoard board = 3;
    // 全体持票人投票结果
    VoteResult voteResult = 4;
    // 状态
    int32  status     = 5;
    string address    = 6;
    int64  height     = 7;
    int32  index      = 8;
    string proposalID = 9;
}
message ProposalChange {
    // 提案时间
    int32 year  = 1;
    int32 month = 2;
    int32 day   = 3;
    // 修改董事会成员
    repeated Change changes = 4;
    // 投票相关
    int64 startBlockHeight   = 5; // 提案开始投票高度
    int64 endBlockHeight     = 6; // 提案结束投票高度
    int64 realEndBlockHeight = 7; // 实际提案结束投票高度
}
```

**参数说明：**

| 参数                       | 类型     | 说明                               |
| :------------------------- | :------- | :--------------------------------- |
| propChange                 | json     | 参见(1)                            |
| curRule.changeApproveRatio | int32    | 董事会赞成率                       |
| curRule.pubOpposeRatio     | int32    | 全体持票人否决率                   |
| curRule.proposalAmount     | int64    | 提案金                             |
| curRule.largeProjectAmount | int64    | 重大项目阈值                       |
| curRule.publicPeriod       | int32    | 公示期                             |
| board.boards               | []string | 有投票权的boards                   |
| board.revboards            | []string | 无投票权的boards                   |
| board.amount               | int64    | 该boards在当前周期已经审批的项目金 |
| board.startHeight          | int64    | 当前周期的起始区块高度             |
| voteResult.totalVotes      | int32    | 总票数                             |
| voteResult.approveVotes    | int32    | 赞成票                             |
| voteResult.opposeVotes     | int32    | 反对票                             |
| voteResult.pass            | bool     | 是否通过, true:通过, false:未通过  |
| status                     | int32    | 提案状态                           |
| address                    | string   | 提案地址                           |
| height                     | int64    | 提案高度                           |
| index                      | int32    | 提案index                          |
| proposalID                 | string   | 提案ID                             |

### 6 评论提案

#### 6.1 评论提案 CommentProp

**调用接口**

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

**参数：**

```

```

**参数说明：**

| 参数       | 类型   | 是否必须 | 说明                             |
| :--------- | :----- | :------- | :------------------------------- |
| execer     | bytes  | 是       | 执行器名称, 这里固定为 autonomy  |
| actionName | string | 是       | 操作名称, 这里固定为 CommentProp |
| payload    | bytes  | 是       | types.Encode(&Comment)           |
| proposalID | string | 是       | 所要评论的提案                   |
| repHash    | string | 否       | 所要回复的评论                   |
| comment    | string | 是       | 评论                             |

**返回数据：**

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

**参数说明：**

| 参数 | 类型  | 说明                     |
| :--- | :---- | :----------------------- |
| data | bytes | 交易十六进制编码后的数据 |

#### 6.2 通过提案 ID 查询所对应评论 ListProposalComment

**调用接口**

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

**参数：**

```
message ChainExecutor {
    string driver    = 1;
    string funcName  = 2;
    bytes  stateHash = 3;
    bytes  param     = 4;
    //扩展字段，用于额外的用途
    bytes extra = 5;
}
message ReqQueryProposalComment {
    string proposalID = 1;
    int32  count      = 2;
    int32  direction  = 3;
    int64  height     = 4;
    int32  index      = 5;
}
```

**参数说明：**

| 参数       | 类型   | 是否必须 | 说明                                        |
| :--------- | :----- | :------- | :------------------------------------------ |
| driver     | bytes  | 是       | 执行器名称, 这里固定为 autonomy             |
| funcName   | string | 是       | 操作名称, 这里固定为 ListProposalComment    |
| proposalID | string | 否       | 提案ID                                      |
| count      | int32  | 是       | 查询数量                                    |
| direction  | int32  | 是       | 查询方向, 0:降序, 1:升序                    |
| height     | int64  | 否       | 查询量大翻页查询时候需要输入从某个高度开始  |
| index      | int32  | 否       | 查询量大翻页查询时候需要输入从某个index开始 |

**返回数据：**

```
message ReplyQueryProposalComment {
    repeated RelationCmt rltCmt = 1;
}
message RelationCmt {
    string repHash = 1;
    string comment = 2;
    int64  height  = 3;
    int32  index   = 4;
    string hash    = 5;
}
```

**参数说明：**

| 参数    | 类型   | 说明             |
| :------ | :----- | :--------------- |
| repHash | string | 回复的评论(hash) |
| comment | string | 评论             |
| height  | int64  | 提案高度         |
| index   | int32  | 提案index        |
| hash    | string | 评论的hash       |

