
2018年2月1日,华为云发布企业级区块链开放平台区块链服务BCS(BlockchainService),是基于开源区块链技术和华为在分布式并行计算、数据管理、安全加密等核心技术领域多年积累基础上推出的企业级区块链云服务产品,帮助各行业、企业在华为云上快速、高效地搭建企业级区块链行业方案和应用。
将企业从烦琐耗时的区块链基础开发和部署中解放出来,使其聚焦有价值的上层应用,快速开发自身业务场景,不再让技术限制自身业务的想象力。

华为BCS服务特性
华为云区块链服务BCS具备灵活高效、安全可靠、简单易用等特性。
华为云区块链服务致力于打造区块链生态,BCS服务实现区块链的底层技术支撑,包括共享账本、安全隐私、智能合约等,同时提供区块链部署、运维能力。
由行业合作伙伴构建领域通用解决方案,并提供咨询与开发服务,助力企业顺利实施区块链应用落地。
基于华为云,BCS支持为企业客户构建全球范围的区块链价值网络,支持跨云对接,支持与华为云运维监控、大数据服务对接,提供全栈技术能力。

BCS服务在华为云的架构
从上图中可以看到华为云提供了完整的区块链应用的技术栈:
从最基层的计算、存储、网络资源到中间的区块链平台的构建部署,以及最上层的用户业务应用领域都进行了非常全面的覆盖(区块链平台部分属于华为云区块链服务,业务应用部分由华为云其他服务提供支持,如云安全、人工智能、大数据分析等)。
目前华为自身以及与相关合作伙伴提供了几大解决方案供企业选择,其他行业的在不断完善中,这些解决方案包括供应链金融、食品溯源、港口物流、积分交易、行业数据共享、税务票据、版权确权等。
基于华为云区块链服务构建企业应用

华为云区块链服务逻辑架构
一个完整的企业区块链应用架构由上至下包含三层:业务应用层、合约层和底层区块链平台层,这三个层级决定了区块链应用开发的成本,是企业在区块链应用的决策、需求分析以及架构阶段需要着重考量的方面。
• 业务应用层
这一层是区块链应用的对外表现层,主要功能是对外提供友好易用的界面为企业用户提供业务服务,形式可以为一个Web应用或者一个手机移动端的APP。
这一层和传统的Web应用以及移动端APP并无明显差别,对最终用户来说并不需要感知区块链的存在,只需确保区块链应用不要破坏用户一贯的软件使用习惯即可。
在这一层次上,华为云区块链服务能够提供给企业的是一些工具类的帮助,例如:提供区块链链码的RESTful调用方式减轻应用层开发的难度和负担等。
关于更多的与应用开发相关的内容,企业可以咨询华为云其他的服务,比如华为云云容器引擎、微服务引擎等,这些服务不在本书的讨论内容之中,在此略过。
• 合约层
合约层顾名思义是智能合约的部署层,是企业应用使用区块链服务最重要的一层。
智能合约封装了企业对区块链使用的全部业务逻辑,是企业业务精髓的体现,每个企业的智能合约都不尽相同,是需要每一个开发区块链应用的企业用心设计,定制开发的部分。
基于其重要性,华为云也对合约的开发部署提供了有力的支持。
首先,在智能合约代码的开发上提供了在线链码编辑器,让用户可以在线开发、编译及调试。
其次,华为云提供了对链码的完整的生命周期管理,用户可以使用界面便捷地安装部署链码。
最后,华为云还提供了丰富的链码样例、模板供开发者参考,将来还会提供更为通用的链代码类库以加速开发者开发链码的过程。
• 区块链底层平台
华为云区块链服务平台BCS以华为公有云服务为基础架构,除了为用户提供计算资源、通讯资源和存储资源以外,更进一步封装了区块链底层平台,将区块链记账能力、区块链运维能力和区块链配套设施能力转化为可编程接口,企业在开发时只需要关注应用层和合约层即可,极大地简化了区块链应用的开发过程,让开发者专注业务逻辑,提升开发效率。
1 区块链服务的交付模式
从交付的角度看,如何选择合适的商业模式进行业务落地是客户首先要考虑的问题。
按照企业用户的诉求,华为云区块链服务解决方案提供三种交付模型:
Turnkey模式(合作伙伴+华为云BCS):
Turnkey就是所谓的交钥匙模式,当企业有区块链诉求时,可以自己指定或者选择华为提供的第三方合作伙伴,由华为云解决方案专家参与,共同分析客户的业务诉求,根据业务的场景制定区块链解决方案,并由第三方合作伙伴完成业务的开发,交付最终的软件给客户。
企业+合作伙伴+华为云BCS的模式:
此方案适用于企业自身需要参与一部分业务系统开发的情形,根据BCS生态系统划分,可由企业完成自身业务系统构建,由合作伙伴完成行业解决方案内的智能合约开发,由华为云提供区块链底层基础设施,共同搭建企业所需的业务系统,企业以最少的人力投入,快速构建区块链应用。
企业+华为云BCS的模式:
当企业有较雄厚的技术储备、较强研发团队时,可以选择直接基于华为云区块链服务进行开发。
华为云为企业提供咨询与架构服务,帮助企业分析区块链应用的解决方案,设计系统对接流程,并提供有力的技术支持和保障。
2 区块链应用构建极速之旅
使用华为云开发企业区块链应用极为简单,只需六个步骤:
|

