跳到主要内容

1. 摘要

本文介绍跨链-BRC315(BubiChain Request for Comments 315)的协议标准和规范流程

2. 动机

解决同构/异构区块链进行数据的共享和互操作过程,让数据和资产能灵活地在各个链间进行验证和流转起来,因此提出BRC315协议定义跨链协议标准

3. 原理

3.1. 中继跨链

本方案提出了中继链+平行链 跨链模式,用于实现不同业务场景的跨链功能,这种模式可以保证跨链的安全性和扩展性。

  • 中继链。任何安全稳定运行的区块链,使用高效的共识算法,保证跨链的效率,满足平行链跨链对性能的不同要求
  • 平行链。所有参与接入跨链生态的同构/异构区块链,可以是各种公链、联盟链、私链等
  • 网关节点。中继链和平行链的适配网关,实现平行链/中继链互联互通跨链通信。支持公证人模式或可信硬件SGX+SPV模式等

该跨链架构包含几个特性:

  • 支持同构链或异构链的跨链
  • 平行链能快速加入,建立跨链路径
  • 支持跨链资产的转移、数据转移、合约调用

以平行链A上的用户Alice向平行链B上的用户Bob转移跨链资产为例,其流程如下:

  1. 用户Alice向A平行链跨链合约发起一笔跨链交易
  2. 平行链A的跨链网关节点监听到跨链交易,经过验证跨链信息后,提交跨链交易到中继链B中
  3. 平行链C的跨链网关节点监听到跨链交易,并进行校验成功后,提交跨链交易到平行链C中
  4. 平行链C中,跨链提案共识成功后,转移资产给用户Bob。
  5. 平行链C的跨链网关节点监听到跨链交易成功后,向中继链B提交跨链交易反馈,标示跨链反馈交易成功
  6. 平行链A和平行链B的跨链网关节点监听到中继链B跨链交易反馈成功后,分别向平行链A和平行链C提交跨链交易反馈,标示跨链反馈交易成功
  7. 至此,跨链结束

3.2. 超时机制

​ 基于中继-平行链的架构中,存在多条平行链,中继链与每个平行链,以及平行链之间的时间无法保证一致性。因此会带来超时异常的问题,很难保证每个链的超时时间保持一致,为此本方案提出了基于中继链的统一超时机制。任意用户在任意链上发起的交易,最终以中继链的时间为基准。当中继链认定某个跨链交易超时,则网关节点会同步该消息至各个平行链,从而达到不同域范围内的平行链时间的一致性,进而保证跨链事务的一致性。

4. 规范

4.1. 中继链合约

初始化接口

创建合约时候,触发合约 init 入口函数。合约进行初始化的操作,初始化合约所在链chainCode、管理组、跨链合约地址(异构链合约无法获取自身的合约地址)。传递 JSON 参数格式如下

调用示例:

{
"method": "init",
"params": {
"chainCode": "ac01",
"managersList": ["adxSYsyhFB8BDjnVg3PQSPMdWsmdpazU9Qs3K"],
"crossContract":""

}
}

调用示例参数说明:

字段名类型描述
chainCodeString必填,链的ID。
managersListArray必填,管理跨链合约的用户组
crossContractString选填,合约自己的地址。

调用接口

setGateway[required]

合约管理账户有权限设置网关节点地址。表示此跨链合约支持相关网关节点提交的平行链跨链交易

注意事项:

  • 触发事件: setGateway

调用示例:

{
"method": "setGateway",
"params":{
"chainCode": "",
"gatewayList": [],
"crossContract": ""
}
}

调用示例参数说明:

字段名类型描述
chainCodeString必填,平行链的ID,长度4位字母或数字
gatewayListArray必填,跨链网关节点地址,
crossContractString必填,平行链的跨链合约地址
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": ""
}
}

调用示例参数说明:

