Wann gilt ein ERC-20-Token-Transfer als bestätigt?

Ich frage mich, wann Sie berücksichtigen sollten, dass eine Übertragung von ERC-20-Token bestätigt ist. Am Anfang dachte ich, dass es ausreichen würde, nur sicherzustellen, dass der Transaktionsaufruf erfolgreich bestätigt wird, aber dann begann ich zu denken, dass ich vielleicht stattdessen auf das Ereignis transferwarten sollte .Transfer

Ich habe gesehen, dass die meisten Token da draußen das TransferEreignis direkt innerhalb der transferFunktion ausgeben. Nehmen wir jedoch den folgenden Vertrag an:

  • Benutzer A ruft die transferFunktion auf, um Token an Adresse B zu übertragen
  • Die transferFunktion sendet ein Ereignis, um die Validierung von Benutzer B anzufordern
  • Die transferFunktion wird an dieser Stelle abgeschlossen, aber es wurden noch keine Token übertragen und das TransferEvent wird auch nicht ausgelöst
  • Jemand validiert Benutzer B und ruft eine andere Funktion im Vertrag auf, die die anfängliche Transaktion abschließt (Token werden verschoben).
  • Das TransferEreignis wird jetzt ausgelöst und zeigt an, dass die Übertragung abgeschlossen ist

In diesem Fall wäre es richtig, auf das Ereignis zu warten , um eine Transaktion von Token zu bestätigen, da es nicht ausreicht Transfer, nur auf die Bestätigung der Transaktion zu warten, die die Funktion aufruft .transfer

Ich bin mir jedoch nicht sicher, ob dies die ERC-20-Spezifikation besagt und was die meisten Tools, die mit ERC-20-Tokens arbeiten, erwarten. Meine Frage ist also, ob es in Ordnung ist, ein Token zu erstellen, bei dem die Bestätigung der Übertragung erfolgt, wenn das TransferEreignis ausgelöst wird, anstatt wenn die aufzurufende Transaktion transferbestätigt wird.

Antworten (2)

Die aufrufende Transaktion transferund das TransferEreignis finden gleichzeitig statt. Transaktionen sind atomar, was bedeutet, dass Dinge, die darin passieren, sofort oder gar nicht aus dem Kontext einer externen Anwendung heraus geschehen. Sie können also entweder auf das Ereignis oder auf die Bestätigung der Transaktion lauschen, es liegt an Ihnen.

In dem Beispiel, das ich oben geschrieben habe, ist das nicht der Fall. Ich werde es deutlicher machen.
Ich würde sagen, dass dieses Beispiel schlecht implementiert wäre. Sie sollten stattdessen den Abschnitt „approve/transferFrom“ des ERC20-Standards verwenden. transfersollte ein Ereignis auslösen Transfer, es sei denn, es schlägt fehl. In diesem Fall wird es zurückgesetzt, anstatt erfolgreich zu sein.
Ja, laut Spezifikation MUSS das TransferEreignis in der Funktion ausgelöst transferwerden, also denke ich, dass Sie Recht haben.

Das Token wird bestätigt, wenn Transferes ausgelöst wird.

Sie müssen jedoch die probabilistische Finalität der Proof-of-Work-Blockchain berücksichtigen. Wenn Sie den neuesten (lokalen) Block scannen können, könnte es sich um einen kleinen Fork handeln, da Miner darum rennen. Warten Sie unter normalen Bedingungen mindestens 10-20 Blöcke auf die endgültige Abrechnung.

Ich habe mich ein bisschen umgesehen und dieses Wiki gefunden: github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md#transfer . Wenn Sie in der Beschreibung der transferFunktion nachsehen, heißt es, dass sie das Ereignis auslösen MUSS Transfer. Ich denke also, wenn die Transaktion für den transferAnruf erfolgreich ist (Warten auf genügend Blockbestätigungen), können wir die Transaktion als bestätigt betrachten, auch ohne das TransferEreignis zu überprüfen.
@dgaviola ja, aber wenn Sie etwas außerhalb der Kette tun (z. B. das Guthaben auf ihrem Konto an einer zentralen Börse gutschreiben), sollten Sie auf eine bestimmte Anzahl von Blöcken warten, um sicherzustellen, dass es unwahrscheinlich ist, dass es zurückgesetzt wird
Richtig, aber dann wird es keine korrekte Implementierung der ERC-20-Spezifikation sein, also denke ich, dass ich das vermeiden sollte.
Übertragungsereignisse sind nur für Off-Chain-Zwecke, da Smart Contracts auf keinen Fall auf das Ereignisprotokoll zugreifen können :)