APP下载

超级账本智能合约的应用研究

2020-07-31季超越郭仲勇岳勇

现代信息科技 2020年4期
关键词:智能合约容器

季超越 郭仲勇 岳勇

摘  要:超级账本是联盟链的代表,支持智能合约的应用。该文介绍了超级账本智能合约链码的编写、链码的安装与调用、链码的执行过程等基础知识。最后介绍了一种对超级账本API的封装,包括Go、Java、Node语言等框架。它以联盟链或BaaS的方式帮助企业更加高效、安全地部署区块链应用。区块链开发者能够快速建立自己所需的开发环境,高效快捷地完成智能合约的编写、部署、执行、区块查询等功能。

关键词:联盟链;智能合约;背书策略;容器;Peer节点;封装

中图分类号:TP311.1     文献标识码:A 文章编号:2096-4706(2020)04-0176-04

Abstract:Hyperledger Fabric is the representative of the consortium blockchain,it supports the smart contracts.This paper introduces some basic knowledge about coding,installation,call and execution of smart contract. Finally it introduces the encapsulation of Hyperledger Fabrics API,including Go,Java,Node and other programming languages.The encapsulation helps companies to deploy blockchain application more efficiently and securely by consortium blockchain or BaaS. Blockchain developers can build their own development environments quickly,accomplish the coding,deployment,execution,block query and other functions of the smart contract efficiently.

Keywords:consortium blockchain;smart contract;endorsement policy;container;Peer node;encapsulation

0  引  言

超級账本(Hyperledger)是IBM贡献的一个开源项目。它首次将区块链技术引入到了分布式联盟账本的应用场景。超级账本项目中提出和实现了许多创新的设计和理念,包括完备的权限和审查管理、细粒度隐私保护,以及可拔插、可扩展的实现框架,对于区块链相关技术和产业的发展都将产生深远的影响[1]。

智能合约作为区块链上运行的一段由用户自定义的代码,给了用户极大的自由空间来操作链上数据[2]。智能合约在数据校验、数据交易、数据共享等方面发挥着重大作用[3]。通过智能合约,用户可以开发出适用于本身业务场景的代码,使区块链架构适用于自身的业务需求。掌握智能合约的开发和设计,是区块链架构应用落地的关键步骤。不同的区块链架构对智能合约的支持有所不同,开发智能合约所用的语言,以及需要遵循的协议也不相同[4]。本文基于超级账本来研究智能合约在实际应用中的设计实施方案。超级账本目前支持用Go、Java、Node来编写链码,本文使用Go语言来实现。

笔者所在公司主打信息安全与区块链应用研发的方向,对各大知名区块链架构都有深入的研究。并且公司内部拥有一套自主研发的区块链技术架构,申请有数个相关专利。现将数月的研究成果总结,来进行技术上的交流分享。

1  超级账本中智能合约的简介

1.1  链码简介

智能合约对于区块链开发人员来说是一个熟悉的概念,而智能合约在Fabric中,通常被称为链码。用户在链码中实现相关的接口,通过官方提供的API来操作账本,实现对账本的增删改查。在Fabric系统中链码分为系统链码和用户链码,系统链码集成于Fabric网络中,无需用户自己安装。系统链码用来实现系统层面的功能,包括系统的配置,用户链码的部署、升级,用户交易的签名和验证策略等;用户链码用于实现用户自己的应用功能[5]。用户根据需求编写好相应的链码后,需将其安装在Fabric网络中。用户链码安装并实例化成功后可通过两种方式来调用:(1)在安装了Fabric节点的系统中,可直接通过命令的方式来调用,这种方式一般适用于开发人或是管理人员。(2)通过SDK开发出客户端来调用,这种方式相对来说更加灵活、友好,面向用户时需要使用这种方式。

链码通常是由Go语言来编写,也支持其他语言(Java、Node.js)。开发人员需要在链码中实现系统指定好的接口。开发人员可以通过链码来操作账本,账本的存储是K-V结构的,每条记录都需要一个独一的key来表示,通过链码可以实现增加一条记录、查询某个key对应的值、修改key的当前值、删除key。一段链码创建的账本状态是与其他链码互相隔离的,故而不能被其他链码直接访问。不过,如果是在相同的网络中,一段链码在获取相应许可后,则可以调用其他链码来访问它的账本。

链码运行在一个受保护的Docker容器当中,与节点的运行互相隔离。通过gRPC协议与相应的Peer节点进行交互,以操作分布式账本中的数据。容器将会在用户实例化链码或是调用链码时被启动。

1.2  链码的背书策略