华为云构建企业区块链步骤
(1)业务场景分析:
并非所有的应用都适合区块链,判定企业应用是否适合区块链应用至关重要。
(2)梳理上链信息:
当判定应用为区块链应用后,也并非所有的数据都适合上链,企业还需要根据数据的业务特点和技术特性对上链数据进行选择和建模。
(3)创建区块链服务:
华为云BCS服务提供一键式的购买,帮助用户屏蔽掉存储、网络、计算等相关资源的购买,系统自动完成大部分区块链底层平台所需配置。
整体配置购买流程可以在10分钟以内完成(包括计算、资源和存储资源的创建时间)。
(4)编写链码并部署:
链代码作为企业业务和区块链存储的纽带逻辑,是企业应用区块链化的结晶,在整个区块链应用开发过程中起着举足轻重的作用。
华为云考虑到这一点,对这一环节提供了辅助增强,企业用户可以在线完成链代码的开发、部署与实例化,完成智能合约部分。
(5)业务集成:
业务系统通过集成SDK、调用RESTful或者JDBC的方式操作区块链,业务改动量小,简洁高效。
(6)区块链服务运维:
通过对接华为云AOM/APM,完成区块链实例、区块链应用的实时监控,提供日志、告警、性能指标的全方位监控,给业务的灵活变更提供依据。
1)业务场景分析
Marbles是一个简单的资产转移示例业务,旨在帮助客户了解链码的基础知识以及如何使用华为BCS服务开发应用程序,帮助快速上手并体验华为云区块链服务。

Marbles界面
Marbles应用成品的界面演示,应用支持多个账户,每个账户可以创建自己的资产——弹珠,每个弹珠的规格都是随机并且独特的(有各自的颜色、大小),因此每一个弹珠都是“唯一”的。
弹珠创建出来即为创建者所有,成为其资产。
资产可以在用户之间互相转移,资产转移的动作称为交易。
• 是否存储状态
Marbles应用需要保存各种状态,包括用户的信息、弹珠的规格还有弹珠的归属权等,由于弹珠可以转移所属权,转移的交易也需要进行记录,弹珠交易不能被任何一方随意更改,并且这些交易要保证安全,账户A只能转账户A的弹珠资产,这些状态数据的保持正是区块链所能提供的。
• 是否多方协作写入
弹珠资产转移是可以发生在任何两个账户之间的,并且交易的结果和用户的最终资产信息是需要向其他用户同步的,因此也符合区块链的多方协作写入的准则。
• 多方是否互信
显然,弹珠资产的所有权账户之间并不存在完全互信的关系,因此区块链所带来的信任是应用必不可少的。
• TTP是否能完美解决
为弹珠资产构建一个可信任的第三方消耗巨大,而且很难找到一个让所有人都绝对信任的公信机构,即便能够找到,这种公信机构提供公信力的成本也是非常昂贵的,因此对于Marbles应用来说,使用区块链来代替中介机构是不二之选。
• 是否限制参与
我们并不希望任何能够接入互联网的人都能使用Marbles应用,因此使用联盟链建立一个准入门槛是必需的。
综上所述,我们判定Marbles应用是一个区块链应用,那么接下来我们就要看看都有哪些数据需要上链。
2)梳理上链信息
在Marbles Demo中,我们的业务可以梳理为以下三条:
• 账户信息的创建,包括账户的增删改查 • 弹珠资产的创建,包括弹珠的增加与删除 • 弹珠资产的转移,资产转移发生在任意两个用户之间 |
由上所述,我们利用传统的软件分析能力不难分解出其中的名词:账户、弹珠资产。
这两个实体将作为我们链上数据结构的实体模型。
另外,我们还需要在弹珠模型上记录弹珠的所有权,即弹珠与账户的关系,因此我们得出了如下的数据模型

弹珠实体数据模型表

