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

如何用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.proto
  • orderer/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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 20:47:39