变量类型描述
crossTxNoString必填,跨链交易编号.[5.3. 跨链编号定义](#5.3. 跨链编号定义)
srcAddressString必填,源地址
destAddressString必填,目标地址
srcChainCodeString必填,源链的链ID。
destChainCodeString必填,目标链的链ID。
payloadTypeString必填,交易类型。参照跨链数据格式定义
payloadObject必填,根据交易类型定义对应的扩展信息。参照跨链数据格式定义
extensionString选填,用户扩展信息
versionString必填,版本信息,由原始用户发起交易携带,填写源链跨链合约的版本信息
proofArray必填,跨链交易数组。
proof[i].ledgerSeqString必填,跨链交易区块高度
proof[i].txHashString必填,跨链交易hash
sendAcked[required]

跨链网关节点监听到平行链上有与自己相关的非首次交易,提交跨链交易到中继链

注意事项:

  • 触发事件: sendAcked

调用示例:

{
"method": "sendAcked",
"params":{
"crossTxNo": "",
"result": "",
"version": "",
"proof":{
"ledgerSeq": "",
"txHash": ""
}
}
}

调用示例参数说明:

变量类型描述
crossTxNoString必填,跨链交易编号
resultString必填,跨链交易结果。"1"成功,"2"失败,"3":"超时"
versionString必填,版本信息,由原始用户发起交易携带,填写源链跨链合约的版本信息
proofObject必填,平行链的跨链存证对象
proof.ledgerSeqString必填,平行链上跨链交易的区块号
proof.txHashString必填,平行链上跨链交易的哈希值

查询接口

getCrossTx[required]

用户在查询跨链交易详情数据,返回跨链协议数据结构

调用示例:

{
"method": "getCrossTx",
"params":{
"crossTxNo": ""
}
}

调用示例参数说明:

变量类型描述
crossTxNoString必填,跨链交易编号

响应数据:

{
"result":{
"type": "string",
"value": "xxxxx"// 为json字符串格式,json对象描述如下
}
}
{
"crossTxNo":"",
"srcChainCode": "",
"destChainCode": "",
"srcCrossContract": "",
"destCrossContract": "",
"srcAddress": "",
"destAddress": "",
"payloadType":"",
"payload": "",
"remark": "",
"result": "",
"refunded":"",
"extension": "",
"sendProofs": [],
"ackProofs": [],
"version": "",
"origin": ""
}

注意:

  • 返回值:跨链协议结构数据。[章节5.1](#5.1. 基本结构定义)

4.2. 平行链合约

初始化接口

创建合约时候,触发合约 init 入口函数。合约进行初始化的操作,初始化合约所在链chainCode、管理组、跨链合约地址(异构链合约无法获取自身的合约地址)。传递 JSON 参数格式如下:

调用示例:

{
"method": "init",
"params": {
"chainCode": "ac01",
"managersList": ["adxSYsyhFB8BDjnVg3PQSPMdWsmdpazU9Qs3K"],
"crossContract":""

}
}

调用示例参数说明:

字段名类型描述
chainCodeString必填,链的ID。
managersListArray必填,管理跨链合约的用户组
crossContractString选填,合约自己的地址。

调用接口

setGateway[required]

合约管理账户有权限设置网关节点地址。表示此跨链合约支持相关网关节点提交的平行链跨链交易

注意事项:

  • 触发事件: setGateway

调用示例:

{
"method": "setGateway",
"params":{
"chainCode": "",
"gatewayList": [],
"crossContract": ""
}
}

调用示例参数说明:

字段名类型描述
chainCodeString必填,平行链的ID
gatewayListArray必填,跨链网关节点地址
crossContractString必填,平行链的跨链合约地址
startTx[required]

跨链交易由普通用户发起,交易内容为源链A(平行链)到目的链C(平行链)的平行链资产转移、合约调用、数据传递等操作

注意事项:

  • 触发事件: startTx

调用示例:

{
"method": "startTx",
"params":{
"srcAddress": "",
"destAddress": "",
"destCrossContract": "",
"destChainCode": "",
"payloadType": "2",
"payload": {
"contractMethod": "getAsset",
"contractCallEncode":"",
"contractInput":[{
"type": "string",
"name": "assetKey",
"value": "asset_code_eth"
}, {
"type": "uint",
"name": "amount",
"value": "10"
}]
},
"extension": "",
"version": ""
}
}

调用示例参数说明:

变量类型描述
srcAddressString必填,源地址
destAddressString必填,目标地址
destChainCodeString必填,目标链的链ID。
destCrossContractString必填,目标跨链合约地址
payloadTypeString必填,交易类型。参照跨链数据格式定义
payloadObject必填,根据交易类型定义对应的扩展信息。参照跨链数据格式定义
extensionString选填,用户扩展信息
versionString必填,版本信息,由原始用户发起交易携带,填写源链跨链合约的版本信息
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": ""
}
}

