【发布时间】:2021-08-02 17:14:16
【问题描述】:
谁能说出为什么在把这个函数放入Remix时会产生上述警告?
function doFlip() public{
uint256 blockValue = uint256(blockhash(block.number - 1));
uint256 coinFlip = uint256(uint256(blockValue)/FACTOR);
side = coinFlip == 1 ? true : false;
flipper.flip(side);
}
完整的合同如下:
//SPDX-License-Identifier: Unlicensed
pragma solidity ^0.6.0;
import "@openzeppelin/contracts-ethereum-package/contracts/math/SafeMath.sol";
interface CoinFlip {
function flip(bool guess) external returns (bool);
}
contract Flipper {
using SafeMath for uint256;
uint256 FACTOR = 57896044618658097711785492504343953926634992332820282019728792003956564819968;
bool public side;
CoinFlip public flipper;
constructor() public {
flipper = CoinFlip(xxxxxxxxxx);
}
function doFlip() public{
uint256 blockValue = uint256(blockhash(block.number - 1));
uint256 coinFlip = uint256(uint256(blockValue)/FACTOR);
side = coinFlip == 1 ? true : false;
flipper.flip(side);
}
}
CoinFlip 合约如下所示:
/ SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import '@openzeppelin/contracts/math/SafeMath.sol';
contract CoinFlip {
using SafeMath for uint256;
uint256 public consecutiveWins;
uint256 lastHash;
uint256 FACTOR = 57896044618658097711785492504343953926634992332820282019728792003956564819968;
constructor() public {
consecutiveWins = 0;
}
function flip(bool _guess) public returns (bool) {
uint256 blockValue = uint256(blockhash(block.number.sub(1)));
if (lastHash == blockValue) {
revert();
}
lastHash = blockValue;
uint256 coinFlip = blockValue.div(FACTOR);
bool side = coinFlip == 1 ? true : false;
if (side == _guess) {
consecutiveWins++;
return true;
} else {
consecutiveWins = 0;
return false;
}
}
}
【问题讨论】:
-
CoinFlip合约是否部署在构造函数中定义的地址上?在 Remix 本地网络上还是在其他网络上(例如 Rinkeby、Ropsten、...)? -
是的,确实,部署在同一个网络上
-
在这种情况下,您能否更新问题并分享
flip()函数体(以及它所访问的合约属性等依赖项)?我的猜测是flip()函数有一个失败的require()条件会引发异常,并且由于doFlip()没有捕获异常,它会恢复交易 - 导致无限气体量消息。但这只是猜测,没有重现问题的代码和值。 -
添加了具有flip()函数的CoinFlip合约。如您所见,它没有任何要求,看起来很基本