如何用Node.js在Fabric v2.2中创建通道并安装链码?
在Fabric v2.2中用Node.js实现通道创建与链码安装
核心说明
通道创建、链码安装属于Fabric节点的管理类操作,不属于链上交易范畴,因此无法通过调用lscc/qscc等系统链码实现。这些操作需要直接调用Peer/Orderer节点的Admin gRPC接口,或者通过执行Fabric CLI命令完成。下面提供两种可行的Node.js实现方案:
方案一:通过child_process调用Fabric CLI命令
这种方式无需处理复杂的gRPC proto解析,直接复用Fabric官方CLI的能力,适合快速落地。
1. 链码安装示例
const { exec } = require('child_process'); // 链码安装命令,需替换为实际的节点地址、证书路径和链码信息 const installCmd = `peer lifecycle chaincode install -n mycc -v 1.0 -p github.com/chaincode/mycc/node --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt`; // 继承环境变量,确保CLI能读取MSP配置 exec(installCmd, { env: { ...process.env, CORE_PEER_LOCALMSPID: "Org1MSP", CORE_PEER_MSPCONFIGPATH: "/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp" } }, (error, stdout, stderr) => { if (error) { console.error(`安装失败: ${error.message}`); return; } if (stderr) { console.error(`命令错误输出: ${stderr}`); return; } console.log(`链码安装成功: ${stdout}`); });
2. 通道创建示例
const { exec } = require('child_process'); // 1. 生成通道交易文件 const generateTxCmd = `configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./mychannel.tx -channelID mychannel`; exec(generateTxCmd, (error, stdout, stderr) => { if (error) { console.error(`生成交易文件失败: ${error.message}`); return; } console.log(`通道交易文件生成完成`); // 2. 执行通道创建命令 const createChannelCmd = `peer channel create -o orderer.example.com:7050 -c mychannel -f ./mychannel.tx --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem`; exec(createChannelCmd, { env: { ...process.env, CORE_PEER_LOCALMSPID: "Org1MSP", CORE_PEER_MSPCONFIGPATH: "/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp" } }, (err, out, errOut) => { if (err) { console.error(`创建通道失败: ${err.message}`); return; } if (errOut) { console.error(`命令错误输出: ${errOut}`); return; } console.log(`通道创建成功: ${out}`); }); });
方案二:调用Peer/Orderer的Admin gRPC接口
如果需要更灵活的集成,可以直接通过Node.js调用Fabric节点的gRPC Admin接口,需先导入对应的proto文件并生成客户端。
1. 准备依赖与proto文件
安装gRPC相关依赖:
npm install grpc @grpc/proto-loader fs-extra
从Fabric源码中复制以下proto文件到项目目录:
peer/protos/peer/lifecycle.protoorderer/protos/orderer/ab.proto- 依赖的基础proto文件(如
common/common.proto、msp/msp.proto)
2. 链码安装gRPC调用示例
const grpc = require('grpc'); const protoLoader = require('@grpc/proto-loader'); const fs = require('fs-extra'); // 加载链码生命周期proto const lifecyclePackageDef = protoLoader.loadSync( './lifecycle.proto', { keepCase: true, longs: String, enums: String, defaults: true, oneofs: true, includeDirs: ['./protos'] } ); const lifecycleProto = grpc.loadPackageDefinition(lifecyclePackageDef).proto; // 创建Peer客户端连接(带TLS认证) const peerSslCreds = grpc.credentials.createSsl(fs.readFileSync('/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt')); const peerClient = new lifecycleProto.LifecyclePeer('peer0.org1.example.com:7051', peerSslCreds); // 读取预打包的链码包 const chaincodePackage = fs.readFileSync('./mycc.tar.gz'); // 构建安装请求 const installReq = { chaincode_install_package: chaincodePackage }; // 添加MSP身份凭证(需用Admin私钥对请求签名,此处简化处理,实际需生成合法签名) const metadata = new grpc.Metadata(); metadata.add('x-mspid', 'Org1MSP'); // 调用安装接口 peerClient.InstallChaincode(installReq, metadata, (err, res) => { if (err) { console.error(`链码安装失败: ${err.details}`); return; } console.log(`链码安装成功,包ID: ${res.package_id}`); });
3. 通道创建gRPC调用示例
const grpc = require('grpc'); const protoLoader = require('@grpc/proto-loader'); const fs = require('fs-extra'); // 加载Orderer的AtomicBroadcast proto const abPackageDef = protoLoader.loadSync( './ab.proto', { keepCase: true, longs: String, enums: String, defaults: true, oneofs: true, includeDirs: ['./protos'] } ); const abProto = grpc.loadPackageDefinition(abPackageDef).orderer; // 创建Orderer客户端连接 const ordererSslCreds = grpc.credentials.createSsl(fs.readFileSync('/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem')); const ordererClient = new abProto.AtomicBroadcast('orderer.example.com:7050', ordererSslCreds); // 读取通道交易文件 const channelTx = fs.readFileSync('./mychannel.tx'); // 构建广播请求(需用Admin私钥签名,此处简化处理) const broadcastReq = { envelope: { payload: channelTx, signature: Buffer.from('dummy-signature') // 实际需替换为合法的MSP签名 } }; // 调用广播接口创建通道 ordererClient.Broadcast(broadcastReq, (err, res) => { if (err) { console.error(`通道创建失败: ${err.details}`); return; } console.log(`通道创建响应: ${JSON.stringify(res)}`); });
注意事项
- 所有操作需确保Node.js进程拥有合法的MSP身份权限,可通过环境变量指定MSP配置路径,或在gRPC请求中携带签名凭证。
- 链码安装前需用
peer lifecycle chaincode package命令生成符合规范的链码包,包含链码代码和metadata.json。 - 通道创建需提前用
configtxgen生成通道交易文件,或通过代码动态构建配置更新结构。
内容的提问来源于stack exchange,提问作者npcxh
相关产品推荐
相关产品推荐

