区块链中的RESTFUL链码调用API原理详解

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

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

如前所述,搭建区块链不是目的,关键是要方便应用更高效地使用区块链。本文要介绍的RESTFUL链码调用API即是华为云区块链为此目的而开发的,在详细介绍API之前,先对链代码做一下简单介绍,便于没有Fabric知识背景的读者理解。

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

如上图所示,图中右边的区块链记录着原始账户的余额,a为100元,b为200元。图中左边客户端应用程序发起一笔转账交易:a向b转x元。这笔交易不会直接写入区块链,而是先经过中间的链代码进行智能合约的运算,检查a的账户里是否有足够的余额,然后才允许转账交易的进行,将最终的a、b账户的余额写入到最新的区块链中。
整个交易过程以及链代码的作用其实非常浅显易懂,但其实我们的应用程序向链代码发起调用的过程还是有些复杂的。因为区块链的调用请求不同于普通的RPC远程调用,客户端需要有如下的事情:

1,将链代码的调用信息如通道ID、链码ID、调用参数、调用者信息等进行打包,
2,将打包好的二进制内容使用用户私钥进行签名
3,根据链码的背书策略不同,可能需要向多个组织的节点上的链码发起调用

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

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

这是一个nodejs版本的SDK使用示例。由此我们可以看出客户端应用直接使用SDK的弊端:
1,配置文件书写复杂 虽然华为云已经提供了SDK配置文件下载功能,对于首次使用SDK的开发人员来说成本仍然很高。
2,SDK语言相关,并且学习成本高 虽然很多语言都提供了Fabric SDK,但是学习起来仍然有一定学习成本,并且不同语言的类库名称,方法名称调用方式都各不相同,切换不同语言时的学习成本成倍增加。
3,SDK过于厚重 应用程序在使用SDK的时候需要将SDK类库引入,虽然不用开发语言的SDK打包后大小各不相同,但对于一些薄客户端(比如安卓或者IOS手机应用)来说仍然显得十分厚重。
华为云为了方便开发者使用区块链服务,在服务端提供了RESTFUL的API以克服上述直接使用SDK方式的不足:

如上面架构图所示,华为云区块链服务直接暴露RESTFUL形式的API供开发者使用,在服务端封装了对SDK的调用。因为华为云替用户管理着区块链的组织结构以及各种证书,所以天然具备了所需要的SDK的配置文件,不需要用户自己手动生成。在此给出一个RESTFUL链码调用请求的Header和Body的示例供读者参考:
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-----\nMIIDBzCCAq2gAwIBAgIQEXPZlMsReamxVtVNnKwCCzAKBggqhkjOPQQDAjCCAQQx\nDjAMBgNVBAYTBUNISU5BMRAwDgYDVQQIEwdCRUlKSU5HMRAwMwUQYD14eH+jTTBLMA4GA1Ud\nDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMCsGA1UdIwQkMCKAIFBXQ5TC4acFeTlT\nJuDZg62XkXCdnOfvbejSeKI2TXoIMAoGCCqGSM49BAMCA0gAMEUCIQCadHIKl0Mk\nYn0WZizyDZYR4rT2q0nzjFaiW+YfV5FBjAIgNalKUe3rIwXJvXORV4ZXurEua2Ag\nQmhcjRnVwPTjpTE=\n-----END CERTIFICATE-----\n”
}
看到这里,读者可能会对上面Header中的签名以及Body中的cert证书信息有所疑惑。请不要着急,在此先介绍一下华为云区块链RESTFUL接口的实现原理,读者自然就能解除心中疑虑。

根据前文我们已经了解区块链的调用和普通RPC的远程调用最主要的区别在于需要有用户签名用于证明交易是指定用户所发起的,那么RESTFUL调用也不可避免这个问题。因此我们在使用华为云区块链RESTFUL接口时仍然需要使用用户私钥对整个请求消息体进行签名如图中?所示,签名的结果放到HEADER中指定名称下。这个签名在服务端会使用用户的公钥进行验证,验证通过交易才能继续。

