跨链中继机制的账户序号一致性保障方法

文档序号:32483767发布日期:2022-12-10 00:11阅读:53来源:国知局
跨链中继机制的账户序号一致性保障方法

1.本发明涉及区块链跨链技术领域,具体为一种跨链中继机制的账户序号一致性保障方法。


背景技术:

2.随着区块链技术的发展,各种基于区块链技术的应用越来越多。为了适应不同领域的需求,研究人员和开发人员通常专注于让区块链技术适用于特定领域,致使区块链类型碎片化程度较高,区块链间的互操作性下降。为了解决这一类问题,跨链的概念及相关技术被提出。
3.跨链技术通常可分为公证人(notary)机制,侧链/中继(sidechains/relays)机制和哈希锁定(hash-locking)。其中,在基于中继机制的跨链模式中,参与跨链的区块链由中继器建立跨链连接,并构成了跨链网络。cosmos是基于中继机制的跨链方案的其中一个代表,在cosmos跨链方案中,所有的跨链相关的操作都会被转化为交易,并通过中继器转发到目标区块链执行。
4.在以太坊(ethereum)及cosmos等区块链中,为了抵御重放攻击(replay attack)或防止双重支付(double-spending,亦称“双花”)问题,其为每个账户维护了与账户关联的序号(以太坊中被称为nonce,cosmos中被称为accountsequence。以下统称为账户序号)。当某个账户拟对某个交易签名时,必须获取当前的账户序号,并将其附加在交易信息中。当区块链接收到交易后,将检查附加在交易中的序号与当前账户序号是否一致,当且仅当两者一致时,该交易才能通过检查并被放入交易池中,等待被纳入区块中;同时,区块链将账户序号递增,等待接收下一个交易。否则,区块链将认为该交易并非首次被区块链接收,并将其视为重放交易丢弃掉。
5.然而,当区块链网络处于高吞吐高负载情况之下(例如区块链在短时间内接收到大量的跨链交易,或因受到轻客户端阻塞攻击而无法及时处理跨链交易)时,可能出现中继账户为多个交易附加了同一个账户序号的情况,致使正常的跨链交易被区块链错误地识别为重放交易并被丢弃。严重者,跨链通信的连接将因为交易过程中账户序号异常而意外中断。
6.跨链作为一种新兴的区块链概念及技术,相关的研究工作仍处于初期阶段。目前大多数与跨链相关的研究,都着眼于提出某种新的跨链协议或架构,或在已有的架构基础上进行改进;而聚焦于某种具体的跨链方案,并提升其某一环节的安全性及稳定性的方法并不多。因此,本发明提出一种跨链中继机制的账户序号一致性保障方法,并以cosmos为例对本发明的原理及实现步骤进行描述。实验证明,本发明可在交易吞吐量较高或受到轻客户端阻塞攻击等情况下,有效降低跨链交易失效及连接中断的风险。经测试,该发明在cosmos跨链方案中至少可以使交易失效率减少约60%。


技术实现要素:

