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
Letzteres. Der gesamte Ether, der für eine Transaktion erforderlich ist, ist amount + gasLimit * gasPrice
( amount
wie 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 gwei
einen Gaspreis von 1 GWei senden und angeben.
balance - gasLimit * gasPrice
, aber ja. (Sie stellen das Gaslimit entsprechend dem geschätzten Gas ein, was eine angemessene Vorgehensweise ist.)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
Jitendra Kumar. Balla
jlstr