Muster eines CrowdSale-Basisvertrags mit Gaslimit-Fehler

Hallo, ich habe den Basisvertrag von der offiziellen Website https://ethereum.org/crowdsale kopiert

Ich bin Anfänger in der Entwicklung von Solidity und Ethereum

Es wurde erfolgreich von Remix kompiliert, aber wenn ich auf der Registerkarte „Ausführen“ auf „Erstellen“ klicke, wird mir ein Fehler angezeigt

Erstellung von Crowdsale fehlerhaft: Benötigtes Gas überschreitet Limit: 300000. Eine wichtige Gasschätzung kann auch ein Zeichen für ein Problem im Vertragscode sein. Bitte überprüfen Sie die Schleifen und vergewissern Sie sich, dass Sie keinen Wert an eine nicht zahlbare Funktion gesendet haben (das ist auch der Grund für die starke Gasschätzung).

Ich bin mir nicht sicher, warum es angezeigt wird

Hier ist mein Code

pragma solidity ^0.4.16;

interface token {
    function transfer(address receiver, uint amount) public;
}

contract Crowdsale {
    address public beneficiary;
    uint public fundingGoal;
    uint public amountRaised;
    uint public deadline;
    uint public price;
    token public tokenReward;
    mapping(address => uint256) public balanceOf;
    bool fundingGoalReached = false;
    bool crowdsaleClosed = false;

    event GoalReached(address recipient, uint totalAmountRaised);
    event FundTransfer(address backer, uint amount, bool isContribution);

    /**
     * Constrctor function
     *
     * Setup the owner
     */
    function Crowdsale(
        address ifSuccessfulSendTo,
        uint fundingGoalInEthers,
        uint durationInMinutes,
        uint etherCostOfEachToken,
        address addressOfTokenUsedAsReward
    ) public {
        beneficiary = ifSuccessfulSendTo;
        fundingGoal = fundingGoalInEthers * 1 ether;
        deadline = now + durationInMinutes * 1 minutes;
        price = etherCostOfEachToken * 1 ether;
        tokenReward = token(addressOfTokenUsedAsReward);
    }

    /**
     * Fallback function
     *
     * The function without name is the default function that is called whenever anyone sends funds to a contract
     */
    function () payable public{
        require(!crowdsaleClosed);
        uint amount = msg.value;
        balanceOf[msg.sender] += amount;
        amountRaised += amount;
        tokenReward.transfer(msg.sender, amount / price);
        FundTransfer(msg.sender, amount, true);
    }

    modifier afterDeadline() { if (now >= deadline) _; }

    /**
     * Check if goal was reached
     *
     * Checks if the goal or time limit has been reached and ends the campaign
     */
    function checkGoalReached() afterDeadline public {
        if (amountRaised >= fundingGoal){
            fundingGoalReached = true;
            GoalReached(beneficiary, amountRaised);
        }
        crowdsaleClosed = true;
    }


    /**
     * Withdraw the funds
     *
     * Checks to see if goal or time limit has been reached, and if so, and the funding goal was reached,
     * sends the entire amount to the beneficiary. If goal was not reached, each contributor can withdraw
     * the amount they contributed.
     */
    function safeWithdrawal() afterDeadline public {
        if (!fundingGoalReached) {
            uint amount = balanceOf[msg.sender];
            balanceOf[msg.sender] = 0;
            if (amount > 0) {
                if (msg.sender.send(amount)) {
                    FundTransfer(msg.sender, amount, false);
                } else {
                    balanceOf[msg.sender] = amount;
                }
            }
        }

        if (fundingGoalReached && beneficiary == msg.sender) {
            if (beneficiary.send(amountRaised)) {
                FundTransfer(beneficiary, amountRaised, false);
            } else {
                //If we fail to send the funds to beneficiary, unlock funders balance
                fundingGoalReached = false;
            }
        }
    }
}

Geben Sie hier die Bildbeschreibung ein

Bitte helfen Sie mir, was genau das Problem ist und wie ich es beheben kann.

Antworten (3)

Es stellt sich heraus, dass Sie versuchen, einen Vertrag mit dem Wert 1 Ether bereitzustellen . Dazu sollten Sie payableIhrer Konstruktorfunktion Folgendes hinzufügen Crowdsale():

/**
 * Constrctor function
 *
 * Setup the owner
 */
