排错:exceeds block gas limit

  • 胡键
  • 更新于 2023-08-02 18:08
  • 阅读 1354

排错:exceeds block gas limit

症状

调用合约方法却得到的错误信息:

MetaMask - RPC Error: [ethjs-query] while formatting outputs from RPC '{"value":{"code":-32000,"message":"exceeds block gas limit"}}'

同时,这个错误最诡异的地方是,之前同样的调用可能都是成功:即同样的 contract、同样的方法、同样的参数,甚至同样的 wallet。但突然之间就失败了

原因

与之前的排错贴不同,当你得到这个错误的时候,实际上 tx 并没有发出去,在 MetaMask 层面就被拒绝了。所以,你在错误信息中根本看不到任何跟 tx 或 contract 有关的信息,只有 MetaMask。

其根本原因在于:

  • 在以太坊中,每个块的 block gas limit 是不同的。新块的值由算法和 miner 投票决定。利用 ethers.js 你可以很方便的得到这个值:provider.getBlock('latest')).gasLimit
  • 若发送交易的 gas limit 超过它,你就得到了这个错误。

假如你的方法中的 gas limit 是动态算出来的,就有可能得到这个错误。关于如何使用 ethers.js 预估 gas,可参见下面的文章。

解决

病因已经找到,解决自然就不是难事:调整 gas limit 计算,使之尽可能准确且不超过 block gas limit 就行了。

【附】若对 ethers.js 或 MetaMask 不熟,可以参见:

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
胡键
胡键
CSM / 架构师 / 创业者,先后就职于中兴和 SAP,现专注于工业物联网、机器学习和区块链。同时,作为机器学习和区块链技术活动的组织者和分享者活跃于本地社区。