在即將正式發布的Hyperledger Fabric SDK 1.0中,Hyperledger Fabric通過gRPC提供服務接口以取代現有的REST API。本文介紹了如何使用Node.JS訪問Hyperledger Fabric的gRPC服務。
Hyperledger Fabric的gRPC服務接口可以通過安裝Hyperledger fabric Client (HFC)獲取。
在工作目錄下運行如下npm
命令以安裝HFC。
npm install hfc
gRPC接口定義文件(.proto)都在HFC的lib\protos
下
api.proto
ca.proto
chaincode.proto
chaincodeevent.proto
devops.proto
events.proto
fabric.proto
server_admin.proto
其中的api.proto
定義了名為Openchain
的服務, 該服務提供了若干個接口以獲取Hyperledger Fabric區塊網絡的具體信息。
// Interface exported by the server.
service Openchain {
// GetBlockchainInfo returns information about the blockchain ledger such as
// height, current block hash, and previous block hash.
rpc GetBlockchainInfo(google.protobuf.Empty) returns (BlockchainInfo) {}
// GetBlockByNumber returns the data contained within a specific block in the
// blockchain. The genesis block is block zero.
rpc GetBlockByNumber(BlockNumber) returns (Block) {}
// GetBlockCount returns the current number of blocks in the blockchain data
// structure.
rpc GetBlockCount(google.protobuf.Empty) returns (BlockCount) {}
// GetPeers returns a list of all peer nodes currently connected to the target
// peer.
rpc GetPeers(google.protobuf.Empty) returns (PeersMessage) {}
}
以下代碼使用GetBlockCount
接口獲取區塊總數。
var fs = require('fs');
var grpc = require('grpc');
var ProtoBuf = require("protobufjs");
var apiProto = grpc.load("./protos/api.proto").protos;
var client = new apiProto.Openchain('192.168.99.100:7051', grpc.credentials.createInsecure());
client.getBlockCount({}, function(err, blockCount) {
if (err) {
console.log("Error :" + err);
} else if (blockCount) {
console.dir(blockCount, { depth: null });
}
});
GetBlockCount
接口返回一個BlockCount
消息, 該消息包含一個count
成員, 也就是當前網絡中的區塊總數。
message BlockCount {
uint64 count = 1;
}
以下代碼則使用GetBlockByNumber
接口獲取某個區塊的信息。
function callbackForBlock(blockNumber) {
return function(err, block) {
console.log("Block[" + blockNumber.number + "]");
if (err) {
console.log("Error :" , err);
} else if (block) {
console.dir(block, { depth: null });
}
console.log("=======================");
};
}
for (var n=0; n<blockCount.count; n++) {
var blockNumber = {
number : n
};
client.getBlockByNumber(blockNumber, callbackForBlock(blockNumber));
}
GetBlockByNumber
接口需要一個輸入參數, 用於指定區塊號碼,其返回消息則是一個Block
消息, 其數據結構定義在fabric.proto
中。
總結
本文介紹了一個使用Node.JS訪問Hyperledger Fabric gRPC服務的示例程序。