SAP云平台,区块链,超级帐本和智能合约

前一篇文章《Hyperledger Fabric on SAP Cloud Platform》,个人同事Aviva已经给你们介绍了基于区块链技术的超级帐本(Hyperledger)的一些概要知识。Fabric是超级帐本5个并行项目中的其中之一,由于发展较为成熟,SAP云平台对Fabric也提供了较好的支持。java

学完了前一篇文章的理论知识后,今天咱们来动手实践一下。linux

咱们作的这个练习的范围很窄,就是学会如何使用go语言开发一组微服务,这组微服务包含读和写两个API,可以将数据写入架设于SAP云平台上的超级帐本服务。git

你们还记得以前Aviva介绍的智能合约(Smart Contract)么?github

简单地说,应用程序经过智能合约接口同超级帐本进行读写操做。咱们将开发一个Hello World的智能合约,部署到SAP云平台上。出于简单起见,咱们没有开发应用,而是简单地在SAP云平台的API控制台上直接消费这个Hello World的智能合约,对云平台上的超级帐本进行读和写。编程

打开超级帐本项目Fabric的github仓库地址:json

https://github.com/hyperledger/fabric网络

发现Fabric项目是Google的编程语言GoLang开发的,所以我们这个练习也使用Go语言来进行智能合约的开发。数据结构

1. 从Google上将Go语言1.11版的二进制包下载到本地,解压到/usr/local目录下:架构

sudo tar -C /usr/local -xzf /home/vagrant/Downloads/go1.11.linux-amd64.tar.gz框架

将该目录配置到环境变量PATH中去:

2. Fabric项目已经将智能合约同超级帐本的通讯封装到一个名叫shim的接口中,咱们只须要在咱们编写的智能合约代码中直接调用该shim接口便可。

咱们使用import将这个shim接口的依赖引入进来,在第14行定义一个结构体,包含ID和Value两个字段。这个结构体便是待写入超级帐本的数据结构,ABAP顾问能够将其视为ABAP数据字典里定义的结构体。

第46行定义的方法Invoke是这个最简单的智能合约的核心代码,cc *MessageStore这个语法和C语言很像,定义了一个类型为MessageStore的指针变量cc。这个指针变量同C++的this指针和ABAP的me引用做用相似,在方法被调用时,指向了方法的调用者。

Invoke后面括号里的stub shim.ChaincodeStubInterface定义了该方法的输入参数(形参)stub, 类型为shim.ChaincodeStubInterface。

这个Invoke方法不会经过应用程序显式调用,而是经过超级帐本程序回调:当方法被调用时,指针cc和输入参数stub已经自动被Fabric框架赋上了对应值。在Invoke方法运行的上下文里,经过输入参数stub判断出当前回调的场景是读仍是写,而后进入对应的分支。分支内部调用咱们本身开发的write和read方法同超级帐本进行交互。具体源码在个人github上:

https://github.com/i042416/KnowlegeRepository/blob/master/ABAP/blockchain/message_store_chaincode.go

这种经过同一个回调函数内部的switch case来处理多个场景的作法,ABAP和Java开发者应该都不陌生。好比下图是经过InvocationHandler实现Java动态代理的例子,其中invoke方法的逻辑结构和本文智能合约代码的结构很是类似。

关于ABAP和Java里各类静态代理和动态代理的写法,请参考个人博客:

Various Proxy Design Pattern implementation variants in Java, ABAP and JavaScript

https://blogs.sap.com/2017/04/17/various-proxy-design-pattern-implementation-variants-in-java-and-abap/

3. 将开发好的智能合约源文件构建成可执行文件。这一步确保在部署智能合约到SAP云平台以前,先在本地开发环境将全部潜在错误所有检测出并修复。

4. 登陆SAP云平台,在Service Marketplace里点击Hyperledger Fabric的超连接:

建立一个新的Service实例:

建立过程当中须要填写channel的ID和密匙。

还记得上一篇文章Aviva提到区块链分为公有链私有链联盟链,而超级帐本属于联盟链么?在联盟链里,有一个专门的称为MSP(Membership Service Provider)的模块,提供成员管理服务,只有受权用户才能接入区块链网络。这里我事先在SAP云平台上建立了一个渠道并进行认证,所以此处直接输入一个合法的渠道ID和密匙。关于SAP云平台上超级帐本渠道的建立和成员受权接入的步骤,请参考SAP帮助文档:

https://help.sap.com/viewer/p/HYPERLEDGER_FABRIC

Service实例建立完毕后,点击Create Service Key按钮建立key,目的是生成用于OAuth认证的clientId和clientSecret,方便接下来的API调用。

点击Service实例的Referencing Apps面板,点击按钮Open Dashboard:

点击Deploy Chaincode,选择本地构建好的zip包,进行上传并部署。这个按钮同SAP云平台Neo和CloudFoundry环境部署本地应用的逻辑相同。

部署成功后,点击Test Chaincode超连接进入API控制台。

该控制台集成了Swagger框架,在调用post请求进行超级帐本的写操做和get请求进行读操做以前,先要点击Authorize按钮进行身份认证:

输入第四步建立Service Key后生成的clientID和clientSecret进行认证:

认证成功后,能够在Swagger的控制台里调用post和get请求了。

首先发送post请求,请求负载就是一个简单的json对象,id为i042416,value为Hello World:

post请求在SAP云平台上的超级帐本执行成功,返回200响应码:

紧接着执行get请求,输入刚才写入的数据id: i042416:

get请求可以将以前经过post请求写入帐本的数据成功读出来:

登陆SAP云平台超级帐本控制台,能看到以前经过post写入的数据已经加入到区块链尾部的区块了。点击区块能够查看数据明细:

在超级帐本控制台的API Calls和Logs面板里也能看到每次超级帐本读写的详细信息。

总结一下,SAP云平台的超级帐本服务,成功地帮助了但愿使用这项区块链技术的企业避免了硬件基础设施的投入,同时屏蔽了大部分超级帐本平台管理的底层细节。经过SAP云平台提供的控制台,便可实现对超级帐本进行设备接入,访问控制,服务监控等管理功能。同时,经过Go语言编写的智能合约一旦部署到SAP云平台,生成的Restful API可以被其余编程语言方便地消费。调用这些API写入超级帐本区块链中的数据将没法再被篡改。使用SAP云平台的超级帐本服务,应用开发人员能够无需将过多精力花费在超级帐本体系架构自己,从而可以专一于应用逻辑的编写上去。

本文写做过程当中,获得了同事Aviva的大力帮助,在此感谢。

更多阅读

要获取更多Jerry的原创文章,请关注公众号"汪子熙":

相关文章
相关标签/搜索