许亮
(四川大学计算机学院,成都610065)
当前,一个万物互联的世界正在快速成型,各种数字化终端设备的普及应用,带来的是各类数据呈指数级的爆发式增长,在这个数据洪流澎湃汹涌的时代,数据科学家研究实现了一系列大数据计算的解决方案,包括各类分布式计算框架、并行计算、云计算、边缘计算、雾计算等。目前,现有的技术方法均采用集中式、中心化的方式来处理大量数据的计算任务,这些系统结构复杂、拓展性有限、容错率低,且计算环境可信度差,数据无法共享,难以满足万物互联时代对数据计算的多样性需求。
以Map-Reduce 编程模型为基础的分布式计算系统采用中心化计算机组来进行大规模数据的分解、计算、汇总,通过网络通信来进行消息传递和工作协调,可扩展性强,容错率高,但是搭建部署分布式计算集群的价格也非常昂贵,且集群不能自动解决恶意节点作恶的问题,只能依靠中心化的方式进行管理。而区块链技术作为一种去中心化的分布式数据库存储技术,具有去中心化、数据防篡改、可溯源等特性,是一种有效解决广域网范围内分布式计算环境信任问题的方案。
本文将区块链与分布式计算相关特性进行了有机结合,基于分布式计算场景,对现有联盟区块链进行了改进和重新设计,利用区块链技术的优点有效解决分布式计算体系存在的信任问题,并研究提出了一种区块链分布式计算模型范式。本文参考Map-Reduce 编程模型,从联盟区块链角度出发,将区块链的交易流程转变为分布式计算框架,从而实现对大规模数据分解后进行分布式并行计算,本文还利用区块链智能合约的优点,将分布式计算的映射和归约等计算功能函数以及计算节点选择策略等函数写入智能合约,部署在区块链上,使所有计算节点均按照合约规定进行计算。该系统利用区块链数据密码加密认证和共识机制的技术特性,能创造可信的分布式计算环境,有效实现数据的安全共享,既免去了搭建分布式计算集群的高昂代价,也去除了中心化管理的束缚,使分布式计算节点的动态加入和退出变得更为自由,能有效解决了节点间的信任问题。这种基于区块链的分布式计算架构使得任何有海量数据计算需求的用户无需搭建分布式计算集群,而是以较低的费用及门槛条件加入该区块链系统,即可发布大规模数据计算任务,使用该系统的分布式可信计算功能,而无需关注更多细节,也不用担心计算环境的可信问题。该系统还设置了可信计算等级,以智能合约形式部署在区块链网络上,由用户根据自身任务需要自由选择系统计算环境的可信等级。
参考现有联盟区块链节点模型,根据分布式计算特点,立足于创造一个可信计算环境,采取计算与存储分离的模式,将分布式计算区块链网络节点设计为计算节点和存储节点两类。计算节点主要执行分布式计算,即对子任务执行mapping 计算和内部结果排序统计等功能。若计算节点选举为主节点,则具有子任务计算结果收集、产生新区块等功能。计算节点不记账,不保存和更新账本,当且仅当计算节点被选为主节点后,需要与账本产生交互和查询,则向存储节点查询或者下载账本。存储节点主要对新产生的区块进行验证,并将验证通过的区块上链,更新账本状态。
计算节点分为四种状态:空闲状态、分发状态、计算状态、主节点状态,在同一任务周期内,一个节点只能进入其中的一种状态。当计算节点作为大数据计算任务分发节点时,该节点进入分发状态,在一次任务中,分发节点不参与任何子任务的计算,而是一直处于分发状态等待计算结果,待收到主节点发来的子任务计算结果后进行最终结果统计汇总。当计算节点接收子任务进行计算时,该节点进入计算状态,计算完成后,判断任务池中是否还有未完成的其他计算任务,若有,则继续保持计算状态,若无,则转入空闲状态。当计算节点选举为主节点时,该节点转入主节点状态,进入主节点状态的计算节点不承担子任务的计算工作,也不能进行作业分发。主节点功能包括:收集各计算节点的计算结果,并对同一子任务不同计算节点的计算结果进行统计比对,当一个子任务相同的计算结果数超过执行该子任务计算节点数50%时,则该结果被认为可信计算结果,主节点将该计算结果发送给任务分发节点,并将所有计算结果打包进新区块。若该子任务没有产生可信结果,主节点将该消息反馈给任务分发节点,由任务分发节点按照计算节点选择策略为该子任务重新选择分配计算节点,重新执行计算流程。主节点产生新的区块后,将新区块发送给所有存储节点,存储节点对区块进行验证后上链,更新账本。计算节点状态转换如图1 所示。
图1 计算节点状态转换图
若在任务执行过程中,分发节点宕机或者发生故障,在任务生命周期内无法接收主节点发来的子任务计算结果,则主节点依然按程序将本次任务所有子任务计算结果打包进新区块,并发送给存储节点验证上链,待分发节点恢复后,自行读取链上的计算结果,调用结果统计模块汇总统计最终结果。如此,确保了在分发节点出现意外的情况下,仍然能保证计算结果的有效性,确保了该分布式系统的鲁棒性。
分布式计算系统一般通过任务的分解与聚合的方式进行分布式并行计算,从而对大数据进行处理,本文所述基于区块链技术的分布式计算方案也采用任务分解与聚合的方式进行,任务分解与聚合等功能均以函数编程形式写入区块链智能合约中,事先部署运行在区块链上。智能合约中既包含分布式计算函数和结果汇总函数,也包括计算节点选择策略。任务分发节点通过智能合约完成任务分解后,根据智能合约中的节点选择策略,由用户自由选择计算可信度等级,确定子任务的计算节点数量,调用智能合约为每个子任务选择分配规定数量的计算节点。
在区块链网络空闲的状态下,网络中只存在两种角色节点—计算节点与存储节点,所有的计算节点都是完全平等的,除被选举为主节点的计算节点处于主节点状态外,此时所有计算节点均处于空闲状态。网络中的节点根据功能不同在逻辑上被分为两层,外层由计算节点组成计算网络,负责执行分布式计算;内层由存储网络组成存储网络,负责区块链数据的验证存储和维护。网络底层仍然是一个P2P 网络,计算节点必须通过主节点与存储节点通信。
图2 网络结构拓扑图
对于一次计算任务,首先,任务分发节点在本地调用部署在区块链系统上的智能合约,自动将一个待处理作业划分为多个数据块,每个数据块对应于一个计算子任务,然后调用智能合约中的节点选择策略算法,为每个子任务选定计算节点并发送子任务数据,计算完成后,计算节点将计算结果发送到主节点,由主节点根据区块链系统设定的规则对计算结果进行验证,并把验证通过的计算结果发送给任务分发节点,最后将所有子任务计算结果打包进新区块,发送至所有存储节点,存储节点对新区块进行验证,通过后写入账本,并向主节点反馈消息。工作结构如图3 所示。
图3 工作结构示意图
计算节点不仅要做数据映射的工作,还要做部分归约工作,相关功能函数都写入智能合约进行部署,最终结果的统计汇总工作交由任务分发节点来做,这样,最终的计算结果将对整个区块链网络隐藏,仅有任务分发节点知道,有利于保护计算结果隐私性。区块链中各区块存储的数据是各计算节点计算出的子任务数据,可用于计算过程的追溯。
对于一次分布式计算任务,具体流程如图4 所示。
图4 工作流程图
(1)计算任务开始,发布任务的计算节点进入分发状态,将任务拆分为多个子任务;
(2)用户根据计算需求,调用智能合约中的节点选择策略为每个子任务选择分配计算节点,并将子任务数据发送给选定的计算节点,同时,将子任务分配表发送给主节点;
(3)接收子任务的节点进入计算状态,调用智能合约中的计算功能函数执行计算;
(4)计算节点完成计算任务后,将计算结果附上自己的签名一并打包发送到主节点;
(5)主节点根据背书规则,对执行同一子任务的所有计算节点,若收到超过半数节点的计算结果相同,则认为该计算结果正确可信,放入区块池,等待出块;
(6)主节点将验证通过的子任务计算结果附上自己的签名一并发送给任务分发节点;
(7)任务分发节点收到各子任务计算结果后,调用汇总功能函数统计最终结果;
(8)主节点按照出块规则,在收集到规定数量或大小的子任务计算结果后,创建新区块,并将新区块发送给所有存储节点;
(9)存储节点收到新区块后,进入验证状态,把验证通过的区块上链,更新账本状态,并反馈给主节点;
(10)主节点收到各存储节点的反馈信息后,将反馈结果汇总统计,并向任务分发节点反馈计算任务完成情况。
在一次计算任务中,任务分发节点完成作业分解后,会调用智能合约中的节点选择策略为每个子任务选择分配相应数量的计算节点。节点选择策略事先以函数编程形式写入智能合约中,部署运行在区块链系统上。为了满足用户的计算需求多样化,节点选择策略应预置多种模式提供给用户自由选择,由用户根据具体任务计算需求,选择执行同一子任务的计算节点数量,我们将这种可调整的节点选择策略称为计算可信度调整策略。
参考Hyperledger Fabric 的背书策略,该系统用户可以选择同时执行同一个子任务的计算节点数量。对于同一个子任务,选择的计算节点数量越多,其计算结果的可信度就越高,但系统的计算效率也就越低。因此,对于那些对计算结果准确度和可信度要求较高的任务,适于选择较多的计算节点同时执行同一子任务,即调高计算可信度。相反,由于区块链系统允许作恶或故障节点存在,所以同一个子任务选择的计算节点数量越少,则其计算结果可信度就越低,但系统的计算效率会提高。因此,对于那些对计算结果的准确度要求不高,而对计算效率要求较高的任务,适于调低计算可信度。用户可以根据具体的计算任务自由选择调整此次计算任务的计算可信度,但为确保计算环境的基本可信度,规定一个子任务选择的计算节点数量不能少于3 个。
本文在区块链技术的基础上,充分发挥区块链系统去中心化、可追溯、防篡改的特性,研究实现了一个基础的Map-Reduce 分布式计算架构,提出了一个去中心化、自治和计算环境可信的分布式计算解决方案。既能有效保证计算结果的隐私性,也能实现计算过程可追溯,用户还能根据任务需要自由调整计算可信度,并间接调整系统的计算效率。