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

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

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

大家还记得之前Aviva介绍的智能合约(Smart Contract)么?

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

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

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的原创文章,请关注公众号"汪子熙":

SAP云平台,区块链,超级账本和智能合约的更多相关文章

  1. java 调用区块链 发布和调用智能合约

    java连接区块链 很简单 ,调用智能合约要麻烦一些. 先说连接 区块链查询数据. 1 maven 项目导入 web3j 的依赖. <dependency> <groupId> ...

  2. HyperLedger Fabric Introduction——区块链超级账本介绍

    介绍 HyperLedger Fabric是一个基于模块化架构的分布式账本解决方案平台,它拥有深度加密.便捷扩展.部署灵活及可插拔等特性.它设计之初的目的是支持不同组件的可插拔实现,并适应整个经济生态 ...

  3. 区块链学习5:智能合约Smart contract原理及发展历程科普知识

    ☞ ░ 前往老猿Python博文目录 ░ 一.智能合约的定义 通俗来说,智能合约就是一种在计算机系统上,当一定条件满足的情况下可被自动执行的合约,智能合约体现为一段代码及其运行环境.例如银行信用卡的自 ...

  4. 【公众号系列】SAP HANA和区块链

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[公众号系列]SAP HANA和区块链   写在 ...

  5. SAP云平台架构概述

    在我们开始SAP云平台的架构之旅之前,让我们先看看SAP已经发布的一些其他云产品.这些云产品方案可以分为公有云和私有云两种. SAP公有云解决方案见下图最右侧,比较著名的有SAP SuccessFac ...

  6. 使用abapGit在ABAP On-Premises系统和SAP云平台ABAP环境之间进行代码传输

    SAP ABAP顾问朋友们,应该都使用过SAPLink这个工具.如果两个ABAP Netweaver系统没有建立起传输路径时,我们无法使用标准的SE10事务码创建传输请求的方式进行这两个系统间的代码传 ...

  7. 使用SAP云平台 + JNDI访问Internet Service

    以Internet Service http://maps.googleapis.com/maps/api/distancematrix/xml?origins=Walldorf&destin ...

  8. 使用SAP云平台的destination消费Internet上的OData service

    通过SAP云平台上的destination我们可以消费Internet上的OData service或者其他通过HTTP方式暴露出来的服务. 创建一个新的destination: 维护如下属性: 点击 ...

  9. 如何在SAP云平台上使用MongoDB服务

    首先按照我这篇文章在SAP云平台上给您的账号分配MongboDB服务:如何在SAP云平台的Cloud Foundry环境下添加新的Service 然后从这个链接下载SAP提供的例子程序. 1. 使用命 ...

随机推荐

  1. php防盗链技术

    在Http协议中,头信息里,有一个重要的选项: Referer Referer: 代表网页的来源,即上一页的地址 如果是直接在浏览器上输入地址,回来进来,则没有Referer头. 这也是: 为什么服务 ...

  2. Dapper的正确使用姿势

    本文demo适用于MySQL Dapper优势和缺点 优点 高性能.易排查.易运维.灵活可控 缺点 和EF相比,手写sql当修改表结构不易发现bug. 习惯了EF后再来使用Dapper,会很难适应那种 ...

  3. CSS3 制作魔方 - 相关立体样式

    最好的实践,就是给定一个实践的目标去实践. 目标:利用 CSS3 的一些特性,绘制一个魔方,要可以玩转的那种,即上下左右每一层都可以独立旋转.效果如下: 为了完成此效果,将使用到以下相关概念和样式:坐 ...

  4. 用spin和edit控件来用spin控制edit里面小数的增减

    1.响应SPIN的消息,就是点SPIN的上键头和下键头的消息,在这个消息里改变值是以0.1步进量增减.2.使用UpdateData(FALSE)来更新EDIT的关联的double型的变量. 创建步骤 ...

  5. Unity3D研究院之IOS&Android收集Log文件(六十二)

    开发项目的时候尤其在处理与服务器交互这块,如果服务端程序看不到客户端请求的Log信息,那么无法修改BUG.在Windows上Unity会自动讲Log文件写入本地,但是在IOS和Android上确没有这 ...

  6. 洛谷P2473 [SCOI2008]奖励关(期望+状压)

    传送门 我数学期望还是太差了…… 先考虑状压模型,设$dp[i][S]$表示第$i$轮,当前宝物状态为$S$,能获得的最大期望分数 然而这个模型有一个问题,第$i$轮不一定能达到状态$S$ 那么考虑转 ...

  7. 织梦cms 应急响应 修复建议

    通过分析log日志,可以知道攻击者的IP 攻击时间 和具体操作 本片文章为内网测试,通过分析日志,进行复现攻击流程,同时对网站的后门给予修复建议 通过分析日志可以知道,攻击者使用了扫描工具进行网站扫描 ...

  8. D - Bomb

    //反向62 #include <iostream> #include <algorithm> #include <string> #include <cst ...

  9. mysql 主从 binlog

    binlog: 用来记录mysql的数据更新或者潜在更新(update xxx where id=x effect row 0);文件内容存储:/var/lib/mysql mysqlbinlog - ...

  10. android 一些常用权限

    <!-- 网络访问权限 --> <uses-permission android:name="android.permission.INTERNET" /> ...