MetaMask Snaps est la feuille de route pour faire de MetaMask le portefeuille le plus extensible au monde. En tant que développeur, vous pouvez intégrer vos fonctionnalités et vos API à MetaMask de manières totalement nouvelles. Les développeurs Web3 sont au cœur de cette croissance, et cette série vise à mettre en avant les MetaMask Snaps novateurs en cours de développement aujourd'hui.
Web3Auth Snap
Dépôt du Snap : https://github.com/Web3Auth/openlogin-snap/
Pourquoi l'avez-vous développé ?
Chez Web3Auth, nous avons toujours cru que l'authentification multi-facteurs est la meilleure façon de sécuriser les actifs crypto, et qu'elle est bien supérieure aux phrases de récupération. Lorsque nous avons découvert à ETHBogota que la dernière version de MetaMask Snaps permettait aux Snaps de fournir des capacités de gestion de clés externes, nous avons décidé de nous lancer le défi d'intégrer la technologie MPC dans MetaMask lors du hackathon Sozu House.
Pouvez-vous nous présenter l'implémentation technique ?
Notre objectif était de permettre à un nouvel utilisateur de se connecter et de configurer la 2FA pour accéder à son compte dans MetaMask. Par la suite, en coulisses, chaque fois qu'il tente de signer une transaction, notre SDK MPC effectue une signature ECDSA à seuil. Cela se fait en divisant une clé privée en deux parties : une part locale stockée dans le snap et une autre stockée sur un serveur de signature. Au cours de plusieurs cycles de communication, le serveur de signature et le snap doivent être en mesure de signer conjointement une transaction Ethereum et de la faire confirmer sur le réseau Goerli. Contrairement aux phrases de récupération, cette configuration ne présente pas de point de défaillance unique pouvant entraîner une perte irréversible des clés : si l'ordinateur portable de l'utilisateur est piraté, ou si le serveur de signature est compromis, l'utilisateur ne perd pas sa clé privée.
Comme tout autre snap, notre snap se compose de deux parties : le package snap proprement dit, et une page qui charge le snap et interagit avec lui. Notre flux utilisateur idéal était de maintenir toutes les interactions de gestion des clés au sein de l'interface utilisateur de l'extension MetaMask, mais en raison de limitations au niveau des permissions, nous n'avons pas pu le faire. À la place, l'authentification de l'utilisateur se déroule en dehors du snap, puis une fois celle-ci terminée, nous migrons l'état vers le snap. Ensuite, nous nous connectons au moteur RPC de MetaMask et répondons aux demandes de transaction en utilisant notre SDK MPC et l'état migré dans le snap pour générer des signatures ECDSA à seuil sur les transactions. Étonnamment, nous avons terminé la partie migration d'état dans les premières heures du hackathon et il ne nous restait plus que la fonctionnalité de signature.
Le reste du processus peut être divisé en deux tâches principales :
Réutiliser les fournisseurs Web3 existants avec notre SDK MPC pour gérer les demandes de transaction entrantes
Faire fonctionner les SDK MPC dans l'environnement SES de MetaMask Snaps
Si vous connaissez le fonctionnement de MetaMask, ou celui d'autres portefeuilles, vous savez que signer une transaction Ethereum demande bien plus que simplement utiliser une clé privée pour signer un message. Un travail considérable est nécessaire pour former l'objet message à signer. Chaque transaction suit un format particulier propre à chaque chaîne et type de transaction, présente des comportements hérités devant être pris en charge pour la rétrocompatibilité, doit obtenir des informations sur les prix actuels du gaz, doit calculer le gaz à utiliser et les limites de gaz, et doit également suivre le nonce du compte, etc. Heureusement, la plupart des fournisseurs Web3 existants gèrent déjà ces aspects nativement. Cependant, pour faire fonctionner correctement notre bibliothèque de signature à seuil avec ces SDK, nous avons dû explorer en profondeur chaque module et remplacer les fonctions de signature de la bibliothèque eth-sig-util par les fonctions de signature de notre propre bibliothèque de signature à seuil, ce qui a demandé un temps considérable. De plus, comme notre SDK MPC était agnostique en termes de chaîne et ne prenait pas en compte les vérifications spécifiques à Ethereum, nous avons également dû procéder à de la rétro-ingénierie et réimplémenter les vérifications des bibliothèques eth-sig-util que nous avions remplacées. Par exemple, l'EIP-2 spécifie que la valeur s dans une signature ECDSA ne doit pas être supérieure à n/2 + 1, où n est l'ordre de la courbe elliptique secp256k1, afin de prévenir les attaques de malléabilité des transactions, ce qui oblige les bibliothèques de signature ECDSA à effectuer un « retournement » de la signature si sa valeur s se situe en dehors de cette plage.
Un autre défi auquel nous avons été confrontés était de faire fonctionner nos SDK MPC dans l'environnement MetaMask Snaps. Notre SDK MPC utilise wasm (compilé depuis Rust) pour s'exécuter efficacement dans le navigateur. En raison des multiples cycles de communication entre le SDK et le serveur de signature, il utilise également Socket.IO pour communiquer afin d'éviter la surcharge des en-têtes HTTP. En tentant de charger notre code wasm dans le snap, nous avons rencontré des problèmes étranges liés à des types d'arguments mixtes dans les méthodes wasm. Malheureusement, les outils de débogage wasm sont encore très insuffisants, avec des messages d'erreur peu utiles et peu informatifs (par exemple : « Uncaught RuntimeError: unreachable »). Au final, nous avons contourné cette limitation en acceptant tous les arguments d'entrée mixtes sous forme de chaînes de caractères, et en les analysant comme des entiers ou des tableaux d'octets directement dans le code wasm. Un autre problème que nous avons rencontré était que socket.io ne fonctionnait pas dans l'environnement MetaMask Snaps. Socket.IO est une bibliothèque et spécification distincte construite au-dessus des WebSockets standard, qui gère des aspects tels que la mise à niveau des connexions, les connexions interrompues, les replis vers le long polling, etc., ce qui est très utile lors de l'utilisation des WebSockets en environnement de production. Malheureusement, nous n'avons pas pu faire fonctionner les bibliothèques de Socket.IO dans l'environnement MetaMask Snap. Nous avons donc dû revenir aux WebSockets standard, réécrire le serveur de signature pour utiliser les WebSockets par défaut au lieu de socket.io, et adopter une stratégie de polling en cas de problème avec le WebSocket.
Pouvez-vous nous parler un peu de vous et de votre équipe ?
Zhen et moi sommes les cofondateurs de Web3Auth, et notre entreprise est spécialisée dans la fourniture de solutions de gestion de clés intuitives, sécurisées et non-custodiales. Nous croyons que la bonne sécurité doit être facile à utiliser et invisible, sinon elle ne sera pas largement adoptée. C'est pourquoi nous sommes de fervents défenseurs de l'utilisation de l'authentification multi-facteurs pour les clés privées.
Quand avez-vous découvert MetaMask Snaps pour la première fois et quelle a été votre expérience ?
Nous avons essayé MetaMask Snaps il y a environ un an, mais malheureusement, il ne disposait pas encore des capacités nécessaires pour nous permettre d'étendre les fonctions de gestion des clés privées au sein de MetaMask. Avec l'introduction récente de SIP-2 (merci Olaf !), qui permet aux MetaMask Snaps d'étendre le keyring de MetaMask, nous sommes très enthousiastes à l'idée de découvrir ce qui est possible ! Lors de la création de notre snap, j'ai également exploré le système SES sur lequel MetaMask Snaps est basé, et je pense que c'est une base très solide pour que MetaMask serve de plateforme permettant aux développeurs d'ajouter des fonctionnalités via MetaMask Snaps.
En quoi MetaMask Snaps se distingue-t-il des autres portefeuilles ?
Son extensibilité ! Je pense que MetaMask Snaps offre une interface sécurisée permettant aux développeurs d'expérimenter et d'enrichir MetaMask sans compromettre la sécurité de l'extension MetaMask elle-même. Contrairement à d'autres types de projets, les portefeuilles exigent des standards de sécurité élevés, ce qui signifie que l'intégration de nouvelles fonctionnalités provenant de tiers est toujours un long et laborieux processus de révision de code et d'audits, qui freine l'innovation. MetaMask Snaps permet à l'équipe MetaMask de continuer à développer un produit sécurisé, tout en permettant aux développeurs externes d'expérimenter et d'étendre ses fonctionnalités.
Parlez-nous de votre expérience et de celle de votre équipe dans la création de Snaps avec MetaMask.
Je pense que MetaMask Snaps est définitivement la voie à suivre, permettant aux gens de développer des fonctionnalités tout en maintenant la sécurité de l'extension MetaMask de base. Il y a quelques imperfections pour l'instant, mais des améliorations arrivent chaque jour, et je pense que c'est globalement très prometteur.
Que représente MetaMask Snaps pour vous ?
J'espère que l'ajout de capacités d'authentification multi-facteurs à MetaMask via MetaMask Snaps aidera les millions d'utilisateurs grand public de MetaMask à gérer leurs comptes de manière plus sécurisée et les protégera contre les arnaques et les piratages. La MFA accomplit déjà cela aujourd'hui pour des milliards d'utilisateurs Web2, et nous souhaitons apporter ces bonnes pratiques de sécurité au Web3.
Quelles opportunités voyez-vous avec MetaMask Snaps et les possibilités qu'il ouvre pour l'espace Web3 ?
En général, je pense que MetaMask Snaps représente une voie réaliste pour que MetaMask ouvre sa base de code à d'autres contributeurs sans compromettre la sécurité.
Avez-vous des conseils à partager avec les développeurs souhaitant essayer MetaMask Snaps ?
Lancez-vous ! Cela peut sembler un peu nouveau, mais c'est très accessible jusqu'à présent et le support est excellent sur le canal Discord de Consensys dédié à MetaMask Snaps. De nombreux développeurs talentueux y travaillent, et si vous souhaitez participer à la conversation pour façonner MetaMask Snaps, c'est le moment idéal pour commencer à développer dessus et donner vos retours !
Développer avec MetaMask Snaps
Pour démarrer avec MetaMask Snaps :
Consultez la documentation développeur
Installez MetaMask Flask
Consultez un guide MetaMask Snaps
Restez connecté avec nous sur Twitter, GitHub discussions et Discord
Gardez un œil sur notre équipe lors du prochain hackathon près de chez vous ! Bon BUIDLing ⚒️
Avertissement : Les MetaMask Snaps sont généralement développés par des tiers autres que Consensys Software. L'utilisation de MetaMask Snaps développés par des tiers se fait à votre propre discrétion et à vos propres risques, et implique votre accord selon lequel vous serez seul responsable de toute perte ou dommage résultant de ces activités. Consensys ne fournit aucune garantie expresse ou implicite, qu'elle soit orale ou écrite, concernant les MetaMask Snaps développés par des tiers, et décline toute responsabilité pour les MetaMask Snaps développés par des tiers. L'utilisation de logiciels liés à la blockchain comporte des risques, que vous assumez pleinement lors de l'utilisation de MetaMask Snaps.