基于区块链的供应链托管系统设计
2022-02-27李朝放卢清华
李朝放,卢清华
(中国石油大学(华东)计算机科学与技术学院,山东青岛 266580)
现代供应链复杂多变,企业在发展过程中的运营管理存在诸多问题。一方面,供应链网络的管理风险不易把控且存在不良交易,造成了供应链信任短缺的现象;另一方面,在中心化的系统中,若关键设备或服务中断运行,可能会对链上的公司造成严重损害[1-2]。
基于分布式账本的区块链提供了高可信的安全环境和自动化交易的能力,去中心化的架构也使历史交易信息在区块中得到保护,有效避免数据篡改和恶意删除。许多政府和企业都在探索区块链技术的更多应用场景,但是仍然缺少系统、完整的区块链解决方案来优化供应链支付问题。
基于此,该文提出了一种基于区块链和物联网的供应链托管架构,以实现供应链的去中心化管理;设计研究了供应链支付托管算法,做到自动化执行交易交割;最后实现了系统原型并完成性能测试工作,结果表明所提结构和算法具有较高的可行性和良好的性能,为供应链提供了高信任度的环境和可以安全执行的交易合约。
1 相关背景
目前供应链越来越依赖于高效可信的运输和通信系统[3]。一些企业采用了供应链弹性技术,使供应链具有自动恢复和自我重建的能力[4];或将供应链内部和外部进行整合,并构建最佳匹配状态[5]等。但是这些仍然不能避免改进方案受到单点故障、人为因素和不良商业交易行为的影响,导致网络环境的受信程度不高,敏感关键信息存在被篡改的可能,造成交易甚至企业的严重损失[6-7]。
区块链作为一种去中心化分布式账本技术,使用共识算法、多种加密和激励策略等手段,搭建了一种去中心化的、无需信任的分布式对等网络和一种链式账本数据结构。这种技术依托去中心化架构,从而实现了点对点交易和分布式自治节点集群,很好地解决了单点故障以及数据、身份信任问题[8-9]。
如图1 所示,区块链基于共识的链式结构从源头上保证了历史数据的不可篡改性,配合共识算法和激励策略保证链上数据的安全性和完整性[10-12]。
图1 区块数据结构
智能合约是指在分布式账本的多个节点上同步运行的代码脚本,且能够做到由互不信任的节点正确执行,而不需要第三方可信机构。由于智能合约的自动执行特性,为依赖数据驱动事务的许多领域提供了机遇,目前越来越多的开发者正致力于开发不同类型的智能合约,例如金融、公证、政务、物流等[13-15]。
目前国内区块链在供应链上也有实验性应用,但主要集中在农产品溯源和防伪等问题上[16],对供应链的架构升级和支付管理缺少深入研究。
2 基于区块链的供应链托管架构
2.1 系统整体架构
图2 展示了所提供应链托管系统的系统架构图。在Fabric 网络中的每一个点代表一个服务器节点。若干服务器节点组成一个组织,组织内部的节点数并不限制,按照真实机构组成来划分组织,而组织中必须确定锚节点来代表本组织与其他节点的通信,如组织1 中的锚节点为服务器节点0,而组织之间或节点之间的通信是建立在通道之上。
图2 供应链托管系统架构
通道是任意节点组成的一个子区块链网络,这些节点可以来自同一组织也可以跨组织,并且节点能够在通道建立之后灵活加入。但节点不能退出,同样通道也不可撤销。需要说明的是,各通道之间不可通信,各拥有独立分布式账本。另外,通道也是链码的安装基础,相同链码只能在同一通道中安装一次,但是可以通过版本迭代来升级链码。
客户端系统由Fabric SDK 开发,安装在服务器节点和物联网设备上。客户端中设定了各服务器节点的IP 地址和名称以及通道和链码等的名称。客户端系统中开发了通道和节点管理器,服务器节点拥有使用该功能的权限,可以实现创建通道和节点加入的管理;交易广播器由物联网设备使用,可以实现交易的发起和广播,广播的目标节点为服务器节点中的peer 节点,也称背书节点,并在此节点上模拟执行交易,结果返回至客户端系统中;交易排序器由物联网设备调用,该功能可以将得到背书的交易发送至orderer 节点进行排序,并最终上链。物联网设备对客户端系统中的功能调用是自动化的,需要传感器数据达到预定阈值,从而触发设备调用相应功能。
2.2 支付托管算法
算法1 描述了基于区块链的供应链支付托管算法。在算法中对每个公司ci进行如下循环:从通道中获得ci的当前账本信息l,使用定义的prase()函数对l进行解析,获得当前合同conc以及历史合同conh。对当前合同conc进行循环解析,并与参数con对比,若conci与con 不相同则保留conci;若相同,则跳过当前conci,保留后续所有合同内容,并将当前conci接入conh,成为历史合同。
接下来使用算法中定义的组装函数assemble(),将更改后的conc和conh整合至账本信息l中,并对l中的资产asset 按照con 的转账合同内容通过转账函数transfer()进行转账操作。
最后将更新的账本信息l进行广播并上传至链上。首先定义结构体pair,包括背书节点peer、交易proposal 以及交易返回值responds。pr 为背书节点,在所有背书节点中循环下述算法:
将pr 赋值于pair.peer,待执行交易p 赋值给pair.proposal。初始化本地背书客户端,使用该客户端与区块链中所有背书节点通信,并将返回值赋值pair.responds。再将节点相关状态更新为connected,并将pair 整体添加至pairs 中。最后将pairs 的内容转换为易于读取数据的proposalResponds,并返回该数据结构。
3 系统原型实现
3.1 服务器节点原型实现
该系统节点集群使用Vmware 虚拟机创建4 台服务器,操作系统为Ubuntu18.04,安装Hyperledger Fabric1.4 分支版本,区块链共识算法采用Apache Kafka 共识。4 台服务器的配置如表1 所示。
表1 节点集群服务器配置
为实现供应链上全流程操作托管,该系统在区块链上开发并安装了如表2 的智能合约。智能合约中允许声明两类机构实体,一为普通公司,一为物流公司。其中普通公司为签署各种合同的主体;相应的,合同也分为两种:普通公司的商业合同和物流公司的物流交易合同;表中增加请求是指公司发布购买意愿或售出意愿,等待其他公司根据请求签订合同;另外,完成请求、完成合同和转账操作均为不可直接调用的智能合约,请求的完成将在增加对应合同时自动执行;商业合同的完成是在对应物流协议完成时被调用执行,而物流协议的触发则需要通过物联网设备的数据传输,实现全流程自动化。
表2 智能合约说明
3.2 客户端原型实现
图3展示了Fabric物联网客户端的类图。APIEscrow为main 函数所在类,在该类中主要声明了Fabric 网络和通道的基本参数,以及创建、初始化客户端、调用智能合约等方法。APIEscrow 类关联的HFClient类是实现客户端方法的主要Java 类。在HFClient 类中,声明和定义了客户端相关的基本参数,包括客户端线程执行器核心池大小、通道Map 等。类中的主要方法有通道的加载、创建和获取以及智能合约相关操作、通过获取和查询通道信息等方法。
图3 客户端类图
BuildClientDTO 类和ChaincodeID 类是创建客户端和安装、初始化智能合约必需的Java 类。在这两个类中声明了客户端和智能合约的必要参数,如mspID、msp 路径等。
APIHandler 是另一个核心Java 工具类。其中createChannel 方法将通过HFClient 客户端对象获取到所需环境参数和orderer 节点数据进行通道的创建,并获取CreateChannelDTO 对象的数据,将需要的peer节点加入至通道。另外智能合约的安装、初始化、升级和查询等操作也可以在APIHandler 类中完成。
图4 展示了交易在客户端和服务器节点间的流程。步骤一,由客户端发起交易,并通过该系统交易广播器广播至全体背书节点,背书节点进行交易模拟,通过后签署背书签名;步骤二,客户端收集所有背书签名;步骤三,客户端再次通过交易广播器将得到签名的交易发送至排序节点,获取排序服务;步骤四,排序节点验证交易合法性并给客户端返回值,最后将合法交易送至提交节点。
图4 交易流程图
4 性能测试
此节对该托管系统进行性能测试。使用树莓派中的Fabric 客户端进行通道创建和peer节点加入,每次运行耗时情况如图5 所示,运行时间稳定在2 s 上下,平均运行时间为1.983 s,完全可以满足企业需求。
图5 通道创建运行时间
图6 展示了使用Fabric 客户端进行智能合约调用的性能测试结果,图中的数据为运行多次智能合约调用的累计耗时。从图中可以看出累计运行时间成线性增长,平均单次调用智能合约的运行时间为0.397 s,可以实现该供应链托管系统的秒级响应。
图6 调用智能合约累计运行时间
5 结束语
文中设计并实现了一个基于区块链的供应链托管系统。该系统结合区块链网络和物联网,实现了供应链商业合同的自动化执行,避免恶意篡改,做到去中心化地管理供应链。利用区块链客户端实现了网络中轻节点调用链上智能合约,并且从创建通道到调用智能合约的累计时间可以满足企业的实际需求。该系统的下一步工作是实现动态增加服务器节点,并接入更真实的物联网设备,如RFID、红外传感器等。