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

使用fabric-common模块实现交易离线签名的可行方案问询

基于fabric-common的网页端交易离线签名上链方案

该需求存在成熟可行的落地方案,用户仅通过web应用即可完成全部操作,无需依赖其他客户端工具。

核心实现逻辑

  • 依赖适配:fabric-common本身支持浏览器环境运行,仅需要在前端工程打包时对node原生crypto模块做polyfill,使用crypto-browserify作为替代即可,无需修改模块核心逻辑。
  • 私钥本地持有:已注册用户的私钥全程存储在用户浏览器本地,可选择加密存储到LocalStorage、IndexedDB,也支持用户手动导入本地私钥文件,私钥始终不会上传到服务端,完全由用户自身管控。
  • 全流程操作步骤:
    1. web端从配置或后端接口获取通道、链码、Fabric节点的基础信息,调用fabric-common提供的Channel、TransactionProposal相关接口在本地构造未签名的交易提案,该步骤无需服务端参与。
    2. 调用fabric-common内置的加密套件,使用用户本地存储的私钥对交易提案的哈希做离线签名,整个签名过程完全在浏览器内存中完成,无任何敏感数据外传。
    3. 签名完成后如果Fabric节点配置了CORS和gRPC-web/REST接口,web端可直接将签名后的交易提案发送给背书节点获取背书响应,再将多节点背书结果组装为正式交易,二次签名后广播到排序节点完成上链;如果节点未配置跨域,可将签名后的交易数据发送给后端做透传,后端仅负责转发数据,不会接触用户私钥也无法篡改交易内容,不影响安全性。

核心代码示例

// 加载已适配浏览器的fabric-common依赖
const { User, Client, Channel } = require('fabric-common');

// 用本地存储的用户证书、私钥初始化用户实例
const currentUser = User.createUser(
  'yourUsername',
  'yourOrgName',
  localStorage.getItem('userCert'), // 本地存储的用户证书
  localStorage.getItem('encryptedUserPrvKey') // 本地存储的加密私钥,解密后使用,此处仅做示例
);

const client = Client.newClient('myClient');
client.setUserContext(currentUser, true);
const channel = new Channel('myChannel', client);

// 本地构造交易提案
const transactionProposal = channel.newTransactionProposal({
  chaincodeId: 'myChaincode',
  fcn: 'yourFunctionName',
  args: ['arg1', 'arg2', 'arg3'],
  chainId: 'myChannel'
});

// 本地离线完成签名,私钥不会离开浏览器
const signedProposal = transactionProposal.sign(currentUser.getSigningIdentity());

注意:私钥存储到本地时必须做对称加密,加密密钥由用户设置的密码派生,避免本地存储数据泄露导致私钥被盗。

内容的提问来源于stack exchange,提问作者sohaib ali gill

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 07:57:05