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

