MetaMask Snaps ist der Fahrplan, um MetaMask zur erweiterbarsten Wallet der Welt zu machen. Als Entwickler kannst du Features und APIs auf völlig neue Weise in MetaMask einbringen. Web3-Entwickler sind der Kern dieses Wachstums, und diese Serie soll die innovativen MetaMask Snaps vorstellen, die heute entwickelt werden.
Revoke Snap mit Swix Jedi und Adrian
Wir sprechen mit dem Web3-Entwickler Swix Jedi und Adrian, die den Revoke Snap beim ETHWarsaw Hackathon entwickelt haben.
Snap Repo: https://github.com/SwixJedi/revokesnap
Warum habt ihr es gebaut?
Um die Sicherheit bei der Token-Nutzung durch externe Akteure zu gewährleisten, implementieren ERC20-Token-Standards eine Allowance, bei der der Token-Inhaber einem Akteur (z. B. einem DEX-Smart-Contract) genehmigen muss, seine Token bis zu einem festgelegten Limit verwenden zu dürfen.
Um die etwas umständliche DeFi-User-Experience zu verbessern, verwenden viele DeFi-Protokolle einen maximalen uint256-Wert für Genehmigungen, damit Nutzer nicht jedes Mal, wenn sie mit ihren Contracts interagieren möchten, Token genehmigen und unnötige Gas-Gebühren bezahlen müssen.
Besonders für aktive DeFi-Nutzer kann leicht eine Situation entstehen, in der nach der Nutzung dieser Protokolle einige übrig gebliebene Genehmigungen verbleiben – ein potenzielles Sicherheitsrisiko.
Obwohl es bereits Lösungen gibt, die Nutzern helfen, mit übrig gebliebenen Allowances umzugehen, bieten nur einige davon die Möglichkeit, Genehmigungen direkt über die Benutzeroberfläche zu verwalten. Der Prozess ist zeitaufwendig, da jede Genehmigung einzeln bearbeitet und manuell bestätigt werden muss. Dieser Ansatz ist zwar sicher, erfordert jedoch viel kontinuierliche, manuelle Nutzerinteraktion.
Das hat uns auf eine bisher unbesetzte Nische aufmerksam gemacht, in der wir die Möglichkeiten von MetaMask Snaps nutzen konnten, um die Dinge zu verbessern.
Kannst du uns durch die technische Umsetzung führen?
Wir haben uns entschieden, folgende Vorteile von MetaMask Snaps zu nutzen:
Zugriff auf alle Accounts in MetaMask
Möglichkeit, komplexe Operationen mit einer einzigen Nutzerbestätigung durchzuführen
Um eine Lösung für dieses Problem vorzuschlagen, die es in Zukunft ermöglichen soll:
Nur eine einzige Nutzerabfrage anzuzeigen, um Zugriff auf alle aktuellen und zukünftigen Accounts zu erhalten (mit der bemerkenswerten Ausnahme von Hardware-Wallets)
Alle Genehmigungen aller aktuellen Accounts in einem Batch zu widerrufen, ohne separate Bestätigungen und Account-Wechsel
Alle Nutzer-Accounts (einschließlich derer auf Hardware-Wallets) aktiv auf neue Genehmigungen zu überwachen und dem Nutzer bei Erkennung eine Benachrichtigung anzuzeigen
Bei der Installation des Revoke Snap über die Web-UI fordert MetaMask die benötigten Berechtigungen an.
Alle Berechtigungen sind in einer snap.manifest.json-Datei festgelegt:
"initialPermissions": {
"snap_confirm": {},
"snap_getBip44Entropy_60": {},
"snap_notify": {},
"endowment:long-running": {}
},
Zwei Berechtigungen sind hier besonders erwähnenswert:
1. Deine „Ethereum"-Accounts und Assets verwalten. Das bedeutet, dass unser Snap für seine Funktion den übergeordneten Schlüssel (Secret Key) des Nutzers aus MetaMask benötigt, um Accounts generieren und Transaktionen im Namen des Nutzers signieren zu können.
2. Unbegrenzt ausführen. Obwohl der Revoke Snap keine Implementierung ist, die dauerhaft im Hintergrund laufen soll, braucht die Abwicklung von Transaktionen auf der Blockchain Zeit – und MetaMask Snaps haben einen eingebauten Kill-Switch nach 60 Sekunden, was möglicherweise nicht ausreicht, um die Transaktionen abzuschließen. Diese Berechtigung ermöglicht es dem RevokeSnap, diese Sicherheitsmaßnahme zu umgehen.
Nach Erhalt der notwendigen Berechtigungen generiert der RevokeSnap eine Anzahl von Accounts aus dem privaten Schlüssel des Nutzers:
export async function getSigners(provider: ethers.providers.Provider, amount: number): Promise<Wallet[]> {
let wallets: Wallet[] = [];
for (let i=0; i<amount; i++) {
wallets.push(await getSigner(provider, i));
}
return wallets;
}
export function getAddresses(wallets: Wallet[]): string[] {
let addresses: string[] = [];
for (let i=0; i<wallets.length; i++) {
addresses.push(wallets[i].address);
}
return addresses;
}
export async function getSigner(provider: ethers.providers.Provider, index: number): Promise<Wallet> {
const ethereumNode = (await wallet.request({
method: 'snap_getBip44Entropy_60',
})) as unknown as BIP44CoinTypeNode;
const deriveEthereumAccount = await getBIP44AddressKeyDeriver(ethereumNode);
const mainAccountKey = (await deriveEthereumAccount(index)).privateKey;
return new Wallet(mainAccountKey, provider);
}
Anschließend wird eine Prüfung auf übrig gebliebene Genehmigungen durchgeführt und nach Abschluss der Suche ein Button angezeigt, um alle identifizierten Genehmigungen zu widerrufen.
Beim Klick auf den „Revoke All"-Button gibt der Snap eine Reihe von Transaktionen aus, die den übrig gebliebenen Genehmigungen entsprechen, um sie einzeln auf null zu setzen. Da der Snap bereits im Besitz der privaten Schlüssel der generierten Wallets ist, erfordert dies keine zusätzliche Bestätigung vom Nutzer über die anfängliche hinaus.
Was sind die nächsten Schritte, wenn ihr das weiterentwickeln würdet?
Da beim Hackathon nur eine begrenzte Zeit zur Verfügung stand, um die optimalen Lösungen zu entwickeln, haben wir eine Reihe funktionaler Implementierungen genutzt, die noch Verbesserungspotenzial haben.
Zunächst wird die Anzahl der im Snap generierten Accounts derzeit als Funktionsparameter übergeben und ist fest auf 3 kodiert. Eine bessere Option wäre, dass der Snap eine externe API (oder ein dediziertes Backend) nutzt, um den nächsten Transaktions-Nonce auf jedem Account für eine gewählte Chain bzw. gewählte Chains zu überprüfen und nur Adressen mit einem Nonce-Wert größer als 0 zu berücksichtigen.
Darüber hinaus haben wir für Genehmigungen eine kurze Liste bekannter Adressen von Token und Akteuren verwendet, um die Funktionalität zu demonstrieren – idealerweise sollte die Genehmigungsprüfung jedoch umfassender erfolgen. Dies könnte beispielsweise durch die Nutzung einer RPC-Provider-API (wie Infura) geschehen, um alle Approval-Transaktionen zu finden und sie für die Anzeige auf der Website zu verarbeiten.
Kannst du uns ein wenig über dich und dein Team erzählen?
Ich bin Jedi und arbeite als Lead Developer bei Swix. Ich bin seit 2017 in der Krypto-Welt dabei, und seit 2019 bin ich tief in den Kaninchenbau gefallen und arbeite mit DeFi-Protokollen, hauptsächlich auf der Smart-Contract-Seite. Bei Swix arbeite ich derzeit daran, Real-Estate-Erträge on-chain zu bringen und neue Nutzer in den Krypto-Bereich einzuführen.
Ich bin Adrian und habe als Software-Entwickler und Architekt für kleine Startups und große Unternehmen gearbeitet. Blockchain ist seit vielen Jahren mein Hauptinteressengebiet, insbesondere das Ethereum-Ökosystem.
Bei der Entwicklung des Revoke Snap haben wir die Arbeit aufgeteilt: Jedi hat sich darauf konzentriert, herauszufinden, wie MetaMask Snaps funktionieren, und die notwendigen Grundlagen für die Smart-Contract-Interaktionen innerhalb unseres Snaps eingerichtet, während Adrian die Web-UI und das Bündeln der Transaktionen übernommen hat.
Wann wart ihr zum ersten Mal mit MetaMask Snaps in Berührung gekommen und wie war eure Erfahrung?
Wir wurden zum ersten Mal bei ETHWarsaw's Präsentation mit MetaMask Snaps bekannt gemacht, die recht technisch war und die tiefergehenden Abläufe des Protokolls umfasste. Das hat uns dazu gebracht, das Thema weiter zu recherchieren – und nun sind wir hier.
Was unterscheidet MetaMask Snaps von anderen Wallets?
Nun ja… die Idee an sich. MetaMask Snaps bricht aus dem im Non-Custodial-Browser-Wallet-Extensions-Bereich etablierten Standard aus, wonach jede Transaktion bei der Interaktion mit Web3-Anwendungen individuell vom Nutzer genehmigt werden muss. Außerdem ist die Funktionalität von Wallets auf das beschränkt, was das dahinterstehende Team zu implementieren entscheidet.
Was MetaMask Snaps auf den Tisch bringt, ist eine Plattform, die die Bottom-up-Erstellung nativer Wallet-Integrationen für beliebige Blockchain-Interaktionen ermöglicht – was große Ähnlichkeit mit mobilen App-Stores hat.
Welche Möglichkeiten siehst du mit MetaMask Snaps und was bedeutet das für den Web3-Bereich? Was bedeutet MetaMask Snaps für dich?
Einer der größten Mehrwerte für den Krypto-Bereich durch MetaMask Snaps ist die Verbesserung der UX in Krypto- und DeFi-Protokollen. Ob das die Möglichkeit zur Bündelung von Transaktionen, 1-Klick-Genehmigung für alle Transaktionen innerhalb einer dApp, direkte Contract-Interaktionen bei der Ausführung von Kreditkarten-zu-Krypto-Käufen oder eine noch kreativere Lösung sein wird – das wird die Zeit zeigen.
Wir sind fest davon überzeugt, dass insbesondere für neue Krypto-Nutzer die Abstraktion der Komplexität und Umständlichkeit von Blockchain-Interaktionen ein Game-Changer sein kann.
Erzähl uns, wie es für dich und dein Team ist, MetaMask Snaps mit MetaMask zu entwickeln?
Eine große Motivation beim Entwickeln des Revoke Snap war, dass MetaMask Snaps sich noch in der Entwicklung befinden und die Experimente, die wir jetzt durchführen, einen greifbaren Einfluss darauf haben können, wohin MetaMask, MetaMask Snaps und dadurch in gewissem Maße auch der Krypto-Bereich gehen werden. Es war eine gute Erfahrung, unseren Beitrag zur Zukunft von Web3 leisten zu können.
Hast du Ratschläge für Entwickler, die MetaMask Snaps ausprobieren möchten?
Für alle Entwickler, die MetaMask Snaps ausprobieren möchten – einfach loslegen. MetaMask Snaps sind mit dem verfügbaren GitHub-Template-Repository recht einfach zu starten, und das MetaMask-Team ist ebenfalls sehr hilfsbereit. Das Konzept selbst hat großes Potenzial, und es wurde damit noch nicht so viel gemacht, sodass es leicht ist, einen Mehrwert zu schaffen.
Mit MetaMask Snaps entwickeln
So startest du mit MetaMask Snaps:
Schau dir die Entwicklerdokumentation an
Installiere MetaMask Flask
Schau dir einen MetaMask Snaps Guide an
Bleib mit uns in Kontakt auf Twitter, GitHub Discussions und Discord
Halte bei unserem Team beim nächsten Hackathon in deiner Nähe Ausschau! Happy BUIDLing ⚒️
Haftungsausschluss: MetaMask Snaps werden im Allgemeinen von Drittanbietern entwickelt, die nicht Consensys Software sind. Die Nutzung von durch Dritte entwickelten MetaMask Snaps erfolgt nach eigenem Ermessen und auf eigenes Risiko, mit der Vereinbarung, dass du allein für etwaige Verluste oder Schäden verantwortlich bist, die aus solchen Aktivitäten resultieren. Consensys gibt keine ausdrückliche oder stillschweigende Garantie, weder mündlich noch schriftlich, in Bezug auf durch Dritte entwickelte MetaMask Snaps und lehnt jede Haftung für durch Dritte entwickelte MetaMask Snaps ab. Die Nutzung von Blockchain-bezogener Software birgt Risiken, die du bei der Verwendung von MetaMask Snaps vollständig übernimmst.