郭 雨
(吉林建筑科技学院 计算机科学与工程学院, 吉林 长春 130114)
传统供应链中,对于实现交易平台之间、交易平台与用户之间、交易平台与商户之间等信息交互的利用,无法保障信息的有效利用以及信息安全性的维护,从而导致交易平台在数据交互过程中产生各种各样难以解决的问题,如溯源不清、交易数据被篡改、质量问题难以划分责任等问题。
区块链技术已逐渐走入大众的生活,成为社会关注的焦点。区块链源于比特币,利用加密链式区块结构存储数据,其中共识算法是区块链技术的一个核心问题,利用共识算法来生成、验证数据,可以有效地解决互联网上信任与价值的可靠传递难题[1]。利用区块链技术去中心化的特点,采用一种全新的数据库技术,可以高价值、多方位对交易数据进行保护,并通过密码学技术保护交易数据内容难以进行篡改、造假或者抵赖。区块链技术的应用有助于建立新的交易平台建设体系,以去中心化、开放的特征,强调和尊重时长交易的自愿原则,发挥统筹协调机制。
传统交易平台数据需要一个第三方可信任的中介进行交易,与传统的交易平台相比,区块链技术除了具有去中心化的优势外,还可以保证网络数据的一致性,实现点对点的交易,从而增加交易平台的数据安全性和可靠性[2]。但是想要达到点对点的交易,就需要考虑区块链安全、效率等因素。区块链主要的共识算法有POW、POS、DPOS、PBFT。在这些共识算法中,拜占庭容错算法(Practical Byzantine Fault Tolerance, PBFT)在交易平台中具有更大的优势。
在分布式系统中,拜占庭容错技术能够很好地对应节点故障和传输错误的问题。但是早期的拜占庭算法是需要有数级的算法,算法复杂,使用难度较大。直到1999年提出的PBFT算法才将算法复杂度降为多项式级别,改进后的算法极大地提高了拜占庭算法的效率[3]。
在PBFT算法中,存在view(视图)概念,在每一个view里,相同配置下运行每一个节点,并且只能设置一个主节点,而其他节点作为view中的备选节点。view中的主节点主要对平台申请数据进行排序,并且按照排序进行分配,将数据分别存储到备份节点中。备份节点检查主节点对请求的排序是否正常,如果出现分配异常状态,就会触发view change机制,将主节点进行替换,在view中进入一个新的主节点。
PBFT算法主要执行流程如图1所示。
图1 PBFT算法执行流程
算法中包含5个阶段。
1)request:客户端首先发送请求,请求信息发送格式为
其中:o----执行操作
t----时间;
c----编号。
2)pre-prepare:将收到的请求发送给主节点,主节点进行记录,记录后发送一条广播数据给其他的备份节点,pre-prepare格式为
< pre-prepare,v,n,d>,
其中:v----所在视图请求;
n----主节点分配编号;
d----digest编号。
通过信息比对,如果备份节点在视图中的数据与请求数据相同,并且未收到过相同节点信息,但是每个节点的摘要编号不相同,则该信息通过,进入下个阶段。
3)prepare:进入到prepare阶段的备份节点会产生一条prepare广播信息,并且会接收到其他节点发送的prepare信息,prepare格式为
< prepare,v,n,d,i>,
其中:i----节点编号。
当节点接收到2倍的允许节点出错的容错数量,并且prepare中的请求、节点编号以及备份节点编号相同,则这个节点可以进入下个阶段。
4)commit:进入到commit阶段的备份节点会产生一条commit广播信息,同时,也会接收到其他节点发送的commit信息,commit格式为
当节点接收到包含自己在内2倍的允许节点出错的容错数量具有相同的v和n的commit信息后,在节点等待中编号较低的请求,请求经过同意后可以进行执行。
5)reply:该节点对客户请求进行答复,reply格式为
< reply,v,t,v,t,r>,
其中:r----请求所在的视图;
t----队形的时间戳;
i----作为请求答复的节点编号;
r----请求答复的最终结果。
当客户端收到包含自己在内的允许节点出错的容错数量,并且请求答复时,t和r的结果都相同,这时表示请求被系统处理。当遇到网络原因,客户端未及时收到答复时,消息将会被重复发送。
除此之外,当视图中节点执行完成后,还需要对多余数据机型回收,即将之前的请求记录信息进行清除,从而节省系统资源,减少系统资源的占用。在使用时,还需要考虑到网络延迟等因素,可能导致视图中的节点并不在同一个处理状态中,因此,在PBFT算法设置check point协议,在check point协议中预先设置检查点,在所有节点执行完毕并通过检查点时,检查点将会对全网进行全面检查,并通知其他节点中的检查点节点信息执行完毕。
智能合约作为一种计算机协议,合约条款在执行时可以是全部或部分自动执行,同时,智能合约为了避免外界因素产生的干扰,实现当一个预先编号的程序被执行时,智能合约执行系统相应的协议条款[4]。这种执行方式使得合约的履行更加便捷,也为执行数据带来保障。
智能合约与传统合约对比见表1。
表1 智能合约与传统合约对比
智能合约与传统合约对比,具有不可比拟的优势,尤其是在区块链技术出现以后,分布式账本技术为智能合约提供了底层技术基础,从而保证数据不被随意篡改,并且保证数据能够按照预定执行的合约条款执行[5]。在超级账本中,智能合约部署在其fabric网络节点上时,可以被调用的与分布式进行交互的程序代码。在以太坊中,智能合约是运行在相互不信任参与者之间的协议,由区块链的共识机制自动实施,不依赖于受信任的机构[6]。
智能合约作为一种协议,其数据架构可以分为呈现层、应用层、业务层和数据层[7]。呈现层主要表示客户前端,应用层根据不同应用程序进行不同设计,业务层包含系统所需要业务过程上的实现,数据层提供持久化数据服务[8]。智能合约的运行机制如图2所示。
图2 智能合约运行机制
智能合约可以自动触发执行代码,验证合约的有效性,从而避免数据篡改的风险。为实现智能合约的交互操作,智能合约会预留一个接口,根据密码学原理,使得合约与接口进行交互验证,保证合约的安全性。
1)PBFT算法在分布式系统中,通过异步通信机制进行传输,从而达成共识[9]。PBFT算法具有很强的一致性,每次计算都需要遍历整个网络节点,但如果在交易平台中具有庞大的网络系统,此时PBFT算法的效率就会降低。当节点个数大于节点编号的1/3时,网络安全将会遭到破坏,从而降低系统的安全性。同时,由于PBFT算法具有的特定通信机制,每一个备份节点的数据都需要进行5步验证,导致PBFT算法执行效率不高。
2)PBFT算法在系统view中,每一次的请求数据、备份节点的请求数据都需要有回应,但是交易平台数据节点数量庞大,无形中增加了网络通信和数据交换的数量,增加了系统的延时时长,从而降低计算效率。
3)PBFT算法中,主节点与备份节点固定,如果节点进行动态变化,由于节点的固定问题,无法对应节点的动态变化,在交易平台中,各个节点的数据量非常大,由于交易平台中并不是一对一的交易,而是具有多家供应商和多用户,并且在交易平台中,供应商的数量也可以不断变化,使得节点的数量和交互过程随之变化,但是PBFT算法无法对节点进行动态的增加或者删除,使得交易平等数据交互得到了限制。
根据区块链技术采用的网络模式对PBFT算法进行分析设计,假设服务器绝大部分时间处于正常状态,不用每一个请求都在达成一致后再执行,取消共识过程,只需要在错误发生之后再进行共识,达成一致性即可,删除原有算法中的reply阶段,在各个备选节点收到消息后,如果收到pre-prepare阶段的广播消息,那么此次消息传递完成,取消客户参与算法共识阶段,将PBFT算法的执行流程简化为三个阶段,实现流程优化效果,PBFT算法改进流程如图3所示。
图3 PBFT算法改进流程
优化后的PBFT算法执行流程如下:
1)取消客户端发送请求的方式,备选节点中的任一节点都可发送请求,为防止请求被数据篡改,需要在请求时加入签名,保护交易数据的可靠性。
2)主节点不需要每次都检查备选节点消息,而是每隔一段时间进行消息匹配,匹配内容为
这里替换原有数据格式,取消客户端编号c,用s表示主节点签名机制。其中t不再表示本地时间,用来表示每次主节点进行共识的时间间隔。
3)在备用节点收到主节点的消息后,会进行消息验证,并且进行消息回复。
采用智能合约技术结果区块链算法进行实验数据对比分析,对改进后的PBFT算法进行实验,并得到相应的实验数据。首先建立智能合约的超级账本,建立一个接口为Run的函数,通过结构调用智能合约内不同方法。主要伪代码如下:
func( )Run(){
定义并处理不同函数
if初始化数据{
return返回数据
}
else if调用账链代码{
return返回数据账链代码)
}
else if f删除用户{
return t. 删除用户返,返回数据
}
func{
对账户进行初始化,并分配账户A和B一个地址,并赋值。
账户地址
账户金额
}
初始化数据
if 账户余额不足{
return 返回错误信息
}
…
fmt.Printf(将执行后的结果写入账本中)
从账本中获取状态/变量信息
查询A账户当前余额并转换为数值
}
return 返回主信息
1)在PBFT算法中,如果频繁地更换主节点,会导致view的跟换,从而影响系统效率以及系统的吞吐量,改进后的算法增加了主节点签名机制,增加节点的信任度,并且在选取主节点时,可以从信任节点中进行选择,不用进行原有节点选取方法。
2)将PBFT算法原有的5个阶段消息传递变为2个阶段消息传递,增加主节点巡查机制,降低系统的通信次数,同时,减少网络通信和数据交换的数量,降低系统的延时时长,从而提高计算效率。
选取实验主节点,利用智能合约机制与改进后的PBFT算法相结合,在实验时选取6个主模拟节点,并将1节点和4节点设置为PBFT节点,进行300次主节点更换,对比原始PBFT算法和改进后的PBFT算法进行实验,对比实验数据如图4所示。
图4 传统算法与改进后的PBFT算法数据对比
实验结果表明,减少主节点数量,并且减少主要交互流程以及网络通信和数据交换的数量,降低了系统的延时时长,从而提高计算效率。
针对原始的PBFT算法存在系统延时时间长、计算效率低、主节点更换次数庞大等问题,提出改进PBFT算法的供应链溯源方法。减少主节点变换次数及交互流程,增加主节点签名机制及节点的信任度,并且在选取主节点时,可以从信任节点中进行选择,并与智能合约机制相结合,从而达到降低算法的通信开销中心化、公开透明以及交易可追溯。整个构架对供应链中产品从生产商到消费者全过程数据记录,保证了交易过程中产品的安全性。