如何使用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
相关产品推荐
相关产品推荐

