当前位置:首页 期刊杂志

基于区块链的数字化智能合约研究①

时间:2024-05-04

方 轶,丛林虎,杨珍波

1(海军航空大学,烟台 264001)

2(92349 部队,淄博 255100)

2008年,中本聪发表了一篇名为《Bitcoin:A Peerto-Peer Electronic Cash System》的论文,提出了一种基于密码学的电子货币,并命名为比特币(Bitcoin)[1].区块链(Blockchain)技术作为比特币的底层技术,包含了P2P、分布式存储、共识机制、智能合约、密码学等计算机技术,具有去中心化、匿名性、存储数据不可篡改、可追溯的特点[2],使区块链成为近些年来信息技术中最受关注的焦点之一并使其迅速发展.

最初区块链技术更多地被应用在金融领域,能够使交易不通过第三方可信任机构完成,同时还能很大程度上确保交易的匿名性、交易数据安全以及交易数据可追溯.如今,区块链技术已经成为又一项能够引领信息时代变革的新技术,其应用已经不仅仅局限于数字金融领域.在医疗数据存储领域[3],薛腾飞等人进行了基于区块链的医疗数据共享模型研究,为实现智慧医疗以及医疗大数据提供了基础平台;在能源领域[4]方面,张俊等人在智能分布式电力能源系统中采用区块链技术,提出了一种分布式存储方案;同时区块链技术在身份认证[5]、投票系统[6]等方面有着广阔的应用前景.然而仍然有许多领域还未进行区块链技术应用方面的探索,尤其是在军事、气象、地理等对数据安全性要求较高的领域还存在着很大的研究空间.

相比于区块链研究的热度,对智能合约的研究大多是基于区块链技术上进行的.研究内容主要是智能合约的运行环境、技术平台、合约协议以及应用场景推广等方面[7].本文主要研究了基于区块链的数字化智能合约应用,针对航空导弹业务场景进行了区块链系统及智能合约的开发.

1 区块链开源平台

1.1 区块链基本架构

总体上,一个区块链应用主要由数据层、网络层、共识层、激励层、合约层和应用层[8],具体如图1所示.本文所做的主要是合约层的工作.

图1 区块链基本架构

按照区块链网络的开放程度,区块链可以分为以下三类:公有链、联盟链和私有链.区块链技术随着比特币的提出进入到人们的视野,近些年来有许多区块链研究人员、基金会、企业、联盟以及活跃的区块链爱好者在区块链开源平台方面进行了大量的工作,出现了诸多优秀的区块链平台,如公有链平台以太坊(Ethereum)、联盟链平台超级账本Hyperledger.

1.2 以太坊

2013年末,年仅19 岁的俄罗斯程序员Vitalik Buterin发布了Ethereum 初版白皮书,标志着Ethereum 项目正式启动.Ethereum 平台使用的加密货币Ether (以太币)也被人们称为第二代加密货币[9].

以太坊平台实现的突破就是它支持用户自行编写智能合约,发行自己的数字货币.以太坊平台允许用户使用Sodility 编程语言编写智能合约.Sodility 是一种语法类似JavaScript 的高级语言,并且是图灵完备的.编写好的智能合约运行于EVM (以太坊虚拟机) 中,EVM 是一个沙盒环境,可以严格控制内部访问权限,保证智能合约运行时的安全.

区块链中引入了共识机制.共识机制的作用是在决策权高度分散的去中心化系统中使各个节点高效地达成共识,保持所有分布式账本数据的同步.区块链中使用的共识机制主要有:PoW (工作量证明机制)、PoS(股权证明机制)、DPoS (股份授权证明机制)、PBFT(实用拜占庭容错算法)[10].比特币与以太坊所使用的都是PoW 共识算法.

1.3 超级账本

Linux 基金会开原组织于2015年12月启动了名为Hyperledger 的开源项目[11],意在多方共同打造区块链技术的企业级应用平台,至今已汇集了众多行业企业精英.Hyperledger 中5 个重要子项目如表1.

表1 Hyperledger 重要子项目信息

其中Fabric 社区活跃度最高,版本更新最快,采用了模块化架构设计,支持可插拔组件的开发与使用.Fabric 的主要组件包括:客户端(Client)、网络节点(Peer)、CA (Certificate Authority)节点和排序服务节点(Orderer).

