Crowdsale, das auf Testnet bereitgestellt wird, kann keine Ether von einem anderen Testkonto empfangen

Ich habe einen Smart Contract für Crowdsale bereitgestellt, der eine Funktion von ReceiveETH() hat:

function receiveETH(address beneficiary) internal {      
    uint coinToSend = bonus(msg.value.mul(COIN_PER_ETHER).div(1 ether)); // Compute the number to send
    Backer backer = backers[beneficiary];
    coin.transfer(beneficiary, coinToSend); // Transfer right now 
    backer.coinSent = backer.coinSent.add(coinToSend);
    backer.weiReceived = backer.weiReceived.add(msg.value); // Update the total wei collected during the crowdfunding for this backer    
    etherReceived = etherReceived.add(msg.value); // Update the total wei collected during the crowdfunding
    coinSentToEther = coinSentToEther.add(coinToSend);
    // Send events
    LogCoinsEmited(msg.sender ,coinToSend);
    LogReceivedETH(beneficiary, etherReceived); 
}

Diesen Vertrag habe ich auf Testnet bereitgestellt, aber er konnte keinen Ether empfangen. Zum Beispiel verwende ich einige Testkonten, um Ether an diese bereitgestellte Smart-Contract-Adresse zu senden, jedes Mal, wenn Erfolg bei Etherscan angezeigt wird und die Tx-Kosten abgezogen werden, während der Ether nicht erfolgreich übertragen wird und der Smart-Contract-Etherbetrag 0 bleibt. LinkGeben Sie hier die Bildbeschreibung ein

Ich frage mich, was hier falsch ist? Hat der Crowdsale-Vertrag eine Funktion, die jedes Mal ausgelöst wird, wenn eine neue Überweisung eingeht?

PS habe gerade bemerkt, dass ich die Fallback-Funktion definiert habe:

function() stopInEmergency respectTimeFrame payable {
    receiveETH(msg.sender);
}

Es sieht für mich perfekt aus, aber mein Vertrag empfängt immer noch keinen Ether, wenn ich versuche, ihn zu senden. Was ist hier noch falsch?

Liegt es an einem kostenpflichtigen Keyword? Ich habe versucht, zahlbar hinzuzufügen, aber es heißt, dass interne Funktionen nicht zahlbar sein können

Antworten (2)

Das internalSchlüsselwort bedeutet, dass Ihre Funktion nur aus dem Vertrag oder daraus abgeleiteten Verträgen aufgerufen werden kann. Sie können es nicht öffentlich nennen.

Wenn Sie möchten, dass diese Funktion von außerhalb des Vertrages aufrufbar ist, sollten Sie internalauf umstellen public.

Sie müssen hinzufügen, payableob mit diesem Funktionsaufruf Ethereum gesendet werden soll.

internalUm dies zu beheben, sollten Sie zu ändern public payable, was diese Funktion öffentlich aufrufbar machen und es auch ermöglichen sollte, Ethereum zusammen mit der Transaktion zu senden.

Hat der Crowdsale-Vertrag eine Funktion, die jedes Mal ausgelöst wird, wenn eine neue Überweisung eingeht?

Für die Übertragung von Ethereum, ja. Das wäre die Fallback-Funktion . Allerdings ist nur 2300 Gas verfügbar. Derzeit gibt es keine Funktion, die beim Transfer für ERC20-Token aufgerufen wird.

Danke Alec, ich verstehe jetzt die Bedeutung der Fallback-Funktion. Bitte werfen Sie einen Blick auf meine hinzugefügten Inhalte, die Fallback-Funktion ist tatsächlich definiert, aber sie empfängt immer noch keinen Ether
@ZixuanZhang Bei beiden Transaktionen Gas Usedist das so viel wie das Gas Limit. Dies deutet darauf hin, dass etwas einen Fehler verursacht oder wirft, denn wenn ein Fehler auftritt, wird sofort das gesamte Gas verbraucht. Stellen Sie sicher, dass nichts einen Fehler verursacht und dass Ihr Gaslimit hoch genug ist.

Ich habe das Problem selbst herausgefunden, weil ich meinen Token-Vertragsbesitz nicht auf meinen Crowdsale-Vertrag übertragen habe.