华为云区块链服务BCS是面向企业及开发者的高性能、高可用和高安全的区块链技术平台服务,能够帮助企业和开发人员在华为云上快速、低成本的建立、部署和管理区块链应用。java
BCS基于Hyperledger1.0、kubernetes搭建,配置简单,数分钟内便可完成部署,提供全流程的自动化运维服务,多维度监控;支持多种高效共识算法,切换灵活,秒级共识(2000+ TPS);多角色节点和成员可动态加入/退出;采用容器化物理资源管理;一键上链,节约80%的开发、部署成本;按需付费,减小60% 使用成本;统一运维,节约监控和运维成本;根据用户需求进行弹性伸缩, 升级回滚;完善的用户、秘钥、权限管理和隔离处理,多层加密保障,国密和同态加密等隐私处理,可靠的网络安全基础能力,运营安全无忧。node
BCS的整体逻辑架构如图1所示的三个层次,即区块链服务平台、合约链码层和业务应用层。python
区块链服务平台具备极强的可靠性和扩展性,后续根据市场需求逐步支持Corda 和EEA 等优秀区块链框架,为上层应用低成本、快速的提供高安全、高可靠、高性能的企业级区块链系统。git
合约链码层目前提供Hyperledger 标准智能合约接口,用户能够根据不一样应用场景构建不一样的智能合约,后续将与合做伙伴一块儿为用户打造通用场景智能合约库,如供应链管理和溯源、供应链金融、数字资产、公益慈善和互联网保险等,企业能够在此基础上快速构建区块链应用场景。github
业务应用层为最终用户提供可信、安全、快捷的区块链应用。用户可使用华为云提供的各类解决方案(例如供应链金融解决方案、游戏行业解决方案、供应链溯源解决方案、新能源行业解决方案等),结合合约层快速搭建区块链应用。算法
图1 华为云区块链服务BCS的逻辑架构docker
本文后续章节将带领你如何使用华为云区块链服务快速开发和部署链上应用,从区块链服务平台层、链码层、应用业务层阐述开发和使用的方法。json
步骤1:资源准备安全
为了更稳定的运行区块链服务需准备2台8u16g机器来进行服务的部署。注册并登录华为云帐号,进入华为云管理控制台, 选择计算/云容器引擎服务(见图2)。网络
点击建立Kubernetes集群按钮,进入建立虚拟机的界面,在集群名称输入框中命名集群的名字,按需选择本身要使用的配置(能够采用默认配置)并点击下一步按钮进入图3界面。
在图3的界面上选择2台8核16GB内存的机器,在弹性IP栏点击如今购买弹性IP,公网弹性IP主要用于对公网发布BCS代理的访问地址。在云容器引擎左侧导航条中点击资源管理/虚拟机集群如图4,查看集群列表中刚建立的集群状态是否购买成功。
图2 云容器引擎服务总览
图3 选择节点机器规格
图4 集群信息列表
步骤2:部署服务
在云管理控制台点击区块链服务进入如图5的区块链服务页面, 点击该页面右上角的“购买区块链服务”的按钮进入图6。
图5 区块链服务总览
在图6的区块链服务购买页面中填写区块链服务名称,选择步骤1中建立的容器集群。在该示例中咱们建立了两个节点组织testorg和developerorg,并为每一个组织分配两个peer节点;选择快速拜占庭容错共识策略,基于拜占庭容错共识节点的最小数量为4,即3f+1,f=1;选择ECDSA签名算法的成员证书分发机制;配置链码管理Portal的登陆密码。
图6 购买区块链服务
区块链节点的通道配置如图7所示, 咱们建立一个通道命名为testchannel, 把以前建立的组织testorg和developerorg加入该通道。完成如上配置以后, 点击下一步浏览该服务的概要信息,最后提交订单完成服务的订购和配置过程如图8。
图7 区块链节点的通道配置
图8 区块链服务订单详情
点击左侧导航条的服务管理进入服务状态查询页面,等待数分钟后查看所部署的服务状态如图9所示, 该服务进入成功运行状态。
图9 区块链服务运行界面
链码也称为智能合约,实质上是控制区块链网络中的不一样实体或相关方相互交易的业务逻辑。简言之,链码将业务网络交易封装在代码中,能够调用链码来设置和获取帐本,即区块数据或世界状态(world state)。
步骤1:示例场景说明
该示例场景使用区块链来追踪研发团队内的某产品的测试数据,经过查询某个产品或者服务一段时间内的测试用例结果, 进而分析产品的功能状态。开发人员能够查询到失败用例是哪些、集中在产品的哪些模块,还能够根据测试人员的名字,联系测试人员快速定位问题;测试管理者能根据不一样测试人员的测试用例,发现问题的多少和模块的稳定程度;测试人员在系统中记录测试结果,其余参与方能够查询测试结果。该示例场景的基本功能说明以下。链码的交互流程如图10。
一、 测试管理者manager建立项目和模块;
二、 测试管理者manager根据项目名称、模块添加测试用例、建立人和建立时间;
三、测试人员tester根据测试用例添加测试结果、测试时间、测试人员和备注;
四、测试人员tester、测试管理者manager、开发人员developer能够根据项目名称、模块查询测试用例;根据测试用例查询测试结果、时间、测试人员和备注。
图10 线下APP和链码的简单交互流程图
步骤2:编写链码
链码开发人员可从
"github.com/hyperledger/fabric/core/chaincode/shim" 模块查看链码的接口,需实现init和invoke接口。shim模块中的接口定义以下:
在定义好整个代码的保存目录结构后,开发人员需将"github.com/hyperledger/fabric/core/chaincode/shim" 加入到方法引用。
对于有须要初始化处理的数据,能够在初始化函数init中编写并在链码实例化的过程当中进行。这里咱们定义了一个示例即初始化项目名称,代码实现以下:
接下来开始定义内部逻辑的启用函数invoke。首先经过接口中的内置方法GetFunctionAndParameters()来获取传入的函数别名和参数,经过switch case或if else条件语句把以前分析的各个用户角色能够调用的方法起个别名,而后和内部的真实方法作好一一对应关系,并将接口对象和相应调用参数传入对应的方法。
具体的用户可以访问哪一个方法的权限逻辑控制可由上层的应用app实现,链码主要完成对数据的存储和查询的逻辑。Invoke 链码示例以下:
完成invoke函数后咱们须要给这个go文件定义好它的入口main函数,经过fabric shim包中的Start方法来启动咱们定义的全局智能合约,保证链码能够被正确的调用,示例以下:
这样咱们链码的基本代码架构就搭建好了,开发人员可继续填充每一个方法内的逻辑,即别名所对应的真实方法的实现。咱们以建立测试用例和查询测试用例为示例说明。
● 建立测试用例以项目名称、模块名称及测试用例名称构成复合主键,而后为它建立一个索引,再将建立好的索引存入链中。这样查询的时候就可使用不一样的组合查询方式查询真实须要的结果。
● 查询测试用例经过部分匹配复合主键将具备相同的项目名称和模块名称的值查询出来,而后经过迭代器将键值中的测试用例名称截取出来存成一个列表,对其进行json序列化并做为查询结果返回给上层App。上层App须要对查询的数值进行反序列化便可拿到整个用例名称的列表,根据其余须要查询具体用例结果。
步骤3:安装部署链码
链码编写完成以后咱们须要把链码部署到fabric集群环境中。华为云区块链服务提供了可视化的链码生命周期管理工具。在区块链服务的管理控制台上点击服务列表后面的链码管理连接,打开图11中的链码管理登录页面,输入默认的用户名admin和用户建立服务时所设置的密码,登录链码管理平台对链码进行相应的操做。
图11 链码管理登录界面
登录后用户可选择在哪一个组织的哪一个节点peer上安装链代码。如图12所示咱们选择在testorg的peer-1节点安装链代码。点击右上角的安装链码按钮,须要填写链码名称、版本号以及为了保证完整性的信息摘要,最后上传一个图13所示的链码zip格式的压缩文件。
图12 链码管理界面
图13 链码安装界面
链码的zip压缩包和压缩包的摘要信息计算如图14和15所示。
图14 链码压缩包
图15 链码压缩包摘要信息
链码使用以前须要先实例化,安装成功之后咱们在链码的操做按钮列中能够看到图16实例化按钮已经处于激活状态。点击实例化按钮,选择链码背书策略,输入链码的函数名、init方法的参数如上述示例中的项目名称testproject、选择要实例化的通道如testchannel,而后点击肯定按钮,触发链码的实例化。实例化结束后可在如图17的界面上查询链码状态,在testchannel上能够查看链码是否已经实例化成功。
图16 链码激活状态界面
图17 链码实例化成功界面
Hyperledger fabric目前支持java,nodejs,go和python语言的sdk,供用户选择用不一样的语言开发上层应用,使用相应的sdk调用部署在区块链上的链码。如下示例中咱们选择使用go语言开发业务层应用。
步骤1:配置fabric sdk
Hyperledger fabric官方提供了咱们须要的go sdk文件包,下载地址是:
https://github.com/hyperledger/fabric-sdk-go。目前BCS服务使用的版本commit号是035e4f9。
咱们须要为fabric sdk生成相应的配置文件和访问区块链节点的组织证书。SDK配置文件主要包括要访问的链码名称/版本、证书解压的目录位置、实例化链码的通道,安装链码的节点组织/名称。在订购的区块链服务状态中的点击图18中的“下载SDK配置“会弹出图19配置窗口,完成sdk配置。
图18 SDK配置文件下载界面
图19 配置SDK文件下载界面
在订购的区块链服务状态列表页面上能够查看每一个节点的状态以及相应的证书下载功能,咱们须要下载相关的证书到sdk的配置文件所指定目录中,使得业务应用能够和区块链节点正常的进行通信。图20显示了orderer节点和peer节点的证书下载连接。
图20 orderer节点和peer节点的证书下载
步骤2:编写业务应用代码
合理配置sdk与区块链节点peer的通讯后,业务层应用代码仅需对接链码的invoke和query的方法。如下示例中咱们使用sdk提供的接口ChannelClient,即先经过加载sdk配置文件生成一个sdk实例,而后传入通道名称和用户信息生成一个ChannelClient对象,最后使用该ChannelClient发起一笔执行链码的交易。
图21 ChannelClient初始化过程
在业务应用代码中定义好一个链码的数据结构ChainCodeSpec,包括ChannelClient对象、 用户信息和链码名称等,在ChannelClient初始化时给其赋值。将链码的invoke和query方法定义成结构体方法,能够很简单的在发起交易的时候完成数据传递如图22所示。
图22 调用链码的invoke和query方法
步骤3:测试业务应用代码
下面咱们简单的定义一个main方法如图23来测试一下咱们的代码。首先声明以前在链码管理网站实例化的链码信息,即链码名称chaicodetest,实例化的通道名称testchannel,用户使用的是组织内的普通用户。其次,定义两个测试方法建立测试用例和查询测试用例。
建立测试用例create_testcases须要按顺序传入4个参数即项目名称、模块名称、测试用例名称和测试用例描述,调用invoke方法将一次交易写入区块链。查询测试用例query_testcases方法传入项目名称和模块名称,查询测试用例信息。
图23 业务应用调用链码实现端到端测试
以后咱们使用go run来执行这个测试用例,如图24咱们能够看到已经生成testchannel实例并与区块链节点创建链接。为了确认交易是否正常,链码是否正确保存以前用例的复合键值索引,咱们登录区块链节点并用“docker logs <容器id>”命令咱们能够看到如图25中为每笔交易建立的区块。图26链码容器也可检查咱们以前链码打印的日志来肯定是否能够正确查询测试用例。
图24 SDK代码执行结果
图25 查看区块链节点peer中的运行结果
图26 链码运行结果
本文经过一个简单的例子介绍如何经过华为云提供的区块链服务快速的开发和搭建起一个应用,用户能够根据所需的场景,基于本文的示例部署区块链服务,开发链码和业务层应用。
本文只阐述了部分代码的实现,完整的代码下载地址是: