技术新讯 > 计算推算,计数设备的制造及其应用技术 > 一种面向栈式EVM的细粒度交易部分回滚机制的实现方法  >  正文

一种面向栈式EVM的细粒度交易部分回滚机制的实现方法

  • 国知局
  • 2024-10-21 15:07:49

本发明属于区块链,尤其涉及一种面向栈式evm的细粒度交易部分回滚机制的实现方法。

背景技术:

1、区块链是一种分布式数字账本,具有去中心化、数据不可篡改、可追溯等特性。为了扩展区块链系统的应用范围,使其能够处理比简单转账更富语义的逻辑操作,以太坊首先实现了智能合约的概念。在以太坊平台上,智能合约是一段自动执行的程序,用户可以通过准图灵完备的高级语言solidity进行合约编写,并使用solidity编译器将合约代码编译为字节码,随后用户可以将该字节码部署到链上的合约账户,而其他账户则通过交易的形式调用合约。

2、然而在智能合约交易的并发执行过程中,当读后写冲突发生时,被中止的交易将触发撤销流程,回滚其执行上下文和相应的状态修改。现有的交易执行方案通常将交易状态回滚至交易执行前的初始状态,然后将被终止的交易重新分配给一个空闲的工作线程以进行重执行。尽管这种基于交易粒度的回滚方案显然可以确保执行的正确性,但若一个交易面临的冲突仅影响其执行的一小部分,却需要重新执行所有操作,这带来较高的开销。此外,与普通转账交易相比,智能合约交易更为复杂,其涉及业务代码逻辑和基于栈的指令执行环境,因此采用粗粒度的交易回滚不仅会造成cpu计算资源的显著浪费,也带来昂贵的重执行开销。

3、以太坊虚拟机evm是目前智能合约执行环境的主流标准,绝大多数执行环境都是evm兼容的。每个evm实例包含一个程序计数器pc,一个运行时栈stack和一个暂存的表结构memory;合约编写的代码逻辑将编译成包含待执行指令的evm字节码,evm通过执行由pc指向的字节码中的指令来操纵运行时栈。当实施细粒度交易部分回滚机制时,程序计数器和表结构都能简单地存储和恢复,然而,如何高效地恢复先前栈的状态是一个具有挑战性的问题。现有的细粒度交易回滚机制引入一种基于寄存器的方法,将基于栈的evm指令转换为基于寄存器的中间表示。但这种方式需要完整地基于栈的运行环境执行一次后才能进行指令转换,且无法处理未转换的分支逻辑,因此使用场景有限。

4、相较于将栈的指令转换为中间表示的方案,基于栈原生的回滚支持是更为通用的解决方案。然而,基于栈的虚拟机在栈内管理操作数,而不显式知道操作数的地址。为了支持部分回滚机制,需要记录所有在将来需要回滚至的栈的状态。一个初步的方案是在需要创建检查点时,对栈中所有元素进行完整快照,将它们复制并存储起来。然而,这种方法效率极为有限,带来显著的内存消耗和维护开销。

技术实现思路

1、本发明的目的旨在提供一种面向栈式evm的细粒度交易部分回滚机制的实现方法,从而允许因读后写冲突而中止的智能合约交易仅需回滚到冲突之前记录的一个状态,而不是回滚到交易执行前的初始状态。为了支持中止的交易可以部分地回滚到特定的快照,该机制采用基于栈原生的回滚方案,通过设计一个持久化栈的结构pstack来模拟标准的evm栈,并支持通用的栈操作原语。pstack对栈区进行细粒度的划分,使得多个快照之间可以共享未修改的内存段,而不是复制整个栈,从而降低快照记录所需要的内存消耗和维护开销。利用pstack结构记录的栈快照,细粒度交易部分回滚机制可以保留未冲突的计算逻辑和读写,节省大量计算资源,从而有效提高执行效率。

2、实现本发明目的的具体技术方案是:

3、一种面向栈式evm的细粒度交易部分回滚机制的实现方法,利用一个持久化栈的结构pstack,在基于栈式虚拟机的evm智能合约执行环境中实现细粒度交易部分回滚机制;其中,

4、所述pstack是一个基于持久化栈的结构,用于记录所有在将来可能要回滚至的栈的状态。该结构模拟了一个标准的栈,支持通用的栈操作原语,可以有效地还原和操作多个栈的快照;该结构将栈细粒度地划分为若干个内存段,每个内存段记录栈中m个连续的元素,使得多个快照之间可以共享未修改的内存段,而无需复制整个栈;该结构支持利用索引访问所有栈元素,以及追踪之前记录的栈的快照;所述的结构利用栈帧来标识栈快照,pstack栈帧由三部分组成:一个指针列表,指向其维护的内存段;一个记录栈高度的变量和一个布尔类型的引用标记列表,以跟踪当前pstack栈帧是否与其他pstack栈帧共享内存段;

