AICon 上海站|90%日程已就绪,解锁Al未来! 了解详情
写点什么

华为云区块链服务 (BCS)RESTFUL 链码调用 API 原理详解

  • 2020-03-25
  • 本文字数:3372 字

    阅读完需:约 11 分钟

华为云区块链服务(BCS)RESTFUL链码调用API原理详解

本文适合于熟悉开源区块链技术 Hyperledger Fabric,以及希望更高效地使用华为云区块链服务的读者。当然,也希望任何对区块链技术有兴趣的读者能从本文中受益。


2018 年 2 月 1 日,华为云发布企业级区块链开放平台区块链服务 BCS(Blockchain Service),是基于开源区块链技术 Hyperledger Fabric 和华为在分布式并行计算、数据管理、安全加密等核心技术领域多年积累基础上推出的企业级区块链云服务产品,旨在帮助各行业、企业在华为云上快速、高效的搭建企业级区块链行业方案和应用。


然而搭建区块链平台并不是目的,华为 BCS 服务的初衷是让客户更简单、更高效地使用区块链。本文要介绍的 RESTFUL 链码调用 API 即是 BCS 服务提供的易于客户端与区块链服务集成的 API。在详细讲解之前,我们先对链代码做一下简单介绍,便于没有 Fabric 知识背景的读者理解。


我们知道区块链是一种由区块串联而成的链式结构,每一个区块上都记录着账户数据,这些数据一经写入是不可篡改的。那么数据是如何写入的呢?如果让拥有写入权限的用户都能随意写入数据的话,区块链也就失去了存在的意义,因此链代码概念的引入意义重大。链代码又被称之为智能合约,顾名思义就是向区块链写入数据的预先约定好的代码。它是一段逻辑,这个逻辑可以是简单的限制和约束,也可以是非常复杂的业务相关的逻辑,根据用户的输入,进行逻辑的运算,最终得出向区块链写入的数据集合,然后将数据写入到区块链上去。如果这样描述过于抽象的话,我们以一个账户转账的例子来进行说明。



如上图所示,图中右边的区块链记录着原始账户的余额,a 为 100 元,b 为 200 元。图中左边客户端应用程序发起一笔转账交易:a 向 b 转 x 元。这笔交易不会直接写入区块链,而是先经过中间的链代码进行智能合约的运算,检查 a 的账户里是否有足够的余额,然后才允许转账交易的进行,将最终的 a、b 账户的余额写入到最新的区块链中。


我们可以看到,上述交易过程以及链代码的作用非常浅显易懂,但实际上由我们的应用程序向链代码发起调用的过程还是有些复杂的工作要做的。因为区块链的调用请求不同于普通的 RPC 远程调用,客户端在一次链码调用过程中需要做的工作如下:


  • 将链代码的调用信息如通道 ID、链码 ID、调用参数、调用者信息等进行打包

  • 将打包好的二进制内容使用用户私钥进行签名

  • 根据链码的背书策略不同,可能需要向多个组织的节点上的链码发起调用



由此可见,这个调用过程如果让客户端开发人员自己来实现是不太现实的,因此需要借助 SDK 的帮助来实现。目前根据客户端的语言不同,SDK 也有各种不同的语言版本,例如 golang 语言就有 fabric-sdk-go 的实现,javascript 也有 nodejs 版本的 SDK 实现。我们先来看一下使用 SDK 需要的配置文件以及使用 SDK 进行调用的示例代码片段:



上图是一个 200 行的 SDK 配置文件片段



这是一个 nodejs 版本的 SDK 使用示例,我们从中可以看到客户端应用直接使用 SDK 的弊端:

配置文件书写复杂

虽然华为云已经提供了 SDK 配置文件下载功能,对于首次使用 SDK 的开发人员来说成本仍然很高。

SDK 语言相关,并且学习成本高

虽然很多语言都提供了 Fabric SDK,但是学习起来仍然有一定学习成本,并且不同语言的类库名称,方法名称调用方式都各不相同,切换不同语言时的学习成本成倍增加。

SDK 过于厚重

应用程序在使用 SDK 的时候需要将 SDK 类库引入,虽然不用开发语言的 SDK 打包后大小各不相同,但对于一些薄客户端(比如安卓或者 IOS 手机应用)来说仍然显得十分厚重。


至此,我们回到本文的重点:华为云为了方便开发者调用区块链服务,在服务端提供了 RESTFUL 的 API 以克服上述直接使用 SDK 方式的不足:



如上面架构图所示,华为云区块链服务直接暴露 RESTful 形式的 API 供开发者使用,在服务端的 RESTful 封装了对 SDK 的调用。用户如果需要发起链码调用只需要如下步骤:

准备链代码调用所需要的参数

  • channelId: 通道 ID

  • chaincodeId: 链码 ID

  • chaincodeVersion: 链码版本号

  • userId: 用户 ID

  • orgId: 组织 ID

  • opmethod: 链码调用类型,是 invoke(修改)还是 query(查询)

  • args: 链码参数, 例如:"[“invoke”,“a”,“b”,“1”]"


以上参数都是用户调用链码必须要准备的参数,用户需要将这些参数按照下面格式进行组织:


{  "channelId": "testchannel",  "chaincodeId": "zmmcode",  "chaincodeVersion": "1.0",  "userId": "User1",  "orgId": "7258adda1803f4137eff4813e7aba323018200c5",  "opmethod": "invoke",  "args": "["invoke","a","b","1"]",  "timestamp": "2018-10-31T17:28:16+08:00",}
复制代码


这些参数会直接作为 RESTful 请求的 HTTP BODY 进行发送。

使用证书对参数进行签名

用户可以从华为云官网获取自己创建的区块链服务的用户证书和私钥,使用私钥对上面步骤 1 中的参数进行签名。签名的方法各语言版本均有实现,在此不做累述。椭圆曲线签名结果为一串哈希值,将这个哈希值放入 HTTP 头部的制定字段 x-bcs-signature-sign 中。

将构造好的 HTTP 请求进行发送

各语言版本均对 RESTful 调用有成熟的支持,在此也不再累述,在此只给出一个实际的 RESTful HTTP 请求的内容供大家参考:


HEADER:x-bcs-signature-sign: 1f8b08000000000000ff14cbb11503510c02b081d260c098bfff6279d74bb90a5ca7384e3cae9b5825af7cb076b65e039be41da8e8b1e38700d599fa4aee37d6c159a94355ada783dbb4d66e17e967db39cef36bcd0b5adc8be3e178698ef9070000ffff
BODY:
{ "channelId": "testchannel", "chaincodeId": "zmmcode", "chaincodeVersion": "1.0", "userId": "User1", "orgId": "7258adda1803f4137eff4813e7aba323018200c5", "opmethod": "invoke", "args": "["invoke","a","b","1"]", "timestamp": "2018-10-31T17:28:16+08:00", "cert": "-----BEGIN CERTIFICATE----- MIIDBzCCAq2gAwIBAgIQEXPZlMsReamxVtVNnKwCCzAKBggqhkjOPQQDAjCCAQQx DjAMBgNVBAYTBUNISU5BMRAwDgYDVQQIEwdCRUlKSU5HMRAwMwUQYD14eH+jTTBLMA4GA1Ud DwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMCsGA1UdIwQkMCKAIFBXQ5TC4acFeTlT JuDZg62XkXCdnOfvbejSeKI2TXoIMAoGCCqGSM49BAMCA0gAMEUCIQCadHIKl0Mk Yn0WZizyDZYR4rT2q0nzjFaiW+YfV5FBjAIgNalKUe3rIwXJvXORV4ZXurEua2Ag QmhcjRnVwPTjpTE= -----END CERTIFICATE----- "}
复制代码


以上三个简单步骤就是使用华为区块链服务的 RESTful API 进行链代码调用的全部过程。可以看到整个流程非常简单,没有引入新的 SDK,调用方式是绝大多数程序员非常熟悉的 RESTful 方式,对于用户来说使用起来没有任何负担。


如果读者作为区块链智能合约的调用者,看到此处可以说已经足够了解华为云区块链 RESTful API 的使用方法了。 但还有用户也许有会对我们的 RESTful 服务感到好奇,想了解为何可以把复杂的链码调用变得如此简单,那么下面的内容可以作为扩展阅读,我们将简单阐述 RESTful 服务的内部机制。


之前我们提到应用程序与区块链代码交互步骤中,客户端所做的工作除了包装方法调用参数之外,最重要的一项工作就是进行签名,签名可以保证交易不会被其他人冒充。那么 RESTFUL 调用同样也存在这个问题,RESTFUL 是基于 HTTP 协议的,更为通用,因此在安全上我们更要做好充足的工作以保证其不可被冒充,下图阐述了华为 RESTFUL 链码调用的机理:



如图所示,华为云利用开源区块链已有的 MSP 功能所提供的安全架构,使用和 SDK 类似的方式对交易进行保障,RESTful 服务逻辑概括如下:


1)当客户端发起 RESTful 链码调用时,首先使用用户的私钥对整个 RESTful 方法体进行签名,将签名的结果放到 HEADER 的 x-bcs-signature-sign 字段中。


2)RESTful 服务端接收到请求后,会使用用户的公钥对请求进行验签。


