一种面向通用场景的跨链互换操作方法转让专利

申请号 : CN202110065638.3

文献号 : CN112396427B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 蒋步云陈胜

申请人 : 北京连琪科技有限公司

摘要 :

本发明提供了一种面向通用场景的跨链互换操作方法,跨链互换操作的参与方包括发起方和接收方,涉及的区块链包括发起请求的发送链和接收请求的接收链。本发明无需在跨链互换的参与方之间引入负责验证交易存在性和负责数据格式转换的第三方,参与方的跨链账户和所在链的共识节点直接验证签名交易的存在性及输出结果,遵循了发送链和接收链原有的权限管理和共识机制。本发明基于签名交易与WorldState世界状态访问的映射关系建立的“条件执行”操作的锁定、解锁和执行机制,能够将通用场景下的任意合约方法调用通过签名交易以“条件执行”操作参与跨链互换。

权利要求 :

1.一种面向通用场景的跨链互换操作方法,其特征在于,跨链互换操作的参与方包括发起方和接收方,区块链包括发起请求的发送链和接收请求的接收链;

步骤1、在接收链部署包含参与互换操作r_oper合约方法的合约rsc,在发送链部署包含参与互换操作s_oper合约方法的合约ssc;

在所述步骤1中,在所述在发送链部署包含参与互换操作s_oper合约方法的合约ssc之前,包括:

在发送链部署处理条件执行交易的合约csc,具体包括:所述条件执行交易的合约csc中包含对所述条件执行操作的条件解锁方法csc.unlock、过期解锁方法csc.expire、执行方法csc.commit;

步骤2、参与跨链互换操作的发送方和接收方分别在发送链上注册账户sa、sb,分别在接收链上注册账户ra、rb;所述注册账户有调用互换操作和获得与账户相关的区块数据的权限;

步骤3、在接收链上提供用于区块数据的检索接口,并向发送链上的共识节点提供交易检索和交易出块证明,发送链上的共识节点能够依据接收链上的交易ID获取并验证交易内容和出块证明;

步骤4、所述注册账户sa在发送链构造和提交条件执行操作的交易ctx,并指定交易ctx的执行条件ctx.commit为包含所述互换操作r_oper的交易在接收链出块,指定待执行的操作ctx.oper为所述互换操作s_oper,指定所述注册账户sb为接收方账户ctx.receiver,所述注册账户sb对条件执行交易的合约csc的解锁方法为ctx.receiver调用指定解锁条件ctx.unlock;

步骤5、所述注册账户sb从交易ctx接收方账户ctx.receiver获得与该账户有关的所述条件执行操作的交易ctx出块之后,接收方分析跨链互换操作请求并决策是否接受互换操作请求,根据决策结果来执行相应操作;

所述步骤5中,所述根据决策结果来执行相应操作具体包括:如果接收方愿意接受互换操作请求,所述注册账户rb在接收链按照发送方执行条件ctx.commit构造包含所述互换操作r_oper的签名交易rtx_accept并提交;接收链共识节点验证所述注册账户rb对所述互换操作r_oper的权限,验证通过之后签名交易rtx出块,所述互换操作r_oper被执行;

接收方所述注册账户rb收到所述条件执行操作的交易ctx出块事件之后,通过在发送链上的所述注册账户sb,通过签名交易stx_commit调用csc.commit方法,传入参数为ctx.txId和rtx.txId,并触发发送链的条件执行签名交易中的所述互换操作s_oper;

发送链共识节点依据接收链ID,即ctx.targetChain,以及传入参数rtx.txId向接收链请求交易内容和出块证明,获得所述交易内容和出块证明之后,发送链共识节点来验证签名交易rtx_accept是否符合ctx.commit要求,若符合,则签名交易stx_commit出块,从所述条件执行操作的交易ctx相关key值中移除所述条件执行操作的交易ctx,所述互换操作s_oper被执行,完成跨链互换操作;

如果接收方不愿意接受互换操作请求,则在发送链上,按照发送方要求的解锁方法ctx.unlock通过所述注册账户sb构造并提交解锁签名交易stx_unlock,调用所述条件解锁方法csc.unlock,发送链共识节点验证通过并出块之后,合约容器触发发送链的所述条件执行操作的交易ctx中的解锁操作,从所述条件执行操作的交易ctx相关key值中移除所述条件执行操作的交易ctx以完成解锁,撤销跨链互换操作;

当发送链的区块高度expired已达到或超过解锁的区块高度ctx.expired,并且发送链未出块任何有效的签名交易stx_commit或解锁签名交易stx_unlock,则确认接收方不理会互换操作请求;

如果接收方不理会该互换操作请求,则所述注册账户sa构造签名交易stx_expire并提交,经发送链共识节点验证通过之后,合约容器解锁所述条件执行操作的交易ctx,从所述条件执行操作的交易ctx相关key值中移除所述条件执行操作的交易ctx以完成解锁,撤销跨链互换操作;

在验证签名交易rtx_accept符合ctx.commit要求的情况下,当发送链和接收链为异构链时,发送链共识节点中内置了对于接收链签名交易和存在性证明的解析实现。

2.根据权利要求1所述的跨链互换操作方法,其特征在于,在所述步骤1中,在所述在发送链部署包含参与互换操作s_oper合约方法的合约ssc之前,还包括:发送链的数据结构定义:在发送链的签名交易tx数据项中,增加执行条件commit、解锁条件unlock、解锁区块高度expired、接收链ID、以及接收方账户receiver,当所述执行条件commit不为空时,所述签名交易tx为包含条件执行操作的交易ctx;

