Hyperledger Fabric中如何实现用户私钥手动签名交易并提交?
解决Hyperledger Fabric自定义私钥签名交易提交问题
核心逻辑
Fabric的拆分交易流程(创建提案→签名→提交)支持完全自定义签名环节,你需要绕过钱包内置的签名校验逻辑,直接用用户自有私钥完成签名,并确保提交时Fabric节点认可该签名的合法性。
具体实现步骤
1. 生成未签名的交易提案
使用Fabric SDK创建交易提案时,不要调用自动签名的提交方法,而是生成原始的未签名提案字节流。以Node.js的fabric-gateway SDK为例:
// 假设已完成gateway连接、contract实例初始化 const transaction = contract.createTransaction('YourChaincodeMethod'); // 获取未签名的提案二进制数据 const unsignedProposal = await transaction.createProposal();
2. 用用户私钥签名提案
确保用户私钥为Fabric兼容的PEM格式(ECDSA类型),对提案字节流做SHA-256哈希后签名:
const crypto = require('crypto'); const { KEYUTIL } = require('jsrsasign'); // 加载用户自有私钥 const userPrivateKeyPem = '-----BEGIN PRIVATE KEY-----\n...用户私钥内容...\n-----END PRIVATE KEY-----'; const privateKey = KEYUTIL.getKey(userPrivateKeyPem); // 生成符合Fabric要求的签名 const hash = crypto.createHash('sha256').update(unsignedProposal).digest(); const signature = KEYUTIL.sign(privateKey, hash, 'SHA256withECDSA');
3. 组装签名交易并提交
将签名后的提案和签名值组装为完整请求,直接调用网关的签名提案提交方法,跳过钱包的默认签名逻辑:
// 构造已签名提案对象 const signedProposal = { proposalBytes: unsignedProposal, signature: Buffer.from(signature, 'hex') }; // 获取节点背书结果 const endorsement = await gateway.getNetwork('yourChannel').submitSignedProposal(signedProposal); // 构造交易提交请求 const commitRequest = { transactionId: transaction.getTransactionId(), endorsement: endorsement }; // 提交交易到排序节点 const commitResult = await gateway.getNetwork('yourChannel').commitTransaction(commitRequest);
4. 关键配置:替换默认签名器
初始化gateway时,必须配置自定义签名器,覆盖钱包的默认签名逻辑,避免出现“未使用钱包密钥签名”的报错:
const gateway = new Gateway(); await gateway.connect(connectionProfile, { identity: { mspId: 'YourOrgMSP', credentials: { // 提供用户对应的身份证书(需已被Fabric MSP认可) certificate: '-----BEGIN CERTIFICATE-----\n...用户证书内容...\n-----END CERTIFICATE-----' } }, signer: { // 自定义签名函数,直接使用用户私钥签名 sign: (data) => { const hash = crypto.createHash('sha256').update(data).digest(); return KEYUTIL.sign(privateKey, hash, 'SHA256withECDSA'); } } });
常见问题排查
- 报错“未使用钱包密钥签名”:检查gateway初始化时是否配置了自定义
signer,确保覆盖了默认的钱包签名器。 - 签名无效:确认签名为DER编码的ECDSA格式,用户私钥与提交的身份证书必须一一对应。
- 交易被拒绝:确保用户的身份证书已被加入Fabric对应MSP的证书信任列表,节点才会认可该身份的签名。
内容的提问来源于stack exchange,提问作者Eduardo Valente
相关产品推荐
相关产品推荐