调用示例参数说明:

变量类型描述
crossTxNoString必填,跨链交易编号。[5.3. 跨链编号定义](#5.3. 跨链编号定义)
srcAddressString必填,源地址
destAddressString必填,目标地址
srcChainCodeString必填,源链的链ID。
destChainCodeString必填,目标链的链ID。
payloadTypeString必填,交易类型。参照跨链数据格式定义
payloadObject必填,根据交易类型定义对应的扩展信息。参照跨链数据格式定义
extensionString选填,用户扩展信息
versionString必填,版本信息,由原始用户发起交易携带,填写源链跨链合约的版本信息
proofArray必填,跨链交易数组。
proof[i].ledgerSeqString必填,跨链交易区块高度
proof[i].txHashString必填,跨链交易hash
sendAcked[required]

跨链网关节点监听到中继链或者平行链上有与自己相关的非首次交易,监控到中继链状态变化则提交跨链交易到平行链

注意事项:

  • 触发事件: sendAcked

调用示例:

{
"method": "sendAcked",
"params":{
"crossTxNo": "",
"result": "",
"version": "",
"proof":{
"ledgerSeq": "",
"txHash": ""
}
}
}

调用示例参数说明:

变量类型描述
crossTxNoString必填,跨链交易编号。
resultString必填,跨链交易结果。"1"成功,"2"失败,"3":"超时"
versionString必填,版本信息,由原始用户发起交易携带,填写源链跨链合约的版本信息
proofObject必填,中继链的跨链存证对象
proof.ledgerSeqString必填,中继链上跨链交易的区块号
proof.txHashString必填,中继链上跨链交易的哈希值
takeOut[required]

用户在发起跨链交易异常(失败或者超时)后,可以主动取出资产(跨链资产转移操作)

注意事项:

  • 触发事件: takeOut

调用示例:

{
"method": "takeOut",
"params":{
"crossTxNo": "",
"toAddress": ""
}
}

调用示例参数说明:

变量类型描述
crossTxNoString必填,跨链交易编号。
toAddressString必填,取出跨链资产后要转移的目标地址。
transfer[required]

目标链经过跨链的额资产转移操作,生成合约资产。资产拥有者可以调用此接口转移相关的跨链资产。转移 value 数量的 token 到的地址 to

注意事项:

  • 触发事件: transfer

调用示例:

{
"method":"transfer",
"params":{
"assetKey": "",
"to":"",
"value":"1000000"
}
}

调用示例参数说明:

变量类型描述
assetKeyString必填,跨链资产key
toString必填,要转移的目标地址。
valueString必填,转移数量。

查询接口

getCrossTx[required]

用户在查询跨链交易详情数据,返回跨链协议数据结构。

调用示例:

{
"method": "getCrossTx",
"params":{
"crossTxNo": ""
}
}

调用示例参数说明:

变量类型描述
crossTxNoString必填,跨链交易编号。

响应数据:

{
"result":{
"type": "string",
"value": "xxxxx"// 为json字符串格式,json对象描述如下
}
}
{
"crossTxNo":"",
"srcChainCode": "",
"destChainCode": "",
"srcCrossContract": "",
"destCrossContract": "",
"srcAddress": "",
"destAddress": "",
"payloadType":"",
"payload": "",
"remark": "",
"result": "",
"refunded":"",
"extension": "",
"sendProofs": [],
"ackProofs": [],
"version": "",
"origin": ""
}

注意:

  • 返回值:跨链协议结构数据。[章节5.1](#5.1. 基本结构定义)

4.3. 事件定义

setGateway

tlog("setGateway", chainCode,crossContract,gatewayList);

事件参数:

字段名类型描述
setGatewayString方法名称
chainCodeString链ID
crossContractString平行链的跨链合约地址
gatewayListArray跨链网关节点地址

sendTx

调用sendTx接口会产生事件

tlog("sendTx", crossTxNo);

事件参数:

字段名类型描述
sendTxString方法名称
crossTxNoString跨链编号

sendAcked

调用sendAcked接口会产生事件

tlog("sendAcked", crossTxNo);

事件参数:

字段名类型描述
sendAckedString方法名称
crossTxNoString跨链编号

startTx

调用startTx接口会产生事件

tlog("startTx", crossTxNo);

事件参数:

字段名类型描述
startTxString方法名称
crossTxNoString跨链编号

takeOut

调用takeOut接口会产生事件

tlog("takeOut", crossTxNo);

事件参数:

字段名类型描述
takeOutString方法名称
crossTxNoString跨链编号

transfer

调用transfer接口会产生事件

tlog('transfer', sender, to, value);

事件参数:

字段名类型描述
transferString方法名称
senderString交易发起者
toString要转移的目标地址。
valueString转移数量

5. 数据定义

5.1. 基本结构定义

参数数据类型描述
srcChainCodeString源链的唯一ID。
destChainCodeString目标链唯一ID。
crossTxNoString跨链编号。
srcAddressString源地址
destAddressString目标地址
srcCrossContractString源跨链合约地址
destCrossContractString目标跨链合约地址
payloadTypeString交易类型,详情见[章节5.2](#5.2. 跨链类型及内容定义)
payloadObject根据交易类型定义对应的扩展信息
proofArray跨链交易数组。
proof[i].ledgerSeqString跨链交易区块高度
proof[i].txHashString跨链交易hash
statusString跨链交易的状态。"0":初始化,"1":已确认成功, "2":已确认失败, "3":已超时,"4":已退款
resultString跨链结果。0正在进行,1是已完成
extensionObject扩展消息。用户自定义消息
versionString协议版本号.如果版本号不兼容,则跨链交易失败

5.2. 跨链类型及内容定义

  • 合约互操作(payloadType="2")
变量类型描述
payloadObject自定义消息
payload.contractCallEncodeString目标合约方法和参数的封装。仅solidity合约需要
payload.contractMethodString目标合约方法
payload.contractInputString(Array)合约参数。用户自定义,array类型的字符串
payload.contractInput[0].typeString合约参数数据类型。随链定义而定,如:string、bytes、uint256等等
payload.contractInput[0].nameString合约参数名称
payload.contractInput[0].valueString/Uint/true/..合约参数数值
payload.contractInput[n]Object自定义参数N
  • 数据传递(payloadType="3")

源链用户发起,传递BID文档数据到目标链,保存在用户定义的资源合约中

变量类型描述
payloadObject数据对象
payload.dataString传递字符串数据。

资源合约的存储接口定义:

function storeCrossData(String crossData)
  • 资产转移(payloadType="4")
变量类型描述
payloadObject源链积分信息
payload.assetTypeString资产类型。1-原生token、2-ERC20资产、3-ERC721资产
payload.amountString积分数量
payload.contractAddressString资产合约地址
payload.tokenIdString资产id。支持ERC721

5.3. 跨链编号定义

跨链开启后会生成唯一的跨链编号来标识此次跨链交易,通过跨链编号来维护跨链的过程和交易数据等。定义规则如下:

​ srcChainId + ":" destChainId + ":" + uniqueSeq

字段描述
srcChainId源链的ID
destChainId目标链的ID
uniqueSeq源链上的唯一序号

5.4. 跨链资产assetKey定义

  • 原生token

源链的ID。如:ac01

  • ERC20资产

    源链ID + “_erc20_” + 源链erc20资产合约地址。如:by01_erc20_did:bid:efW9t6ACLWV78CjtWrcSvNF51ytUoBQo

  • ERC721资产

    源链ID + “_erc721_” + 源链erc721资产合约地址。如:by01_erc721_did:bid:efW9t6ACLWV78CjtWrcSvNF51ytUoBQo