Skip to content

Latest commit

 

History

History
865 lines (595 loc) · 34.6 KB

星火链网RFC-009:星火链网跨链协议规范.md

File metadata and controls

865 lines (595 loc) · 34.6 KB

星火链网RFC-009:星火链网跨链协议规范

1. 序言

编号:RFC-009

类型:标准

标题:星火链网跨链协议规范

作者:金键,jin.jian@caict.ac.cn;谢家贵,xiejiagui@caict.ac.cn;李志平,lizhiping@caict.ac.cn;郭健,guojian@caict.ac.cn;刘远超,liuyuanchao@caict.ac.cn

发布时间:2021-12-14

状态:采纳

更新时间:2021-12-14

讨论地址:#9

依赖RFC:无

2. 摘要

结合BID标识符,”星火·链网”实现了智能合约跨链互操作、链上数据的跨链传输、资产跨链交易等。本文介绍星火链网跨链协议的流程和规范。

3. 动机

为了更清楚地描述星火链网的跨链机制,跨链的类型、流程和相关规范,这篇RFC做了相关的回应。

4. 原理

下面将从架构、角色、设计原则、流程等方面进行阐述。

4.1 架构简介

image-20211214141343580

跨链协议组件包含:

  • 跨链合约

    • 定义主链积分转移、子链积分兑换、跨链合约调用、数据跨链四种跨链互操作
  • 骨干节点网关

    • 连接主链和子链的桥梁,起到类似公证人的效果
  • 跨链通信协议

    • 定义跨链消息的消息格式

4.2 核心角色

  • 星火·主链:用于跨链交易的可信验证和可靠路由,是一条具有身份认证功能的许可公有链,在跨链方案中承担中继链的角色。

  • 骨干节点: 骨干节点的作用是跨链网关,内置跨链账户,负责子链与主链之间的消息通信。

  • 星火·子链: 承载多行业、区域应用,丰富链网生态,提供行业区块链解决方案,赋能区块链应用落地的重要角色。

4.3 跨链设计原则

星火链网设计跨链方案时需要满足四个核心原则:

  • 有保证的消息传递——只要主链、子链正常产生区块就能收到跨链消息

  • 无信任的消息传递——在无信任基础上确保消息传递的正确性和真实性

  • 消息是有序传递的—— 跨链消息以定义好的顺序到达

  • 跨链消息执行结果是一致的——跨链消息执行结果不会因区块回退而被覆盖

基于以上核心原则,“星火·链网”设计了可靠路由解析机制与可信验证策略机制这两个关键技术来保证跨链消息传递的真实性,跨链交易执行的原子性,以及执行结果的一致性。

4.3.1 可靠路由

可靠路由是指跨链消息可以在有限时间内到达目标子链,且路由过程中消息不可被篡改。“星火·链网”的可靠路由策略由骨干节点、主链共识节点、主链跨链消息验证节点以及子链参与,使用三阶段确认策略确保消息可达,使用hash签名、merkle证明等技术保障消息传递过程中不被篡改;利用交易和区块作为跨链交易路由的载体,只要主链、子链正常生产区块,跨链消息就不会被阻塞,保证了消息传递的稳定性。 image-20211214113406508

可靠路由流程:

1、 源链提供跨链消息的SPV证明及hash签名到骨干节点集合

2、 骨干节点是一个多节点集合,节点按权重排序,一次验证源链的spv证明

3、 骨干节点使用队列管理跨链消息,负责验证SPV,使用nonce对跨链消息排序并将跨链消息转换成统一的跨链交易格式,发送到主链。

4、 主链上的跨链验证节点专门负责与特定子链的骨干节点通信、验证和预执行跨链交易,包括验证骨干节点跨链交易队列的merkle proof。

5、 验证通过后跨链验证节点提交跨链交易到共识节点。

6、 主链上的共识节点对跨链交易进行共识,同时启动跨链交易超时的计时。

7、 目标子链的跨链验证节点通过区块同步获知跨链交易。以下相同

