北京航空航天大学分布式实验室 北京航空航天大学云南创新研究院 余维 胡 凯
性能问题一直是困扰区块链领域的大问题,其中智能合约性能是整个区块链性能的瓶颈之一,智能合约在1994年由尼克萨博首次提出,但受到合约代码执行环境的影响,很难应用到现实生活中。区块链技术为智能合约提供了一个良好的执行环境,保证了合约的正确性以及强制执行性,在区块链上合约具备了控制资产的能力。但基于区块链的智能仍处于一个初级阶段,仍有许多问题需要解决。最新数据显示大部分公链上的智能合约执行效率低下,以太坊上智能合约的平均时间达到了20s左右。如何提升合约的执行效率成为了一个亟待解决的问题。
1. 一般智能合约执行模型
纵观现有公链的的智能合约执行模型,其大部分与以太坊的执行模型相似,对以太坊的智能合约执行模型进行进一步分析可知,其主要的执行步骤如图1所示。
其中,智能合约的执行处理过程为:
步骤1:获取目前待处理的交易池,获取排头交易,调用其相应的智能合同。
步骤2:以太坊虚拟机分析交易内容,获取交易所调用的合约名、合约方法、以及合约输入等信息。
步骤3:以太坊虚拟机从交易和状态数据库中获取相应的合约字节码和合约输入。
步骤4:合约代码在以太坊虚拟机中执行,完成对应交易的业务逻辑。
步骤5:以太坊虚拟机将合约执行结果写回到状态数据库中,完成业务状态的更新。
步骤6:当块中的所有交易都已执行时,系统会将状态数据库的当前状态的哈希摘要作为认证记录存储在区块链中。
1. 智能合约并行执行模型
基于对以上的执行模型步骤的分析,我们可以发现智能合约执行过程均为串行执行,由于执行过程中包含大量计算以及存储操作,易导致性能不佳。基于此分析,我们提出了智能合约并行执行模型,使用并行技术来解决串行模型所带来的性能瓶颈。并行模型的具体实现借助于多线程技术,从而有效的提升智能合约的执行效率。智能合约并行模型如图2所示。
图2 智能合约并行模型
其中,智能合约的执行处理过程为:
步骤1:当区块链系统从交易池中获得足够的有效交易时,它将开始处理这些交易。
步骤2:交易分割模块分析当前交易以获取共享变量的信息。随后,交易分割模块将交易分到不同的集合中,使得这些集合彼此之间没有相同的共享变量。最后,这些交易集将被发送到多线程处理模块中执行。
步骤3:多线程处理模块将工作分配给每个线程。
步骤4:线程开始运行并从状态数据库获取必要的初始数据,例如合约代码。智能合约准备好执行。
步骤5:将执行合约代码,代码将完成其相应的智能合约的业务逻辑。
步骤6:智能合约执行将改变一些相关的状态变量,这些更改最终将被写回状态数据库。
步骤7:当所有智能合约完成后,区块链系统将进行状态数据库的认证。然后将所有已处理的交易和认证记录到区块链中。
新模型在实现上面临的最大问题是执行时所产生的同步问题,同步问题可描述为在使用多线程对业务进行处理时,若不能保证各线程之间共享变量的安全,则可能会导致程序执行的出错。为保证多线程所处理业务中共享变量的安全性,相比于现有的智能合约模型,其主要增加了交易分割模块,将交易高效的分割为相互独立(无相同共享变量)的交易组,保证了多线程之间无相同的共享变量,确保了各线程中任务执行的安全性。交易分割过程如图3所示。
图3 并行模型交易分割
交易分割主要是基于交易中所包含的共享变量,将具有相同共享变量的交易分配到同一个任务组,交予同一个线程串行执行,防止了因包含同一共享变量而产生的同步问题。如图3所示,交易1与交易2拥有同一共享变量x1,故两者被分配到了组合1这个任务组中。除包含相同共享变量的交易需被分配到同一任务组外,包含相同共享变量的交易存在着传递性,即两交易同时与另一个交易拥有相同共享时,其也应被分配到同一任务组中,如图3所示,交易1与交易3同时与交易2拥有x1与x3的相同共享变量,则三者被分配到了同一任务组组合1中。
以下为智能合约并行模型和串行智能合约模型的性能对比,测试场景为购物消费场景,基于购物的基础逻辑编写了对应的购物合约并模拟了批量的购物交易。所对比的是两种模型处理同一批数量的购物交易所花费的时间。
图4 智能合约模型性能对比
如图4所示,并行智能合约模型相比于串行执行模型,在实验中至少可以节省23.8%的时间成本,最多可以节省41.9%的时间成本。由上述实验结果可以看出并行模型可有效的提升智能合约执行性能,让智能合约应用到更多领域。