MPC Snap: Integración de autenticación multifactor en MetaMask

Un Snap del Hackathon de Sozu House construido en Bogotá

7 min de lectura
MPC Snap: Integración de autenticación multifactor en MetaMask

MetaMask Snaps es la hoja de ruta para convertir a MetaMask en la wallet más extensible del mundo. Como desarrollador, puedes incorporar tus funciones y APIs a MetaMask de formas completamente nuevas. Los desarrolladores de Web3 son el núcleo de este crecimiento, y esta serie tiene como objetivo destacar los novedosos MetaMask Snaps que se están construyendo hoy en día.

Web3Auth Snap

Repositorio del Snap: https://github.com/Web3Auth/openlogin-snap/

¿Por qué lo construyeron?

En Web3Auth, siempre hemos creído que la autenticación multifactor es la mejor manera de proteger los activos cripto, y es mucho mejor que las frases semilla. Cuando vimos en ETHBogota que la última versión de MetaMask Snaps permitía a los Snaps ofrecer capacidades externas de gestión de claves, decidimos desafiarnos a integrar tecnología MPC en MetaMask durante el hackathon de Sozu House.

¿Puedes explicarnos la implementación técnica?

  • Nuestro objetivo era permitir que un nuevo usuario iniciara sesión y configurara la autenticación en dos pasos (2FA) para acceder a su cuenta en MetaMask. Posteriormente, en segundo plano, cada vez que intentara firmar una transacción, nuestro SDK de MPC realizaría una firma ECDSA de umbral. Esto se logra dividiendo una clave privada en dos partes: una parte local almacenada en el snap y otra almacenada en un servidor de firma. A lo largo de varias rondas de comunicación, el servidor de firma y el snap deben poder firmar conjuntamente una transacción de Ethereum y confirmarla en la red Goerli. A diferencia de las frases semilla, esta configuración no tiene un único punto de fallo que conduzca a la pérdida irreversible de claves: si el portátil del usuario es hackeado, o si el servidor de firma es hackeado, el usuario no pierde su clave privada.

  • Como cualquier otro snap, el nuestro consta de dos partes: el paquete del snap en sí y una página que carga e interactúa con el snap. Nuestro flujo de usuario ideal era mantener todas las interacciones de gestión de claves dentro de la interfaz de usuario de la extensión de MetaMask, pero debido a limitaciones en los permisos no pudimos hacerlo. En su lugar, la autenticación del usuario ocurre fuera del snap y, una vez completada, migramos el estado al snap. Posteriormente, nos conectamos al motor RPC de MetaMask y respondemos a las solicitudes de transacciones utilizando nuestro SDK de MPC y el estado migrado en el snap para generar firmas ECDSA de umbral en las transacciones. Sorprendentemente, completamos la parte de migración de estado en las primeras horas del hackathon y solo nos quedó la funcionalidad de firma.

  • El resto del proceso puede dividirse en dos tareas principales:

  • Reutilizar los proveedores Web3 existentes con nuestro SDK de MPC para gestionar las solicitudes de transacciones entrantes

  • Hacer funcionar los SDKs de MPC en el entorno SES de MetaMask Snaps

  • Si estás familiarizado con el funcionamiento de MetaMask, o con cómo funcionan otras wallets, sabrás que firmar una transacción de Ethereum requiere mucho más trabajo que simplemente usar una clave privada para firmar un mensaje. Se necesita mucho trabajo para formar el objeto de mensaje que se va a firmar. Cada transacción sigue un formato particular específico para cada cadena y tipo de transacción, tiene comportamientos heredados que deben ser compatibles con versiones anteriores, debe obtener información sobre los precios actuales del gas, debe calcular el gas a utilizar y los límites de gas, y también debe rastrear el nonce de la cuenta, entre otras cosas. Afortunadamente, la mayoría de los proveedores Web3 existentes ya hacen estas cosas de forma nativa. Sin embargo, para que nuestra biblioteca de firmas de umbral funcionara correctamente con estos SDKs, tuvimos que profundizar en cada módulo y reemplazar las funciones de firma de la biblioteca eth-sig-util con las funciones de firma de nuestra propia biblioteca de firmas de umbral, lo que llevó una cantidad significativa de tiempo. Además, como nuestro SDK de MPC era agnóstico a la cadena y no contemplaba las verificaciones específicas de Ethereum, también tuvimos que aplicar ingeniería inversa y reimplementar las verificaciones de las bibliotecas eth-sig-util que habíamos reemplazado. Por ejemplo, EIP-2 especifica que el valor s en una firma ECDSA no debe ser mayor que n/2 + 1, donde n es el orden de la curva elíptica secp256k1, para prevenir ataques de maleabilidad de transacciones, lo que requiere que las bibliotecas de firma ECDSA realicen un "volteo" de la firma si su valor s cae fuera de este rango.

  • Otro desafío que enfrentamos fue hacer funcionar nuestros SDKs de MPC en el entorno de MetaMask Snaps. Nuestro SDK de MPC utiliza wasm (compilado desde Rust) para ejecutarse de manera eficiente en el navegador. Debido a las múltiples rondas de comunicación entre el SDK y el servidor de firma, también utiliza Socket.IO para comunicarse y evitar la sobrecarga de los encabezados HTTP. Al intentar cargar nuestro código wasm en el snap, nos encontramos con algunos problemas extraños relacionados con tipos de argumentos mixtos en los métodos wasm. Desafortunadamente, las herramientas de depuración de wasm siguen siendo muy limitadas, con mensajes de error poco útiles e informativos (por ejemplo, "Uncaught RuntimeError: unreachable"). Al final, resolvimos esta limitación aceptando todos los argumentos de entrada mixtos como cadenas de texto y analizándolos como enteros o arrays de bytes dentro del propio código wasm. Otro problema que encontramos fue que socket.io no funcionaba en el entorno de MetaMask Snaps. Socket.IO es una biblioteca y especificación independiente construida sobre WebSockets estándar que gestiona cosas como la actualización de conexiones, las conexiones interrumpidas, los mecanismos de respaldo a long polling, etc., que son muy útiles al usar WebSockets en entornos de producción. Desafortunadamente, no pudimos hacer funcionar las bibliotecas de Socket.IO en el entorno de MetaMask Snap. Por ello, tuvimos que recurrir a WebSockets estándar y también reescribir el servidor de firma para usar WebSockets predeterminados en lugar de socket.io, y recurrir a una estrategia de polling si el websocket presentaba problemas.