8、 跨链验证节点转发跨链交易给骨干节点。

9、 骨干节点验证跨链交易已被主链共识后,转发跨链消息给目标子链。

10、 目标子链验证跨链消息hash签名,确认跨链消息未被篡改。

4.3.2 可信验证

“星火·链网”实现可信验证策略,保证跨链交易执行结果的一致性。保证一致性最大的挑战是因子链共识算法不同而可能存在的分叉或回退。对于可能存在分叉的子链,星火·主链需要验证跨链交易被打包在主链而不是分叉链上。因此,针对不同类型的共识算法,”星火·链网”实现了不同的验证策略:

4.3.2.1 确定性共识算法

应用确定性共识算法(如实用拜占庭算法)的子链,在产生区块的过程中不会产生分叉,跨链交易一旦被打包进区块,即可认为交易被最终确认。因此,只需要验证跨链交易已被确认的SPV证明即可。

image-20211214134432278

4.3.2.2 概率性一致共识算法

应用概率性一致共识算法(如POW)的子链,在产生区块的过程中时刻存在分叉,依赖最长链原则来确认主链。要求这类子链必须有多个骨干节点,这些骨干节点共同管理一个多重签名账户来向星火·主链发起跨链交易,只有经过多个骨干节点签名验证后的跨链交易,主链才认为它已经被子链最终确认。 image-20211214134504736

4.3.3 强原子性原则

下图展示了一个完整的跨链交易: image-20211214140410361

为了保证该交易的原子性,需满足如下条件。

4.3.3.1 三阶段准备
  • 准备阶段:

    • 1、通过跨链合约预执行跨链互操作,如锁定质押资产
    • 2、预执行交易上链后,构造跨链消息,提交跨链交易
  • 提交阶段:

    • 1、骨干节点验证跨链交易,并提交到主链
    • 2、主链路由跨链消息,等待目标子链响应
    • 3、目标子链提交响应信息
  • 确认阶段:

    • 1、子链提交确认消息
    • 2、主链路由确认消息并更新跨链消息状态
    • 3、目标子链获取跨链交易状态并响应
4.3.3.2 键值锁定

从数据库层面锁定跨链交易涉及到的数据,防止误写

4.4 跨链流程

SEND和ACK机制是任意一条发送的跨链消息,在发出后经过目标链处理完成后,必须确认给源链,源链收到确认消息后才将此跨链消息进行确认操作(如锁定、解锁、转移资产)。 ACK消息包含三种类型:

  • 成功

    目标链处理完成后,骨干节点监听后,向源链发送ACK SUCEESD消息

  • 失败

    目标链处理异常,如交易失败,骨干节点监听后,向源链发送ACK FAILED消息

  • 超时

    目标链一直没有相应,骨干节点会先查询主链是否为超时状态,如果为超时,则会向源链发送ACK TIMEOUT消息 image-20211214140609810

以子链向子链发送跨链交易为例,流程描述:

  1. 子链bif Chain的Alice向子链eth Chain的Bob发起跨链交易;

  2. 子链bif Chain的网关节点(骨干节点)监听到跨链事务,判断事务状态和可靠性;

  3. 提交跨链交易到中继链;

  4. 中继链执行交易,打包出块;

  5. 子链eth Chain的网关节点监听到跨链事务,判断事务状态和可靠性;

  6. 子链eth Chain执行跨链交易。

  7. 子链eth Chain的网关节点向中继链发送ack;

  8. bif Chain的网关节点、eth Chain的网关节点监听到中继链的ack;各网关节点发送ack给各子链;

  9. 跨链交易完成;

5. 规范

本规范基于1+N的主子链群架构,解决链群之间的资产信息互联互通问题。该链群架构由一个国家主链和多个行业从链组成,这种架构可以让各个行业业务更加高效地运行在各自的从链上,这些业务相互独立且不会受到彼此影响。

5.1 跨链类型

image-20211214161332774

跨链内容包括:主链积分转移、子链积分兑换、数据传递、合约互操作。

