Can not estimate: NotEnoughCash
如果在发送交易时遇到错误:Can not estimate: transaction execution failed, all gas will be charged (execution error: NotEnoughCash { required: xx, got: xx, actual_gas_cost: xx, max_storage_limit_cost: xx }) 则表示交易的 from 账户余额不足
。此种情况需要检查是否交易的 gasPrice,gas,storageLimit 设置过大,或者给 from 账号准备足够的余额,或给合约设置代付.
错误详情
此错误是由RPC 方法 cfx_estimateGasAndCollateral
返回(从v2.0.2开始),在调用该方法时,如果参数中设置了 from
信息,会使用 from
账户的真实 balance 来模拟执行交易,如果账户的余额不足以支付交易的 value + gas*gasPrice + storage抵押费,则 estimate 操作将会失败,并返回如下错误:
{
"code": -32015,
"message": "Can not estimate: transaction execution failed, all gas will be charged (execution error: NotEnoughCash { required: 18014398509481983999023437515000000, got: 0, actual_gas_cost: 0, max_storage_limit_cost: 18014398509481983999023437500000000 })",
"data": "0x4e6f74456e6f75676843617368207b2072657175697265643a2031383031343339383530393438313938333939393032333433373531353030303030302c20676f743a20302c2061637475616c5f6761735f636f73743a20302c206d61785f73746f726167655f6c696d69745f636f73743a203138303134333938353039343831393833393939303233343337353030303030303030207d"
}
在 estimate 操作检查 balance 可大大减少 pending 交易。目前 TestNet 公开 RPC 节点已完成升级,cfx_estimateGasAndCollateral
该方法参数的默认值如下:
- gasPrice: 1 Drip
- gas: 1500w
另外从 v2.0.2 开始,发送交易的最低 gasPrice 提高到了 1GDrip
如何分析余额不足的具体原因
可通过如下步骤检查具体不足原因:
- 检查发送账户是否有余额
- 如果发送账户有余额,检查是否 gas, gasPrice, storageLimit 设置过大,余额不足有可能是某项设置过大导致的,比如 storageLimit
- 如果交易接受账户是一个合约,且合约有 sponsor,检查
- 燃气费赞助余额,抵押存储赞助余额是否足够
- 发送账户是否在赞助白名单中
- 本笔交易的燃气费是否在燃气费赞助
upperBound
以内
注意:可使用 Scan 的赞助页面查看合约的赞助余额,可通过 SponsorWhitelistControl 合约的读写合约功能,查看白名单设置情况
合约设置了赞助商,为什么还是报此错误
用户可能会遇到此种情况:交易的 to 地址是一个合约,且合约已经设置了赞助商,但发送交易时还是报 NotEnoughCash 错误。此种情况可能是由两个原因导致的:
- 合约代付的白名单可能没有正确设置,交易的 from 地址不在白名单里,所以代付未生效
- 交易的 gasFee(gasPrice * gas) 超过了燃气代付的上限(upperbound), 所以代付未生效
解决办法
解决此错误可使用如下方法之一:
- 可尝试在预估燃气费时将 gasPrice 设为 1Drip,得到预估值后发送交易时再把燃气费设为正确的值比如 1GDrip。
- 直接升级最新版本的 SDK(js,go,java), 目前最新版本的SDK 已针对此 case 做了处理
- 如果条件允许,可提高合约燃气赞助的 upperbound 到 0.05 CFX
No Comments