账户实体数据模型表
模型的数据都将以键值对的形式存储于区块链上。
然需要注意的是,我们此处给出的示例应用比较简单,大部分信息都存储在区块链上,然而实际的应用可能会非常复杂,数据量也将十分庞大,因此需分析具体业务来确定数据是否希望得到区块链的方便共享、安全写入和不可篡改等特性,只将必要的数据记录于区块链上,对于成本的控制和性能的保证是很关键的。
3)购买区块链服务
在开发区块链应用之前,我们需要确保有一个真正的区块链平台可以供我们进行测试,以及将来作为实际的生产运行平台,从头搭建区块链平台是低效并且高风险的,选择华为云区块链服务可以为企业节省不少前期投入成本,以及后期维护成本,甚至降低对区块链使用的学习曲线。

4)编写链码并部署
链代码也称智能合约,是控制区块链网络中相关方相互交互的业务逻辑。
链代码将业务网络交易封装在代码中,最终在一个Docker容器内运行。
目前华为云区块链服务暂时支持Golang语言编写代码。
链代码即一个Go文件,创建好文件后进行函数开发等操作。
Marbles应用中区块链的部分开发和部署完毕,但仅有区块链是没有办法让最终用户来使用的,区块链的最终目的是服务于业务。
接下来我们要将Marbles应用和刚刚构建的区块链服务对接,由应用触发业务数据在区块链上的存储和读取,才能发挥区块链的作用。
5)业务系统集成
业务系统集成即对区块链服务与区块链应用进行集成对接,集成的速度和质量直接关系到应用开发人员的开发效率以及应用最终用户的体验,所以这一步是至关重要的。

区块链与业务系统集成
由Marbles应用程序发起对资产转移链码的调用,试图将user1的弹珠资产marble1转移给用户user2,调用触发链码逻辑先进行合法性校验,最终将弹珠资产marble1的所有者属性user2写到区块链上,完成资产的转移。
那么在上述业务流程中,Marbles应用程序具体需要如何跟区块链的链代码交互呢?

应用程序与区块链代码交互步骤
①客户端将调用块链码所需要的信息进行打包,包括通道ID、链码ID、调用参数、调用者信息等。
②客户端将步骤①打包好的二进制用调用者私钥进行签名,此签名除了拥有私钥的用户外,其他人无法伪造。
③最后客户端将前两步产生的二进制及签名分别发到需要背书的区块链节点进行背书,背书的过程即为链码调用的过程。
然后,客户端将返回的背书信息汇总发送到区块链上进行写入。
由此我们可以看到,应用程序和链码的交互过程还是比较复杂的,这个过程不应该让应用开发者自己来实现,因此就有了支持各种语言的客户端SDK版本,例如Golang、Node.js等。
但即便如此,使用客户端SDK的成本还是很高,因此华为云提供了两种调用方式:
一种是刚才提到的使用语言相关的客户端SDK进行调用;
另外一种为创新的RESTful调用方式
• SDK对接方式:
开发业务应用时需要根据所使用的开发语言种类确定下载的SDK,如Marbles应用使用Node.js作为开发语言,BCS服务提供了相应的SDK配置文件下载

下载SDK配置

SDK配置信息
SDK配置文件是为了让区块链SDK调用程序了解已经完成部署的区块链服务的架构、peer和orderer的地址以及各种证书的位置等,这些信息都是使用SDK所必需的。
SDK获取之后,就可以使用SDK开发区块链调用代码了。
优点:基于原生Fabric SDK,没有其他环节,调用响应速度较快。
缺点:
• 配置文件书写复杂
虽然华为云已经提供了SDK配置文件下载功能,对于首次使用SDK的开发人员来说成本仍然很高。
• SDK与语言相关,并且学习成本略高
虽然很多语言都提供了Fabric SDK,SDK调用起来也算是简洁,但使用起来仍然有一定学习成本,并且不同语言的类库名称、方法名称调用方式都各不相同,切换不同语言时的学习成本成倍增加。
• SDK过于厚重
应用程序在使用SDK的时候需要将SDK类库引入,虽然不用开发语言的SDK打包后大小各不相同,但对于一些薄客户端(比如手机应用)来说就显得十分厚重了。
• RESTful对接方式:
华为云为了方便开发者使用区块链服务,在服务侧提供了RESTful的API以克服上述直接使用SDK方式的不足。
要使用RESTful对接方式,只需在订购时选择启用RESTful接口即可,并且如果订购时候没有选择,后续也可单独进行安装,安装好RESTful接口的服务组件。

