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

如何将Hyperledger Fabric 2.4测试网络中的chaincode/smart contract方法暴露为REST endpoints?

如何将Hyperledger Fabric 2.4测试网络中的chaincode/smart contract方法暴露为REST endpoints?

当然可以啦!你已经搞定了链码的部署和CLI调用,接下来把这些链码方法转成REST接口给前端用,本质就是搭一个中间层服务,帮你把HTTP请求转换成Fabric的链码调用请求,再把结果返回给前端。下面给你两种实用的实现思路,还有具体的操作参考:

方法一:自己开发自定义REST中间层(灵活度最高)

这种方式适合需要定制接口逻辑、和现有前端项目无缝配合的场景,步骤如下:

  • 第一步:选一个你熟悉的后端框架,比如Node.js(搭配Fabric Node Gateway SDK)、Python(Fabric Python SDK)或者Java(Fabric Java SDK),Node.js因为和前端生态适配好,是最常用的选择。
  • 第二步:配置Fabric网络连接信息:把测试网络中organizations文件夹下的组织MSP信息、用户证书/密钥(比如organizations/peerOrganizations/org1.example.com/users/User1@org1.example.com/msp路径下的文件),还有connection-org1.json(组织的连接配置文件)复制到你的后端项目里。
  • 第三步:用Fabric Gateway SDK封装链码操作:
    • 写一个POST接口(比如/api/invoke),接收前端传来的链码名称、方法名、参数,调用SDK的submitTransaction方法执行链码的写入操作;
    • 写一个GET接口(比如/api/query),处理查询请求,调用evaluateTransaction方法执行链码的读取操作。
  • 第四步:测试接口:用Postman或者前端直接发请求,确认能正确调用链码并返回结果,之后就可以对接你的前端项目了。

方法二:使用现成模板快速搭建(省时间)

如果你不想从头写服务,可以用现成的Node.js模板快速生成REST接口,举个简单的示例:

  1. 先安装依赖:
    npm install express @hyperledger/fabric-gateway fabric-ca-client
    
  2. 编写基础服务代码(保存为server.js):
    const express = require('express');
    const { Gateway, Wallets } = require('@hyperledger/fabric-gateway');
    const fs = require('fs');
    const path = require('path');
    
    const app = express();
    app.use(express.json());
    
    // 初始化Fabric Gateway连接
    async function initGateway() {
      const walletPath = path.join(__dirname, 'wallet');
      const wallet = await Wallets.newFileSystemWallet(walletPath);
      // 确保User1身份已导入钱包(可以用Fabric CLI的`wallet import`命令导入)
      const identity = await wallet.get('User1@org1.example.com');
      if (!identity) throw new Error('钱包中未找到User1身份');
    
      // 加载组织连接配置
      const connectionProfile = JSON.parse(fs.readFileSync('./connection-org1.json', 'utf8'));
      const gateway = new Gateway();
      await gateway.connect(connectionProfile, {
        wallet,
        identity: 'User1@org1.example.com',
        discovery: { enabled: true, asLocalhost: true } // 测试网络下启用本地发现
      });
      return gateway;
    }
    
    // 链码查询接口
    app.get('/api/query', async (req, res) => {
      try {
        const { chaincodeName, method, args } = req.query;
        const gateway = await initGateway();
        const network = await gateway.getNetwork('mychannel'); // 替换为你的通道名
        const contract = network.getContract(chaincodeName);
        // 处理参数,支持多参数用逗号分隔
        const result = await contract.evaluateTransaction(method, ...(args ? args.split(',') : []));
        res.json({ success: true, data: result.toString() });
        gateway.disconnect();
      } catch (err) {
        res.status(500).json({ success: false, error: err.message });
      }
    });
    
    // 链码调用(写入)接口
    app.post('/api/invoke', async (req, res) => {
      try {
        const { chaincodeName, method, args } = req.body;
        const gateway = await initGateway();
        const network = await gateway.getNetwork('mychannel');
        const contract = network.getContract(chaincodeName);
        const result = await contract.submitTransaction(method, ...args);
        res.json({ success: true, data: result.toString() });
        gateway.disconnect();
      } catch (err) {
        res.status(500).json({ success: false, error: err.message });
      }
    });
    
    // 启动服务,绑定到0.0.0.0让Windows能访问WSL2里的服务
    app.listen(3000, '0.0.0.0', () => {
      console.log('REST服务运行在端口3000');
    });
    
  3. 把测试网络中的connection-org1.json复制到项目根目录,并用Fabric CLI导入用户身份到钱包:
    wallet import --wallet ./wallet --identity User1@org1.example.com --cert ./organizations/peerOrganizations/org1.example.com/users/User1@org1.example.com/msp/signcerts/cert.pem --key ./organizations/peerOrganizations/org1.example.com/users/User1@org1.example.com/msp/keystore/<你的密钥文件名>_sk
    
  4. 启动服务:node server.js,之后就可以用Windows的浏览器或者Postman通过http://<WSL2的IP>:3000访问接口了(WSL2的IP可以用hostname -I命令查看)。

注意事项

  • 因为你在WSL2里跑测试网络,REST服务要绑定到0.0.0.0,确保Windows端能通过WSL2的IP访问到服务。
  • 确保证书和密钥的文件权限正确,避免服务读取失败。
  • 测试网络的节点监听地址默认配置已经满足WSL2内部访问的需求,不需要额外修改。

备注:内容来源于stack exchange,提问作者Abhignan Rakshith

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 12:29:37