function Crowdsale(
    address ifSuccessfulSendTo,
    uint fundingGoalInEthers,
    uint durationInMinutes,
    uint etherCostOfEachToken,
    address addressOfTokenUsedAsReward
) public payable {
    beneficiary = ifSuccessfulSendTo;
    fundingGoal = fundingGoalInEthers * 1 ether;
    deadline = now + durationInMinutes * 1 minutes;
    price = etherCostOfEachToken * 1 ether;
    tokenReward = token(addressOfTokenUsedAsReward);
}
Ja, das hilft, die Warnung zu verbergen. Aber wenn ich ETH an diese Vertragsadresse übertrage, schlägt es die ganze Zeit fehl. Hier ist ein Vertrag, den ich mit demselben Code erstellt habe: rinkeby.etherscan.io/address/…

Wert 1 Äther nicht bewiesen, dann wird dieser Code ausgeführt:

pragma solidity ^0.4.16;

interface token {
    function transfer(address receiver, uint amount) public;
}

contract Crowdsale {
    address public beneficiary;
    uint public fundingGoal;
    uint public amountRaised;
    uint public deadline;
    uint public price;
    token public tokenReward;
    mapping(address => uint256) public balanceOf;
    bool fundingGoalReached = false;
    bool crowdsaleClosed = false;

    event GoalReached(address recipient, uint totalAmountRaised);
    event FundTransfer(address backer, uint amount, bool isContribution);

    /**
     * Constrctor function
     *
     * Setup the owner
     */
    function Crowdsale(
        address ifSuccessfulSendTo,
        uint fundingGoalInEthers,
        uint durationInMinutes,
        uint etherCostOfEachToken,
        address addressOfTokenUsedAsReward
    ) public {
        beneficiary = ifSuccessfulSendTo;
        fundingGoal = fundingGoalInEthers * 1 ether;
        deadline = now + durationInMinutes * 1 minutes;
        price = etherCostOfEachToken * 1 ether;
        tokenReward = token(addressOfTokenUsedAsReward);
    }

    /**
     * Fallback function
     *
     * The function without name is the default function that is called whenever anyone sends funds to a contract
     */
    function () payable public{
        require(!crowdsaleClosed);
        uint amount = msg.value;
        balanceOf[msg.sender] += amount;
        amountRaised += amount;
        tokenReward.transfer(msg.sender, amount / price);
        FundTransfer(msg.sender, amount, true);
    }

    modifier afterDeadline() { if (now >= deadline) _; }

    /**
     * Check if goal was reached
     *
     * Checks if the goal or time limit has been reached and ends the campaign
     */
    function checkGoalReached() afterDeadline public {
        if (amountRaised >= fundingGoal){
            fundingGoalReached = true;
            GoalReached(beneficiary, amountRaised);
        }
        crowdsaleClosed = true;
    }


    /**
     * Withdraw the funds
     *
     * Checks to see if goal or time limit has been reached, and if so, and the funding goal was reached,
     * sends the entire amount to the beneficiary. If goal was not reached, each contributor can withdraw
     * the amount they contributed.
     */
    function safeWithdrawal() afterDeadline public {
        if (!fundingGoalReached) {
            uint amount = balanceOf[msg.sender];
            balanceOf[msg.sender] = 0;
            if (amount > 0) {
                if (msg.sender.send(amount)) {
                    FundTransfer(msg.sender, amount, false);
                } else {
                    balanceOf[msg.sender] = amount;
                }
            }
        }

        if (fundingGoalReached && beneficiary == msg.sender) {
            if (beneficiary.send(amountRaised)) {
                FundTransfer(beneficiary, amountRaised, false);
            } else {
                //If we fail to send the funds to beneficiary, unlock funders balance
                fundingGoalReached = false;
            }
        }
    }
}

Sofern die Bergleute das Blockgaslimit nicht erhöhen, besteht Ihre einzige Möglichkeit darin, den Vertrag in mehrere Verträge aufzuteilen

Jeder Vertrag hat also eine eigene Adresse, und Sie können zwischen ihnen telefonieren. Zum Beispiel kann ein ICO Crowdsale aufgeteilt werden in:

1 Crowdsale: Verwalten Sie den Crowdsale, wie Token zugeteilt werden, Belohnungen, Öffnen, Schließen 2 Token: Implementiert ERC20, kann Token erstellen, Übertragung genehmigen 3 Wallet: Verwalten Sie während des Crowdsale erhaltene Gelder

Auch die Aufteilung hilft bei einem Sicherheitsaudit, da jeder Vertrag einen begrenzten Umfang hat.

Danke versuch es

Ich denke, Sie machen hier einen kleinen Fehler. Wie Sie sehen können, hat die Registerkarte "Umgebung" in der Remix-IDE die Auswahl "Injected web3", dies sollte ausgewählt werden, wenn Sie den TESTRPC-Client in Ihrem lokalen Netzwerk ausführen, andernfalls sollten Sie JAVASCRIPT ausgewählt haben VM-Option, durch Auswahl dieser Option sollte Ihr Kontakt ausgeführt werden.