chain33 icon indicating copy to clipboard operation
chain33 copied to clipboard

jrpc接口版本管理问题

Open linj-disanbo opened this issue 5 years ago • 2 comments

chain33 在实现jrpc接口时, 存在直接返回 types 包中的数据结构. 会有两个问题

  1. pb格式的 0值在json中, 会被忽略
  2. 内部数据结构的改动, 会影响协议. 这不一定都是bug, 有时这个改动也需要协议改动, 但有时代码的修改者没有意识这会导致协议的变动, 就没有去修改协议文档.

部分类型已经在 rpc/types/types.go 已经定义, 只是有接口没有用上.

我们可以约定 jrpc 的实现 为 先调用 rpc的实现函数, 再处理返回值的类型转换, 这样不容易产生上诉问题. 类型转换可以写一些小的转换函数来实现.

linj-disanbo avatar Nov 03 '20 08:11 linj-disanbo

接口中用的数据结构就算有和内部用到的数据结构一模一样, 也建议单独在定义一份, 用更多的代码换更稳定的接口.

在chain33项目中, types.transaction 应该是相对不会变的数据结构, 也有两次变化

  1. 增加对交易组的支持: 加了 next, groupCount等
  2. 最近加入 hashCache, fullHashCache

linj-disanbo avatar Nov 03 '20 09:11 linj-disanbo

  1. json rpc 和 grpc 一样,客户端要对后续新增字段兼容,使用的json 解析的库,需要支持这一点,这个要明确重点的写在我们的接口说明上。

  2. 修改字段或者字段的名字,类型之类的,需要新建一个函数 GetAccountV2 V3... , 并且把旧版本设置为过期,提醒客户端。一段时间后,改成 GetAccount ,不再对非常老的版本支持。提供一个启动后调用过期函数,以及次数的统计接口,他们的运维可以监控这个接口,及时的升级客户端。

33cn avatar Nov 04 '20 08:11 33cn