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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 20:43:19