2017-12-24 22 views
2

私はスマートな契約を結んでおり、このビデオは以下の通りです:https://www.youtube.com/watch?v=s677QFT6e4U&t=911s。コードを正確にコピーしましたが、フォールバック関数を呼び出そうとすると、次のエラーが発生します。Gas required exceeds block gas limit: 300000000。次のようにフォールバック機能は、(それが何もしない)であるにもかかわらず:必要ガスがブロックガス制限のフォールバック機能を超えています

これはあまりにも多くのガスを使用することができる方法

function() payable { 
 

 
}

契約コード:

pragma solidity ^0.4.11; 
 

 
import './IERC20.sol'; 
 
import './SafeMath.sol'; 
 

 
contract AToken is IERC20 { 
 
    
 
    using SafeMath for uint256; 
 
    
 
    uint256 public _totalSupply = 0; 
 
    uint256 public constant hardLimit = 45000000; 
 
    string public constant symbol = "ABC"; 
 
    string public constant name = "Alphabet"; 
 
    uint8 public constant decimals = 18; 
 
    
 
    //1 ETH = 25000 Alphabet 
 
    uint256 public constant RATE = 25000; 
 
    
 
    address public owner; 
 
    
 
    mapping(address => uint256) balances; 
 
    mapping(address => mapping(address => uint256)) allowed; 
 
    
 
    function() payable { 
 
     createTokens(); 
 
    } 
 
    
 
    function SnapToken() { 
 
     owner = msg.sender; 
 
    } 
 
    
 
    function createTokens() payable { 
 
     //require(msg.value > 0); 
 
     //uint256 tokens = msg.value.mul(RATE); 
 
     //require(tokens.add(_totalSupply) <= hardLimit); 
 
     //balances[msg.sender] = balances[msg.sender].add(tokens); 
 
     //_totalSupply = _totalSupply.add(tokens); 
 
     //owner.transfer(msg.value); 
 
    } 
 
    
 
    function totalSupply() constant returns (uint256 totalSupply) { 
 
     return _totalSupply; 
 
    } 
 
    
 
    function balanceOf(address _owner) constant returns (uint256 balance) { 
 
     return balances[_owner]; 
 
    } 
 
    
 
    function transfer(address _to, uint256 _value) returns (bool success) { 
 
     require(balances[msg.sender] >= _value && _value > 0); 
 
     balances[msg.sender] = balances[msg.sender].sub(_value); 
 
     balances[_to] = balances[_to].add(_value); 
 
     Transfer(msg.sender, _to, _value); 
 
     return true; 
 
    } 
 
    
 
    function transferFrom(address _from, address _to, uint256 _value) returns (bool success) { 
 
     require(allowed[_from][msg.sender] >= _value && balances[_from] >= _value && _value > 0); 
 
     balances[_from] = balances[_from].sub(_value); 
 
     balances[_to] = balances[_to].add(_value); 
 
     allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value); 
 
     Transfer(_from, _to, _value); 
 
     return true; 
 
    } 
 
    
 
    function approve(address _spender, uint256 _value) returns (bool success) { 
 
     //allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_value); 
 
     Approval(msg.sender, _spender, _value); 
 
     return true; 
 
    } 
 
    
 
    function allowance(address _owner, address _spender) constant returns (uint256 remaining) { 
 
     return allowed[_owner][_spender]; 
 
    } 
 
    event Transfer(address indexed _from, address indexed _to, uint256 _value); 
 
    event Approval(address indexed _owner, address indexed _spender, uint256 value); 
 
}

私は、これはガスの要件を減らすが、残念ながらありませんかどうかを確認するためにいくつかのものをコメントアウト。あなたは前にこれに直面しましたか? (リミックスでテスト済み)フォールバック関数を呼び出すとき

おかげ

+0

契約書とクライアントコードを記載してください。 –

+0

@AdamKipnis、添付のコードを見つけてください。 – SwimmingG

答えて

2

契約は、掲載され、実行しません。ただし、ロジックのコメントを解除するとエラーになりますcreateTokens()

フォールバック機能はガスの制限値が低く(2300)、できるだけ制限があります。ストレージに書き込む、外部の関数を呼び出す、イーサーネットを送信するなど、即座に上限に達するようなことはできません。これは主に、あなたの契約がetherを受信し、イベントを記録できるようにするために使用する必要があります。

上記の例では、代替機能でcreateTokens()への呼び出しを削除し、その機能をクライアントから直接呼び出すだけです。

Documentation on Fallback Functions

例のクライアントコード:

const abiDefinition = ...; 
const contractAddress = ...; 
const account = ...; 
const amountInEther = ...; 

const contract = web3.eth.contract(abiDefinition); 
const contractInstance = contract.at(contractAddress); 

const transactionObj = { 
    from: account, 
    value: web3.toWei(amountInEther, 'ether'), 
}; 

contractInstance.createTokens.sendTransaction(transactionObj, (error, result) = { 
    ... 
}; 

また、サイドノートとして、あなたの値の計算が間違っています。 msg.valueはエーテルではなく、魏にある。 1つのエーテルで送信すると、あなたのhardlimitの上にうまくいく。あなたの契約でWeiと協力することをお勧めしますので、RATEを調整してください。

+0

答えに感謝します。私は今夜​​もう一度試してみるよ。 createTokensを呼び出す代わりに何をすることをお勧めしますか?それは投資家が契約に支払ったときに私が結局呼び出す必要のある機能です。ありがとう! – SwimmingG

+1

'sendTransaction()'コールでエーテルを送ることができます。 JSクライアント呼び出しの例を使って答えを更新します。 –

+0

ビデオはSolidityの古いバージョンを使用していましたが、現在はガスの方が効率的な他の関数呼び出しがあります。ありがとうございました! – SwimmingG

関連する問題