其中客户端的主要作用是和Fabric 系统进行交互,实现对区块链系统的操作.客户端主要有命令行客户端(CLI)以及用Fabric SDK 开发的应用客户端.网络节点是区块链去中心化P2P 网络中的对等节点,按照功能可以分为背书节点(Endorser)和确认节点(Committer).背书节点主要对交易提案进行模拟执行以及背书验证.确认节点主要负责验证交易的合法性,并更新和维护区块链数据与账本状态.

CA 节点主要负责为Fabric 网络中的成员提供基于数字证书的身份信息,可以生成或取消成员的身份证书.Fabric 可以通过CA 节点实现节点权限控制的管理.

排序服务节点主要负责对各个节点发送的交易提供排序服务,并使所有记账节点达成共识.之后排序节点按照一定规则确定交易顺序之后,将数据发送给各个节点,把交易数据持久化到区块链账本中.

各个组件相互关系如图2所示.

图2 Fabric 组件关系示意图

1.4 其他开源区块链平台

以太坊与超级账本是两个在区块链技术发展过程中具有划时代意义的项目,以太坊的出现标志着区块链进入到2.0 时代,超级账本项目则代表区块链3.0 时代.除此之外,还有许多区块链平台,如比特股(BitShares)[12]、瑞波币(Ripple)[13]、以及中国的趣链(Hyperchain)[14]活跃于世界比特币舞台上.表2是几种区块链平台的对比.

要将区块链技术应用于部队导弹业务数字化登记工作中,首先需要选择合适的开发平台.根据部队实际情况,选用联盟链开发平台Hyperledger Fabric 更符合部队实际,因为联盟链相比公有链和私有链具有用户证书颁发、用户身份识别的功能,具有PKI 体系的认证机制,能有效控制入网用户的各种权限.

表2 部分区块链平台对比

2 智能合约

2.1 智能合约简介

1994年,Szabo N 首次提出了智能合约(smart contract)的概念[15].智能合约的本质是一段运行于网络中的模块化、可重用、自动执行的脚本代码,同时它还具有两个重要的特点:图灵完备与沙箱隔离.也正是由于智能合约的特点,使其在被提出的初期并没有得到广泛的关注与应用.随着比特币、区块链以及各种区块链开源平台的出现,才使得智能合约由概念逐步落地实现,如今智能合约已经成为区块链应用中的重要组成部分.

智能合约在区块链应用中的地位相当于现实生活中的合同,加入区块链的用户都要遵照智能合约来完成特定的行为,开发者可以通过编写智能合约规定用户的行为.智能合约开发完成后需要部署于区块链网络中,部署后的智能合约对用户是不可见的,保证了智能合约的隐私性,开发者可以在使用过程中对智能合约进行修改、升级.

2.2 Hyperledger 中的智能合约

在Fabric 中,智能合约也被称为Chaincode (链码),即链上代码,主要分为系统链码和用户链码,在区块链应用开发中设计并编写的链码指的是用户链码.在Fabirc 中,访问、修改、查询账本都是通过调用部署的链码完成的,一般使用Go 语言编写,通过Fabric 官方提供的API,实现规定接口的代码,这些API 位于Fabric 源码中的Shim 包下.同时,链码之间也可以相互调用.与以太坊中的智能合约一样,Fabric 中链码也运行于一个沙盒环境——Docker 容器中,与背书节点的运行互相隔离.目前Fabric 支持使用Go、Java、Node.js 三种编程语言进行链码开发,其中Go 语言是支持最好、最稳定的,因此本文选择Go 语言进行Fabric 链码的开发.Fabric 中智能合约的运行情况如图3所示.

图3 智能合约执行流程图

首先,用户通过客户端(SDK/CLI)发起一个提案,背书节点通过调用Shim 包的方法创建账本仿真交易执行内容,并通过Shim 包对智能合约进行初始化和参数调用;背书节点模拟提案执行,分别执行读账本和写账本操作,模拟更新状态数据;若返回执行成功,则开始执行背书操作,若返回失败,返回错误码500;背书节点对交易结果进行背书签名,并将带有背书结果和背书签名的交易提案返回客户端进行背书认证.

3 某型航空导弹业务数字化登记智能合约设计

