Kann ich meinen GESAMTEN Ether an eine zahlungspflichtige Funktion senden? oder soll ein wenig gespart werden, um fürs Gas zu bezahlen?

Ich habe diese großen Zweifel daran, wie das EVM funktioniert,

Nehmen wir an, ich habe ein Ether-Guthaben von 1000000000000000000 in Wei (1 Ether) und ich möchte ALLES davon an eine bezahlbare Funktion übergeben, rufen wir die Funktion buy() auf:

Contract.buy({ from: '0x0...', value: 1000000000000000000 });

Wird es funktionieren? Bedeutung; Wird das an sich die GAS-Kosten abziehen?

Oder im Gegenteil ... ich muss die Gaskosten schätzen und sie selbst von dem Ether abziehen, den ich sende? Wenn ich zum Beispiel 50000 in Gas schätze, würde ich es so machen:

Contract.buy({ from: '0x0...', value: 999999999999950080, gas: 50000 });

Welcher Ansatz ist der richtige und warum?

Vielen Dank im Voraus!

BEARBEITEN (Code in Swift):

    var options = Veev.options(gas: nil, from: addressFrom)
    let contract = web3.contract(contractABI, at: EthereumAddress(Rinkeby.address))
    let parameters = [EthereumAddress("0x0.."), amountToBuy] as [AnyObject]
    guard let estimatedGas = web3.contract(contractABI, at: EthereumAddress(Rinkeby.address))?.method("buy", parameters: parameters, options: options)?.estimateGas(options: nil) else { return }
    options.gas = estimatedGas
    let value: BigUInt = BigUInt(ether) - BigUInt(estimatedGas) * BigUInt(5000000000) - 1 // 5000000000 is gas Price
    options.value = value
aktualisiert und überprüft. Sie können alle eth übertragen, indem Sie gasPrice 0 angeben.
Danke, erkläre es. Wenn ich gasPrice auf 0 setze, muss ich dann trotzdem diese Formel verwenden: 1 Ether - 55000 * 1 gwei?

Antworten (2)

Letzteres. Der gesamte Ether, der für eine Transaktion erforderlich ist, ist amount + gasLimit * gasPrice( amountwie viel Ether Sie senden). Sie müssen also genügend Ether beiseite legen, um das Maximum abzudecken, das die Transaktion für Gas kosten kann.

In Ihrem Beispiel, in dem 50000 Gas benötigt werden, möchten Sie beispielsweise 1 ether - 50000 * 1 gweieinen Gaspreis von 1 GWei senden und angeben.

Vielen Dank! Ich musste wirklich einen Kommentar von einem Profi hören.
Ich habe mich sehr bemüht, dies in Code einzufügen, aber ich erhalte immer noch die folgende Fehlermeldung: "Unzureichende Mittel für Gas * Preis + Wert". Es scheint ein mehr oder weniger „häufiger“ Fehler zu sein. Haben Sie eine Idee, was ich falsch mache, Sir? Danke.
Bitte teilen Sie Ihren Code mit.
Sicher, aber es ist in Swift. Es gibt jedoch ein Update: Ich habe es geschafft, es mit dieser Formel zum Laufen zu bringen: Äther - geschätztes Gas * Gaspreis, der einzige Unterschied zu der Formel, die Sie damals angegeben haben, wären 5 gwei anstelle von 1 gwei. 5 gwei (5000000000) scheint in meinem Fall der Standardgaspreis zu sein, was denkst du?
Ich habe gerade einen Beispielcode hinzugefügt, hoffe, es ist selbsterklärend, es ist im Wesentlichen dasselbe (hoffentlich!)
Sie sind derjenige, der den Benzinpreis auswählt, aber ich sehe nirgendwo in Ihrem Code, wo Sie ihn angeben.
Vielleicht lassen Sie es unspezifiziert und lassen etwas anderes wählen, aber Sie müssen auf jeden Fall wissen, welcher Gaspreis verwendet wird, damit Sie die Berechnung richtig durchführen können.
Ja, es ist standardmäßig 5000000000. Ich kann ihn natürlich ändern, aber ich habe mich dagegen entschieden, weil ich gelesen habe, dass eine Verringerung des Werts zu Verzögerungen bei der Transaktionsverarbeitung führen kann. In Anbetracht dieser Vorgabe, was ist dann die beste Formel? Danke
1 Gwei ist im Moment viel , aber in Zeiten mit starkem Verkehr benötigen Sie bis zu 30 oder 40 Gwei, um eine Transaktion durchzubringen. ethgasstation.info ist ein guter Weg, um zu sehen, was ein angemessener Gaspreis ist.
Danke, ich würde es mehr als alles andere zu schätzen wissen, wenn Sie mir bitte sagen könnten, was die endgültige Formel ist, die ich brauche. Ist diese richtig: Ether - schätztGas * GasPreis ... Oder sollte ich etwas ändern?
Ich würde es so formulieren balance - gasLimit * gasPrice, aber ja. (Sie stellen das Gaslimit entsprechend dem geschätzten Gas ein, was eine angemessene Vorgehensweise ist.)
Leider funktioniert die Formel aus irgendeinem seltsamen Grund manchmal, manchmal nicht.
Sind Sie 100% sicher, dass der Gaspreis immer auf den gleichen Betrag eingestellt wird? Ich würde es ausdrücklich angeben, um sicherzugehen.
Es hat wieder funktioniert, aber ich muss mehrere Tests durchführen, um sicherzustellen, dass die Formel stimmt

Kann ich meinen GESAMTEN Ether an eine zahlungspflichtige Funktion senden? oder soll ein wenig gespart werden, um fürs Gas zu bezahlen?

Ja, das können Sie, indem Sie gasPrice auf 0 setzen. Aber in Echtzeit wissen wir nicht, wie lange die Ausführung dauern wird, es hängt von der Situation ab. Ich habe in Etherscan gesehen, dass ein Teil des Transaktionswerts 0 ist.

Siehe auch den folgenden Link: https://etherscan.io/tx/0x173fd250d63a62bb407f214ff924b49e1c90593572eab1a8c523783f2aa58ba3

In Ihrem Beispiel können Sie Gas für die Funktion buy () schätzen, indem Contract. buy.estimateGas({ from: '0x0...', value: 1000000000000000000})Sie angeben, wie viel Gas für eine Methode verbraucht wird. Also keine Notwendigkeit anzunehmen, aber einige Entwickler beschweren sich, dass es keinen genauen Wert zurückgibt. Besser 5-10% zusätzlichen Wert hinzufügen.

Das ist für die sicherere Seite in der obigen Methode angenommen, dass es Ihre geschätzten 55000 Gas für exec buy() sind, dann müssen Sie den Wert an die Methode senden1 ether - 55000 * 1 gwei

Vielen Dank, unter Verwendung der obigen Formel (sagen wir, es ist 3ETH): 3 Ether - 80000 * 1 gwei, erhalte ich die folgende Fehlermeldung: "Unzureichende Mittel für Gas * Preis + Wert" (Mein geschätztes Gas ist 72000 und ich aufrunden 80000). Irgendeine Idee, wie man es repariert?