Geldüberweisung im Vertrag nicht möglich

Innerhalb von Remix verwende ich eine Adresse (addr1), um den Vertrag bereitzustellen, und eine andere (addr2), um eine Funktion innerhalb des Vertrags aufzurufen. Die Funktion ist eine einfache Übertragungsfunktion. Ich übertrage 1000000000000000000 Wei (1 Äther) von Adresse2 zu Adresse1. Es kann jedoch nicht übertragen werden und meine Ausgabe gibt immer wieder falsch zurück. Was ist hier falsch?

Außerdem verwende ich die SafeMath-Bibliothek für die sub, es ist dasselbe wie subtrahieren.

function transferToOwner() payable returns (bool) {
    owner.transfer(msg.value.sub(1000000000000000000));
    return true;
}

Antworten (1)

Der richtige Weg, dies zu tun, wäre wie folgt:

function transferToOwner() payable returns (bool) {
    owner.transfer(msg.value);
    return true;
}

Dadurch wird eine beliebige Menge an Eth weitergeleitet, die die Person, die diese Funktion aufruft, gesendet hat.

Wenn Sie nur 1 eth senden möchten, unabhängig davon, was sie gesendet haben, als sie die Funktion aufgerufen haben, würde es so aussehen:

function transferToOwner() payable returns (bool) {
    //Sender should forward at least 1 ether.
    require(msg.value > 1 ether);
    uint amountToSend = 1 ether;
    uint change = msg.value - amountToSend; // Do something with the change. Return it to sender, maybe?
    //If you don't do anything with the change, it will be stuck on this contract
    owner.transfer(1 ether);
    return true;
}
Wie übergeben Sie jedoch msg.value? Derzeit gibt es 0 zurück.
@JorahFriendzone Wenn Sie Remix verwenden, gibt es oben ein Feld mit der Aufschrift "Wert", in das Sie eingeben können, wie viel Ether an eine kostenpflichtige Funktion wie die oben geschriebene gesendet werden soll.
Ah danke! Der Grund, warum ich zu testen versuchte, war letztendlich, dass web3 die Funktion transferToOwner aufruft. Allerdings gebe ich im Moment mit Remix den Wert manuell ein. Wie würde ich das über web3 machen, da ich keine Variable an die Funktion übergebe?
Sie können neben jedem Funktionsaufruf ein Objekt übergeben, das unter anderem den Wert von eth enthält, den Sie senden möchten, oder das gelieferte Gas.
Normalerweise, wenn ich einen Funktionsaufruf in web3 mache, mache ich contractInstance.functionName (hier übergebene Daten), aber ich versuche, auf die Weitergabe von Daten durch die Funktion zu verzichten und nur die Funktion alles intern verarbeiten zu lassen, weshalb mein transferToOwner nicht hat beliebige Parameter. Ich versuche herauszufinden, wie ich transferToOwner ausführen kann, ohne Parameter über web3 zu übergeben, wenn das sinnvoll ist
Sie würden es tun contractInstance.functionName({value:1000000000000000000});