目前,部队航空导弹业务登记工作形式主要是手工登记.手工登记方式存在着诸多问题及安全隐患,如:存储过于集中、数据溯源困难、笔迹不清、书写习惯或格式不统一、重复填写、易被篡改等.区块链技术有着去中心化、数据可追溯、防篡改的特点,因此基于区块链技术,对航空导弹业务登记工作进行数字化,能够很大程度上解决目前手工登记方式存在的“痛点”问题.本文以航空导弹业务为应用场景,进行区块链架构设计、智能合约设计与开发.

根据区块链的基本架构,合约层是部署于数据层、网络层和共识层之上的.因此在对智能合约进行设计之前,需要首先对区块链架构进行设计.

3.1 区块链架构设计

与传统区块链架构相比,本文研究的某型航空导弹业务数字化登记中不需要出现类似于比特币系统中货币的概念,因此不需要激励层,合约层之上即为应用层,二者通过客户端(CLI/SDK)关联起来.在传统区块链架构的基础上进行具体设计与改进,如图4所示.

图4 某型航空导弹业务数字化登记区块链架构

在Fabric 中,有两种支持KVS 存储的数据库可提供选择使用,一种是默认的LevelDB,另一种是可以配置选择的CouchDB.这里选用的是CouchDB,因为Fabric 支持对CouchDB 的富查询(Rich Query),同时CouchDB 还有图形化管理界面,为开发人员提供了极大的便利,且CouchDB 支持JSON 数据格式,更适用于表格的数据存储.Fabric 的网络层中,节点间的P2P 网络由Gossip协议实现,在通道中的各个节点会持续广播和接受Gossip 消息.通道(Channel)是Fabric 中重要的概念,多个节点之间可以组成一个通道,同一个节点也可以加入不同的通道.一个通道内部的所有节点共同维护同一个账本,通道与通道之间互相隔离.在本文中的研究中,预设计一个orderer 节点,两个组织Org1和Org2,每个组织都有两个节点Peer0和Peer1,锚节点都是Peer0 节点.两个组织中的所有节点都加入到同一个通道channel1 中.P2P 网络拓扑结构如图5所示.

图5 网络拓扑结构

共识层使用的是PBFT 共识算法,PBFT 是一种考虑了拜占庭容错的共识算法,能够容忍网络中存在最多三分之一的作恶节点.相比PoW、PoS 等共识算法,PBFT 的效率更高.同时由于联盟链规模相比公有链小很多,因此恶意节点对账本同步的影响更大,使用PBFT 能更好地保证区块链中各个节点有效达成共识.

3.2 智能合约设计

区块链应用于传统应用最主要的区别是使用智能合约来实现主体业务逻辑,智能合约既是程序逻辑的主体,也是数据存储的主体.航空导弹业务分为许多方面,现以某型航空导弹技术准备中的气密性检查为例进行智能合约设计.

气密性检查即在某个时刻记录下内部压力,然后进行充气,充到一定压力值后保持一段时间,再记录下压力值.如果两个压力值之差小于某个阈值,说明该弹气密性检查结论为合格,否则为不合格.

智能合约必须要实现Init 接口和Invoke 接口,其中Init 是对智能合约进行初始化,执行的结果就是在状态数据库中创建一个数据库,用来存放通过该智能合约写入账本的数据,本文的智能合约设计中没有考虑预先在数据库中录入数据,因此Init 接口在实现过程中不需要进行操作,只需要返回一个Success 消息即可;Invoke 接口是执行交易的接口,在本文中的作用就是调用已编写的函数.

Invoke 接口的调用操作过程如图6所示.

图6 Invoke 接口调用操作过程示意图

Invoke 接口需要客户端输入两个参数;函数名(Function)和函数所需参数(Parameter),智能合约中的Invoke 只需要通过Shim 包中的GetFunctionAnd Parameter 方法就能接收到客户端传入的函数名和函数所需参数,再通过编写Invoke 内部的判别方法,就可以根据需要,通过输入相应的函数名来指定调用编写好的函数.Invoke 接口内可提供调用的函数信息如表3所示.

根据某型航空导弹气密性检查操作过程以及实际业务需求,Invoke 接口中需要调用的自定义函数有:创建检查记录函数(Create)、根据导弹编号查询检查记录(Query)、查询某个编号导弹的时间戳(queryTime)、查询某个编号导弹的不合格检查记录(queryJl)、查询某个编号导弹气密性检测记录的创建者(queryCreator)等.

表3 Invoke 接口提供的函数信息

4 智能合约的开发、测试与安全性分析

4.1 智能合约开发

