Kann jemand bitte die Unterschiede zwischen der Verwendung von Send und Call for Contracts erklären und wann diese verschiedenen Methoden verwendet und wann nicht verwendet werden sollen?
Zum Beispiel :
msg.sender.send(number);
msg.sender.call.value(number)();
Ich weiß, dass das Senden 2300 Gas verbraucht und dass das Verwenden von Anrufen kein Gas verbraucht.
EDIT Dez. 2019: call.value()()
sollte nun zum Transferieren von Ether verwendet werden. (Verwenden Sie nicht Senden oder Übertragen.)
1 Send()
leitet kein Gas mehr weiter. Es verwendet einfach das fest codierte Stipendium (2300 Gas), das von den Wertübertragungskosten (mindestens 9040) abgezweigt wird. Es reicht aus, um Ether zu senden, aber auch genug, um im Grunde eine zusätzliche kleine Protokollierungsoperation (in einer Fallback-Funktion) durchzuführen. Die folgenden Vorgänge verbrauchen mehr Gas als das für eine Fallback-Funktion bereitgestellte Stipendium:
• Schreiben in den Speicher
• Erstellen eines Vertrags
• Aufruf einer externen Funktion, die viel Gas verbraucht
• Senden von Äther
2 Wenn einem send()
Aufruf das Gas ausgeht, gibt er keinen Fehler aus, sondern gibt einfach „false“ zurück.
von solidity Doc:
Wenn ein Kontrakt Ether empfängt (ohne dass eine Funktion aufgerufen wird), wird die Fallback-Funktion ausgeführt. Der Vertrag kann sich nur darauf verlassen, dass ihm zu diesem Zeitpunkt das „Gas-Stipendium“ (2300 Gas) zur Verfügung steht. Dieses Stipendium reicht nicht aus, um in irgendeiner Weise auf Speicher zuzugreifen. Um sicherzustellen, dass Ihr Vertrag Ether auf diese Weise empfangen kann, überprüfen Sie die Gasanforderungen der Fallback-Funktion (z. B. im Abschnitt „Details“ in Browser-Solidity).
• Es gibt eine Möglichkeit, mit addr.call.value(x)() mehr Gas an den empfangenden Vertrag weiterzuleiten. Dies ist im Wesentlichen dasselbe wie addr.send(x), nur dass es das gesamte verbleibende Gas weiterleitet und dem Empfänger die Möglichkeit eröffnet, teurere Aktionen durchzuführen. Dies kann das Zurückrufen in den sendenden Vertrag oder andere Zustandsänderungen umfassen, an die Sie möglicherweise nicht gedacht haben. Es ermöglicht also eine große Flexibilität für ehrliche Benutzer, aber auch für böswillige Akteure.
Warnung : Verträge, die Ether empfangen, aber keine Fallback-Funktion definieren, lösen eine Ausnahme aus und senden den Ether zurück (dies war vor Solidity v0.4.0 anders). Wenn Sie also möchten, dass Ihr Vertrag Ether empfängt, müssen Sie eine Fallback-Funktion implementieren.
.call()
. Und kann nicht genug betonen, dass .call()
„ehrliche Benutzer, aber auch böswillige Akteure große Flexibilität haben“.2,300
Gasstipendium weiter, sicher gegen Wiedereintrittfalse
bei Misserfolg zurück2,300
Gasstipendium weiter, sicher gegen Wiedereintrittfalse
bei Misserfolg zurückWeitere Einzelheiten können Sie hier https://ethereum.stackexchange.com/a/38642/18932 nachlesen
Alex Darby
eth
.call
erstellt keine Transaktion; Ich habe gerade dies geschrieben, das andere Details enthält, nach denen Sie möglicherweise suchen: ethereum.stackexchange.com/a/6477/42Tjaden Hess
send
sendet mehr als 0 Gas, nicht wahr? Es sendet 23000eth
send
sendet 0 Gas, aber es gibt eine EVM-Regel, dass der Empfänger immer ein Stipendium von 2.300 Gas erhält (so dass er, wenn er möchte, immer genug Gas hat, um zu protokollieren, dass er etwas erhalten hat).Xavier Leprêtre B9lab
.call
Javascript (keine Transaktion) mit.call
Solidity (bereits in einer Transaktion).Alex Darby