本发明涉及一种智能合约技术领域,特别是涉及区块链上智能合约执行与存储的系统设计与实现方法。
背景技术:
合约是现实社会中经济活动的基础,它是两方面或几方面在共同协作时,为了确定各自的权利和义务而订立的共同遵守的条文。合约规定了交易的标的、内容、时间和执行约定等,并具有法律保障,双方或多方在信任或者不信任的状态下履行合约承诺,有法可依、有据可寻。合约通过规范承诺与执行合约过程,从而保证交易活动的有序进行。当前,人类社会正在向数字社会发展,虚拟经济是数字社会的重要活动,一个巨大挑战就是将现实中人们经济活动转移到网络虚拟世界上。智能合约的概念在1994年由nickszabo首次提出。智能合约是能够自动执行合约条款的可计算交易协议程序代码,它与区块链(blockchain)技术的结合,形成了诚信网络上价值转移的数字合约或代码即合约(codeasacontract),正成为人们在虚拟世界中维持安全数字关系的重要手段,是未来数字社会的基础协议,因此智能合约的相关研究是具有重要意义的。
智能合约理论几乎与互联网技术(worldwideweb)同时出现,但应用实践却一直严重地落后于理论,缺乏将这个理念转变现实的清晰路径。主要面临两个方面问题,一是智能合约没有有效的手段来控制实物资产,保证合约的执行,正如售货机通过将商品保存在内部控制财产所有权,可是计算机程序很难控制现金、股份等现实世界中的资产;二是单个计算机很难保证执行这些条款以获得合约方的信任,合约方需要可靠的解释和执行代码的可信环境,它无法亲自检查有问题的计算机,也无法直接观察与验证其他合约方的执行动作,只有让第三方审核各方合约执行的记录。而区块链技术的出现解决了这些问题,奠定了智能合约应用的基础,同时,智能合约也扩大了区块链的应用范围。区块链为完全数字化资产的记录和转移奠定了基础,通过完全数字化的资产,区块链给计算机代码提供直接控制资产的方法,使得智能合约具有执行力。在区块链上,资产的控制就是控制资产对应的密钥权限,而不是任何实物。区块链使计算系统成为受信任系统,它已经不仅限于数据库的功能,同时还是可以执行代码和记录数字资产所有权的分布式计算机,数字资产所有权就可以被上传和存储在区块链中,并根据指令执行,一旦区块链记录了合约代码,合约方就可以确定合约不会被更改。2015年以太坊(ethereum)把区块链技术和智能合约理论结合,设计实现了可编程的合约语言与可执行的基础设施,开创了基于区块链上智能合约的巨大应用场景。在ethereum中,智能合约是存储在区块链上的脚本,通过区块链节点以分布式的形式执行,相当于商业交易、监督管理过程中法律、法规的执行者。区块链以按序、安全、可验证的方式保证合约的执行。相比目前复杂的涉及用户、汽车经销商和银行的贷款行为和手续,智能合约是能够自动执行合约条款的计算机程序,它能够完善现有的商业模式,更重要的是他们可能颠覆现有的商业模式,也大大减少了第三方中介的费用。
但是现有的基于区块链的智能合约技术还处于一个初级阶段,尚有很多问题还没有解决,如执行效率低下,ethereum虽然改进了比特币的公有链算法,但也需要15秒/块,这还无法满足实际生产的需求;智能合约作为区块链的链上代码执行的安全问题;以及智能合约代码与文本的一致性问题等。目前基于区块链的智能合约的设计与技术仍有进一步研究和改进的空间,有必要进一步研究基于区块链的智能合约技术。
区块链与智能合约的结合对区块链纳入交易的速度与智能合约的可扩展性都会产生影响。当前ethereum的智能合约执行模型降低了区块链纳入交易的速度。
智能合约就是一段经过协商的代码,它的执行应该是分布式的、可观察和可验证的,代码被部署在分享的、复制的账本上,它可以维持自己的状态、控制自己的资产(状态、资产与代码一样,被存储在账本上),还能够对接收到的外界信息进行回应。把智能合约放在区块链上执行就是利用区块链本身自带的一致性算法来保证合约执行结果的一致性。
图1是智能合约与区块链结合的原理性示意图,其中,区块链是安全的分布式数据库,智能合约通过协议与用户界面促使合约的执行具有一致性、可观察性、可验证性、自强制性和接入控制。代码/程序以文本形式存储在不同的节点上,给代码/程序添加断点,并对断点的程序状态进行一致性验证,只能通过消息改变程序的信息空间,合约及其状态记录在区块链中,合约状态的改变智能通过消息去触发。
技术实现要素:
有鉴于此,本发明设计了一种私有区块链的智能合约异步执行存储系统与实现方法。
首先,提供一种私有区块链的智能合约异步执行存储系统,包括:私有区块链的执行状态机、交易处理器执行状态机,能够支持scam(smartcontractasynchronousmodel,即智能合约异步执行模型)的存储结构模块。
优选的,采用执行状态机mnode表示scam中私有区块链的执行状态机,是一个五元组(qnode,∑mode,δnode,snode,fnode),qnode是私有区块链中节点的状态集合,∑mode是输入(事件)的集合,δnode是转换函数的集合,snode是初始状态,fnode是终止状态的集合
优选的,采用执行状态机mexecutor表示scam中交易处理器执行状态机,是一个五元组(qexecutor,∑executor,δexecutor,sexecutor,fexecutor),qexecutor是交易处理器状态机的状态集合如表4。∑executor是输入(事件)的集合。δexecutor是转换函数的集合。sexecutor是初始状态值,fexecutor终止状态的集合
优选的,所述能够支持scam的存储结构模块包括关系型数据库以及kv(key-value)数据库,所述关系型数据库用于存储区块链,所述kv数据库用于存储状态树的节点,并且为了支持协议,kv中设置多个变量。
优选的,所述关系型数据库采用区块头部表与交易数据表两个表存储的形式,其中区块头部表以区块哈希为主键,而交易数据表以交易哈希为主键,同时在存储交易的时候,增加一个字段用于存储交易所在的区块哈希。
优选的,所述kv中设置的多个变量包括:1)“state_root”,表示最新处理交易的状态树根;2)“state_height”,表示最新处理交易所在区块的高度;3)“state_tx”,表示最新处理交易所在区块的序号;4)“state_latest”,表示交易处理器最新处理的高度;5)“block:itran:j”,表示记录区块高度为i,交易序号为j的交易处理成功后的状态根与结果;6)“blocktrans:*”,表示区块*的交易的key值;7)“用户编号”,表示对应存储用户信息;8)“计算节点”,记录区块链计算节点的地址列表,作为一个多方共同维护的合约账户,当有计算节点需要更新的时候,必须经过大多数管理节点的同意,才能更新,这样保证了更新的同步性;9)“第三方编号”,用于给监管方分配权限;10)“合约编号”,存储合约的信息,包括代码、合约状态;11)“名称注册”,用于给合约注册名称,便于查询。
优选的,所述交易处理器执行模块以服务组合形式提供合约服务,分为执行器executor与计算器compute,执行器executor用于与节点通信,计算器compute用于计算交易,为了安全考虑合约代码执行部分会放到docker执行,计算器compute的服务在docker中启动,计算器compute负责执行合约代码,并返回计算结果给执行器executor,在docker执行以保证合约执行不会给节点带来危险。
本发明还提供了一种私有区块链的智能合约异步执行存储系统的实现方法,包括步骤:
1)首先,在firsttimesetup进入建立私有区块链执行模块;
2)在启动的同时,采用onmessage监听消息,所述监听消息包括:接收新区块newblock消息、区块投票vote消息、区块存储recblock消息和区块请求missingblock消息;
3)当接收到新的区块就进入receivenewblock函数,对区块进行处理,先判断区块的来源与有效性然后在对有效区块进行投票;
4)投票消息进入recblockvotedmg函数,当区块的赞成票或反对票超过一定数量,则根据结果存储区块;
5)区块请求消息进入recblockrequestdmg函数,节点将其他节点需要的区块放入消息中发送出去;
6)区块存储消息进入recblocksdmg函数,节点会将区块存储到账本中,同时交易处理器计算交易。
优选的,执行器executor每次初始化的时候,都会先从数据库中读取状态值,继续上次结束后的工作,所述状态值包括:”state_root”、”state_height”、”state_tx”、”result_root”、”state_latest”、”block:*tran:*”、”blocktrans:*”、”cache”和”resultcache”,并且每次计算完交易后,都会更新这些值,在运行状态过程中,执行器execuotr不断将未处理交易发送给计算器computor进行处理。
优选的,所述交易处理器执行模块的服务是通过使用grpc实现,所述grpc允许用户定义一个服务,指定其可以被远程调用的方法及其参数和返回类型。
采用本发明的系统和方法,提高了智能合约的执行效率,智能合约作为区块链的链上代码执行的安全性进一步提高并且智能合约代码与文本的一致性问题得以解决。
根据下文结合附图对本发明具体实施例的详细描述,本领域技术人员将会更加明了本发明的上述以及其他目的、优点和特征。
附图说明
后文将参照附图以示例性而非限制性的方式详细描述本发明的一些具体实施例。附图中相同的附图标记标示了相同或类似的部件或部分。本领域技术人员应该理解,这些附图未必是按比例绘制的。本发明的目标及特征考虑到如下结合附图的描述将更加明显,附图中:
图1是现有技术的智能合约与区块链结合的原理性示意图;
图2是根据本发明实施例的基于区块链的智能合约scam模型示意图;
图3是根据本发明实施例的scam中私有区块链执行方法流程图;
图4是根据本发明实施例的私有区块链执行状态机示意图;
图5是根据本发明实施例的交易处理器执行状态机示意图;
图6是根据本发明实施例的基于区块链的智能合约状态存储模型示意图;
图7是根据本发明实施例的私有区块链智能合约异步执行存储系统的实现方法模块图。
具体实施方式
ethereum是首个把分布式虚拟机与区块链相结合的系统,私有区块链上智能合约异步执行模型的设计来源于ethereum中智能合约设计。ethereum的区块链不仅存储了交易,还存储了最新账户状态信息,账户分为两种:一种是合约账户,其中合约账户才有相应的代码、一种是外部账户,这种帐户没有代码。每个账户都有相应的地址,包含:nonce(账户里的nonce相当于是该账户所做的交易数,账户的nonce记为)、balance(账户余额,记为)、合约代码(合约账户才有,记为)和存储(记为)。合约代码存储在合约账户中,合约是需要交易触发执行的,交易中填写合约账户的地址,这样计算节点接收到交易后就会去查询对应的代码,加上交易中的data信息作为输入来执行合约。交易包含以下元素:nonce(交易里的nonce相当于是交易被处理的标志,记为)、gasprice(由于ethereum是公有链,需要通过收取计算费用来保护不被攻击,记为)、gaslimit(计算费用的上限,记为)和to(交易的接收方,记为)、value(金额,记为),以及v,r,s用于签名验证。
ethereum先计算新区块中的所有交易后,将状态根放入区块的头部,计算好区块头部后,再将新的区块广播出去,导致合约的计算时间包含在了区块的制作时间中,所以ethereum的速度很慢,不仅如此,公有链存储历史数据回滚的可能性,所以很难做到区块计算与交易计算的分离。私有链的区块具有即时终结性,提供了区块计算与交易计算分离的可能性,
下面给出本实施例中私有区块链上智能合约异步执行方法的概述。
智能合约异步执行就是在不影响合约状态一致性的前提下,将合约的计算从区块的计算抽取出来。基本的思路:私有链的区块具有即时性,就是与ethereum不同,ethereum由于自身的一致性的原因,可能有状态回滚的可能,而私有链中被验证过的区块是不会被回滚的,所以,可以让区块链将所有来源正确的交易都放入区块链中,交易可以异步处理,处理的结果也存放在结果树中,然后将结果树的根放入区块的头部,区块在做共识的时候,只对当前的已经被处理过的交易进行一致性检查。交易由交易处理器执行,交易处理器从区块链数据库中取出未被处理的交易并执行。
图2是基于区块链的智能合约异步执行模型(smartcontractasynchronousmodel,scam),区块链节点负责将来源正确的交易链入链中,使得交易的顺序固化,然后交易处理器按区块链中交易的顺序逐个处理交易,每次做区块的时候都是对最新处理交易的状态做一致性同步。最新状态由三个变量表示,state_height表示已被处理交易所在区块高度、state_tx表示已被处理交易序号、state_root表示最新状态树的根)。
图3显示了scam中私有区块链的执行过程,区块链在做块的时候负责将交易固定在链中不处理交易,只验证交易的来源是否正确,但会对最新处理的交易状态进行共识。后面交易处理器负责将区块链中的交易处理,并在计算新区块的时候提供最新状态值,即state_height,state_tx和state_root这三个变量,在验证区块的时候检查这三个变量的值。
交易会广播给所有的计算节点,节点通过compute_right(tx,height,time_interval)计算是否有权限计算新的区块,有权限的节点计算新区块,这时节点需要通过state=querystate()向交易处理器询问最新状态,计算好新的区块后广播给其他的计算节点。计算节点接收到新区块后,需要交易处理器验证状态是否正确,区块验证通过,则广播赞成票,否则发送反对票。当节点接收到的区块的赞成票或反对票数量超过节点数的1/3,则进行同步计算,并存储区块。智能合约异步执行模型(scam)中私有区块链执行系统包括:私有区块链状态执行状态机、交易处理器执行状态机,能够支持scam的存储结构模块以及智能合约模块。
下面分别对系统的各个组成部分进行说明:
1)scam中私有区块链的执行状态机
执行状态机mnode表示scam中私有区块链的执行状态机,是一个五元组(qnode,∑mode,δnode,snode,fnode),qnode是私有区块链中节点的状态集合,如表1所示。∑mode是输入(事件)的集合,δnode是转换函数的集合。snode是初始状态,fnode是终止状态的集合
表1
私有区块链节点执行状态机的状态转换函数如表2。
表2
私有区块链节点执行状态机∑mode的定义如表3。
表3
综合表1-3,状态机转换示意图如图4所示。
从私有区块链执行过程看出,交易处理器必须满足的四个接口是querystate、verifystate、newblock和computestate。
2)scam中交易处理器执行状态机
执行状态机mexecutor表示scam中交易处理器执行状态机,是一个五元组(qexecutor,∑executor,δexecutor,sexecutor,fexecutor),qexecutor是交易处理器状态机的状态集合如表4。∑executor是输入(事件)的集合。δexecutor是转换函数的集合。sexecutor是初始状态值,fexecutor终止状态的集合
表4
当没有未处理交易的时候,交易处理器一直处于等待监听状态,不同的消息会触发不同的行为,δexecutor定义如表5所示。
表5
∑executor定义的事件如表6所示。
表6
综合表4-6,我们可以得到如图5的状态机转换图。
3)能够支持scam的存储结构模块
根据私有区块链与智能合约的存储要求与特点获得能够支持scam的存储结构模块。私有区块链的存储有一个特点就是区块一旦存储了就不需要改动,所以可以将区块链存储在关系型数据库中,存为两个表,区块头部表与交易数据表,其中区块头部表以区块哈希为主键,而交易数据表以交易哈希为主键,同时在存储交易的时候,增加一个字段用于存储交易所在的区块哈希。
智能合约全局状态的存储特点是更新多,而且异步执行需要很多临时存储的地方,所以以key-value的形式存储是十分合适的,这里采用kv数据库存储状态树的节点。
图6表示基于区块链的智能合约状态存储结构设计模块,为了支持异步执行协议,kv中需要以下几个变量:
1)“state_root”,最新处理交易的状态树根;
2)“state_height”,最新处理交易所在区块的高度;
3)“state_tx”,最新处理交易所在区块的序号;
4)“state_latest”,交易处理器最新处理的高度;
5)“block:itran:j”,记录区块高度为i,交易序号为j的交易处理成功后的状态根与结果;
6)“blocktrans:*”,区块*的交易的key值;
7)“用户编号”,对应存储用户信息;
8)“计算节点”,记录区块链计算节点的地址列表,这是一个多方共同维护的合约账户,当有计算节点需要更新的时候,必须经过大多数管理节点的同意,才能更新,这样保证了更新的同步性;
9)“第三方编号”,用于给监管方分配权限;
10)“合约编号”,存储合约的信息,包括代码、合约状态;
11)“名称注册”,用于给合约注册名称,便于查询。
图7表示一种私有区块链的智能合约异步执行存储系统的实现方法模块图。首先,程序入口在firsttimesetup,在启动的同时,还有onmessage用于监听消息(接收新区块newblock消息、区块投票vote消息、区块存储recblock消息和区块请求missingblock消息)。当接收到新的区块就会进入receivenewblock函数,对区块进行处理,先判断区块的来源与有效性然后在对有效区块进行投票;投票消息会进入recblockvotedmg函数,当区块的赞成票或反对票超过一定数量,则根据结果存储区块;区块请求消息会进入recblockrequestdmg函数,节点将其他节点需要的区块放入消息中发送出去;区块存储消息会进入recblocksdmg函数,节点会将区块存储到账本中,并同时交易处理器去计算交易。
交易处理器每次初始化的时候,都会先从数据库中读取状态值,继续上次结束后的工作:”state_root”、”state_height”、”state_tx”、”result_root”、”state_latest”、”block:*tran:*”、”blocktrans:*”、”cache”和”resultcache”。且每次计算完交易后,都会更新这些值。在运行状态过程中,交易处理器不断计算未处理交易。
4)智能合约模块:
以服务组合形式提供合约服务,它分为执行器executor与计算器compute,执行器executor负责与节点通信,计算器compute负责计算交易。在这里智能合约模块服务是通过使用grpc实现(grpc允许我们定义一个服务,指定其可以被远程调用的方法及其参数和返回类型)。executor是交易执行器,为了安全考虑合约代码执行部分会放到docker执行,所以还有一个计算服务compute在docker中启动,compute负责执行合约代码,并返回计算结果给executor,在docker执行可以保证合约执行不会给节点带来危险。executor服务要提供的全部服务包括query、verify、newblock和querytrie,定义如表7。
表7
compute只有compute服务,服务定义如表8,请求交易包括交易的内容,结果的返回不仅包括结果的内容,还包括状态值的变化。
表8
由于是将计算服务放在docker中执行,所以合约执行过程需要查询区块链状态并返回结果,交易处理器接收到结果的返回,则会更新状态。stub表示交易处理器与计算服务(docker)的中间,stud对象包含了计算服务与交易处理器之间的行为,合约编写的时候可以直接调用stub的接口,stub定义如表9。
表9
虽然本发明已经参考特定的说明性实施例进行了描述,但是不会受到这些实施例的限定而仅仅受到附加权利要求的限定。本领域技术人员应当理解可以在不偏离本发明的保护范围和精神的情况下对本发明的实施例能够进行改动和修改。