发送链的合约容器增强:对于所述条件执行操作的交易ctx,发送链的合约容器基于合约方法与世界状态WorldState读写操作的映射关系,采用对存在相互影响的交易集合进行仿真预执行的方法,提供对所述条件执行操作的锁定、解锁、以及执行机制。

3.根据权利要求1所述的跨链互换操作方法,其特征在于,在所述步骤2中,所述注册账户有获得与完成互换操作相关的权限,具体包括:所述注册账户有获得所在区块链的区块数据的权限;

所述注册账户sa拥有在发送链上通过签名交易rtx调用合约方法来执行互换操作s_oper和调用所述条件执行交易的合约csc的权限;

所述注册账户sb拥有在发送链上通过签名交易rtx调用所述条件执行交易的合约csc的权限;

所述注册账户ra拥有在接收链上通过签名交易rtx调用合约方法来执行互换操作r_oper的权限;

其中,所述互换操作s_oper和所述互换操作r_oper是一对原子性互换操作。

4.根据权利要求1所述的跨链互换操作方法,其特征在于,所述步骤4中,所述指定解锁条件ctx.unlock具体包括:当所述注册账户sb在发送链提交解锁签名交易stx_unlock出块,或者当发送链区块高度expired达到ctx.expired。

5.根据权利要求1所述的跨链互换操作方法,其特征在于,所述步骤5中,在接收方分析跨链互换操作请求并决策是否接受互换操作请求之前,还包括:发送链共识节点验证所述注册账户sa对所述互换操作s_oper的权限,发送链共识节点的合约容器预执行获得与所述互换操作s_oper相关的世界状态WorldState的key值集合,并将所述条件执行操作的交易ctx与所述key值集合相关联,以完成所述互换操作s_oper的锁定,在后续预执行签名交易时,将排除导致所述互换操作s_oper的锁定的无效签名交易出块,后续预执行的签名交易包括普通签名交易和条件执行签名交易。

说明书 :

一种面向通用场景的跨链互换操作方法

技术领域

[0001] 本发明涉及区块链的跨链技术领域,具体涉及一种在两条以上的链之间实现多个参与方原子性跨链互换操作方法。

背景技术

[0002] 哈希时间锁定合约,英文为HTLC(Hash Time Lock Contract),是闪电网络中提出的一种跨链方法,它在智能合约的基础上,让交易参与双方先在两条不同链上以约定的哈
希值锁定资产,如果都在规定的时间内输入哈希值正确的原像,通过两条链上的原子性操
作实现资产交换。该方法的局限在于:仅适用于资产交换单一场景,其中的资产锁定、解锁、
条件执行等方法不适用于任意合约方法跨链互换操作的通用场景;
[0003] 现有其他跨链方法存在的主要局限和问题包括:
[0004] 1)在解决通用场景下跨链互换操作的原子性方面,现有方法是要求参与跨链调用的方法能够“回滚”或者“逆操作”,在实际应用中,绝大多数场景难以满足(例如转账合约方
法,需要“回滚”时余额不足,或者合约方法绑定有线下的交割行为等);
[0005] 2)在解决跨链操作出块证明方面,引入了中心化信任的跨链操作存在性验证方,一方面可能破坏链本身的访问控制和共识机制。另一方面由于验证方本身不是跨链互换的
参与方,一旦出现非预期结果,缺少追责机制;
[0006] 3)现有方法在解决异构链之间的数据交换时,通过链外适配机制将异构的签名交易、跨链请求等转换为中间格式。由于跨链互换的参与方是通过第三方适配器间接解析操
作内容,降低了安全强度。

发明内容