在某些情况下,用户的公私钥对并不是华为云区块链服务管理的,而是用户使用组织私钥自行签发的,这个时候服务端就缺少这个用户的公私钥,此时就需要在请求消息体中使用cert字段上传用户公钥,服务端使用用户上传的公钥验证HEADER中的签名是否是私钥对消息体的合法签名。这时问题就来了,任何一个伪造者都可以自己制作一个非对称的公私钥对,然后对一个非法的消息体进行私钥签名,并把公钥放到消息体中以通过服务端的验签。为了避免这个漏洞,服务端在验签之前会对用户上传的公钥进行合法性验证,如上图?。因为用户上传的公钥实际上是一个证书,该证书包含了用户公钥以及组织私钥对该证书的签名,而伪造者缺少组织私钥无法伪造签名,这样服务端就能判定用户上传证书的合法性。

当服务端使用合法的用户证书验证请求HEADER中的签名是用户私钥的签名后,服务端就可以真正发起区块链链码的调用了,这里服务端使用SDK的方式与客户端直接使用SDK的方式并无不同,只不过如果客户端证书是自行签发的,那么服务端是没有用户私钥的,这个时候就会使用组织的admin证书发起区块链链码的调用。
至此,RESTFUL的调用机制读者也清楚了,那么RESTFUL调用的优点也就很容易理解:

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

  1. 由于绝大多数语言都已经拥有很成熟的RESTFUL调用类库,调用RESTFUL基本没有学习成本。
  2. 不用引入SDK类库,适合更轻量的客户端。
    以上就是对华为云区块链RESTFUL链代码调用API的原理的详细讲述,目前RESTFUL接口还处于公测阶段,欢迎读者到华为云进行免费体验并提出宝贵意见。

参考资料:API参考



来源:CSDN
原文:https://blog.csdn.net/weixin_43682574/article/details/85077234
版权声明:本文为博主原创文章,转载请附上博文链接!

原文地址:http://blog.51cto.com/14071491/2332290

时间: 2024-10-11 17:30:43

区块链中的RESTFUL链码调用API原理详解的相关文章

区块链中的软分叉与硬分叉详解

区块链兄弟社区,区块链技术专业问答先行者,中国区块链技术爱好者聚集地 作者:吴寿鹤 来源:区块链兄弟 原文链接:http://www.blockchainbrother.com/article/29 著权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 说到分叉,我们首先了解一下在软件开发中的分叉是什么? 软件项目中的分叉 软件开发中的分叉指的是:在开源项目中如果有人Fork了一个项目(一个项目分叉为两个项目),然后开发者沿着这个Fork向另外一个不同的方向独立发展这个项目.例如L

1.3.1 区块链中的加密算法——Hash算法(更新)

为了为保证存储于区块链中的信息的安全与完整,区块链中使用了包含密码哈希函数和椭圆曲线公钥密码技术在内的大量的现代密码学技术,同时,这些密码学技术也被用于设计基于工作量证明的共识算法并识别用户. 在前边的文章中已经系统的讲述了密码学中的哈希算法,在本节,将会给大家介绍Hash算法在区块链中的应用! 概念回顾: 哈希函数:是一类数学函数,可以在有限合理的时间内,将任意长度的消息压缩为固定长度的二进制串,其输出值称为哈希值,也称为散列值. 以哈希函数为基础构造的哈希算法,在现代密码学中扮演着重要的角色

Java 实现区块链中的区块,BLOCK的实现

1.区块是区块链的基础单元 区块链由若干个区块组成,区块是区块链的基础单元 2.区块链中区块的基本属性 区块6个属性的说明-Index 区块的索引值,区块链中的唯一键区块6个属性的说明-Timestamp 区块的时间戳,用于区分区块的产生时间区块6个属性的说明-Hash 区块的hash值是整个区块各个内容整体计算出的hash值区块6个属性的说明-Previous Hash 前一个区块的hash值区块6个属性的说明-Data 区块链的数据存储部分,例如比特币是用来存储交易数据区块6个属性的说明-N

