Hyperledger Fabric 提供了软件开发包/SDK以帮助开发者访问fabric网络 和部署在网络上的链码,但是Hyperledger Fabric官方没有提供简单易用的REST API访问接口,在这个教程里我们将学习如何利用Hyperledger Fabric的SDK 来开发REST API服务器。
1、系统结构概述
整个系统包含两个物理节点:
- Fabric节点:运行Fabric示例中的First Network,并且实例化了Fabcar链码
- API服务器节点:运行REST API Server代码供外部访问
下面是部署在AWS上的两个节点实例的情况:
首先参考官方文档安装hyperledger fabric。
然后运行脚本fabcar/startFabric.sh
:
1 | cd fabric-samples/fabcar |
上述脚本运行之后,我们就得到一个正常运转的Hyperledger Fabric网络(著名的演示网络First Network),包含2个机构/4个对等节点,
通道为mychannel,链码Fabcar安装在全部4个对等节点上并且在mychannel上激活。账本中有10条车辆记录,这是调用
合约的initLedger
方法的结果。
现在我们为REST API Server准备身份标识数据。使用fabcar/javascript创建一个用户标识user1,我们将在REST API Server 中使用这个身份标识:
1 | cd javascript |
运行结果如下:
现在Rest API Server需要的东西都备齐了:
- org1的连接配置文件:first-network/connection-org1.json
- Node.js包文件:fabcar/package.json
- User1身份钱包:fabcar/javascript/wallet/user1/
后面我们会把这些数据文件拷贝到Rest API Server。
2、Rest API Server设计
我们使用ExressJS来开发API服务,利用query.js和invoke.js 中的代码实现与fabric交互的逻辑。API设计如下:
- GET /api/queryallcars:返回全部车辆记录
- GET /api/query/CarID:返回指定ID的车辆记录
- POST /api/addcar/:添加一条新的车辆记录
- PUT /api/changeowner/CarID:修改指定ID的车辆记录
3、Rest API Server代码实现
apiserver.js代码如下:
1 | var bodyParser = require('body-parser'); |
代码中对原来fabcar的query.js和invoke.js修改如下:
- ccpPath修改为当前目录,因为我们要使用同一路径下的连接配置文件connection-org1.json
- 在gateway.connect调用中,修改选项discovery.asLocalhost为false
4、Rest API Server的连接配置文件
API服务依赖于连接配置文件来正确连接fabric网络。文件 connection-org1.json 可以直接从 fabric网络中获取:
1 | { |
当fabcar/startFabric.sh执行时,我们可以交叉检查证书的传播是否正确。 peer0.org1和 peer1.org1 的证书是org1的 TLS root CA 证书签名的。
注意所有的节点都以localhost引用,我们稍后会将其修改为Fabric Node的 公开IP地址。
5、用户身份标识
我们已经在Fabric节点上生成了一个用户标识user1并保存在wallet目录中, 我们可以看到有三个对应的文件:私钥、公钥和证书对象:
稍后我们会把这些文件拷贝到Rest API Server上。
6、安装Rest API Server节点
1、首先在Rest API Server节点上安装npm、node:
1 | sudo apt-get update |
验证结果如下:
2、然后在Rest API Server上创建一个目录:
1 | mkdir apiserver |
3、接下来将下面的文件从Fabric节点拷贝到Rest API Server节点。我们 利用loccalhost在两个EC2实例间拷贝:
1 | # localhost (update your own IP of the two servers) |
运行结果如下:
4、可以看到现在所有的文件都拷贝到Rest API Server了,为了保持一致,我们将user1/改名为wallet/user1/:
1 | cd apiserver |
运行结果如下:
5、现在在Rest API Server上创建上面的apiserver.js文件。
6、修改连接配置文件connection-org1.json 中的fabric节点的ip地址:
1 | sed -i 's/localhost/[Fabric-Node-IP]/g' connection-org1.json |
运行结果如下:
7、在/etc/hosts中增加条目以便可以正确解析fabric节点的IP:
1 | 127.0.0.1 localhost |
运行结果如下:
8、安装必要的依赖包:
1 | npm install |
9、万事俱备,启动Rest API Server:
1 | node apiserver.js |
7、访问API
我们的API服务在8080端口监听,在下面的示例中,我们使用curl来 演示如何访问。
1、查询所有车辆记录
1 | curl http://[API-Server-Node-IP]:8080/api/queryallcars |
运行结果如下:
2、添加新的车辆记录并查询
1 | curl -d '{"carid":"CAR12","make":"Honda","model":"Accord","colour":"black","owner":"Tom"}' -H "Content-Type: application/json" -X POST http://[API-Server-Node-IP]:8080/api/addcar |
运行结果如下:
3、修改车辆所有者并再次查询
1 | curl http://[API-Server-Node-IP]:8080/api/query/CAR4 |
运行结果如下:
我们也可以用postman得到同样的结果:
原文链接:An Implementation of API Server for Hyperledger Fabric Network
汇智网翻译整理,转载请标明出处