1
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。重要的气体估计也可能是合约代码中存在问题的迹象。请检查循环并确保你做到了未将价值发送给非应付函数”。我没有写太多代码,但它仍然给了我这个错误。任何人都可以帮忙吗?

4

1 回答 1

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 {}
于 2018-02-24T08:24:12.067 回答