[0007] 本申请提供了一种面向通用场景的跨链互换操作方法,以解决上述提到的一种或多种技术问题,
[0008] 本申请所采用的技术方案如下:
[0009] 一种面向通用场景的跨链互换操作方法,跨链互换操作的参与方包括发起方和接收方,所述区块链包括发起请求的发送链和接收请求的接收链;
[0010] 步骤1、在接收链部署包含参与互换操作r_oper合约方法的合约rsc,在发送链部署包含参与互换操作s_oper合约方法的合约ssc;
[0011] 步骤2、参与跨链互换操作的发送方和接收方分别在发送链上注册账户sa、sb,分别在接收链上注册账户ra、rb;所述注册账户有调用互换操作和获得与账户相关的区块数
据的权限;
[0012] 步骤3、在接收链上提供用于区块数据的检索接口,并向发送链上的共识节点提供交易检索和交易出块证明,发送链上的共识节点能够依据接收链上的交易ID获取并验证交
易内容和出块证明;
[0013] 步骤4、所述注册账户sa在发送链构造和提交所述条件执行操作的交易ctx,并指定交易ctx的执行条件ctx.commit为包含所述执行操作r_oper的交易在接收链出块,指定
待执行的操作ctx.oper为所述执行操作s_oper,指定所述注册账户sb为接收方账户
ctx.receiver,所述注册账户sb对所述条件执行交易的合约csc的解锁方法为
ctx.receiver调用指定解锁条件ctx.unlock;
[0014] 步骤5、所述注册账户sb从交易ctx接收方账户ctx.receiver获得与该账户有关的所述条件执行操作的交易ctx出块之后,接收方分析跨链互换请求并决策是否接受互换请
求,根据决策结果来执行相应操作。
[0015] 进一步的,在所述步骤1中,在所述在发送链部署包含参与互换操作s_oper合约方法的合约ssc之前,还包括:
[0016] 发送链的数据结构定义:在发送链的签名交易tx数据项中,增加执行条件commit、解锁条件unlock、解锁区块高度expired、接收链ID、以及接收方账户receiver,当所述执行
条件commit不为空时,所述签名交易tx为包含条件执行操作的交易ctx;
[0017] 发送链的合约容器增强:对于所述条件执行操作的交易ctx,发送链的合约容器基于合约方法与世界状态WorldState读写操作的映射关系,采用对存在相互影响的交易集合
进行仿真预执行的方法,提供对所述条件执行操作的锁定、解锁、以及执行机制;
[0018] 在发送链部署处理条件执行交易的合约csc,具体包括:所述条件执行交易的合约csc中包含对所述条件执行操作的条件解锁方法csc.unlock、过期解锁方法csc.expire、执
行方法csc.commit。
[0019] 进一步的,在所述步骤2中,所述注册账户有获得与该账户相关的区块数据的权限,具体包括:
[0020] 在所述步骤2中,所述注册账户有获得与完成互换操作相关的权限,具体包括:
[0021] 所述注册账户有获得所在区块链的区块数据的权限;
[0022] 所述注册账户sa拥有在发送链上通过签名交易rtx调用合约方法来执行操作s_oper和调用所述条件执行交易的合约csc的权限;
[0023] 所述注册账户sb拥有在发送链上通过签名交易rtx调用所述条件执行交易的合约csc的权限;
[0024] 所述注册账户ra拥有在接收链上通过签名交易rtx调用合约方法来执行操作r_oper的权限;
[0025] 其中,所述执行操作s_oper和所述执行操作r_oper是一对原子性互换操作。
[0026] 进一步的,所述步骤4中,所述指定解锁条件ctx.unlock具体包括:当所述注册账户sb在发送链提交解锁签名交易stx_unlock出块,或者当发送链区块高度expired达到
ctx.expired。
[0027] 进一步的,所述步骤5中,在接收方分析跨链互换请求并决策是否接受互换请求之前,还包括:发送链共识节点验证所述注册账户sa对所述执行操作s_oper的权限,发送链共
识节点的合约容器预执行获得与所述执行操作s_oper相关的世界状态WorldState的key值
集合,并将所述条件执行操作的交易ctx与所述key值集合相关联,以完成所述执行操作s_
oper的锁定,在后续预执行普通签名交易时 ,将排除导致所述执行操作s_oper的锁定的无
效签名交易出块,后续预执行的签名交易包括普通签名交易和条件执行签名交易。
[0028] 进一步的,所述步骤5中,所述根据决策结果来执行相应操作具体包括:
[0029] 如果接收方愿意接受互换操作请求,所述注册账户rb在接收链按照发送方执行条件ctx.commit构造包含所述执行操作r_oper的签名交易rtx_accept并提交;接收链共识节
点验证所述注册账户rb对所述执行操作r_oper的权限,验证通过之后签名交易rtx出块,所
述执行操作r_oper被执行;
[0030] 接收方所述注册账户rb收到所述条件执行操作的交易ctx出块事件之后,通过在发送链上的所述注册账户sb,通过签名交易stx_commit调用csc.commit方法,传入参数为
ctx.txId和rtx.txId,并触发发送链的条件执行签名交易中的所述执行操作s_oper;
[0031] 发送链共识节点依据接收链ID,即ctx.targetChain,以及传入参数rtx.txId向接收链请求交易内容和出块证明,获得所述交易内容和出块证明之后,发送链共识节点来验
证签名交易rtx_accept是否符合ctx.commit要求,若符合,则签名交易stx_commit出块,从
所述条件执行操作的交易ctx相关key值中移除所述条件执行操作的交易ctx,所述执行操
作s_oper被执行,完成跨链互换操作。
[0032] 进一步的,所述步骤5中,所述根据决策结果来执行相应操作,具体包括:
[0033] 如果接收方不愿意接受互换操作请求,则在发送链上,按照发送方要求的解锁方法ctx.unlock通过所述注册账户sb构造并提交解锁签名交易stx_unlock,调用所述条件解
锁方法csc.unlock,发送链共识节点验证通过并出块之后,合约容器触发发送链的所述条
件执行操作的交易ctx中的解锁操作,从所述条件执行操作的交易ctx相关key值中移除所
述条件执行操作的交易ctx以完成解锁,撤销跨链互换操作。
[0034] 进一步的,所述步骤5中,所述根据决策结果来执行相应操作,具体包括:
[0035] 当发送链区块高度expired已达到或超过解锁区块高度expired,并且发送链未出块任何有效的签名交易stx_commit或解锁签名交易stx_unlock,则确认接收方不理会该互
换操作请求;
[0036] 如果接收方不理会该互换操作请求,则所述注册账户sa构造签名交易stx_expire并提交,经发送链共识节点验证通过之后,合约容器解锁所述条件执行操作的交易ctx,从
所述条件执行操作的交易ctx相关key值中移除所述条件执行操作的交易ctx以完成解锁,
撤销跨链互换操作;
[0037] 进一步的,在验证签名交易rtx_accept符合ctx.commit要求的情况下,当发送链和接收链为异构链时,发送链共识节点中内置了对于接收链签名交易和存在性证明的解析
实现。
[0038] 通过本申请实施例,可以获得如下技术效果:
[0039] 1)相对于HTLC方法,本发明不再局限于资产互换场景。参与跨链互换的操作可以是两条以上链的任意合约方法调用;
[0040] 2)本发明实现的原子性互换不要求合约方法支持回滚。本发明对“条件执行”操作的锁定、解锁和执行机制基于签名交易与WorldState访问的映射关系,在合约容器内部自
动化进行的,适用于采用WorldState世界状态的大多数区块链系统;
[0041] 3)本发明无需在跨链互换的参与方之间引入负责验证交易存在性和负责数据格式转换的第三方,参与方的跨链账户和所在链的共识节点直接验证签名交易的存在性及输
出结果,遵循了发送链和接收链原有的权限管理和共识机制;
[0042] 4)当用于跨链互换的接收链上的操作也采用“条件执行”交易时,本发明中的接收链可以作为下一条接收链的发送链,成为多跳跨链互换操作的连接环节,依此类推,本发明
也适用于两条以上链的跨链互换操作。

