1. 摘要
本文介绍跨链-BRC315(BubiChain Request for Comments 315)的协议标准和规范流程
2. 动机
解决同构/异构区块链进行数据的共享和互操作过程,让数据和资产能灵活地在各个链间进行验证和流转起来,因此提出BRC315协议定义跨链协议标准
3. 原理
3.1. 中继跨链
本方案提出了中继链+平行链 跨链模式,用于实现不同业务场景的跨链功能,这种模式可以保证跨链的安全性和扩展性。
- 中继链。任何安全稳定运行的区块链,使用高效的共识算法,保证跨链的效率,满足平行链跨链对性能的不同要求
- 平行链。所有参与接入跨链生态的同构/异构区块链,可以是各种公链、联盟链、私链等
- 网关节点。中继链和平行链的适配网关,实现平行链/中继链互联互通跨链通信。支持公证人模式或可信硬件SGX+SPV模式等
该跨链架构包含几个特性:
- 支持同构链或异构链的跨链
- 平行链能快速加入,建立跨链路径
- 支持跨链资产的转移、数据转移、合约调用
以平行链A上的用户Alice向平行链B上的用户Bob转移跨链资产为例,其流程如下:
- 用户Alice向A平行链 跨链合约发起一笔跨链交易
- 平行链A的跨链网关节点监听到跨链交易,经过验证跨链信息后,提交跨链交易到中继链B中
- 平行链C的跨链网关节点监听到跨链交易,并进行校验成功后,提交跨链交易到平行链C中
- 平行链C中,跨链提案共识成功后,转移资产给用户Bob。
- 平行链C的跨链网关节点监听到跨链交易成功后,向中继链B提交跨链交易反馈,标示跨链反馈交易成功
- 平行链A和平行链B的跨链网关节点监听到中继链B跨链交易反馈成功后,分别向平行链A和平行链C提交跨链交易反馈,标示跨链反馈交易成功
- 至此,跨链结束
3.2. 超时机制
基于中继-平行链的架构中,存在多条平行链,中继链与每个平行链,以及平行链之间的时间无法保证一致性。因此会带来超时异常的问题,很难保证每个链的超时时间保持一致,为此本方案提出了基于中继链的统一超时机制。任意用户在任意链上发起的交易,最终以中继链的时间为基准。当中继链认定某个跨链交易超时,则网关节点会同步该消息至各个平行链,从而达到不同域范围内的平行链时间的一致性,进而保证跨链事务的一致性。
4. 规范
4.1. 中继链合约
初始化接口
创建合约时候,触发合约
init
入口函数。合约进行初始化的操作,初始化合约所在链chainCode、管理组、跨链合约地址(异构链合约无法获取自身的合约地址)。传递JSON
参数格式如下
调用示例:
{
"method": "init",
"params": {
"chainCode": "ac01",
"managersList": ["adxSYsyhFB8BDjnVg3PQSPMdWsmdpazU9Qs3K"],
"crossContract":""
}
}
调用示例参数说明:
字段名 | 类型 | 描述 |
---|---|---|
chainCode | String | 必填,链的ID。 |
managersList | Array | 必填,管理跨链合约的用户组 |
crossContract | String | 选填,合约自己的地址。 |
调用接口
setGateway[required]
合约管理账户有权限设置网关节点地址。表示此跨链合约支持相关网关节点提交的平行链跨链交易
注意事项:
- 触发事件: setGateway
调用示例:
{
"method": "setGateway",
"params":{
"chainCode": "",
"gatewayList": [],
"crossContract": ""
}
}
调用示例参数说明:
字段名 | 类型 | 描述 |
---|---|---|
chainCode | String | 必填,平行链的ID,长度4位字母或数字 |
gatewayList | Array | 必填,跨链网关节点地址, |
crossContract | String | 必填,平行链的跨链合约地址 |
sendTx[required]
跨链网关节点监听到者平行链上有与自己相关的首次交易,提交跨链交易到中继链
注意事项:
- 触发事件: sendTx
调用示例:
{
"method": "sendTx",
"params":{
"crossTxNo": "",
"srcAddress": "",
"destAddress": "",
"srcCrossContract": "",
"destCrossContract": "",
"srcChainCode": "",
"destChainCode": "",
"payloadType": "",
"payload":{
"contractMethod": "getAsset",
"contractCallEncode":"0x364363d0dfd8bed7a6310defc156d",
"contractInput":[{
"type": "string",
"name": "assetKey",
"value": "asset_code_eth"
}, {
"type": "uint",
"name": "amount",
"value": "10"
}]
},
"extension": "",
"proof": {
"ledgerSeq":"10536140",
"txHash":"0xfdbf907e5496df6c0a43939ad5b9dcd007dfff10ff026d65382936c9f17834af"
},
"version": ""
}
}
调用示例参数说明:
变量 | 类型 | 描述 |
---|---|---|
crossTxNo | String | 必填,跨链交易编号.[5.3. 跨链编号定义](#5.3. 跨链编号定义) |
srcAddress | String | 必填,源地址 |
destAddress | String | 必填,目标地址 |
srcChainCode | String | 必填,源链的链ID。 |
destChainCode | String | 必填,目标链的链ID。 |
payloadType | String | 必填,交易类型。参照跨链数据格式定义 |
payload | Object | 必填,根据交易类型定义对应的扩展信息。参照跨链数据格式定义 |
extension | String | 选填,用户扩展信息 |
version | String | 必填,版本信息,由原始用户发起交易携带,填写源链跨链合约的版本信息 |
proof | Array | 必填 ,跨链交易数组。 |
proof[i].ledgerSeq | String | 必填,跨链交易区块高度 |
proof[i].txHash | String | 必填,跨链交易hash |
sendAcked[required]
跨链网关节点监听到平行链上有与自己相关的非首次交易,提交跨链交易到中继链
注意事项:
- 触发事件: sendAcked
调用示例:
{
"method": "sendAcked",
"params":{
"crossTxNo": "",
"result": "",
"version": "",
"proof":{
"ledgerSeq": "",
"txHash": ""
}
}
}
调用示例参数说明:
变量 | 类型 | 描述 |
---|---|---|
crossTxNo | String | 必填,跨链交易编号 |
result | String | 必填,跨链交易结果。"1"成功,"2"失败,"3":"超时" |
version | String | 必填,版本信息,由原始用户发起交易携带,填写源链跨链合约的版本信息 |
proof | Object |