5.1.1 主链积分转移

主链的积分由主链共识及其激励机制产生。激励机制是指对参与区块链共同治理节点的奖励机制,一个有效的激励模型能够提高用户参与度的积极性,从而保证了区块链系统的活跃性;因为区块链关系到所有参与者的利益,因此能够促使参与者共同维护区块链系统,防止黑客攻击,使区块链系统运行的稳定性、安全性和高效性,从而建立一个功能更加完善的区块链生态系统。

主链积分可以转移到主从链群中做任意转移,主链可以转移到子链的任一账户地址中,子链的账户仍然可以在子链中转移给子链的其他用户,从而达到主链积分在全网中流通及使用。

5.1.2 子链积分兑换

子链积分由子链共识及其激励机制。每个子链的生态中,子链积分对生态的影响有着关键性因素。在实际的生产和商业活动中,子链积分也有着跨域使用的需求。因此需要对子链积分跨链流通和使用进行支持。

子链积分只能兑换主链积分进行转移。在源链中,用户需要先找骨干节点按照汇率先兑换成对应的主链积分,转移到对端链中,由骨干节点按照目标链积分的汇率进行兑换。

5.1.3 合约互操作

用户调用合约,可以传递参数。

5.1.4 数据传递

源链传递到对端的BID合约,以BID DOC方式存储。

5.2 跨链通讯协议定义

协议定义分为基本数据定义、跨链类型定义、跨链基础接口类型定义。

5.2.1 基本数据定义

参数 数据类型 描述
destChainCode String 源链的链码
destChainCode String 目标链的链码
crossTxNo String 跨链编号。"A:B:XXXXXXXX",A为源链码,B为目标链码,XXXX为随机编码
srcBid String 源地址
destBid String 目标地址
txType String 交易类型,0:主链积分转移;1:子链积分兑换;2:合约互操作;3:数据传递
payload Object 根据交易类型定义对应的扩展信息,详情见以下定义
remark String 用户备注信息
txList Array 跨链交易数组
txList[i].hash String 跨链交易hash
status String 跨链交易的状态。"0":初始化,"1":已确认成功, "2":已确认失败, "3":已超时,"4":已退款
result String 跨链结果。0正在进行,1是已完成
extension Object 扩展消息。用户自定义消息
version String 协议版本号.如果版本号不兼容,则跨链交易失败

5.2.2 跨链类型定义

类型定义参考跨链类型

5.2.2.1 主链积分转移

参数说明:

参数 数据类型 描述
payload Object 主链积分信息
payload.amount String 积分数量
5.2.2.2 子链积分兑换

场景使用:

  • 子链->主链
  • 子链->子链
  • 主链->子链

骨干节点的提案网关需要承担兑换子链积分和转移主链积分的功能。

汇率换算

 let masterAmount;
 let srcAmount;
 let srcTokenRate;
 let destAmount;
 let destTokenRate;
 
 masterAmount = srcAmount/srcTokenRate;
 masterAmount = destAmount/destTokenRate;

参数说明:

参数 数据类型 描述
payload Object 源链积分信息
payload.masterAmount String 主链积分数量
payload.srcAmount String 源链积分数量
payload.srcTokenRate String 源链积分的汇率
payload.destAmount String 目标链积分数量
payload.destTokenRate String 目标链积分的汇率
5.2.2.3 合约互操作

参数说明:

参数 数据类型 描述
payload Object 自定义消息
payload.destContractBid String 目标合约BID
payload.srcSenderBid String 发起人BID
payload.destContractMethod String 目标合约方法
payload.destContractInput Array 合约参数。用户自定义
payload.destContractInput[0] Object/String/Array 自定义参数一
payload.destContractInput[n] Object/String/Array 自定义参数N
payload.Token Object 可以为空,源链积分信息当涉及到需要支付资产时候,可以使用子链积分兑换的协议进行扩展
payload.Token.masterAmount String 主链积分数量
payload.Token.srcAmount String 源链积分数量
payload.Token.srcTokenRate String 源链积分的汇率
payload.Token.destAmount String 目标链积分数量
payload.Token.destTokenRate String 目标链积分的汇率
5.2.2.4 数据传递