附图说明

[0043] 为了更清楚地说明本申请实施例中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本申请的一些实
施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附
图获得其他的附图。
[0044] 图1为本发明的跨链互换操作方法的流程示意图;
[0045] 图2为本发明的跨链互换流程图;
[0046] 图3为本发明的跨链互换操作方法的区块结构的组成示意图;
[0047] 图4为本发明的签名交易间接影响示意图。

具体实施方式

[0048] 为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是
本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员
在没有作出创造性劳动前提下所获得的全部其他实施例,都属于本申请保护的范围。
[0049] 在对本发明的技术方案进行详细描述之前,首先对本发明中使用的术语约定进行如下介绍:
[0050] 标识:即唯一标识,用以区分和查找数字对象的索引,本发明中ID即标识,本发明中的ID可采取通用唯一识别码(uuid)方法生成,在跨链环境下仍然保持唯一性;
[0051] 合约:即智能合约,可以被区块链合约容器加载和执行的代码,合约拥有唯一标识、合约包含供签名交易调用的方法,合约方法通过合约容器提供的接口读写外部状态。本
发明中的“操作”是指通过签名交易调用合约方法;
[0052] 合约上下文(Contract Context):即合约方法执行的上下文环境,包括调用合约方法的签名交易,访问区块数据和world State世界状态的API接口;
[0053] World State:即世界状态,由合约容器上下文提供给合约代码访问接口,支持持久化读写的Key‑Value键值对;
[0054] 签名:本发明中的签名包含账户标识和数字签名两部分,其中数字签名是使用了公钥加密领域的技术实现,用于鉴别数字信息的方法;账户标识用于从关联交易中提取签
名者的数字证书,用以验证其数字签名;
[0055] 签名交易:包含交易发起方签名的结构化数据,代表了签名者的授权行为,签名交易中指定了调用的合约方法及调用参数;
[0056] “条件执行”签名交易:附带执行和解锁条件等数据项的签名交易,该类交易代表了在满足执行条件下签名者的授权行为,“条件执行”签名交易中对指定合约方法的调用称
作“条件执行”操作,交易出块之后并不立即执行操作而是锁定该操作;
[0057] 签名交易预执行:指合约容器开辟临时的World State状态空间作为交易执行的上下文环境,执行交易并返回结果,预执行将获得正式执行相同的返回结果,但是不会改变
实际的World State状态。预执行用于共识节点在正式出块之前对执行签名交易造成的状
态改变达成一致。
[0058] 图1为本发明的跨链互换操作方法主流程示意图、图2为本发明的跨链互换流程图。跨链互换操作的参与方包括发起方A和接收方B,涉及的区块链包括发起请求的发送链S
和接受请求的接收链R。
[0059] 步骤1、在接收链部署包含参与互换操作r_oper合约方法的合约rsc,在发送链部署包含参与互换操作s_oper合约方法的合约ssc,并部署用于处理条件执行交易的合约
csc;
[0060] 在上述步骤1中,所述在发送链部署包含参与互换操作s_oper合约方法的合约ssc,具体包括:在发送链的签名交易tx数据项中,增加执行条件commit、解锁条件unlock、
解锁区块高度expired、接收链ID、以及接收方账户receiver,当所述执行条件commit不为
空时,所述签名交易tx为包含条件执行操作的交易ctx;对于所述条件执行操作的交易ctx,
发送链的合约容器基于合约方法与世界状态WorldState读写操作的映射关系,采用对存在
相互影响的交易集合进行仿真预执行的方法,提供对所述条件执行操作的锁定、解锁、以及
执行机制;
[0061] 在上述步骤1中,所述部署用于处理条件执行交易的合约csc,具体包括:所述条件执行交易的合约csc中包含对所述条件执行操作的条件解锁方法csc.unlock、过期解锁方
法csc.expire、执行方法csc.commit;
[0062] 步骤2、参与跨链互换操作的发送方和接收方分别在发送链上注册账户sa、sb,分别在接收链上注册账户ra、rb;所述注册账户有获得与该账户相关的区块数据的权限;
[0063] 在上述步骤2中,所述注册账户有获得与该账户相关的区块数据的权限,具体包括:
[0064] 所述注册账户sa拥有在发送链上通过签名交易rtx调用合约方法来执行操作s_oper和调用所述条件执行交易的合约csc的权限;
[0065] 所述注册账户sb拥有在发送链上通过签名交易rtx调用所述条件执行交易的合约csc的权限;
[0066] 所述注册账户ra拥有在接收链上通过签名交易rtx调用合约方法来执行操作r_oper的权限;
[0067] 所述执行操作s_oper和所述执行操作r_oper是一对原子性互换操作;
[0068] 步骤3、在接收链上提供用于区块数据的检索接口,并向发送链上的共识节点提供交易检索和交易出块证明,发送链上的共识节点能够依据接收链上的交易ID获取并验证交
易内容;
[0069] 步骤4、所述注册账户sa在发送链构造和提交所述条件执行操作的交易ctx,并指定交易ctx的执行条件ctx.commit为包含所述执行操作r_oper的交易在接收链出块,指定
待执行的操作ctx.oper为所述执行操作s_oper,指定所述注册账户sb为接收方账户
ctx.receiver,所述注册账户sb对所述条件执行交易的合约csc的解锁方法为调用指定解
锁条件ctx.unlock;
[0070] 上述步骤4中,所述指定解锁条件ctx.unlock,具体包括:当所述注册账户sb在发送链提交解锁签名交易stx_unlock出块,或者当发送链区块高度expired达到
ctx.expired;
[0071] 步骤5、所述注册账户sb从交易ctx接收方账户ctx.receiver获得与该账户有关的所述条件执行操作的交易ctx出块之后,接收方分析跨链互换请求并决策是否接受互换请
求,根据决策结果来执行相应操作。
[0072] 上述步骤5中,在接收方分析跨链互换请求并决策是否接受互换请求之前,还包括:验证所述注册账户sa对所述执行操作s_oper的权限,合约容器预执行获得与所述执行
操作s_oper相关的世界状态WorldState的key值集合,并将所述条件执行操作的交易ctx与
所述key值集合相关联,以完成所述执行操作s_oper的锁定,在后续预执行签名交易时,将
排除导致所述执行操作s_oper的锁定无效的签名交易出块;
[0073] 根据决策结果来执行相应操作,具体包括:
[0074] 1)如果接收方愿意接受互换操作请求,则所述注册账户rb在接收链按照发送方执行条件ctx.commit构造包含所述执行操作r_oper的签名交易rtx_accept并提交;接收链共
识节点验证所述注册账户rb对所述执行操作r_oper的权限,验证通过之后签名交易rtx出
块,所述执行操作r_oper被执行;
[0075] 接收方所述注册账户rb收到所述条件执行操作的交易ctx出块事件之后,通过在发送链上的所述注册账户sb,通过签名交易stx_commit调用csc.commit方法,传入参数为
ctx.txId和rtx.txId,并触发发送链的条件执行签名交易中的所述执行操作s_oper;
[0076] 发送链共识节点依据接收链ID,即ctx.targetChain,以及传入参数rtx.txId向接收链请求交易内容和出块证明,获得所述交易内容和出块证明之后,发送链共识节点验证
签名交易rtx_accept是否符合ctx.commit要求,若符合,则签名交易stx_commit出块,从所
述条件执行操作的交易ctx相关key值中移除所述条件执行操作的交易ctx,所述执行操作
s_oper被执行,完成跨链互换操作,执行步骤9;
[0077] 其中,在验证签名交易rtx_accept符合ctx.commit要求的情况下,当发送链和接收链为异构链时,发送链共识节点中内置了对于接收链签名交易和存在性证明的解析实
现;
[0078] 2)如果接收方不愿意接受互换操作请求,则在发送链上,按照发送方要求的解锁方法ctx.unlock通过所述注册账户sb构造并提交解锁签名交易stx_unlock,调用所述条件
解锁方法csc.unlock,发送链共识节点验证通过并出块之后,合约容器触发发送链的所述
条件执行操作的交易ctx中的解锁操作,从所述条件执行操作的交易ctx相关key值中移除
所述条件执行操作的交易ctx以完成解锁,撤销跨链互换操作;
[0079] 3)当发送链区块高度expired已达到或超过解锁区块高度expired,并且发送链未出块任何有效的签名交易stx_commit或解锁签名交易stx_unlock,则确认接收方不理会该
互换操作请求;
[0080] 如果接收方不理会该互换操作请求,所述注册账户sa构造签名交易stx_expire并提交,经发送链共识节点验证通过并之后,合约容器解锁所述条件执行操作的交易ctx,从
所述条件执行操作的交易ctx相关key值中移除所述条件执行操作的交易ctx以完成解锁,
撤销跨链互换操作。
[0081] 图3为本发明的跨链互换操作方法的区块结构的组成示意图,其中区块Block定义的previousBlockHash形成了前后衔接,保证了区块链内容的完整性。区块Block定义的
hashOfBlock保证了当前区块的内容完整性,出块共识节点签名signBlocker 保证了区块
的合法性。transactions是区块Block包含的一系列交易Transaction序列,交易内容中包
含了交易签名者signCaller指定调用的合约方法(cId、method)及方法参数(args)。
[0082] 在上述步骤1中,在发送链的签名交易tx数据项中,增加执行条件commit、解锁条件unlock、解锁区块高度expired、接收链ID、以及接收方账户receiver,这使得“条件执行”
签名交易比常规签名交易多出以下数据项:
[0083] l  commit:提交执行的条件,为另一条链上的签名交易,但是该签名交易signCaller的tm_local和signature为空,通过signCaller.eId指定接收链上的账户rb,即
只允许接收方提交执行;
[0084] l unlock:解锁条件,通过cId、method指定为对发送链csc.unlock方法的调用,该签名交易signCaller的tm_local和signature为空通过signCaller.eId指定发送链上的账
户sb,即只允许接收方解锁。
[0085] l expired:锁定过期的时间区间,以距离ctx所在块之后的块高度衡量。
[0086] l targetChain:接收链ID
[0087] l receiver:接收方账户
[0088] “条件执行”签名交易的锁定与解锁
[0089] 签名交易调 用的合约方法逻辑中,通过合约容器提供的上下文(ContractContext)提供的API能够读写WorldState世界状态,以转账的合约方法为例,定
义如下合约方法:
[0090] def transfer(c: ContractContext, from:String, to:String, amount:Int) ={
[0091]     val dfrom = c.api.getState(from).asInstanceOf[Int]
[0092]     if(dfrom < amount)
[0093]       throw ContractException("余额不足")
[0094]     c.api.setState(from,dfrom ‑ amount)
[0095]     var dto = c.api.getState(to).asInstanceOf[Int]
[0096]     c.api.setState(to,dto + amount)}
[0097] 其中c表示合约上下文、from表示发送方账户、to表示接收方账户、amount表示转移金额;
[0098] 合约逻辑在合约容器内部执行/预执行时,对WorldState形成顺序访问的读写指令,图4为本发明的签名交易间接影响示意图。当签名交易调用的合约逻辑对WorldState键
值的访问存在交集时,某个交易的写入操作可能导致其他签名交易抛出异常从而无效。例
如:常规签名交易tx_m对K4的写入setState(K4,V4),可能导致依赖K4值的“条件执行”签名
交易ctx_1、ctx_n抛出异常。
[0099] 假定ctx _1出块在tx_m之前,或者在同一区块内排在tx_m之前,共识节点通过预执行验证ctx_1时,合约逻辑能够正常执行(以转账为例,余额充足),因此ctx_1正常出块并
锁定,但是如果在ctx_1锁定期间,tx_m也出块,导致ctx_1的锁定失效(执行tx_m之后,余额
不足了),接收方仍然误以为ctx_1锁定有效,在接收链发起互换操作r_oper,结果r_oper执
行成功,但s_oper提交执行时由于抛出异常失败,互换的原子性因此被破坏。进一步归纳由
相同key值读写导致的影响如下:
[0100] l 写入key值可能导致读取key值的操作无效;
[0101] l 读取key值不会导致写入key值无效;
[0102] l 读取key值不会导致读取key值无效;
[0103] l 写入key值不会导致写入key值无效;
[0104] 上述举例表明,实现原子性的关键问题之一在于必须考虑签名交易之间的相互影响,确保这种影响不会导致锁定的“条件执行”交易失效。为此本发明采用针对锁定的“条件
执行”交易进行仿真预执行的方法,评估写入键值操作对读取相同键值操作的影响是否会
导致后者无效,确保导致任何处于锁定状态的“条件执行”交易失效的签名交易不被共识接
纳出块。具体方法如下:
[0105] 在共识节点的合约容器中:a.通过增强合约容器上下文中提供的WorldState访问API,在预执行签名交易时返回相关的读取和写入的WorldState键值集合;b.在“条件执行”
交易出块锁定时建立与每个WorldState键值相关的锁定状态的“条件执行”交易集合,包括
写入和读取该key值的“条件执行”交易;c.两者叠加,通过预执行签名交易,能够返回与之
相关的锁定状态的“条件执行”交易集合。
[0106] 考虑到“条件执行”交易提交执行(commit)时机的不确定性,“条件执行”交易集合可能以任意顺序提交执行,因此需要对每一种可能的顺序进行仿真。在区块提案阶段预执
行验证一条“条件执行”交易时,首先将交易追加到与之相关(包括该交易由于写入键值影
响的交易集合,和该交易由于读取键值被影响的交易集合)的每一个WorldState键值对应
的“条件执行”交易集合中,然后对每个交易集合,以每一种可能的顺序预执行,如果出现任
何异常,判定为待验证的“条件执行”交易将导致已锁定的“条件执行”交易异常,因此验证
不予通过阻止其出块,并将该交易从所有WorldState键值对应的“条件执行”交易集合中移
除,维持已锁定的“条件执行”交易的有效。反之如果验证通过并出块,则将其保留在
WorldState键值对应的“条件执行”交易集合中,作为为后续交易验证的目标集合,条件交
易进入锁定状态。
[0107] 在区块提案阶段预执行验证一条常规交易时,由于该交易的顺序一定在当前锁定的“条件执行”交易之前,因此验证方法为:将该交易置于与之相关(该交易由于写入键值影
响的交易集合)的每一个WorldState键值对应的“条件执行”交易集合最前面,对除该交易
外的其他交易以可能的每一种顺序预执行,如果出现任何异常,判定为待验证的常规交易
将导致已锁定的“条件执行”交易异常,因此不予通过。
[0108] 当签名交易对指定的“条件执行”交易ctx调用csc合约的解锁(unlock)或提交(commit)方法成功时,调用将ctx从所有WorldState键值对应的“条件执行”交易集合中异
常,退出锁定状态。
[0109] 上述措施保证了在“条件执行”交易锁定期间,任何新出块的签名交易不会破坏被锁定操作的有效性,为跨链互换的原子性提供了保障。其中步骤1a关键代码如下,在合约上
下文提供的WorldState访问接口中增加了记录读写相关键值key集合的数据项kset_read、
kset_write和操作,定义如下合约方法接口类:
[0110] class ShimAPI(cId: String) { ...
[0111]   val kset_read = Set[Key]()    //读取相关键值集合
[0112]   val kset_write = Set[Key]()    //写入相关键值集合
[0113]   def setState(key: Key, value: Value): Unit = {
[0114]     kset_write.add(key)       //键值加入写入集合
[0115]     put(key, value) }
[0116]   def getState(key: Key): Value= {
[0117]     kset_read.add(key)       //键值加入读取集合
[0118]     get(key) } ...}
[0119] 其中对于在“条件执行”交易出块锁定时建立与每个worldState键值相关的锁定状态的“条件执行”交易集合,通过全局的数据项kmap_read和kmap_write,提供用以维护每
个WorldState键值相关的处于锁定状态的“条件执行”交易集合,还包括步骤2、步骤3所需
的获得签名交易相关“条件执行”交易集合、锁定和解锁“条件执行”交易的相关方法,定义
如下全局方法类:
[0120] object ShimAPI {
[0121]   type Key=String
[0122]   type Value=Array[Byte]
[0123]   val kmap_read=Map[Key,Set[Transaction]]() //读取键值的相关交易集合
[0124]   val kmap_write=Map[Key,Set[Transaction]]() //写入键值的相关交易集合
[0125]   def loadTx(tid:String):(Transaction,Long)={...} //加载并返回指定签名交易,tid:指定签名交易ID,交易所在区块高度
[0126] def loadRemoteTX(targetChain:String,tid:String):(Transaction,Proof)={...} //通过接收链提供的区块数据检索API,获得接收链上的出块签名交易及交易出块
证明,targetChain:接收链ID,tid:接收链上的签名交易ID
[0127] def getKeySet(t:Transaction):(Set[Key],Set[Key])={...} //基于合约上下文中增强的WorldState访问API,通过预执行获得交易读取和写入的相关键值集合
[0128] def getBlockHeight():Long={...} //获得当前区块高度
[0129] def getLockedTxRead(key:Key):Option[Set[Transaction]]={kmap_read.get(key)}// 获得读取指定键值的相关“条件执行”签名交易集合,其中key表示指定键值
[0130] def getLockedTxWrite(key:Key):Option[Set[Transaction]]={kmap_write.get(key)}
[0131] //获得写入指定键值的相关“条件执行”签名交易集合,其中key表示指定键值
[0132] 对于获得指定交易的相关“条件执行”签名交易集合,如果指定交易为常规交易,只返回被其写入键值影响的条件执行交易集合;如果指定交易为条件执行交易,返回被其
写入键值影响的和因其读取键值被影响的条件执行交易集合,通过如下合约方法来实现,
其中t表示指定交易;
[0133] def getRelatedTx(t:Transaction):Set[Transaction] = {
[0134]     val (ks_read,ks_write) = getKeySet(t)
[0135]     val stx = Set[Transaction]()
[0136]       if(t.commit){ //如果是条件执行交易
[0137]       val ki1 = ks_write.intersect(kmap_read.keySet)
[0138]       ki1.foreach(x => stx.++(getLockedTxRead(x)))
[0139]       val ki2 = ks_read.intersect(kmap_write.keySet)
[0140]       ki2.foreach(x => stx.++(getLockedTxWrite(x)))
[0141]     }else{
[0142]       val ki = ks_write.intersect(kmap_read.keySet)
[0143]       ki.foreach(x => stx.++(getLockedTxRead(x)))
[0144]     }
[0145]     stx
[0146]   }
[0147] 通过如下合约方法来实现锁定指定的“条件执行”交易操作,其中tid表示待锁定的“条件执行”交易ID;
[0148] def lockTx(tid:String) ={
[0149]     val t = loadTx(tid)
[0150]     val (ks_read,ks_write) = getKeySet(t)
[0151]     ks_read.foreach { x =>
[0152]       val ts = getLockedTxRead(x).getOrElse(Set[Transaction]())
[0153]       ts.add(t)}
[0154]     ks_write.foreach { x =>
[0155]       val ts = getLockedTxWrite(x).getOrElse(Set[Transaction]())
[0156]       ts.add(t)} }
[0157] 通过如下合约方法来实现解锁指定的“条件执行”交易,其中tid表示待解锁的“条件执行”交易ID;
[0158]   def unlockTx( tid:String) ={
[0159]     val t = loadTx(tid)
[0160]     val (ks_read,ks_write) = getKeySet(t)
[0161]     val ki_read = ks_read.intersect(kmap_read.keySet)
[0162]     ki_read.foreach { x =>
[0163]       val tr = getLockedTxRead(x)
[0164]       if(!tr.isEmpty) tr.get.remove(t)
[0165]     }
[0166]     val ki_write = ks_write.intersect(kmap_read.keySet)
[0167]     ki_write.foreach { x =>
[0168]       val tw = getLockedTxWrite(x)
[0169]       if(!tw.isEmpty) tw.get.remove(t)
[0170]     }
[0171]   }
[0172] }
[0173] 在本发明的技术方案中,对于包含跨链互换操作的合约,发送链上部署了包括条件执行签名交易中的执行操作s_oper(跨链互换操作)的合约ssc,接收链上部署了包括条
件执行签名交易中的执行操作r_oper(跨链互换操作)的合约rsc,对于合约ssc和合约rsc
的合约方法及参数,可以是任何参与跨链双方认可的形式,当应用于类似HTLC的资产交换
场景时,ssc包含了双方在发送链上的账户sa和sb,rsc则包含了双方在接收链上的账户ra
和rb。
[0174] 在本发明的技术方案中,发送链上部署了用于处理“条件执行”交易的合约csc(如下所示),该合约包含了用于提交执行(commit)、条件解锁(unlock)和过期解锁(expire)的
合约方法,接收方使用接收链出块交易txId, 触发“条件执行”交易执行通过如下合约方法
来实现,其中,ctxId表示待触发的“条件执行”交易ID、txId表示接收链出块交易txId:
[0175] class ContractAssetsTPL extends IContract{...
[0176]   def commit(c: ContractContext, ctxId:String, txId:String): ActionResult={
[0177]     val (ctx,blockHeight) = ShimAPI.loadTx(ctxId)
[0178]        //当接收链为异构链时,verifyProof内置了对于接收链签名交易和存在性证明的解析
[0179]     val (rtx,proof) = ShimAPI.loadRemoteTx(ctx.targetChain,txId)
[0180]     if(!verifyProof(proof))
[0181]         throw ContractException("出块存在性证明验证失败,提交执行失败!")
[0182]     if(rtx.method!= ctx.method || rtx.args!= ctx.args)
[0183]         throw ContractException("不满足执行条件,提交执行失败!")
[0184]      ...
[0185]     ShimAPI.unlockTx(ctxId)
[0186]   }
[0187] 在本发明的技术方案中,接收方拒绝互换请求,解锁“条件执行”交易通过如下合约方法实现,其中,ctxId表示待触发的“条件执行”交易ID;
[0188]   def unlock(c: ContractContext, ctxId:String): ActionResult={
[0189]     val (ctx,blockHeight) = ShimAPI.loadTx(ctxId)
[0190]     if(c.t.signCaller.eId != ctx.notify)
[0191]         throw ContractException("非接收方调用,解锁失败!")
[0192]      ...
[0193]     ShimAPI.unlockTx(ctxId)
[0194]   }
[0195] 在本发明的技术方案中,发送方使用出块高度,解锁“条件执行”交易通过如下合约方法实现,其中,ctxId表示待触发的“条件执行”交易ID;
[0196]   def expire(c: ContractContext, ctxId:String): ActionResult={
[0197]     val (ctx,blockHeight) = ShimAPI.loadTx(ctxId)
[0198]     if(ShimAPI.getBlockHeight() ‑ blockHeight < ctx.expired)
[0199]         throw ContractException("未达到过期区块高度,解锁失败!")
[0200]      ...
[0201]     ShimAPI.unlockTx(ctxId)
[0202]   }
[0203] }
[0204] 在一些实施例中,计算机程序的部分或者全部可以经由ROM而被载入和/或安装到设备上。当计算机程序加载并被执行时,可以执行上文描述的方法的一个或多个步骤。
[0205] 本发明中以上描述的功能可以至少部分地由一个或多个硬件逻辑部件来执行。例如,非限制性地,可以使用的示范类型的硬件逻辑部件包括:场可编程门阵列(FPGA)、专用
集成电路(ASIC)、专用标准产品(ASSP)、芯片上系统的系统(SOC)、负载可编程逻辑设备
(CPLD)等等。
[0206] 用于实施本公开的方法的程序代码可以采用一个或多个编程语言的任何组合来编写。这些程序代码可以提供给通用计算机、专用计算机或其他可编程数据处理装置的处
理器或控制器,使得程序代码当由处理器或控制器执行时使流程图和/或框图中所规定的
功能/操作被实施。程序代码可以完全在机器上执行、部分地在机器上执行,作为独立软件
包部分地在机器上执行且部分地在远程机器上执行或完全在远程机器或服务器上执行。
[0207] 在本公开的上下文中,机器可读介质可以是有形的介质,其可以包含或存储以供指令执行系统、装置或设备使用或与指令执行系统、装置或设备结合地使用的程序。机器可
读介质可以是机器可读信号介质或机器可读储存介质。机器可读介质可以包括但不限于电
子的、磁性的、光学的、电磁的、红外的、或半导体系统、装置或设备,或者上述内容的任何合
适组合。机器可读存储介质的更具体示例会包括基于一个或多个线的电气连接、便携式计
算机盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦除可编程只读存储器(EPROM
或快闪存储器)、光纤、便捷式紧凑盘只读存储器(CD‑ROM)、光学储存设备、磁储存设备、或
上述内容的任何合适组合。
[0208] 此外,虽然采用特定次序描绘了各操作,但是这应当理解为要求这样操作以所示出的特定次序或以顺序次序执行,或者要求所有图示的操作应被执行以取得期望的结果。
在一定环境下,多任务和并行处理可能是有利的。同样地,虽然在上面论述中包含了若干具
体实现细节,但是这些不应当被解释为对本公开的范围的限制。在单独的实施例的上下文
中描述的某些特征还可以组合地实现在单个实现中。相反地,在单个实现的上下文中描述
的各种特征也可以单独地或以任何合适的子组合的方式实现在多个实现中。
[0209] 尽管已经采用特定于结构特征和/或方法逻辑动作的语言描述了本主题,但是应当理解所附权利要求书中所限定的主题未必局限于上面描述的特定特征或动作。相反,上
面所描述的特定特征和动作仅仅是实现权利要求书的示例形式。