所需气体超过限制:3000000。

时间:2018-02-24 07:12:12

标签: blockchain ethereum solidity smartcontracts remix

pragma solidity ^0.4.16;

contract createNewToken {
    uint256 total_ether_to_send;
    address private owner;

    //constructor
    function createNewToken() public{
        owner = msg.sender;
    }

    // client request for tokens by sending ether.
    function requestForToken() public payable{
        address sender = msg.sender;
        uint value = msg.value;
        total_ether_to_send = value;
        require(sender.balance >= total_ether_to_send);
        owner.transfer(total_ether_to_send);

        total_ether_to_send = value / 2;
        require(owner.balance >= total_ether_to_send);
        sender.transfer(total_ether_to_send);
    } 
}

我在Remix IDE中已经完整地编写了这段代码。合同成功创建,但是当我使用它时,它给了我一个错误,说"所需的气体超过限制:3000000。重要的气体估算也可能是合同代码中出现问题的迹象。请检查循环并确保您没有向非应付函数发送价值"。我没有写太多代码,但它仍然给了我这个错误。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

首先,您的msg.value已经发送到您的方法,因此您无需检查发件人余额:require(sender.balance >= total_ether_to_send);

第二次,您的合约中没有后备功能可以接收以太币。

第三次,您尝试向所有者发送100%msg.value,然后将50%的msg.value发送给发件人。显然,如果没有任何额外的资金,你不能花费150%的msg.value。以下是工作代码示例:

function requestForToken() public payable{
    address sender = msg.sender;
    uint value = msg.value;
    total_ether_to_send = value / 2;
    require(this.balance >= total_ether_to_send);
    owner.transfer(total_ether_to_send);

    require(this.balance >= total_ether_to_send);
    sender.transfer(total_ether_to_send);
} 

function() payable {}