Pc节点提供了grpc的接口调用方式,通过官方定义好的.proto文件和编译好的proto.js,proto.d.ts,用户可以按参数规范,调用已开放的grpc接口和节点进行交互。
目前,我们已支持:
Win10 64位以及Windows Server2008+操作系统
Linux 操作系统
Mac操作系统
安装依赖npm i \@grpc/grpc-js
安装依赖npm i \@grpc/proto-loader
下述代码以typescript为例,实现一个通用的grpc客户端来调用接口。
import * as grpc from "@grpc/grpc-js";
import * as protoLoader from "@grpc/proto-loader";
import {
BFChainService, GetLastBlockReply, GetBlockReply,
TrTransferAssetReply
} from "../grpc/src/proto";
const PROTO_PATH = process.cwd() + "/grpc/protos/bfchain.proto";
export class GrpcClient {
public ip: string = "";
//BFChainService里定义了所有可用的grpc接口
private _client!: BFChainService;
constructor() { }
async init(ip: string = "localhost"): Promise<void> {
this.ip = ip; // 连接的服务器ip
const packageDefinition = protoLoader.loadSync(PROTO_PATH, {
keepCase: true,
longs: String,
enums: String,
defaults: true,
oneofs: true,
});
const proto = grpc.loadPackageDefinition(packageDefinition);
const port = 19005; // 连接的服务器端口
const Service = proto["BFChainService"];
const service = new Service(`${this.ip}:${port}`,
grpc.credentials.createInsecure());
return new Promise((resolve, reject) => {
const WAIT_CONNECT_MS = 2000; // 连接超时事件
service.waitForReady(Date.now() + WAIT_CONNECT_MS, err => {
if (err) {
return reject(err);
}
this._client = service as any;
resolve();
});
});
}
/**
* 获取最新区块
*/
async getLastBlock(): Promise<GetLastBlockReply> {
return new Promise((resolve, reject) => {
this._client.getLastBlock({}, (err, response) => {
if (err) {
return reject(err);
}
resolve(response);
});
});
}
/**
* 根据高度获取区块
*/
async getBlock(height: number): Promise<GetBlockReply> {
return new Promise((resolve, reject) => {
this._client.getBlock({ height: height.toString() }, (err, response) => {
if (err) {
return reject(err);
}
resolve(response);
});
});
}
}
(async () => {
const client = new GrpcClient();
await client.init();
//获取最新区块
await client.getLastBlock();
//获取高度为100的区块
await client.getBlock(100);
})();