背书策略是背书节点判定一项交易是否能够被认可的依据。链码实例化时可指定背书策略。当记账节点接收到交易时,会获知相关链码信息,然后检查链码的背书策略,判断交易是否满足背书策略[6]。

背书策略可分为主体Principal(P)和阈值Threshold(T)两部分。Principal指定由哪些成员进行背书。Threshold接受两个输入,分别为阈值T和若干个P的集合n,只要交易中包含了n中t个成员的背书则认为交易合法。通过主题和阈值相结合的方式,可灵活地设定需要背书的企业成员。

1.3  系统链码

系统链码与用户链码有相同的编程模型,但系统链码运行在Peer节点,用户链码则在隔离的容器中运行。因此,系统链码内置在Peer节点的可执行文件中,不遵循用户链码的生命周期。系统链码用于减少Peer节点与用户链码进行gRPC通信的开销,同时權衡管理的灵活性。系统链码只能通过Peer节点的二进制文件升级,必须通过一组固定的参数进行注册,但不具有背书策略。

Hyperledger Fabric系统链码实现了一系列系统功能,以便系统集成人员能够根据需求对其进行修改与替换。常见系统链码如下[7]:(1)生命周期系统链码(LSCC):管理链码的生命周期。(2)配置系统链码(CSCC):处理在Peer节点上的通道配置。(3)查询系统链码(QSCC):提供查询的账本API,例如获取交易信息、区块信息等。(4)背书系统链码(ESCC):通过签名交易提案响应处理背书过程。(5)验证系统链码(VSCC):处理交易验证,包括检查背书策略以及多进程并发控制。

2  链码的编写

2.1  链码的基本格式

编写链码需要符合官方的基本格式要求,才能够正常地在链上运行,并执行业务。超级账本编写链码所遵循的格式要求非常简单,开发人员可以轻松地掌握,并熟练应用。开发链码需要遵循的格式要求如下:(1)引入基础包:首先要引入最重要的两个包:Shim和Peer,这两个包提供了操作账本的接口,和数据返回的结构。(2)复写Init方法:链码接口中总共有两个接口需要复写,Init是其中之一,该方法在初始化链码时执行,可完成对账本的初始化,或是初始化一些基本业务数据。(3)复写Invoke方法:Invoke是业务执行时所调用的方法,所有的业务都要在该方法中完成。

2.2  链码的API

下面介绍一下Fabric为用户提供的操作账本的API。超级账本Fabric提供了丰富的接口,给用户极大的自由空间来操作账本。通过这些接口用户可以灵活地操作链上数据。

2.2.1  获得调用的参数

(1)GetArgs() [][]byte:返回以byte数组的形式的参数列表。(2)GetStringArgs() []string:返回字符串格式的参数列表。(3)GetFunctionAndParameters() (string, []string):将参数分为两部分,第一个参数作为函数名,其余的参数作为参数列表。(4)GetArgsSlice() ([]byte, error):返回byte切片的形式获得参数列表。

2.2.2  增删改查StateDB

(1)PutState(key string, value []byte) error:存入数据库,若key已存在则修改。(2)DelState (key string) error:删除key。(3)GetState(key string) ([]byte, error):查询某个key对应的value值,返回byte数组数据,需要转换为string。(4)GetStateByRange(startKey, endKey string)** (StateQu- eryIteratorInterface , error):批量查询某个区间内的记录。(5)GetHistoryForKey(key string) ( HistoryQueryIterato- rInterface , error):获取某个key的修改历史记录。

2.2.3  复合键处理

(1)CreateCompositeKey(objectType string, attributes []string) (string, error):根据某个对象生成复合键。(2)Split CompositeKey(compositeKey string) (string, [] string , error):根据复合键拆分得到对象类型,属性字符串数组。

2.2.4  获取当前用户证书

GetCreator() ([]byte, error):获得调用本链码的客户端的用户证书。

2.2.5  调用链码

InvokeChaincode(chaincodeName string, args [][]byte, channel string) pb.Response:在本链码中调用其它通道上已经部署好的链码。

2.2.6  获取提案对象属性

(1)GetSignedProposal() (*pb.SignedProposal, error):获得当前的提案对象包括客户端对提案的签名。(2)GetTransient() (map[string][]byte, error):返回提案对象的Payload的属性。(3)GetTxTimestamp() (*timestamp.Timestamp, error):获得交易时间戳。(4)GetBinding() ([]byte, error):获得Binding对象,返回提案对象的proposal.Header中SignatureHeader.Nonce、SignatureHeader.Creator和ChannelHeader.Epoch的组合。

2.2.7  事件设置

