Remix中Solidity的doFlip函数触发无限gas警告的原因是什么
问题解答:doFlip函数在Remix触发无限gas警告的原因
- 第一个原因是外部合约调用的gas消耗无法被静态预估:
你的doFlip函数中调用了外部合约CoinFlip的flip方法,Remix的内置静态gas估算器无法提前确定这个外部调用的具体gas消耗:
一方面你用来存储目标合约地址的flipper是可变的状态变量,不是固定的常量地址,静态分析阶段无法确认你最终调用的是哪份合约代码;另一方面外部函数的执行逻辑包含分支判断、状态读写等动态操作,无法在静态阶段算出准确gas值,因此Remix会给出“可能消耗无限gas”的警告,这属于Remix静态分析的常见提示,不代表代码执行时真的会耗尽所有gas。 - 第二个原因是合约存在无效地址占位符:
你在Flipper合约的构造函数中,给flipper赋值时用了xxxxxxxxxx作为地址占位符,如果你部署合约时没有将这个占位符替换为已经部署好的、合法的CoinFlip合约地址,那么调用doFlip时会尝试向无效地址(甚至零地址)发起外部调用,这类调用要么直接回滚,要么会消耗掉交易剩余的所有gas,这也是触发gas警告的诱因之一。 - 补充说明:
你代码里的blockhash读取、算术运算、状态赋值操作的gas消耗都是固定可预估的,不会触发gas警告,也不会真的出现无限gas消耗的情况,只要你部署时填入正确的CoinFlip合约地址,正常调用即可运行,警告仅来自Remix的静态分析限制。
内容的提问来源于stack exchange,提问作者Vlad
相关产品推荐
相关产品推荐

