Solidity
Remix 中的氣體估算失敗
不能像寫的那樣真正使用傳遞函式。它假定所有者使用它。所以為水龍頭使用的“鑄幣”功能做了一個新的功能。不知道為什麼編譯器消息如此神秘。
totalSupply_ = totalSupply_.add(_amount); balances[_to] = balances[_to].add(_amount); emit Mint(_to, _amount); emit Transfer(address(0), _to, _amount);
嘗試為我的 ERC-20 代幣創建水龍頭,並在執行我的
dripToken
函式時得到“氣體估計失敗”,如下所示(更新):function dripToken() public { require(faucetStatus); if(!checkStatus(msg.sender)) revert(); tokenInstance.updateSupply(oneToken); updateStatus(msg.sender, oneMinute); tokenInstance.transfer(msg.sender, oneToken); }
我已將其範圍縮小到導致錯誤的轉移呼叫行。我現在部署我的 ERC-20 代幣並通過以下方式將其傳遞到水龍頭合約中:
constructor(string _fname, address _tokenInstance) public { tokenInstance = MyToken(_tokenInstance); faucetName = _fname; faucetStatus = true; emit FaucetOn(faucetStatus); }
我的令牌轉移函式來自https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/token/ERC20/StandardToken.sol 我剛剛注意到我收到關於轉移函式的編譯器警告,提示問題,但我不明白為什麼(還)。這是警告:
函式 StandardToken.transfer(address,uint256) 的 gas 需求 high:無限。如果一個函式的gas需求高於block gas limit,它就不能被執行。請避免在修改大面積儲存的函式或操作中出現循環(這包括清除或複制儲存中的數組)
function transfer(address _to, uint256 _value) public returns (bool) { require(_value <= balances[msg.sender]); require(_to != address(0)); balances[msg.sender] = balances[msg.sender].sub(_value); balances[_to] = balances[_to].add(_value); emit Transfer(msg.sender, _to, _value); return true; }
我通過以下方式創建我的令牌。我現在用少量供應初始化它。
contract MyToken is StandardToken { string public name; uint8 public decimals; string public symbol; constructor() public { StandardToken.balances[msg.sender] = 1000000000000000000; StandardToken.totalSupply_ = 1000000000000000000; name = "My Token"; decimals = 18; symbol = "MY"; } }
在Google驅動器上發布我的程式碼: https ://drive.google.com/open?id=1EvKEVhD8bR2oKS2W1XNRQpTqVbieUcmC
您必須指定呼叫轉移的地址。例如,如果您嘗試轉移 ERC20 代幣,程式碼如下:
ERC20TokenAddress.transfer(msg.sender, oneToken);
沒有前導地址,EVM 不知道正在傳輸什麼。
請參閱 OP 頂部的答案。我認為這是失敗的要求塊。不知道為什麼編譯器對此如此神秘。