Einschließlich Transaktionsgebühren beim Versand von ETH aus einem Smart Contract

Nehmen wir an, ich habe einen einfachen Solidity-Wallet-Vertrag, wie unten gezeigt. Wenn ich vom Vertrag zurücktreten möchte, werden senddie Transaktionsgebühren (Benzinkosten) von dem Betrag abgezogen, den die empfangende Partei erhält. Wie kann ich Ether aus dem Smart Contract senden, sodass die Gaskosten dem Vertrag selbst und nicht dem Empfänger auferlegt werden?

Außerdem möchte ich die Gebühr wissen, die der Brieftasche auferlegt wird, bevor ich den Vertrag anrufe. Ist es möglich, die Gebühr zu ermitteln, die für send()die JSON-RPC-Schnittstelle erhoben wird?

/**
 * Simple hosted wallet contract.
 */
contract Wallet {

    event Deposit(address from, uint value);
    event Withdraw(address to, uint value);

    address owner;

    function Wallet() {
        owner = msg.sender;
    }

    /**
     * Simple withdrawal operation.
     */
    function withdraw(address _to, uint _value) {
        if(msg.sender != owner) {
            throw;
        }

        Withdraw(_to, _value);

        _to.send(_value);
    }


    /**
     * Somebody sends ETH to this contract address
     */
    function() {
        // just being sent some cash?
        if (msg.value > 0) {
            Deposit(msg.sender, msg.value);
        }
    }

}
Diese Informationen können aus der internen Transaktion wie hier abgerufen werden: testnet.etherscan.io/tx/…
Der Titel scheint das Gegenteil von der Frage zu sein: "Wie kann ich Ether aus dem Smart Contract senden, damit die Gaskosten dem Vertrag selbst auferlegt werden und nicht dem Empfänger?" Soll der Titel umformuliert werden?

Antworten (2)

Laut Solidity Docs glaube ich nicht, dass Ihre erste Anfrage möglich ist. Tatsächlich empfehlen die Dokumente, zu einem Auszahlungsschema zu wechseln:

Warning: There are some dangers in using send: The transfer fails if the call stack depth is at 1024 (this can
always be forced by the caller) and it also fails if the recipient runs out of gas. So in order to make safe Ether
transfers, always check the return value of send or even better: Use a pattern where the recipient withdraws the
money.

Nachdem Sie zu einem Auszahlungsmuster gewechselt haben, können Sie einfach web3.eth.estimateGas() verwenden .

Guter Punkt! In diesem Fall möchte ich eine Ethereum-Wallet in einem gehosteten Webdienst ausführen. Alle normalen Ethereum-Transaktionen sollten dem Benutzer zur Verfügung stehen, daher kann hier leider kein Auszahlungsmuster des Empfängers durchgeführt werden.

Wenn ich mit Senden vom Vertrag zurücktreten möchte, werden die Transaktionsgebühren (Benzinkosten) von dem Betrag abgezogen, den die empfangende Partei erhält. Wie kann ich Ether aus dem Smart Contract senden, sodass die Gaskosten dem Vertrag selbst und nicht dem Empfänger auferlegt werden?

Das Gas wird von demjenigen bezahlt, der sich beruft withdraw.

_to.send(_value)wird immer versuchen, die angegebene Anzahl von wei _valuean die Adresse zu senden _to. _valuewird nicht durch Gaskosten gemindert. ( sendkann fehlschlagen (gibt false zurück), wenn die Aufruftiefe von 1024 überschritten wird oder wenn der _toüber eine Fallback-Funktion verfügt, die mehr als 2300 Gas verbraucht. Generell wird empfohlen, den Rückgabewert von zu überprüfen send.)

Bestimmen Sie die Gebühr, die für send() über die JSON-RPC-Schnittstelle von geth erhoben wird?

eth_estimateGas ist eine JSON-RPC-Methode zum Schätzen der Gaskosten. Für den speziellen Fall von withdrawwird es eine vernünftige Schätzung geben, aber nicht nur für die _to.send(_value). Betrachten Sie für allgemeine Fälle: Was sind die Einschränkungen für die Schätzung von Gas und wann wäre ihre Schätzung erheblich falsch?