Grpc

Pc节点提供了grpc的接口调用方式,通过官方定义好的.proto文件和编译好的proto.js,proto.d.ts,用户可以按参数规范,调用已开放的grpc接口和节点进行交互。

目前,我们已支持:

  1. Win10 64位以及Windows Server2008+操作系统

  2. Linux 操作系统

  3. Mac操作系统

安装环境

安装依赖npm i \@grpc/grpc-js

安装依赖npm i \@grpc/proto-loader

  1. 下载.proto文件解压至根目录将官网下载的附件解压至根目录,下图中该目录名为grpc,目录中带有.proto文件和proto.js、proto.d.ts




接口调用示例

下述代码以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);
})();