You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Node.js SDK和TLS查询Hyperledger Fabric Go链码

嘿,既然你已经搞定了自定义Fabric网络和Fabcar示例的基础操作,那用Node.js SDK结合TLS查询Go链码其实就差几步配置和代码调整啦,我给你详细拆解一下:

使用Node.js SDK结合TLS查询Hyperledger Fabric Go链码

1. 先确认必备的文件与依赖

首先得确保你手头有这些关键文件(Fabcar示例里应该都有,记得对应你的自定义网络路径):

  • 所属组织的TLS根证书(比如tlsca.org1.example.com-cert.pem)
  • 查询用户的身份文件:私钥、证书,以及网络连接配置文件connection.json
  • 已经在通道上安装并实例化好Go版本的链码(不管是自定义的还是Fabcar的Go版)

另外,Node.js SDK的依赖要到位,没装的话在项目目录下执行:

npm install fabric-network fabric-client

2. 配置TLS连接参数

打开你的connection.json,一定要确保每个peer/orderer节点的配置都开启TLS支持,核心配置示例如下:

"peers": {
  "peer0.org1.example.com": {
    "url": "grpcs://peer0.org1.example.com:7051",
    "tlsCACerts": {
      "path": "/绝对路径/tlsca.org1.example.com-cert.pem"
    },
    "grpcOptions": {
      "ssl-target-name-override": "peer0.org1.example.com"
    }
  }
}

这里划重点:

  • 用grpcs://协议代替grpc://,这是TLS连接的标志
  • ssl-target-name-override必须和peer节点证书里的CN(通用名称)完全匹配,否则会触发TLS验证错误

3. 编写查询的Node.js代码

接下来是实际的查询逻辑,步骤很清晰:加载身份→创建网关连接→获取通道与链码→执行查询,直接上可复用的示例代码:

const { Gateway, Wallets } = require('fabric-network');
const path = require('path');
const fs = require('fs');

async function queryGoChaincode() {
    try {
        // 加载网络连接配置文件
        const ccpPath = path.resolve(__dirname, 'config', 'connection.json');
        const connectionProfile = JSON.parse(fs.readFileSync(ccpPath, 'utf8'));

        // 加载存储用户身份的钱包
        const walletPath = path.join(process.cwd(), 'wallet');
        const wallet = await Wallets.newFileSystemWallet(walletPath);

        // 验证查询用户是否存在于钱包中
        const userIdentity = await wallet.get('user1');
        if (!userIdentity) {
            console.log('用户"user1"的身份不在钱包中,请先运行registerUser.js创建身份');
            return;
        }

        // 创建网关并开启TLS连接
        const gateway = new Gateway();
        await gateway.connect(connectionProfile, {
            wallet,
            identity: 'user1',
            discovery: { enabled: true, asLocalhost: true }, // 本地测试时asLocalhost设为true,生产环境改为false
            tlsInfo: {
                certificate: fs.readFileSync(path.resolve(walletPath, 'user1-cert.pem'), 'utf8'),
                key: fs.readFileSync(path.resolve(walletPath, 'user1-private.pem'), 'utf8')
            }
        });

        // 获取目标通道
        const network = await gateway.getNetwork('mychannel');
        // 获取链码实例(替换成你的链码名称)
        const contract = network.getContract('fabcar');

        // 执行查询操作(这里用Fabcar的queryAllCars为例,替换成你的链码查询方法)
        const queryResult = await contract.evaluateTransaction('queryAllCars');
        console.log(`查询结果:${queryResult.toString()}`);

        // 关闭网关连接
        await gateway.disconnect();

    } catch (error) {
        console.error(`查询失败:${error}`);
        process.exit(1);
    }
}

// 执行查询
queryGoChaincode();

4. 几个关键注意事项

  • TLS证书一致性:客户端使用的TLS根证书必须和peer/orderer节点的证书来自同一个CA,否则会出现TLS握手失败
  • 用户权限:用来查询的用户必须拥有对应通道的查询权限,Fabcar示例里的user1已经配置好权限,但自定义用户需要提前在MSP中注册并授权
  • 查询方法选择:用evaluateTransaction做查询,因为它不会提交交易,不需要背书节点参与,性能更高;如果是修改账本的操作才用submitTransaction
  • 服务发现配置:如果你的网络启用了服务发现,discovery.enabled设为true,asLocalhost仅在本地测试时用true,生产环境要换成节点的实际域名

内容的提问来源于stack exchange,提问作者Arraphi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:16:48