send()- oder transfer()-Funktionen schlagen immer fehl

Ich habe unten ein paar Codes erstellt

Pragma Solidität ^0.4.19;

contract SendAndTransferExample {

    function SimpleSendToAccount() public returns(bool) {
       return msg.sender.send(10000000000000000000);
    }

    function SimpleTransferToAccount() public {
       msg.sender.transfer(10000000000000000000);
    }
}

Ich habe beide Funktionen mit JavaScript vm ausgeführt und das Ergebnis ist immer gleich. erstes Ergebnis, wenn ich die Funktion send() ausgeführt habe, Geben Sie hier die Bildbeschreibung einund das Ergebnis unten, als ich die Funktion transfer() ausgeführt habeGeben Sie hier die Bildbeschreibung ein

transact to SendAndTransferExample.SimpleTransferToAccount errored: VM error: revert.
revert  The transaction has been reverted to the initial state.
Note: The constructor should be payable if you send value.  Debug the transaction to get more information. 

Ich habe keine Ahnung, was falsch war. Jemand hilft mir bitte.

Es sieht so aus, als ob Sie versuchen, ETH aus dem Vertrag in die msg.sender. Enthält der Vertrag ETH zum Senden? Wie die Fehlermeldung andeutet, könnten Sie eine Konstruktorfunktion oder eine andere kostenpflichtige Funktion hinzufügen, die es dem Vertrag ermöglicht, ETH zu akzeptieren, die er dann senden könnte.
Ich habe versucht, ETH unter Vertrag zu nehmen, und ich habe einen Fehler bekommen. VM-Fehler: Zurücksetzen. revert Die Transaktion wurde in den Ausgangszustand zurückgesetzt. Hinweis: Der Konstruktor sollte zahlbar sein, wenn Sie einen Wert senden. Debuggen Sie die Transaktion, um weitere Informationen zu erhalten.
Und wie kann ich einen Konstruktor oder eine kostenpflichtige Funktion hinzufügen, die dies zulässt?

Antworten (2)

Versuchen Sie dies für Ihren Vertrag:

pragma solidity ^0.4.24;

contract SendAndTransferExample {

    constructor() public payable { }

    function SimpleSendToAccount() public returns(bool) {
       return msg.sender.send(10000000000000000000);
    }

    function SimpleTransferToAccount() public {
       msg.sender.transfer(10000000000000000000);
    }

    function() public payable { }
}

Hier habe ich 2 Funktionen hinzugefügt:

  1. Eine constructor()Funktion, die nur einmal ausgeführt wird, direkt bei der Vertragserstellung. Sie können diese Funktion verwenden, um Variablen zu initialisieren, z. B. wer der Eigentümer des Vertrags ist, und andere globale Werte. In diesem Fall haben wir die Funktion erstellt payable, was bedeutet, dass sie ETH akzeptieren kann. Während der Vertragserstellung können Sie die ETH als übergeben msg.valueund bei der Vertragserstellung wird die ETH als Teil ihres Saldos in den Vertrag aufgenommen.

  2. Eine Fallback-Funktion ( function()), die immer dann ausgeführt wird, wenn Sie den Vertrag aufrufen und keine der anderen Funktionen mit der Funktionskennung übereinstimmt oder wenn keine Daten geliefert wurden. Dies bedeutet, dass Sie ETH einfach an den Vertrag senden können, und da die Fallback-Funktion ebenfalls ist payable, wird diese ETH akzeptiert.

Mit einer dieser Funktionen sollten Sie in der Lage sein, genügend ETH an Ihren Vertrag zu senden, damit Ihre anderen Funktionen funktionieren.

Sie sollten einige Zeit damit verbringen, die solidity-Dokumentation zu lesen, die diese beiden Themen und vieles mehr behandelt!

Es wird ungefähr so ​​sein:

function send(address _receiver) payable {
_receiver.send(msg.value);

}

Ihre Methode sollte zahlbar sein, um Ether zu senden.

Beachten Sie, dass address.send (value) und address.transfer(value) beide gleich sind, außer dass send bei einem Fehler keine Ausnahme auslöst und alle Ihre Transaktionsgebühren und Übertragungsausnahmen verbraucht .

Dies ist nicht korrekt. Eine Funktion muss NICHT payableEther senden. Nur um Äther zu erhalten.
Um das Senden oder Übertragen im Smart Contract durchzuführen, sollte die Methode Ether vom Methodenaufrufer erhalten, der hier msg.value ist.
Sie machen Annahmen darüber, was die Funktion des Benutzers zu tun versucht. Hier haben Sie eine Funktion gebaut, die ETH an eine andere Adresse weiterleitet. In diesem Fall macht Ihre Funktion Sinn, aber das ist nicht unbedingt das, was der Benutzer versucht, und die Aussage, die Sie machen, ist im Allgemeinen nicht wahr.