SetEvent(name string, payload []byte) error:当链码提交完毕,会通过事件的方式通知客户端,通知的内容可以通过SetEvent设置。

3  链码的安装与调用

链码可以通过两种方式安装到Fabric网络上,通过命令直接安装或是通过SDK安装。

目前,Fabric提供了package、install、instantiate和upgrade四个命令管理链码生命周期。后续计划会加入stop和start命令来启用以及停用已经部署好的链码。这里先来讨论前面四个命令,它们的生命周期的转换如图1所示。

一个创建完成链码经过install的操作,安装到Peer节点中。安装完成后在该链中任一安装过的节点进行实例化(instantiate),链码即进入正常运行阶段。实例化链码只需要一次。链码实例化完成以后,如果需要进行改动,可通过升级(upgrade)命令来完成。实例化和升级的命令执行时都会执行链码中的Init方法,所以在升级链码时,一定要注意避免Init方法对已有的数据造成影响。下面对控制链码生命周期的指令做简单的介绍:(1)package:链码打包的方法有两种,一种是打包成多所有者的链码,需要先创建一个被签名的链码包(SignedCDS),然后将其按顺序地传递给其他所有者签名;一种是打包单个所有者持有的链码。(2)signpackage:在创建阶段就被签名的链码包能够交给其他所有者进行检查与签名,支持带外对链码进行签名。当在某些通道上实例化链码时,背书策略是在带外确定的,用于提供合适的MSP主体。如果没指定实例化策略,则默认的策略就是通道的任何MSP管理员。(3)install:将链码的源代码打包成Chaincode Deployment Spec(CDS)的规定的格式,然后安装到通道中的背书节点上。当安装的链码包只包含一个Chaincode Deployment Spec时,将使用默认初始化策略并包括一个空的所有者列表。(4)instantiate:实例化调用生命周期系统链码用于创建及初始化通道上的链码。链码能够在任意数量的通道上实例化,并在每个通道上单独调用。一个节点上的链码在多个通道实例化时,每个通道的状态仍是隔离的。实例化的创建者必须满足包含在SignedCDS内链码的实例化策略,而且还必须是通道的写入器(作为通道创建的一部分被配置)。可以防止部署链码的流氓实体或者欺骗者在未被绑定的通道上执行链码。(5)upgrade:链码的升级时需要改变链码的版本号(作为SignedCDS的一部分)。SignedCDS另外的部分,如所有者及实例化策略都是可选的。然而,链码的名称前后必须保持一致,否则会被当作另外一个新的链码。在升级前,必须将新版本的链码安装到需求的背书节点上。升级也是一种交易,会把新版本的链码绑定到通道中。升级只会对升级的通道产生影响,其他通道仍然運行旧版本的链码。

4  链码的执行过程

链码运行在单独的Docker容器当中,与节点相隔离。节点与容器之间通过gRPC协议进行通信[8]。在链码执行过程中,节点与容器之间交互的流程图如图2所示。

(1)首先是客户端发起请求到Fabric的Peer节点[9]。(2)节点收到请求后,向Chaincode容器发起请求,执行链码。链码执行过程中会涉及到对状态数据库的增删改查操作。执行GetState时,容器通过节点访问本地的状态数据库,获取到状态数据,执行GutState时,节点将数据状态缓存在本地,此时并不修改状态数据库。(3)链码执行完成后返回给客户端执行结果并签名信息。客户端收集到足够的成功消息后,会将信息提交给Orderer节点。

5  提供BaaS或联盟链服务

5.1  BaaS服务

为了降低区块链网络的使用门槛,减轻企业应用区块链技术的工作量。目前已有许多的区块链架构开源项目,其中最为有名的就是Linux基金会发起的Hyperledger。下面介绍一下一套成熟的BaaS框架应当具有的基本功能:(1)客户端管理:提供用户账号的管理操作,例如生成新的用户账号、对用户权限的配置与管理、查询现有的用户,及其基本的系统登录记录。(2)合约管理:提供合约的基本管理,如合约的生命周期管理,包括合约的安装、实例化、升级等;提供合约的基本信息查询。(3)通道管理:提供对通道的基本管理与操作,例如通道的创建,查看通道的组织信息、节点信息、链码信息等。

通过BaaS服务,用户可以在不知道底层区块链技术的情况下,使用区块链技术存储数据。所以BaaS服务应当具有如下特点:(1)简单易用:简单的操作流程,让用户可以轻易上手。(2)封装性:将底层技术进行封装,仅暴露给用户一些简单易用的接口,降低用户的学习成本。(3)灵活性:给用户更多的权限和接口,方便用户对区块链系统的管理,并且保证系统的安全性不受到破坏。