3)验签通过后,RESTful 服务内部封装了原生 SDK 调用,根据原始请求重新构造 SDK 调用参数,并提供 SDK 所需的配置文件及私钥信息使用原生 SDK 进行链代码调用。


至此,相信读者已经对华为区块链服务的 RESTFUL 链码调用 API 机制有了深刻的了解,那么这种调用方法和普通的 SDK 方式相比优势何在呢,归纳总结如下:


  • 使用简单方便,由华为云区块链服务封装 SDK 的复杂性。

  • 由于绝大多数语言都已经拥有很成熟的 RESTFUL 调用类库,调用 RESTFUL 基本没有学习成本。

  • 不用引入 SDK 类库,适合更轻量的客户端,例如手机端。


本文转载自 华为云产品与解决方案 公众号。


原文链接:https://mp.weixin.qq.com/s/wSKtWZ05H8FAa--syXpidA


2020-03-25 16:281804

评论

发布
暂无评论
发现更多内容

高可用性集群软件就选Skybility HA!优势多多!

行云管家

高可用 双机热备

手慢无!清华大牛熬夜整理Spring微服务架构设计第2版文档,限时删

钟奕礼

Java 编程 架构 计算机 java程序员

java文件流

hello java

文件 程序 Java core 11月月更

双11狂欢背后,火山引擎数智平台为品牌做了这件事

字节跳动数据平台

大数据 营销数字化 火山引擎

如何杜绝 spark history server ui 的未授权访问?

明哥的IT随笔

hadoop spark

LED透明屏焊接和插接安装以及三招提升稳定性

Dylan

LED LED显示屏 led显示屏厂家

【#HDC2022】HarmonyOS体验官活动正式开启,赶快投稿赢限量奖品吧!

HarmonyOS开发者

HarmonyOS

三面阿里java后台开发岗总结:进阿里必看这份究极面试文档

钟奕礼

Java 编程 java程序员 java面试 java架构

面向对象基础

断墨寻径

面向对象 java;

数字先锋| 教育资源乘云而来!46万城乡学子共享名师课堂

天翼云开发者社区

共享开源技术,共建开放生态丨平凯星辰余梦杰出席 2022 世界互联网大会开源论坛圆桌对话

PingCAP

开源

互联网公司网络堡垒机首选哪家品牌?有什么优势?

行云管家

互联网 网络安全 信息安全 堡垒机

Alibaba最新推出的Spring Cloud手册惨遭开源

小小怪下士

Java 程序员 阿里 SpringCloud

Kubectl 命令总结

蜗牛也是牛

这次,听人大教授讲讲分布式数据库的多级一致性|TDSQL关键技术突破

腾讯云数据库

腾讯云 tdsql 腾讯云数据库 多级一致性 中国人民大学

TiKV 源码阅读三部曲(三)写流程

PingCAP

源码阅读

Jmix 1.4 功能概览

世开 Coding

企业级低代码 Jmix 企业级应用程序开发

OpenHarmony开发之MQTT讲解

OpenHarmony开发者

OpenHarmony

阿里云研发工程师刘睿:阿里云消息生态及最佳实践

云布道师

阿里云 云原生

极客时间架构训练营模块五作业

李晨

架构

想要设计一个良好的接口至少要考虑这14点!

程序员小毕

Java 编程 程序员 程序人生 java面试

追求极致性能!RocketMQ消息通信详解

Java全栈架构师

Java 程序员 面试 RocketMQ 消息中间件

太强了!终于有人整理出了仿京东电商项目,再次开源了

钟奕礼

Java 编程 架构 项目 java程序员

旺链科技出席Hyperledger区块链技术峰会,分享数字乡村新业态

旺链科技

区块链 hyperledger 产业区块链 企业号十月PK榜

欢迎来嫖!阿里P8高级技术专家携这份818页Java核心技术重磅来袭

钟奕礼

Java 编程 计算机 java程序员 java架构

Linux内存泄露案例分析和内存管理分享

京东科技开发者

负载均衡 集群 内存泄漏 Linux Cron 运维、

视频服务HDR Vivid 还原色彩,让所见成“真”

HarmonyOS SDK

视频 HMS Core

让迁移不再开盲盒,让云也能省钱丨Hackathon 项目背后的故事第一期回顾

PingCAP

hackathon

从零到一构建完整知识体系!阿里巴巴Java并发编程技术内幕全网首次公开

Java全栈架构师

源码 程序员 程序人生 Java并发 java面试

【C语言】for 关键字

謓泽

11月月更

4.0体验站|我对OceanBase 4.0社区版的体验与看法

OceanBase 数据库

华为云区块链服务(BCS)RESTFUL链码调用API原理详解_云原生_华为云产品与解决方案_InfoQ精选文章