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

Mina开发网支付交易发送失败:签名无效错误求助

Mina开发网支付交易签名无效(Invalid_signature)问题排查与解决

我在Mina开发网尝试签名并发送支付交易时失败,返回Invalid_signature错误,具体报错信息如下:

error - Error: Query failed -- returned code 200. mutation($from:PublicKey!, $to:PublicKey!, $amount:UInt64!, $fee:UInt64!, $memo:String, $scalar:String, $field:String, $nonce:UInt32){ sendPayment(input: { from:$from, to:$to, amount:$amount, fee:$fee, memo:$memo, nonce:$nonce }, signature:{ scalar: $scalar, field: $field, }) { payment { amount fee feePayer { publicKey token } feeToken from fromAccount { publicKey token } hash id isDelegation kind memo nonce receiver { publicKey token } source { publicKey token } to token toAccount { token publicKey } } } } | {'data': None, 'errors': [{'message': 'Couldn\'t send user_command: Error creating user command: {"payload":{"common":{"fee":"0.01","fee_token":"1","fee_payer_pk":"B62qqAMY1gz8kvEAyf1ioBLPCfbq8WqpLqGXTqUF9LBVf4HLSTXTnMb","nonce":"0","valid_until":"4294967295","memo":"E4YM2vTHhWEg66xpj52JErHUBU4pZ1yageL4TVDDpTTSsv8mK6YaH"},"body":["Payment",{"source_pk":"B62qqAMY1gz8kvEAyf1ioBLPCfbq8WqpLqGXTqUF9LBVf4HLSTXTnMb","receiver_pk":"B62qop7Eh2nAymEun27TJYhKA1rWyvGHgHGwFpQDF1ANhFt2zCqsVFU","token_id":"1","amount":"1"}]},"signer":"B62qqAMY1gz8kvEAyf1ioBLPCfbq8WqpLqGXTqUF9LBVf4HLSTXTnMb","signature":["Signature","7mX8NLNR3mWuEV7QvQi5Z7yEfJn13y3KNS9BBHo9B31UuMhzBm9G3jKKMXpMY1Lr6obrP9BfP92KfVxDfsoBwiDV93kT17Lg"]} Error: Invalid_signature', 'locations': [{'line': 1, 'column': 136}], 'path': ['sendPayment']}]}

对应的交易发送代码(transfer2函数)如下:

const transfer2 = async (sender: string, receiver: string, amount: number) => {

...
  let signedPayment = MinaSDK.signPayment({
    to: receiver,
    from: sender,
    amount: 1,
    fee: 10000000,
    nonce: json.account.nonce
  }, keys);

  res = await fetch(process.env.MINA_REST_URL! + '/broadcast/transaction', {
    method: 'POST',
    body: JSON.stringify(signedPayment),
    headers: {
      'Content-Type': 'application/json',
    },
  })

  json = await res.json()
  if (res.status !== 200) {
    throw new Error(json.error)
  }

  return json

}

可能的原因及解决步骤

  • 验证私钥与发送地址匹配
    确认keys对应的私钥属于sender指定的公钥地址。可通过MinaSDK.utils.getPublicKey(keys)获取私钥对应的公钥,与sender对比,确保两者完全一致。

  • 检查Nonce值有效性
    报错中显示nonce为0,需确认该值与发送账户当前最新nonce完全一致。Mina账户nonce随交易递增,建议通过节点API(如/accounts/${sender})实时获取最新值,避免使用过期缓存的json.account.nonce。

  • 确认交易参数一致性
    检查signPayment中的amount、fee、to、from等参数,是否与广播时发送的参数完全无差异。若签名时参数和实际广播参数存在偏差(如单位转换错误),会导致签名验证失败。

  • 排查SDK与节点版本兼容性
    不同版本的Mina SDK和节点可能存在签名算法或格式差异,导致签名无法被验证。确保使用的SDK版本与开发网节点版本兼容,优先选择官方推荐的稳定版本。

  • 验证签名格式正确性
    打印signedPayment内容,检查signature部分的scalar和field字段格式是否符合Mina节点API要求,确认签名结构未被意外修改。

内容的提问来源于stack exchange,提问作者att

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 03:29:56