2017-12-24 9 views
2

Ich arbeite an einem Smart-Vertrag und folgte diesem Video hier: https://www.youtube.com/watch?v=s677QFT6e4U&t=911s. Ich habe den Code genau kopiert, aber wenn ich versuche, die Fallback-Funktion aufzurufen, erhalte ich den folgenden Fehler: Gas required exceeds block gas limit: 300000000. Auch wenn die Ausweichfunktion ist wie folgt (es nichts tut):Gas benötigt Block Gas Limit Fallback-Funktion

function() payable { 
 

 
}

Wie könnte dies zu viel Gas verwenden?

CONTRACT Code:

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); 
 
}

kommentierte ich ein paar Sachen zu sehen, ob dies den Gasbedarf reduzieren würde, aber leider nicht. Hast du das schon einmal gesehen?

Dank

+0

Bitte geben Sie den Vertrag und Ihren Kundencode an. –

+0

@AdamKipnis, finden Sie den Code beigefügt. – SwimmingG

Antwort

2

Der Vertrag, wie geschrieben, nicht ausgeführt werden, wenn die Ausweichfunktion (Getestet Remix) aufrufen. Es wird jedoch fehlschlagen, sobald Sie die Logik in createTokens()

Ausweichfunktionen haben niedrige Gaslimits (2300) und sind daher sehr begrenzt in dem, was sie tun können. Sie können nicht Dinge wie in den Speicher schreiben, externe Funktionen aufrufen oder Ether senden, da Sie sofort das Limit erreichen. Es sollte in erster Linie verwendet werden, um Ihrem Vertrag zu ermöglichen, Ether zu empfangen und möglicherweise ein Ereignis zu protokollieren.

In dem Beispiel, das Sie oben veröffentlicht haben, entfernen Sie den Anruf zu createTokens() in Ihrer Fallback-Funktion und rufen Sie einfach diese Funktion direkt von Ihrem Client.

Documentation on Fallback Functions

Beispiel Client-Code:

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) = { 
    ... 
}; 

Auch als eine Randnotiz, sind Ihre Wertberechnungen falsch. msg.value ist in Wei, nicht Ether. Das Senden von 1 Äther bewirkt, dass Sie weit über Ihre hardlimit gehen. Es wird empfohlen, mit Wei in Ihren Verträgen zu arbeiten, also sollten Sie Ihre RATE anpassen.

+0

danke für die Antwort. Ich werde es heute Abend nochmal versuchen. Was würden Sie vorschlagen, anstatt createTokens aufzurufen? Das ist die Funktion, die ich schließlich anrufen muss, wenn der Investor in den Vertrag einzahlt. Vielen Dank! – SwimmingG

+1

Sie können den Ether mit dem Aufruf 'sendTransaction()' senden. Ich werde die Antwort mit einem Beispiel-JS-Client-Aufruf aktualisieren. –

+0

Also mehr, dass das Video eine veraltete Version von Solidity verwendet hat, und jetzt gibt es andere Funktionsaufrufe, die für Gas effizienter sind, nochmals vielen Dank! – SwimmingG