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

签名合约后发送交易失败:eth_sendRawTransaction RPC请求报错求助

问题排查与修复方案

咱们先拆解你代码里的核心问题,一步步解决交易发送失败的问题:

1. 第二个尝试的致命错误

你在Attempt #2里踩了个大坑:signedTx是完整的已签名交易字符串,绝对不能把它塞到TransactionInput.Data字段里!Data字段应该放的是合约调用的ABI编码数据(也就是TransferFunction转换后的字节码),而不是整个签名好的交易。另外,SendTransaction.SendRequestAsync是给那些让节点帮忙签名的场景用的,你已经自己完成签名了,这个接口完全不适合你的需求,这就是第二个尝试直接失败的原因。

2. 第一个尝试的潜在问题点

第一个尝试的方向是对的(直接发已签名的原始交易),但参数配置里有几个容易踩的坑:

  • GasPrice单位错了:你设置的GasPrice = 5,这里在Nethereum里默认是Wei单位,5 Wei的GasPrice远低于BSC链的最低要求(BSC通常要求至少5 Gwei),节点直接会拒绝这个交易。正确的写法应该是Web3.Convert.ToWei(5, UnitConversion.EthUnit.Gwei)。
  • Nonce手动设置风险高:你硬写了Nonce = 57,但Nonce必须和你账户当前的交易计数完全匹配(可以用web3.Eth.Transactions.GetTransactionCount.SendRequestAsync(你的钱包地址, BlockParameter.CreatePending)获取最新的pending状态Nonce),如果Nonce重复或者太小,交易肯定失败。
  • 没指定ChainId:在BSC这类非以太坊主网的链上签名,必须指定ChainId(BSC是56),否则签名会被认为是无效的跨链签名。
  • TokenAmount和Value混淆:如果这是ERC20转账函数,TokenAmount要注意代币的小数位数(比如18位小数的话,1个代币要传1e18),而Value字段应该设为0(ERC20转账不需要转ETH),你在第二个尝试里设了Value = 100,这会额外转100 Wei的ETH,可能不是你要的,也可能干扰交易。

修正后的完整代码

针对BSC链(ChainId=56),给你改好的代码:

// 1. 正确准备合约调用参数
var mintMsg = new TransferFunction() 
{ 
    // 假设代币是18位小数,这里转成1个代币的最小单位
    TokenAmount = Web3.Convert.ToWei(1, UnitConversion.EthUnit.Ether), 
    To = "0x6f78e96E4cDeca2F1e121f23Bc2effBaaea05E8f", 
    // 获取当前账户的pending状态Nonce,避免重复或过期
    Nonce = await web3.Eth.Transactions.GetTransactionCount.SendRequestAsync(你的钱包地址, BlockParameter.CreatePending), 
    // 5 Gwei,符合BSC的GasPrice要求
    GasPrice = Web3.Convert.ToWei(5, UnitConversion.EthUnit.Gwei), 
    Gas = 70000,
    // 指定BSC的ChainId,确保签名有效
    ChainId = 56 
};

// 2. 签名交易(记得传入你的钱包地址,确保用正确的账户签名)
var txHandler = web3.Eth.GetContractTransactionHandler<TransferFunction>();
var signedTx = await txHandler.SignTransactionAsync(合约地址, mintMsg, 你的钱包地址);

// 3. 发送已签名的原始交易
var txHash = await web3.Eth.Transactions.SendRawTransaction.SendRequestAsync(signedTx);

// 4. 可选:等待交易上链获取回执
var txReceipt = await web3.Eth.Transactions.GetTransactionReceipt.SendRequestAsync(txHash);
while (txReceipt == null)
{
    await Task.Delay(1000);
    txReceipt = await web3.Eth.Transactions.GetTransactionReceipt.SendRequestAsync(txHash);
}

额外排查技巧

  • 抓错误日志:捕获RpcException,打印Exception.Message,节点会返回具体错误(比如"nonce too low"、"gas price too low"),这是最快定位问题的方法。
  • 核对私钥和地址:确保签名用的私钥对应你要发交易的账户,不然签名完全无效。
  • 检查合约ABI:确认TransferFunction和合约的ABI完全匹配(函数名、参数类型不能错),不然合约调用会失败。

内容的提问来源于stack exchange,提问作者Hy Tửng Mít Tơ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 00:57:37