7.本发明的目的是提供一种跨链中继机制的账户序号一致性保障方法,适用于基于中继机制且引入了账户序号功能的跨链方案,解决了该跨链模式中因高并发高负载,导致跨链交易的账户序号出现错误,进而导致交易验证失败和跨链连接失效的问题。
8.本发明的技术方案如下:
9.为实现上述目的,本发明提供一种跨链中继机制的账户序号一致性保障方法,包括以下步骤:
10.s1:中继器组共同维护一个记录中继账户信息的数据库,用于在跨链通信过程中记录和校验中继账户的关键信息;
11.s2:跨链通信过程中,中继器从目标链获取中继账户的当前账户序号sequence;
12.s3:中继器向中继账户信息数据库发送查询请求,获取该账户存储于数据库中的历史序号lastsequence;
13.s4:中继器利用从数据库获得的lastsequence与从目标区块链获得的中继账户序号sequence进行比对和修正;
14.s5:中继器将修正后的账户序号写入数据库,将lastsequence更新为修正后的sequence;
15.s6:中继器将修正后的账户序号附加到跨链交易中,并对交易进行签名和广播。
16.进一步地,上述步骤s1具体是:
17.s101:中继器组获取所有与组内中继器连接的区块链的关键信息,包括区块链的唯一标识id、中继账户在区块链上的地址信息address、中继账户在区块链上的初始账户序号sequence;
18.s102:中继器组按照《id-address,lastsequence》的格式编排上述信息,其中,id-address表示键,为lastsequence为对应键的值;
19.s103:将所有的《id-address,lastsequence》键值对存储到数据库中。
20.进一步地,上述步骤s2具体是:
21.s201:中继器向目标区块链发送中继账户信息查询请求,该请求信息通过传输层转发至目标区块链;
22.s202:目标区块链获取请求后,由auth模块查询中继账户的信息并生成查询结果;
23.s203:中继器查询并捕获目标区块链auth模块生成的查询结果,并从中选取出账户序号sequence。
24.进一步地,上述步骤s3具体是:
25.s301:中继器在访问数据库中的中继账户的lastsequence之前,将进行互斥锁竞争;若获取到则跳转到s302,否则跳转至s301重新等待下一轮竞争;
26.s302:中继器获取目标区块链的id及中继账户address,并以id-address为键,在数据库中查询并返回对应的值lastsequence。
27.进一步地,上述步骤s301具体是:
28.1)中继器组连接到后台的redis数据库,该数据库用于实现中继器竞争互斥锁;同时,每个中继器均会分配一个唯一标识进程的uuid;
29.2)中继器通过消息队列检查并等待拟获取的互斥锁是否已处于释放状态;
30.3)中继器以id-address为键,使用setnx命令尝试向redis数据库写入当前进程的uuid,并设置写入值的超时时间expiretime;
31.4)redis向中继器返回值,如果值为1,证明写入成功,同时也证明在此之前没有其他进程给同样的键写入值,即互斥锁是可获取的;如果返回0,证明写入失败,同时也证明在此之前已有其他进程给同样的键写入值,即互斥锁已被占用,该进程跳转回步骤2)重新尝试竞争互斥锁。
32.进一步地,上述步骤s4具体是:
33.s401:将获取到的sequence与数据库中存储的lastsequence进行对比,若sequence小于等于lastsequence则跳转到s402,否则跳转到s403;
34.s402:将sequence的值修正为lastsequence+1;
35.s403:中继器将sequence附加到跨链交易中,等待交易的签署和广播。
36.进一步地,上述步骤s5具体是:
37.s501:以id-address为键,将数据库中对应的值lastsequence更新为sequence;
38.s502:中继器释放先前竞争到的互斥锁,允许其他阻塞的进程再次竞争互斥锁。
39.进一步地,上述步骤s502具体是:
40.1)中继器以id-address为键,使用get命令查询redis数据库的值是否与该进程的uuid相同;
41.2)如果查询值与uuid相同,证明此数据就是该进程写入的;中继器以id-address为键,使用del命令清除值;
42.3)中继器释放互斥锁,并向消息队列发出互斥锁已释放的消息,允许其他进程以同样的方式竞争互斥锁。
43.本发明的实施例提供的技术方案可以包括以下有益效果:
44.1)本发明是一种跨链中继机制的账户序号一致性保障方法,通过维护一个中继器间的共享账户信息数据库,实现对附加在跨链交易中的账户序号进行校验和修正的功能,从而有效避免了因交易吞吐量过高或和受到轻客户端阻塞攻击,导致auth模块错误地将正常交易识别为重放交易的情况,进而提升了跨链通信的稳定性;
45.2)本发明利用进程间互斥锁,保证了同一时间段,仅有一个中继器可以读写账户信息数据库,避免了因高并发造成的数据库读写冲突所导致的账户序号校验和修正失败的情况;实验表明,在cosmos跨链方案中,使用本发明的中继器校验及修正账户序号的平均耗时仅为3.946ms,而一个简单跨链交易被一个单节点的区块链处理的总时间周期的平均耗时为3.048s,两者相差数量级为3;当目标区块链的全节点数量大于1时,交易处理时间将会进一步提升,使用本发明所耗费的时间占比也将进一步下降;因此,本发明不会对cosmos跨链通信的效率造成明显的负面影响;
46.3)本发明旨在不修改区块链本身的代码的前提下,使用非侵入、低耦合的方式,将一种跨链中继机制的账户序号一致性保障方法应用于现有的基于中继机制的跨链方案中;开发者仅需依据本发明额外部署账户信息数据库,并建立中继器组与数据库的互斥连接,即可有效降低交易被auth模块错误地识别为重放交易的概率,并提升了跨链通信的稳定性;经测试,该发明在cosmos跨链方案中至少可以使交易失效率减少约60%。
附图说明
47.图1为本发明的架构图;
48.图2为本发明的整体流程图;
49.图3为本发明中继器获得互斥锁的流程图;
50.图4为本发明中继器释放互斥锁的流程图;
51.图5为本发明实际工作的序列图;
52.图6为本发明未使用此方法跨链通信出现异常的情况;
53.图7为本发明使用此方法跨链通信正常完成的情况。
具体实施方式
54.下面将结合本发明实施例中的本发明附图,对本发明实施例中的本发明技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
55.如图1-4的跨链中继机制的账户序号一致性保障方法,如图2所示,具体按照以下步骤实施:
56.步骤1,中继器组共同维护一个记录中继账户信息的数据库,用于在跨链通信过程中记录和校验中继账户的关键信息;
57.步骤1具体按照以下步骤实施:
58.步骤1.1,中继器组获取所有与组内中继器连接的区块链的关键信息,包括区块链的唯一标识id、中继账户在区块链上的地址信息address、中继账户在区块链上的初始账户序号sequence;
59.步骤1.2,中继器组按照《id-address,lastsequence》的格式编排上述信息,其中,id-address表示键,为lastsequence为对应键的值;
60.步骤1.3,将所有的《id-address,lastsequence》键值对存储到数据库中;
61.步骤2,跨链通信过程中,中继器从目标链获取中继账户的当前账户序号sequence;
62.步骤2具体按照以下步骤实施:
63.步骤2.1,中继器向目标区块链发送中继账户信息查询请求,该请求信息通过传输层转发至目标区块链;
64.步骤2.2,目标区块链获取请求后,由auth模块查询中继账户的信息并生成查询结果;
65.步骤2.3,中继器查询并捕获目标区块链auth模块生成的查询结果,并从中选取出账户序号sequence;
66.步骤3,中继器向中继账户信息数据库发送查询请求,获取该账户存储于数据库中的历史序号lastsequence;
67.步骤3具体按照以下步骤实施:
68.步骤3.1,中继器在访问数据库中的中继账户的lastsequence之前,将进行互斥锁竞争。若获取到则跳转到3.2,否则跳转至3.1重新等待下一轮竞争,如图3所示;
69.步骤3.1具体为:
70.(1)中继器组连接到后台的redis数据库,该数据库用于实现中继器竞争互斥锁。同时,每个中继器均会分配一个唯一标识进程的uuid。
71.(2)中继器通过消息队列检查并等待拟获取的互斥锁是否已处于释放状态;
72.(3)中继器以id-address为键,使用setnx命令尝试向redis数据库写入当前进程的uuid,并设置写入值的超时时间expiretime。
73.(4)redis向中继器返回值,如果值为1,证明写入成功,同时也证明在此之前没有其他进程给同样的键写入值,即互斥锁是可获取的。如果返回0,证明写入失败,同时也证明在此之前已有其他进程给同样的键写入值,即互斥锁已被占用,该进程跳转回步骤(2)重新尝试竞争互斥锁。
74.步骤3.2,中继器获取目标区块链的id及中继账户address,并以id-address为键,在数据库中查询并返回对应的值lastsequence;
75.步骤4,中继器利用从数据库获得的lastsequence与从目标区块链获得的中继账户序号sequence进行比对和修正;
76.步骤4具体按照以下步骤实施:
77.步骤4.1,将获取到的sequence与数据库中存储的lastsequence进行对比,若sequence小于等于lastsequence则跳转到4.2,否则跳转到4.3;
78.步骤4.2,将sequence的值修正为lastsequence+1;
79.步骤4.3,中继器将sequence附加到跨链交易中,等待交易的签署和广播;
80.步骤5,中继器将修正后的账户序号写入数据库,将lastsequence更新为修正后的sequence;
81.步骤5具体按照以下步骤实施:
82.步骤5.1,以id-address为键,将数据库中对应的值lastsequence更新为sequence;
83.步骤5.2,中继器释放先前竞争到的互斥锁,允许其他阻塞的进程再次竞争互斥锁,如图5所示;
84.步骤5.2具体按照以下步骤实施:
85.(1)中继器以id-address为键,使用get命令查询redis数据库的值是否与该进程的uuid相同;
86.(2)如果查询值与uuid相同,证明此数据就是该进程写入的。中继器以id-address为键,使用del命令清除值;
87.(3)中继器释放互斥锁,并向消息队列发出互斥锁已释放的消息,允许其他进程以同样的方式竞争互斥锁;
88.步骤6,中继器将修正后的账户序号附加到跨链交易中,并对交易进行签名和广播;
89.当区块链网络中的所有区块链及中继器初始化完毕,并完成中继器与区块链的连接后,中继器组将等待并响应跨链通信事件。若区块链网络中的任意账户执行了跨链操作,则中继器将产生相应的跨链交易。在整个交易生命周期内,将按照上述流程对交易的信息进行检查和修正,以确保整个跨链交易生命周期正常完成。
90.实施例
91.首先,对应于步骤1,中继器组共同维护一个记录中继账户信息的数据库,用于在跨链通信过程中记录和校验中继账户的关键信息。此次实验是基于一个较为简单的cosmos跨链网络,如图1所示,该网络包括三个区块链(chain-a、chain-b、chain-c)及一个中继节点,中继节点运行了三个中继器(relayer-1,relayer-2,relayer-3)。在该网络中,存在一个中继账户account-r,且该账户的信息均被网路中的区块链及中继器所保存。中继器组共同维护一个存储了中继账户信息的数据库,该数据库记录了中继器组从每个区块链最后一次获取到的中继账户的账户序号。数据库中的每一条数据均有相应的互斥锁标记位,同一时刻有且仅有一个中继器可以读写某一条数据。
92.对应于步骤2,跨链通信过程中,中继器从目标链获取中继账户的当前账户序号sequence。基于步骤1所描述的跨链网络,假设连接了chain-a和chain-b的中继器relayer-1,拟使用account-r创建两个发往chain-a的跨链交易tx1和tx2。在创建和签署tx1时,relayer-1将从chain-a获取account-r当前的账户序号n,并附加到tx1上。假设tx1在签署完毕后已经发送到chain-a,但chain-a的auth模块并未完全完成对tx1的验证。此时,relayer-1拟创建tx2,那么最终附加到tx2上的序号也为n,即出现了不同交易使用了相同序号的情况。
93.对应于步骤3,中继器向中继账户信息数据库发送查询请求,获取该账户存储于数据库中的历史序号lastsequence。考察步骤2中假设的relayer-1生成的tx2。由于同一时刻可能有其他的中继器也要访问这一条数据,因此,所有拟访问该数据的中继器须首先竞争互斥锁。假设relayer-1竞争到了该锁,由于tx2的目标区块链是chain-a,中继账户是account-r,则应当从数据库中查询chain-a-account-r对应的lastsequence值。
94.对应于步骤4,中继器利用从数据库获得的lastsequence与从目标区块链获得的中继账户序号sequence进行比对和修正。在步骤3中,tx1已经先于tx2完成了sequence验证工作,因此,此时lastsequence的值为n。而中继器检查到本次获取到的sequence也为n,所以将sequence的值修改为lastsequence+1,即n+1。
95.对应于步骤5,中继器将修正后的账户序号写入数据库,将lastsequence更新为修正后的sequence。relayer-1将数据库中chain-a-account-r对应的lastsequence更新为此时的sequence,即n+1。若所有工作正常完成,则relayer-1释放互斥锁,允许其他阻塞的中继器继续竞争该锁。若在此过程中,发生了任何错误,则中继器将回滚所有的操作,并返回错误信息。
96.最后,对应于步骤6,中继器将修正后的账户序号附加到跨链交易中,并对交易进行签名和广播。relayer-1将修正后的sequence附加到tx2中,并完成后续的签名和广播工作。
97.如图6为出现异常的跨链测试截图。其中,右上及右下为参与跨链通信的两个区块链;左上及左下为连接区块链的中继器进程。
98.如图7为使用了本发明的跨链测试截图。其中,右上及右下为参与跨链通信的两个区块链;左上及左下为连接区块链的中继器进程。
99.尽管已经示出和描述了本发明的实施例,对于本领域的普通技术人员而言,可以理解在不脱离本发明的原理和精神的情况下可以对这些实施例进行多种变化、修改、替换
和变型,本发明的范围由所附权利要求及其等同物限定。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1