5、所述细粒度交易部分回滚机制是一种交易并发执行过程中的冲突管理方案。当一笔交易t遇到读后写冲突需要被中止时,该机制利用pstack结构记录的栈快照,将交易t回滚到冲突之前记录的一个状态,而不是回滚到交易执行前的初始状态;同时,该机制允许中止的交易仅需重执行被冲突影响的操作,而其他和冲突无关的已执行逻辑和读写将被保留并由下一次重执行复用,从而大大节省了交易t的重执行开销。

6、本发明将pstack结构与evm标准结合,实现细粒度交易部分回滚机制,包括如下步骤:

7、步骤a1:在evm执行环境中检查交易t是否读取智能合约执行环境之外的状态数据;若读取外部状态,则创建一个检查点,复制前一个栈帧的栈高度和指针列表来分叉构建一个新的pstack栈帧;

8、步骤a2:执行交易t;根据交易t中的逻辑操作,更新当前pstack栈帧的指针列表以及操作中涉及的内存段;

9、步骤a3:检测智能合约交易的读后写冲突;当智能合约交易t因冲突发生而被终止时,将交易t回滚到该冲突之前最近的检查点中记录的pstack栈帧状态,并删除此pstack栈帧之后创建的所有栈帧以及因冲突而无效的读取依赖关系和写入版本信息;

10、步骤a4:在回滚到的最近检查点记录的pstack栈帧的执行上下文中重新执行交易,并在试探性提交时,将交易t在最新一次中止后新写入的本地写集版本插入共享存储中;

11、进一步,所述步骤a1,包括如下步骤:

12、步骤a11:在evm执行环境中检查智能合约交易t待读取的状态是否存在于交易t的本地读写集中;

13、步骤a12:若状态不存在,则创建一个新的检查点;

14、步骤a13:分叉一个新的pstack栈帧来捕捉当前evm的栈状态快照,并且返回一个全局唯一的快照标识号;

15、步骤a14:构建并初始化该新栈帧,拷贝当前的栈高度和指向新栈帧之前pstack栈帧的指针列表,并将所有内存段都标记上值为真的引用标记,表示这些段均为共享状态。

16、进一步,所述步骤a2,包括如下步骤:

17、步骤a21:执行交易t中的逻辑操作,在当前pstack栈帧上通过元素索引找到操作中涉及到的元素待更新的目标内存段;

18、步骤a22:若元素待更新的目标内存段的引用标记为假,则元素的值将直接写入当前pstack栈帧目标段的对应位置;

19、步骤a23:若元素待更新的目标内存段的引用标记为真,则将目标段克隆至当前pstack栈帧新分配的内存段,并将元素的值写入新段中;在这之后,将该段的引用标记置为假,表示该新段被当前pstack栈帧所单独拥有。

20、进一步,所述步骤a3,包括如下步骤:

21、步骤a31:当发生交易的读后写冲突时,将导致交易中止的冲突键记录在被中止交易的冲突键集合中;

22、步骤a32:交易t检测到被中止时,以原子方式从冲突键集合中获取冲突键,并找到在运行逻辑中发生位置最早的冲突键;

23、步骤a32:交易t通过快照标识号,将evm的栈的状态恢复到对应的pstack栈帧,并移除所有在快照标识号之后创建的栈帧;若有栈帧中的引用标记为假,则回收该段的内存分配;

24、步骤a34:交易t清理受读后写冲突影响的读取依赖和写入版本。

25、进一步,所述步骤a4,包括如下步骤:

26、步骤a41:交易t根据最近检查点所对应的pstack栈帧中记录的执行上下文信息,恢复到之前的执行状态进行重新执行;

27、步骤a42:由于部分回滚已保留未冲突的状态读写,因此在试探性提交时仅需向共享存储插入交易t在最新一次中止后新写入本地写集中的版本。

28、本发明的有益效果包括:

29、本发明旨在降低智能合约交易因读后写冲突而引发的高额回滚和重执行开销,专注于开发一种面向栈式evm的细粒度交易部分回滚机制的实现方法。本发明充分考虑了evm基于栈的、大端对齐的特性,利用一个持久化栈的结构pstack,在evm智能合约执行环境中实现高效的细粒度交易部分回滚。具体而言,本发明通过pstack来模拟一个标准的栈,支持通用的栈操作原语。pstack将栈划分为若干个内存段,每段记录栈中m个连续的元素。这样细粒度的划分使得多个快照之间可以共享未修改的内存段,而不是复制整个栈,以实现高效的快照记录与管理。同时,pstack可利用索引访问所有栈元素,并且追踪之前记录的栈的快照。基于该结构,中止的交易可以部分地回滚,而不是回滚到交易执行前的初始状态。相较于完全回滚方案,本发明采用指令级别的交易回滚能保留未冲突的计算逻辑和读写,节省大量计算资源,从而有效提高执行效率。

本文地址:https://www.jishuxx.com/zhuanli/20241021/320635.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 YYfuon@163.com 举报,一经查实,本站将立刻删除。