Skip to main content

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 该方法参数的默认值如下:

  1. gasPrice: 1 Drip
  2. gas: 1500w

另外从 v2.0.2 开始,发送交易的最低 gasPrice 提高到了 1GDrip

如何分析余额不足的具体原因

可通过如下步骤检查具体不足原因:

  1. 检查发送账户是否有余额
  2. 如果发送账户有余额,检查是否 gas, gasPrice, storageLimit 设置过大,余额不足有可能是某项设置过大导致的,比如 storageLimit
  3. 如果交易接受账户是一个合约,且合约有 sponsor,检查
  • 燃气费赞助余额,抵押存储赞助余额是否足够
  • 发送账户是否在赞助白名单中
  • 本笔交易的燃气费是否在燃气费赞助 upperBound 以内

注意:可使用 Scan 的赞助页面查看合约的赞助余额,可通过 SponsorWhitelistControl 合约的读写合约功能,查看白名单设置情况

合约设置了赞助商,为什么还是报此错误

用户可能会遇到此种情况:交易的 to 地址是一个合约,且合约已经设置了赞助商,但发送交易时还是报 NotEnoughCash 错误。此种情况可能是由两个原因导致的:

  1. 合约代付的白名单可能没有正确设置,交易的 from 地址不在白名单里,所以代付未生效
  2. 交易的 gasFee(gasPrice * gas) 超过了燃气代付的上限(upperbound), 所以代付未生效

解决办法

解决此错误可使用如下方法之一:

  1. 可尝试在预估燃气费时将 gasPrice 设为 1Drip,得到预估值后发送交易时再把燃气费设为正确的值比如 1GDrip。
  2. 直接升级最新版本的 SDK(js,go,java), 目前最新版本的SDK 已针对此 case 做了处理
  3. 如果条件允许,可提高合约燃气赞助的 upperbound 到 0.05 CFX