源链用户发起,传递到目标链,最终以BID DOC方式存储。

参数说明:

参数 数据类型 描述
payload Object 数据对象
payload.document Object BID DOC对象
payload.document.id String id为具体的bid标识
payload.document.publicKey[] Array 标识did拥有者公钥数组
payload.document.publicKey[i].id String id#keys-i的格式,用来标识did拥有者。如:did:bid:ZUZQkYXw6f87t3JkHCr2MauQAzYB2zM1s#keys-1
payload.document.publicKey[i].type String Ed25519,目前只支持Ed25519
payload.document.publicKey[i].publicKeyHex String 拥有者公钥
payload.document.type String 具体标识的物体类型比如图像(image)、声音(voice)、视屏(video)、汽车(car)、手机(phone)、标识(handle)等
payload.document.recovery Array 修改权限控制列表
payload.document.recovery[i] String 为恢复秘钥标识。如did:bid:ZUZQkYXw6f87t3JkHCr2MauQAzYB2zM1s#keys-1
payload.document.service Object 标识依赖的服务对象
payload.document.service.id String bid#resolver
payload.document.service.type String DIDResolve
payload.document.serviceEndpoint String DID解析地址
payload.document.attributes Array 属性信息,创建地址的时候可以不用传入
payload.document.attributes[i].key String 关键字标识
payload.document.attributes[i].type String 是否加密,加密为encrypt,未加密为空""
payload.document.attributes[i].value String 若是加密状态则值为空,若是明文状态为具体的值
payload.document.encryptEndpoint String 解密服务地址
payload.document.fileEndpoint String 文件存储地址
payload.proof Object 证据对象
payload.proof.type String 为签名算法类型默认为Ed25519
payload.proof.creator String id#keys-1
payload.proof.signatureValue String 签名信息,签名的具体内容为document相加,让后用创建者(变更者)BID私钥进行签名

5.2.3 跨链基础接口类型

image-20211214153602224

  • 发起交易

用户发起跨链交易CTx-1(主链积分、子链积分、合约资产、数据传递)。该跨链交易由普通用户发起,交易内容为源链M(任意主链或子链)到目的链N(非M的主链或者子链)。

  • 提交交易

骨干节点监听到主链或者子链上有与自己相关的首次交易,提交跨链交易到对手链(如监控到子链则提交跨链交易到主链;监控到主链则提交跨链交易到子链)。

  • 确认交易

骨干节点监听到主链或者子链上有与自己相关的非首次交易,提交跨链确认到对手链(如监控到子链则提交跨链交易到主链;监控到主链则提交跨链交易到子链)。

5.3 跨链合约定义

跨链合约定义分为主链合约定义、子链合约定义等。

5.3.1 主链合约定义

主链合约定义的步骤如下:

5.3.1.1 设置网关节点地址

功能:

超级节点设置网关节点

{
	"method": "setNotaryBid",
	"params":{
		"chainCode": "",
		"notaryBid": "",
		"remark": ""
	}
}

请求参数说明:

字段名 类型 是否必填 描述
chainCode String 链码
notaryBid String 骨干节点的网关节点地址
remark String 备注

成功的返回事件:

tlog("setNotaryBid", "chainCode");

响应参数说明:

字段名 类型 描述
setNotaryBid String 方法名称
chainCode String 链码
5.3.1.2 设置子链兑换汇率

功能:

超级节点设置网关节点

{
	"method": "setTokenRate",
	"params":{
		"chainCode": "",
		"rate": "",
        "remark": ""
	}
}

请求参数说明:

字段名 类型 是否必填 描述
chainCode String 链码
rate String 子链积分与主链积分汇率,并且以主链积分为基准。如"6.5"表示1个主链积分可以兑换6.5个子链积分。
remark String 备注