选择Ubuntu16.04 作为开发、运行环境,Fabric 版本为最稳定的v1.2,Go 语言使用稳定版本1.11.4.根据业务实际情况以及对智能合约的设计结果,开发中需要用到的Shim 包API 如表4所示.

表4 开发所需部分API

某型航空导弹技术准备中的气密性检查的过程中,在气密性检查中,需要记录的信息有:导弹编号、检查日期、检查人、开始时间、开始时压力(0.1±0.005 Mpa)、结束时间、结束时压力(Mpa)、压力差(Mpa)以及结论(压力差≤0.01 Mpa 为合格),共计9 个数据项.链码中定义数据格式代码段如下:

压力差与结论需要智能合约内部的Create 函数进行判断的,首先计算压力差,再根据压力差与阈值的关系进行结论的判断.

根据前文的设计,必须实现的Init 接口代码段如下:

根据智能合约设计结果,Invoke 接口内部的具体实现代码段如下:

4.2 智能合约测试

利用Shim 包所提供的API,对每个自定义的功能函数进行编写,然后进行部署调试.在CLI 客户端中输入相应指令,即可得到运行结果.

首先通过docker exec -it ci bash 命令进入到客户端CLI 容器中,使用peer chaincode install 安装链码,安装时需要指定通道.本文创建的通道名为channel1;再利用peer chaincode init 命令,对智能合约进行初始化.由于之前在实现Init 接口时没有要求CLI 传入任何参数,因此输入Function 参数和Args 参数数组时为空即可.初始化完成后,在CouchDB 中创建了关于该智能合约的数据库;最后使用peer chaincode invoke 命令,输入通道名称、智能合约名称以及需要传入的Function 参数以及Args 参数数组,之后即可得到查询结果,如图7所示.

图7 在客户端中运行智能合约

智能合约的设计与开发是Fabric 平台的核心工作之一,安装在区块链网络的背书节点上,类似于社会中的法律合同,对业务进行了强制性的规范.通过智能合约的设计、开发与演示可以看出,相比于纸质手工登记,使用区块链技术既具有传统数字化登记系统有利于存储、格式规范、登记速度快等优点,同时又实现了去中心化的分布式存储方式保证了登记数据可追溯、不可篡改.然而要将区块链技术进一步应用于航空导弹业务登记领域,还需要进一步研究探索,后续将要进行的工作主要有:使用国密SM2和SM3 算法对Fabric 中的加密模块进行改进,实现加密算法的“国产化”,进一步提高区块链网络的安全性与可靠性;对PBFT 共识算法进行优化,降低节点之间达成共识的耗时.

4.3 安全性分析

在航空导弹业务场景中,本文设计并实现的区块链系统及智能合约能够实现无人监督的业务数据登记录入工作,免去了对于第三方监督的依赖.同时还能够保证数据的可靠性、完整性以及可追溯性,提高了数据的可信度并提高了防止数据被恶意篡改能力.引入的共识机制能够保证数据来源的高可信度,可以有效地防止恶意节点对数据系统进行破坏.本文设计的系统使用一种NoSQL 数据库:CouchDB 作为存储环境,相比于传统使用SQL 数据库的数据记录软件,能够有效防止SQL 注入攻击.

智能合约是对相关业务或逻辑的代码实现,其目的在于不依赖于可信任的第三方执行各种操作.如果被恶意修改会造成业务或逻辑混乱,甚至会对系统造破坏,因此对智能合约的保护是一项重要内容.本文提出的智能合约隐私保护措施主要是将智能合约安装并运行于Docker 上.Docker 是一种容器,能够实现虚拟化但又不同于虚拟化.容器是完全沙箱机制的,之间不存在任何接口.同时在Linux 系统内核中也存在着分别实现对容器资源隔离和资源限制的功能.智能合约运行在Docker 容器上时,能够保证智能合约的独立性,同时对于已经安装在Docker 上的智能合约对外界也是不可见的,即使修改智能合约代码,已经安装的智能合约也不会受到影响.

5 结语

本文针对部队传统航空导弹业务登记中存在的问题与隐患,提出了基于区块链技术对传统登记方式进行数字化的方案,并完成了智能合约的设计,最后对某型航空导弹气密性检测登记进行了智能合约的开发与测试,对区块链技术在部队工作中的应用进行了初步探索,安全性分析证明了该方案具有较好的可行性与有效性.

免责声明

我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!