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
相关产品推荐
相关产品推荐