成功的返回事件:

tlog("setTokenRate", "chainCode");

响应参数说明:

字段名 类型 描述
setNotaryBid String 方法名称
chainCode String 链码
5.3.1.3 发起跨链交易

功能:

用户发起从主链到子链的交易

{
	"method": "startTx",
	"params":{
        "srcBid": "",
        "destBid": "",
        "destChainCode": "",
        "txType": "",
        "payload":{
        },
        "remark": "",
        "extension": {},
        "version": ""
    }
}

请求参数说明:

变量 类型 描述
srcBid String 源地址BID
destBid String 目标地址BID
destChainCode String 目标链的链码
txType String 交易类型。参照跨链数据格式定义
payload Object 根据交易类型定义对应的扩展信息。参照跨链数据格式定义
extension Object 用户扩展信息
remark String 备注信息
version String 版本信息,由原始用户发起交易携带,填写源链跨链合约的版本信息

成功的返回事件:

tlog("startTx", "crossTxNo");

响应参数说明:

字段名 类型 描述
startTx String 方法名称
crossTxNo String 跨链编号
5.3.1.4 提交跨链交易

功能:

骨干节点提交从子链到子链或者主链的交易

{
	"method": "sendTx",
	"params":{
        "srcBid": "",
        "destBid": "",
        "srcChainCode": "",
        "destChainCode": "",
        "txType": "",
        "payload":{
        },
        "remark": "",
        "extension": {},
        "version": ""
    }
}

请求参数说明:

变量 类型 描述
srcBid String 源地址
destBid String 目标地址
srcChainCode String 源链的链码
destChainCode String 目标链的链码
txType String 交易类型。参照跨链数据格式定义
payload Object 根据交易类型定义对应的扩展信息。参照跨链数据格式定义
extension Object 用户扩展信息
version String 版本信息,由原始用户发起交易携带,填写源链跨链合约的版本信息
remark String 备注信息

成功的返回事件:

tlog("sendTx", "crossTxNo");

响应参数说明:

字段名 类型 描述
sendTx String 方法名称
crossTxNo String 跨链编号
5.3.1.4 提交跨链确认交易

功能:

骨干节点提交从子链到主链的交易确认

{
	"method": "sendAcked",
	"params":{
        "crossTxNo": "",
    	"result",
        "extension": {},
        "version": ""
    }
}

请求参数说明:

变量 类型 描述
crossTxNo String 跨链交易编号
result String 跨链交易结果。"0"成功,"1"失败,"2":"超时"
version String 版本信息,由原始用户发起交易携带,填写源链跨链合约的版本信息

成功的返回事件:

tlog("sendAcked", "crossTxNo");

响应参数说明:

字段名 类型 描述
sendAcked String 方法名称
crossTxNo String 跨链编号
5.3.1.5 提取异常的跨链资产

功能:

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

{
	"method": "takeOut",
	"params":{
        "crossTxNo": "",
        "toBid": "",
        "payload": {}
    }
}

请求参数说明:

变量 类型 描述
crossTxNo String 跨链交易编号
toBid String 取出跨链资产后要转移的目标地址。
payload Object/Array/String 可以为空。如果toBid是合约的话,需要自定义合约的参数
payload.contractMethod String 目标合约方法
payload.contractInput Array 合约参数。用户自定义
payload.contractInput[0] Object/String/Array 合约参数自定义参数一
payload.contractInput[n] Object/String/Array 自定义参数N

成功的返回事件:

tlog("takeOut", "crossTxNo");

响应参数说明:

字段名 类型 描述
takeOut String 方法名称
crossTxNo String 跨链编号

5.3.2 子链合约定义

子链合约定义的步骤如下:

5.3.2.1 设置网关节点

功能:

骨干节点设置网关节点地址

{
	"method": "setNotaryBid",
	"params":{
		"chainCode": "",
		"notaryBid": "",
		"remark": ""
	}
}

请求参数说明:

字段名 类型 是否必填 描述
chainCode String 链码
notaryBid String 骨干节点的网关节点地址
remark String 备注

成功的返回事件:

tlog("setNotaryBid", "chainCode", "notaryBid");

响应参数说明:

字段名 类型 描述
setNotaryBid String 方法名称
chainCode String 链码
notaryBid String 骨干节点的网关节点地址
5.3.2.2 发起跨链交易

用户发起从子链到子链或者主链的交易

{
	"method": "startTx",
	"params":{
        "srcBid": "",
        "destBid": "",
        "destChainCode": "",
        "txType": "",
        "payload":{
        },
        "remark": "",
        "extension": {},
        "version": ""
    }
}

请求参数说明:

变量 类型 描述
srcBid String 源地址
destBid String 目标地址
destChainCode String 目标链的链码
txType String 交易类型。参照跨链数据格式定义
payload Object 根据交易类型定义对应的扩展信息。参照跨链数据格式定义
extension Object 用户扩展信息
remark String 备注信息
version String 版本信息,由原始用户发起交易携带,填写源链跨链合约的版本信息

成功的返回事件:

tlog("startTx", "crossTxNo");

响应参数说明:

字段名 类型 描述
startTx String 方法名称
crossTxNo String 跨链编号
5.3.2.3 提交跨链交易

功能:

骨干节点提交从主链或者子链到当前链的交易

{
	"method": "sendTx",
	"params":{
        "srcBid": "",
        "destBid": "",
        "srcChainCode": "",
        "destChainCode": "",
        "txType": "",
        "payload":{},
        "remark": "",
        "extension": {},
        "version": ""
    }
}

请求参数说明:

变量 类型 描述
srcBid String 源地址
destBid String 目标地址
srcChainCode String 源链的链码
destChainCode String 目标链的链码
txType String 交易类型。参照跨链数据格式定义
payload Object 根据交易类型定义对应的扩展信息。参照跨链数据格式定义
extension Object 用户扩展信息
version String 版本信息,由原始用户发起交易携带,填写源链跨链合约的版本信息
remark String 备注信息

成功的返回事件:

tlog("sendTx", "crossTxNo");

响应参数说明:

字段名 类型 描述
sendTx String 方法名称
crossTxNo String 跨链编号
5.3.2.4 提交跨链确认交易

功能:

骨干节点提交从主链或子链到当前链的交易确认;合约在该状态,实现解锁、转移、增发、销毁资产

{
	"method": "sendAcked",
	"params":{
        "crossTxNo": "",
    	"result": "",
        "extension": {},
        "version": ""
    }
}

请求参数说明:

变量 类型 描述
crossTxNo String 跨链交易编号
result String 跨链交易结果。"0"成功,"1"失败,"2":"超时"
extension Object 用户扩展信息
version String 版本信息,由原始用户发起交易携带,填写源链跨链合约的版本信息

成功的返回事件:

tlog("sendAcked", "crossTxNo");

响应参数说明:

字段名 类型 描述
sendAcked String 方法名称
crossTxNo String 跨链编号
5.3.2.5 提取异常的跨链资产

功能:

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

{
	"method": "takeOut",
	"params":{
        "crossTxNo": "",
        "toBid": "",
        "payload": {}
    }
}

请求参数说明:

变量 类型 描述
crossTxNo String 跨链交易编号
toBid String 取出跨链资产后要转移的目标地址。
payload Object/Array/String 可以为空。如果toBid是合约的话,需要自定义合约的参数
payload.contractMethod String 目标合约方法
payload.contractInput Array 合约参数。用户自定义
payload.contractInput[0] Object/String/Array 合约参数自定义参数一
payload.contractInput[n] Object/String/Array 自定义参数N

成功的返回事件:

tlog("takeOut", "crossTxNo");

响应参数说明:

字段名 类型 描述
takeOut String 方法名称
crossTxNo String 跨链编号

6. 实现

名词/ 链接 实现说明
bif 星火链网的源代码中,有跨链流程规范的实现

7. 缺陷

暂无