综合上述功能及特点并结合区块链本身的特性,要开发出一套性能稳定,灵活易用的区块链BaaS服务,笔者在这里提出一套更加灵活适用的BaaS数据流程,如图3所示。

5.2  联盟链

对超级账本API进行封装,帮助企业更加高效、安全地搭建超级账本联盟链、部署区块链应用。封装后的联盟链对区块链开发者友好,能够辅助其快速的完成开发环境搭建、智能合约的编写及部署、区块查询等功能。总结其主要特点如下[10]:(1)稳定性强:对于任何系统而言,稳定性都是至关重要的,鉴于联盟链的分布式特性,以及区块链共识机制的复杂性,想要构建一个稳定性强的联盟链并不简单。(2)效率高:联盟链是一个分布式架构,使分布式系统达成共识,需要一定的时间。如何缩短达成共识的时间,是联盟链提高效率的关键。超级账本采用特殊的共识机制,可运行于solo或是kafka模式,共识效率相对较高。(3)容错性好:不同的区块链应用场景对容错能力的要求也不同,有些需要具有拜占庭容错能力,而有些只需要具有对崩溃故障容错的能力即可[11]。鉴于联盟链的成员是身份确知的,一般仅需要对崩溃故障容错的支持。

6  结  论

当前,区块链技术已经在金融、物联网、社交、医疗、档案、司法、版权[12]等场景实现了技术落地。区块链赋能实体产业之路发展前景广阔[13],随着区块链技术的深入应用,需要不断探索区块链应用价值和技术创新。技术创新支撑和驱动商业模式创新,助力行业应用的落地进而产生新的经济模型[14]。

超级账本具备很好的保密性、可伸缩性、灵活性和可扩展性等特点,使用超级账本来构建、运行和执行使用多种语言编写的智能合约,具有契约成本低、人为干预风险较低、执行高效准确等优点。

参考文献:

[1] 杨保华,陈昌.区块链原理、设计与应用 [M].北京:机械工业出版社,2017.

[2] 付梦琳,吴礼发,洪征,等.智能合约安全漏洞挖掘技术研究 [J].计算机应用,2019,39(7):1959-1966.

[3] 周润,卢迎.智能合约对我国合同制度的影响与对策 [J].南方金融,2018(5):93-98.

[4] 纳拉扬·普鲁斯蒂.区块链项目开发指南 [M].朱轩彤,闫莺,董宁,译.北京:机械工业出版社,2017.

[5] 冯翔,刘涛,吴寿鹤,等.区块链开发实战:Hyperledger Fabric关键技术与案例分析 [M].北京:机械工业出版社,2018:121-138.

[6] 张增骏,董宁,朱轩彤,等.深度探索区块链:Hyperledger技术与应用 [M].北京:机械工业出版社,2018:61- 69.

[7] 杨毅.HyperLedger Fabric开发实战:快速掌握区块链技术 [M].北京:电子工业出版社,2018:160-177.

[8] 史文斌.基于Hyperledger Fabric的区块链应用系统云服务化 [D].杭州:浙江大学,2018.

[9] 张海宁.超级账本:助力企业级区块链应用与开发 [C].《IMI研究动态》2017年上半年合辑.北京:《IMI 研究动态》编辑部,2017:565-570.

[10] ANDROULAKI E,BARGER A,BORTNIKOV V,et al.Hyperledger Fabric:A Distributed Operating System for Permissioned Blockchains [C]// Proceedings of EuroSys 2018 conference,2018:30.

[11] 邵奇峰,金澈清,张召,等.区块链技术:架构及进展 [J].计算机学报,2018,41(5):969-988.

[12] 华劼.区块链技术与智能合约在知识产权确权和交易中的运用及其法律规制 [J].知識产权,2018(2):13-19.

[13] 陈德,姜新旺,王艳霞,等.基于Hyperledger的自交易共享平台解决方案 [J].计算机时代,2018(1):20-22+26.

[14] 尹稚淳,李航.基于超级账本技术的电子合同解决方案 [J].现代计算机(专业版),2018(11):86-90.

作者简介:季超越(1994-),男,汉族,河南淮阳人,高级工程师,本科,主要研究方向:供应链金融、区块链。

猜你喜欢

智能合约容器
难以置信的事情
怎样量出4升水
农产品供应链金融信用体系框架设计
基于区块链技术的去中心化数字出版平台研究
从容器的形状看压强
区块链技术在互联网保险行业的应用探讨
智能合约的特点及其在债券市场的应用
区块链技术在会计中的应用展望
液体对容器底及容器对桌面的压力和压强
智能合约与金融合约