v1协议
说明
V0 协议 Transaction 结构中目标地址to
字段类型为 String,即十六进制字符。但是链上存储时是按照 bytes 类型存储的。
因为字符大小写的问题,导致交易具有可变性,无法准确恢复出发送交易的地址。
因此,在 V1 协议中,将目标地址的类型由 String 改为 bytes。
V0 协议 Transaction 结构中chain_id
字段为 u32 类型。
每条链都需要选择自己唯一的chain_id
,u32 取值空间过小,必须有中心化机构协调才能保证不会出现两条链的chain_id
重复的情况。
因此,在 V1 协议中,将chain_id
的类型由 u32 改为 bytes(u256)。
这样链的运营方可以选择使用 uuid 或者随机的哈希值作为chain_id
,不需要中心化机构协调,也可以在很大概率上保证chain_id
的唯一。
对应 RELEASE 版本
v0.20及以上版本
协议变更
Transaction 结构中增加
to_v1
字段,类型为 bytes。在链的协议版本为 v1 时,原来to
字段不再使用。Transaction 结构中增加
chain_id_v1
字段,类型为 bytes(u256)。在链的协议版本为 v1 时,原来chain_id
字段不再使用。Transaction 结构中的
version
字段必须填 1。
实施协议升级
安排所有节点升级 CITA 版本至 v0.20 及以上版本。
升级系统合约。 Admin private key, chain id, version, url as the params. 注意:这里的参数仅作为演示使用,请实际操作时替换为目标链的相应参数 ./env.sh scripts/amend_sys_cont_to_v0-20.sh 0x5f0258a4778057a8a7d97809bd209055b2fbafa654ce7d31ec7191066b9225e6 1 0 http://127.0.0.1:1337"
使用超级管理员账户,执行如下协议升级命令(注意:这里的 admin-private 私钥仅作为演示使用,请实际操作时替换为目标链的实际私钥)。
cita-cli scm VersionManager setVersion --admin-private 5f0258a4778057a8a7d97809bd209055b2fbafa654ce7d31ec7191066b9225e6 --version 1
用户升级相关工具和 SDK 至明确支持 V1 协议的版本,具体请参见 SDK 和 工具的 RELEASE NOTES。
注意
- 原来的
to
字段和chain_id
字段一定不能填,否则会有交易可变性问题。因此协议升级之后有相关的检查,发现to
字段和chain_id
字段不为空就报错。 - 因为跨链功能目前还没有正式使用,因此升级后相关工具将不再支持 V0 协议,只支持 V1 协议。