订购了RESTful组件的区块链服务
一旦添加了RESTful服务,即可使用相关语言中的RESTful方式进行调用。因为华为云替用户管理着区块链的组织结构以及各种证书,所以天然具备了所需要的SDK的配置文件,不需要用户自己手动生成。
RESTful已经作为一种最基本的远程调用形式在各大语言中都有非常良好的支持,在此就不做赘述了,比较特殊的地方是请求中Header的签名字段x-bcs-signature-sign和Body里面的cert证书字段。

RESTful链码调用机制
华为云利用开源区块链已有的MSP功能所提供的安全架构,使用和SDK类似的方式对交易进行保障。
在客户端发起RESTful链码调用时,首先使用用户的私钥对整个RESTful方法体进行签名,如图中①所示。
签名的结果放到Header的x-bcs-signature-sign字段中。
RESTful服务端接收到请求后,会使用用户的公钥对请求进行验签,如图中②所示。
RESTful服务内部封装了对开源SDK的调用,SDK会重新包装链码调用信息,使用用户私钥对其进行再次签名,如图中③所示,以此完成对链代码的调用。
另外还有一种更为复杂的场景。
当用户自行管理证书的时候,我们的服务端是没有用户公私钥对的,此时用户用私钥签名之后,服务端无法进行验证,所以这种场景就要求用户将自己的公钥随着请求传到服务端。

用户管理密钥对的RESTful调用过程
用户自己管理的证书也不可以随意生成,必须由组织的私钥签发才有效,因此在用户发起RESTful请求时,如图中①所示,要在请求体中放入证书,证书包含用户的公钥以及组织私钥的签名,然后再将整个请求体使用用户私钥进行签名,将签名结果放到Header的x-bcs-signature-sign字段。
请求到达服务端后,如图中②所示,服务端首先使用组织的公钥对上传的证书进行合法性校验,校验通过则说明用户上传的证书确实是组织签发,用户公钥合法有效,可以使用证书对Header中的签名进行校验。
校验的过程以及后续步骤跟之前的场景相同,在此就不赘述了。
至此,相信读者已经对华为区块链服务的RESTful链码调用API机制有了深刻的了解,那么这种调用方法和普通的SDK方式相比有什么优势呢?
在此,我们进行简单的归纳如下:
• 使用简单方便,由华为云区块链服务封装SDK的复杂性。
• 由于绝大多数语言都已经拥有很成熟的RESTful调用类库,调用RESTful基本没有学习成本。
• 不用引入SDK类库,适合更轻量的客户端。
由上可以看出,RESTful使用起来更加方便,但我们的Marbles示例为了展示更复杂的调用方式选择了SDK对接,至此,我们的Marbles应用已经可以正常运行。
另外需要注意的是,上述两种对接方式的优缺点只代表了普通的场景,真实场景如何选择还需要结合实际情况进行分析。
例如用户购买了足够的带宽,RESTful调用开销和延时已经不是瓶颈,并且RESTful服务内部对SDK也进行了缓存,此时在大规模调用的情况下使用RESTful对接方式的性能可能占优。
6)区块链服务运维
我们知道,任何IT系统都离不开运维,区块链应用也一样,运维的内容包括对软件服务的管理、对系统底层资源的监控以及对应用日志的收集等。
• 服务扩容
华为区块链服务基于开源的Hyperledger Fabric,每个组织有一些数量的节点(Peer)用来对交易做背书,当交易量增大时,为了保证背书效率,就需要对节点数量进行扩容。华为云提供了以下简单易行的扩容方式。

服务列表
• 资源监控
我们需要一个整体的可视化监控界面,可以查看节点(虚机)、peer、orderer性能指标:进入区块链服务控制台,点击“运维中心”,跳转到应用运维管理控制台

运维管理控制台
4 区块链服务的跨云部署和云上云下混合部署方案
随着客户业务规模扩展到全国乃至世界范围内,基于当地的政策法规将当地业务部署到云平台时,为了和现有的业务打通,需要使用跨云部署的解决方案。
在某些场景中,政府客户或者一些对数据隐私性保护严密的客户,既需要公有云平台提供的服务,又需要本地的数据私密性的需要,本地需要自己的数据中心,在这种情况下就需要依赖云上云下混合部署方案。

就是三种部署方案的大体架构,第一种是全公有云部署,第二种是线上线下混合部署,最后一种是以SAP云作为例子打通BCS和SAP的混合云部署方案。
不论线上线下还是混合云的方案,他们的区别在于是客户本地私有数据中心集群还是一个云上的私有集群,都需要有对外连接的地址和相关节点存在。
因此,打通他们之间的步骤都是类似的,可以分为下面的三步。
这里以一个客户B希望将自己的节点和另一个网络内部的客户A的节点加入共同通道为例。
1 )将节点加入区块链网络

2) 加入区块链网络通道

3)部署链码到区块链网络通道中



