Eine gute User Experience sowie Gaskostenoptimierung sind wichtige Bausteine bei der Umsetzung von Use Cases auf einer öffentlichen Blockchain. Die ursprüngliche Freigabemethode in Ethereum hatte Schwächen. Je nach Anwendung mussten Nutzer mehrere Genehmigungstransaktionen senden, was zu Verwirrung und höheren Kosten führen konnte. Aus Gründen der Bequemlichkeit forderten manche Anwendungen Nutzer sogar auf, ihr maximal verfügbares Token-Guthaben zu genehmigen, was den Anwendungen dann Zugriff auf das gesamte Token-Guthaben der Wallet für einen unbestimmten Zeitraum gab, wodurch bei einem potentiellen Hack alle Tokens der Nutzenden gefährdet waren. Später wurde das Genehmigungssystem in Ethereum verbessert, indem granulare Genehmigungen eingeführt wurden, die es ermöglichten, den Zugriff von Anwendungen auf das Token-Guthaben besser zu steuern. Allerdings unterstützen ältere Token diese Funktion nicht und nicht alle neueren Token haben sie übernommen.
Wie funktionieren ERC-20-Tokengenehmigungen standardgemäß?
Das Standardmodell von ERC-20 Tokens in Ethereum erfordert zwei Transaktionen, die jeweils Gasgebühren verursachen: Eine Freigabe und eine Interaktion (siehe Abbildung 1).
Abbildung 1: Genehmigungsablauf im Standardmodell von ERC-20
- Bob ruft die approve() Funktion auf einem ERC-20 Token auf, um eine Ausgabegenehmigung für einen Smart Contract zu erteilen.
- Bob ruft die interaction() Funktion auf, die wiederum transferFrom() auf dem ERC20-Token Smart Contract aufruft, um die Token zu transferieren.
- Schlechte Benutzerfreundlichkeit: Benutzer müssen jedes neue Protokoll für jeden Token, den sie verwenden möchten, mit einer separaten Transaktion genehmigen.
- Schlechte Sicherheit: Viele Anwendungen verlangen oft unbegrenzte Genehmigungen, um das UX-Problem aus Punkt 1 zu beheben. Folglich wären bei einem Hack des Protokolls alle Tokens eines Nutzers gefährdet, der eine unbefristete Genehmigung erteilt hatten.
Exkurs: Ethereum Request for Comment (ERC) ist das Protokoll zur Einführung neuer Verbesserungen im Netzwerk durch Entwickler. Neue ERCs werden erstellt, indem der Vorschlag über EIP (Ethereum Improvement Proposal) eingereicht wird. EIP ist ein Entwurfsdokument, das Informationen zu einer neuen Funktion oder einem neuen Verfahren enthält, um die Ethereum-Community zu informieren.
Permit (EIP-2612) Modell als erste Verbesserung
Zur Verbesserung des Standardmodells wurde „EIP-2612 Permit Extension for EIP-20 Signed Approvals“ eingeführt. EIP-2612 ist eine Erweiterung der ERC-20-Tokenstandards, wodurch die vorher genannten Probleme gelöst werden sollen (siehe Abbildung 2).
Abbildung 2: Genehmigungsablauf von EIP-2612
- Bob signiert eine Off-Chain-Genehmigungsnachricht, die einem Smart Contract die Erlaubnis erteilt, einen (EIP-2612)-Token auszugeben.
- Bob sendet die signierte Nachricht als Teil der Interaktion mit dem Smart Contract.
- Der Smart Contract ruft permit() für den Token auf, wodurch die Genehmigungsnachricht und die Signatur verbraucht wird und der Smart Contract eine Genehmigung erhält.
- Der Smart Contract verfügt nun über die Genehmigung, so dass er transferFrom() für den Token aufruft und die von Bob gehaltenen Tokens verwenden kann.
Dadurch werden die ursprünglichen Probleme des ERC-20-Ansatzes gelöst:
- Der Nutzer muss nie eine separate approve()-Transaktion einreichen.
- Permit Signaturen werden erteilt und sofort konsumiert.
- Es können Betragsgrenzen und Verfallszeiten gesetzt werden.
Leider kommt EIP-2612 in den meisten Fällen nicht in Frage, da es sich um eine Erweiterung des ERC20-Standards handelt und diese Funktion nur bei neuen Tokens möglich ist. Es gibt also nur sehr wenige größere Token, die hiervon profitieren können.
Die Lösung heißt Permit2
Auf der Suche nach Produktverbesserungen hat das Team von Uniswap Labs einen neuen Marktstandard identifiziert, um sowohl die Probleme aus dem Standardmodell als auch von EIP-2612 zu lösen: Permit2 (siehe Abbildung 3).
Abbildung 3: Genehmigungsablauf von Permit2
- Bob ruft approve() auf einem ERC-20 Token auf, um den Permit2-Smart-Contract eine unbegrenzte Genehmigung zu erteilen.
- Bob signiert eine Off-Chain-Permit2-Nachricht, die signalisiert, dass der Protokoll-Smart-Contract Token übertragen darf.
- Bob ruft eine Interaktionsfunktion des Protokoll-Smart-Contracts auf und übergibt die signierte Permit2-Nachricht als Parameter.
- Der Protokoll Smart Contract ruft permitTransferFrom() auf den Permit2-Smart-Contract auf, der wiederum aus Punkt 1 erteilte Erlaubnis verwendet, um transferFrom() auf dem ERC-20-Smart-Contract aufzurufen und die von Bob gehaltenen Tokens zu übertragen.