如何强制Monero广播余额不足的无效交易用于端到端测试?
解决Monero钱包RPC无法广播余额不足交易的问题
Monero的transfer RPC方法本身会在钱包端做严格的余额校验,所以没法直接通过它发起余额不足的交易。要实现你的测试需求,可以从以下两个方向入手:
1. 手动构造无效交易并通过send_raw_transaction广播
钱包的校验是在本地完成的,你可以绕过钱包的逻辑,自己构造一笔余额不足的交易,再用节点的send_raw_transaction方法直接广播到网络:
- 步骤:
- 先用钱包的
get_transaction_template获取一个合法的交易模板 - 修改模板中的输出金额,让总输出超过钱包可用余额
- 对修改后的交易进行签名(签名只验证私钥匹配,不校验余额,所以即使余额不足也能完成签名)
- 将签名后的原始交易数据通过
send_raw_transactionRPC发送到节点
- 先用钱包的
示例curl命令(假设已构造好raw_tx):
curl --request POST \ --url http://127.0.0.1:38081/json_rpc \ --header 'Content-Type: application/json' \ --data '{"jsonrpc":"2.0","id":"0","method":"send_raw_transaction","params":{"tx_as_hex":"[构造好的原始交易十六进制字符串]"}}'
注意:send_raw_transaction是节点的RPC方法(默认端口38081),不是钱包RPC,无需钱包授权头。
2. 模拟未确认入账场景(更贴合测试需求)
你的核心需求是验证“入账确认前不允许支出”,其实不需要广播无效交易,而是可以在测试环境中模拟未确认余额的场景:
- 使用Monero测试网,给自己的钱包发送一笔交易,此时钱包会显示未确认余额
- 默认情况下,调用
transfer方法时钱包只会使用已确认余额,会直接拒绝使用未确认余额的转账请求 - 若要强制钱包尝试使用未确认余额,可在
transfer参数中添加allow_unconfirmed_inputs: true,此时钱包会发起交易,但网络会因输入未确认而无法完成确认,以此验证你的应用是否拦截这类操作
示例修改后的transfer请求:
curl --request POST \ --url http://127.0.0.1:38084/json_rpc \ --header 'Authorization: Basic [redacted]' \ --header 'Content-Type: application/json' \ --data '{"jsonrpc":"2.0","id":"0","method":"transfer","params":{"destinations":[{"amount":250000,"address":"[redacted]"}],"priority":0,"get_tx_metadata":true,"allow_unconfirmed_inputs":true}}'
内容的提问来源于stack exchange,提问作者Alice
相关产品推荐
相关产品推荐