区块链中的节点是什么

随着区块链科技的进步,各种形态不同的链展现在大家面前,有些区块链中节点有很多(如以太坊),而有些区块链中的节点又很少(如EOS),今天我们拿第一代区块链比特币来讲. 比特币被设计为一种去中心化的点对点(P2P)网络 如中心化的应用都是由一台服务器集中管理,而去中心化的应用就是由很多台服务器管理存储信息,并且相互验证. 综上所诉的去中心应用中的服务器就是节点 节点的作用 为了确认交易有效性,比特币需要多于一个单独网络的矿工处理交易单,它必须通过"节点"向网络广播.这是交易处理过程的第一步

1.3.2 区块链中的密码学——Merkle 树

在计算机领域,Merkle树大多用来进行完整性验证处理.在处理完整性验证的应用场景中,特别是在分布式环境下进行这样的验证时,Merkle树会大大减少数据的传输量以及计算的复杂度. Merkle哈希树是一类基于哈希值的二叉树或多叉树,其叶子节点上的值通常为数据块的哈希值,而非叶子节点上的值是将该节点的所有子节点的组合结果的哈希值. 如下图所示为一个Merkle哈希树,节点A的值必须通过节点C.D上的值计算而得到.叶子节点C.D分别存储数据块001和002的哈希值,而非叶子节点A存储的是其子节点C.

[老k说区块链]区块链中的共识(1)— 免信任的共识机制

老k,柏链道捷CTO.清华阿尔山区块链研究中心高级工程师,超过17年的系统软件开发经验,在操作系统.编译器.虚拟机和符号执行方面都有实战经验.主持开发多个开眼项目,目前主要从事区块链底层系统开发工作. 这个系列的文章主要谈一下我对区块链中的共识机制的理解,欢迎跟大家一起交流.探讨. 前言 当今区块链的概念和产业已经遍布神州大地,创业言必区块链,在各种咖啡厅中你都可以听到周围的人谈论区块链,大部分从业者对区块链技术的一个认识是它是一个分布式账本技术,更有些人说区块链是各种计算机技术的组合,如P2P

区块链中的密码学(三)-椭圆曲线加密算法分析

在目前密码学的非对称加密算法中,RSA算法依然是一种主流,但是随着比特币中对于一种之前不太流行的算法:椭圆加密算法(ECC)的成功应用后,这种算法得到了很大的关注和普及.有一种说法是中本聪不信任RSA算法,认为美国人在其中留有后门,而据斯诺登的爆料也确实如此.相较RSA,ECC不仅在某种程度上杜绝所谓留有后门的情况,而且加密性能/安全性都有提高.本文就带大家一窥ECC算法的天地. 鉴于ECC算法对数学知识要求比较高,不像RSA依赖于中学数学的水平,ECC用到了许多<近世代数基础>,<初等

002/区块链核心概念与原理详解(Mooc)

视频地址:https://www.imooc.com/learn/988 1.课程介绍 (一).区块链前世今生 密码朋克--神秘组织(邮件组) 2.区块链核心概念与原理 (一)比特币是数字货币 为什么叫区块链? 因为比特币系统里面的数据是一个个的区块来存储,并且通过hash方式将一个个区块链接起来.这样就形成了一个区块的链条叫区块链. 什么是比特币? 一串数字可以用于货币交换叫数字货币或虚拟货币--比特币 比特币就是一个虚拟货币,它的价值来源于大家的信任.在区块链中通常称为共识.(大家认为它有价

IOS问题汇总:2015-1-9 IOS之NSArray 中调用的方法详解(转)

IOS之NSArray 中调用的方法详解 下面的例子以 NSArray *array = [NSArray arrayWithObjects:@“wendy”,@“andy”,@“tom”,@“jonery”,@“stany”, nil];1.获取数组中总共有多少个对象. -(NSUInteger)count; NSLog(@“%d”,[array count]); 2 2.获取数组中下标对应的元素对象.(下标是从0开始) -(id)objectAtIndex:(NSUInteger)index