如何将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方法执行链码的读取操作。
- 写一个POST接口(比如
- 第四步:测试接口:用Postman或者前端直接发请求,确认能正确调用链码并返回结果,之后就可以对接你的前端项目了。
方法二:使用现成模板快速搭建(省时间)
如果你不想从头写服务,可以用现成的Node.js模板快速生成REST接口,举个简单的示例:
- 先安装依赖:
npm install express @hyperledger/fabric-gateway fabric-ca-client - 编写基础服务代码(保存为
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'); }); - 把测试网络中的
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 - 启动服务:
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
相关产品推荐
相关产品推荐