¿Puedes contarnos un poco sobre ti y tu equipo?

Zhen y yo somos los cofundadores de Web3Auth, y nuestra empresa se especializa en proporcionar soluciones de gestión de claves intuitivas, seguras y sin custodia. Creemos que una buena seguridad debe ser fácil de usar e invisible, o no será adoptada ampliamente. Por eso somos grandes defensores del uso de la autenticación multifactor para las claves privadas.

¿Cuándo conociste MetaMask Snaps por primera vez y cómo fue tu experiencia?

Probamos MetaMask Snaps hace aproximadamente un año, pero desafortunadamente, en ese momento no tenía las capacidades para permitirnos extender las funciones de gestión de claves privadas dentro de MetaMask. Con la reciente introducción de SIP-2 (¡gracias, Olaf!), que permite a MetaMask Snaps extender el keyring de MetaMask, ¡estamos muy emocionados de ver lo que es posible! Mientras construía nuestro snap, también exploré el sistema SES en el que se basa MetaMask Snaps, y creo que es una base muy sólida para que MetaMask actúe como una plataforma que permita a los desarrolladores añadir funcionalidades a través de MetaMask Snaps.

¿Qué diferencia a MetaMask Snaps de otras wallets?

¡La extensibilidad! Creo que MetaMask Snaps proporciona una interfaz segura para que los desarrolladores experimenten y amplíen MetaMask sin comprometer la seguridad de la propia extensión. A diferencia de otros tipos de proyectos, las wallets requieren altos estándares de seguridad, lo que significa que integrar nuevas funcionalidades de terceros siempre es un proceso largo y arduo de revisión de código y auditorías, lo que frena la innovación. MetaMask Snaps permite al equipo de MetaMask seguir construyendo un producto seguro, mientras que al mismo tiempo permite a los desarrolladores externos experimentar y ampliar su funcionalidad.

Cuéntanos cómo es para ti y tu equipo construir Snaps con MetaMask.

Creo que MetaMask Snaps es definitivamente el camino a seguir, ya que permite a las personas construir funcionalidades manteniendo segura la extensión base de MetaMask. Hay algunos detalles por pulir ahora mismo, pero las mejoras llegan cada día y creo que en general es muy emocionante.

¿Qué significa MetaMask Snaps para ti?

Espero que añadir capacidades de autenticación multifactor a MetaMask a través de MetaMask Snaps ayude a los millones de usuarios convencionales de MetaMask a gestionar sus cuentas de forma más segura y les proteja de ser víctimas de estafas y hackeos. La MFA ya está haciendo esto hoy en día para miles de millones de usuarios de Web2, y queremos llevar esas buenas prácticas de seguridad a Web3.

¿Qué oportunidades ves con MetaMask Snaps y las posibilidades que abre para el espacio Web3?

En general, creo que MetaMask Snaps representa una forma realista para que MetaMask abra su base de código a las contribuciones de otros sin comprometer la seguridad.

¿Algún consejo que quieras compartir con los desarrolladores interesados en probar MetaMask Snaps?

¡Solo inténtalo! Puede parecer algo nuevo, pero hasta ahora ha sido muy accesible y el soporte es excelente en el canal de Discord de Consensys para MetaMask Snaps. Hay muchos desarrolladores increíbles trabajando en ello, y si quieres ser parte de la conversación que está dando forma a MetaMask Snaps, ¡ahora es el momento de construir sobre él y dar tu opinión!

Construyendo con MetaMask Snaps

Para comenzar con MetaMask Snaps:

  1. Consulta la documentación para desarrolladores

  2. Instala MetaMask Flask

  3. Consulta una guía de MetaMask Snaps

  4. Mantente conectado con nosotros en Twitter, discusiones de GitHub y Discord

¡Estén atentos a nuestro equipo en el próximo hackathon cerca de ustedes! ¡Feliz BUIDLing! ⚒️

Aviso legal: Los MetaMask Snaps son generalmente desarrollados por terceros distintos a Consensys Software. El uso de MetaMask Snaps desarrollados por terceros se realiza a tu propia discreción y riesgo, y con el acuerdo de que serás el único responsable de cualquier pérdida o daño que resulte de dichas actividades. Consensys no ofrece ninguna garantía expresa o implícita, ya sea oral o escrita, con respecto a los MetaMask Snaps desarrollados por terceros, y declina toda responsabilidad por los MetaMask Snaps desarrollados por terceros. El uso de software relacionado con blockchain conlleva riesgos, y los asumes en su totalidad al usar MetaMask Snaps.

Traducido por IA. Puede contener errores. Por favor, verifique siempre la información.

Califica la traducción
  • MetaMask
    MetaMask

    La billetera cripto autocustodiada líder y puerta de entrada a Web3, desarrollada por Consensys.

    Leer todos los artículos