MPC Snap: Integrando Autenticação Multifator ao MetaMask

Um Snap de Hackathon da Sozu House construído em Bogotá

7 min de leitura
MPC Snap: Integrando Autenticação Multifator ao MetaMask

MetaMask Snaps é o roteiro para tornar a MetaMask a carteira mais extensível do mundo. Como desenvolvedor, você pode trazer seus recursos e APIs para a MetaMask de formas totalmente novas. Os desenvolvedores Web3 são o núcleo desse crescimento, e esta série tem como objetivo destacar os MetaMask Snaps inovadores que estão sendo criados hoje.

Web3Auth Snap

Repositório do Snap: https://github.com/Web3Auth/openlogin-snap/

Por que você o criou?

Na Web3Auth, sempre acreditamos que a autenticação multifator é a melhor forma de proteger ativos cripto, sendo muito superior às seed phrases. Quando vimos na ETHBogota que a versão mais recente do MetaMask Snaps permitia que os Snaps oferecessem capacidades externas de gerenciamento de chaves, decidimos nos desafiar a integrar a tecnologia MPC à MetaMask no hackathon da Sozu House.

Você pode nos guiar pela implementação técnica?

  • Nosso objetivo era permitir que um novo usuário fizesse login e configurasse a 2FA para acessar sua conta na MetaMask. Em seguida, nos bastidores, sempre que tentasse assinar uma transação, nosso SDK de MPC realizaria uma assinatura ECDSA de limiar. Isso é feito dividindo uma chave privada em duas partes: um compartilhamento local armazenado no snap e outro armazenado em um servidor de assinatura. Ao longo de várias rodadas de comunicação, o servidor de assinatura e o snap devem ser capazes de assinar conjuntamente uma transação Ethereum e confirmá-la na rede Goerli. Diferentemente das seed phrases, essa configuração não possui um único ponto de falha que leve à perda irreversível de chaves: se o laptop do usuário for hackeado, ou se o servidor de assinatura for comprometido, o usuário não perde sua chave privada.

  • Como qualquer outro snap, o nosso é composto por duas partes: o pacote do snap em si e uma página que carrega e interage com o snap. Nosso fluxo de usuário ideal era manter todas as interações de gerenciamento de chaves dentro da interface da extensão MetaMask, mas devido a limitações de permissões, não conseguimos fazer isso. Em vez disso, a autenticação do usuário acontece fora do snap e, uma vez concluída, migramos o estado para dentro do snap. Em seguida, nos conectamos ao mecanismo RPC da MetaMask e respondemos às solicitações de transação usando nosso SDK de MPC e o estado migrado no snap para gerar assinaturas ECDSA de limiar nas transações. Surpreendentemente, concluímos a parte de migração de estado nas primeiras horas do hackathon e ficamos apenas com a funcionalidade de assinatura.

  • O restante do processo pode ser dividido em duas tarefas principais:

  • Reutilizar provedores Web3 existentes com nosso SDK de MPC para lidar com as solicitações de transação recebidas

  • Fazer os SDKs de MPC funcionarem no ambiente SES do MetaMask Snaps

  • Se você conhece o funcionamento da MetaMask ou de outras carteiras, sabe que assinar uma transação Ethereum exige muito mais do que simplesmente usar uma chave privada para assinar uma mensagem. Há muito trabalho envolvido na formação do objeto de mensagem a ser assinado. Cada transação segue um formato específico para cada rede e tipo de transação, possui comportamentos legados que precisam ser suportados para compatibilidade retroativa, precisa obter informações sobre os preços atuais de gas, calcular o gas a ser utilizado e os limites de gas, além de rastrear o nonce da conta, entre outros aspectos. Felizmente, a maioria dos provedores Web3 existentes já realiza essas tarefas nativamente. No entanto, para fazer nossa biblioteca de assinatura de limiar funcionar bem com esses SDKs, precisamos mergulhar fundo em cada módulo e substituir as funções de assinatura da biblioteca eth-sig-util pelas funções de assinatura da nossa própria biblioteca de assinatura de limiar, o que demandou um tempo considerável. Além disso, como nosso SDK de MPC era agnóstico em relação à rede e não contemplava verificações específicas do Ethereum, também precisamos fazer engenharia reversa e reimplementar verificações das bibliotecas eth-sig-util que havíamos substituído. Por exemplo, o EIP-2 especifica que o valor s em uma assinatura ECDSA não deve ser maior que n/2 + 1, onde n é a ordem da curva elíptica secp256k1, a fim de evitar ataques de maleabilidade de transação, o que exige que as bibliotecas de assinatura ECDSA realizem um "flip" da assinatura caso seu valor s esteja fora desse intervalo.

  • Outro desafio que enfrentamos foi fazer nossos SDKs de MPC funcionarem no ambiente do MetaMask Snaps. Nosso SDK de MPC utiliza wasm (compilado a partir de Rust) para funcionar de forma eficiente no navegador. Devido às múltiplas rodadas de comunicação entre o SDK e o servidor de assinatura, ele também usa Socket.IO para se comunicar e evitar a sobrecarga dos cabeçalhos HTTP. Ao tentar carregar nosso código wasm no snap, encontramos problemas estranhos com tipos de argumentos mistos nos métodos wasm. Infelizmente, as ferramentas de depuração de wasm ainda são bastante limitadas, com mensagens de erro pouco úteis e informativas (por exemplo, "Uncaught RuntimeError: unreachable"). No fim, contornamos essa limitação aceitando todos os argumentos de entrada mistos como strings e convertendo-os para inteiros ou arrays de bytes dentro do próprio código wasm. Outro problema que encontramos foi que o socket.io não funcionava no ambiente do MetaMask Snaps. O Socket.IO é uma biblioteca e especificação separada, construída sobre WebSockets padrão, que lida com coisas como atualização de conexão, quedas de conexão, fallbacks para long polling, entre outros recursos muito úteis ao usar WebSockets em ambientes de produção. Infelizmente, não conseguimos fazer as bibliotecas do Socket.IO funcionar no ambiente do MetaMask Snap. Por isso, precisamos recorrer aos WebSockets padrão e também reescrever o servidor de assinatura para usar WebSockets nativos em vez do socket.io, além de implementar uma estratégia de polling como fallback caso o WebSocket apresentasse problemas.

Pode nos contar um pouco sobre você e sua equipe?

Zhen e eu somos os cofundadores da Web3Auth, e nossa empresa é especializada em fornecer soluções de gerenciamento de chaves intuitivas, seguras e não custodiais. Acreditamos que uma boa segurança precisa ser fácil de usar e invisível, caso contrário não será amplamente adotada. Por isso, somos grandes defensores do uso da autenticação multifator para chaves privadas.

Quando você teve seu primeiro contato com o MetaMask Snaps e como foi essa experiência?

Experimentamos o MetaMask Snaps há cerca de um ano, mas infelizmente, na época, ele ainda não tinha as capacidades necessárias para nos permitir estender as funções de gerenciamento de chaves privadas dentro da MetaMask. Com a introdução recente do SIP-2 (obrigado, Olaf!), que permite ao MetaMask Snaps estender o keyring da MetaMask, ficamos muito animados para ver o que é possível! Enquanto construía nosso snap, também explorei o sistema SES no qual o MetaMask Snaps é baseado, e acredito que é uma base muito sólida para a MetaMask atuar como uma plataforma para que desenvolvedores adicionem funcionalidades por meio do MetaMask Snaps.

O que diferencia o MetaMask Snaps de outras carteiras?

A extensibilidade! Acredito que o MetaMask Snaps oferece uma interface segura para que desenvolvedores experimentem e aprimorem a MetaMask sem comprometer a segurança da extensão em si. Diferentemente de outros tipos de projetos, as carteiras exigem altos padrões de segurança, o que significa que integrar novas funcionalidades de terceiros é sempre um processo longo e árduo de revisão de código e auditorias, o que inibe a inovação. O MetaMask Snaps permite que a equipe da MetaMask continue desenvolvendo um produto seguro, ao mesmo tempo em que permite que desenvolvedores externos experimentem e ampliem suas funcionalidades.

Conte-nos como é o processo de criação de Snaps com a MetaMask para você e sua equipe.

Acredito que o MetaMask Snaps é definitivamente o caminho a seguir, permitindo que as pessoas criem funcionalidades enquanto mantêm a extensão MetaMask base segura. Ainda há alguns pontos a ajustar, mas as melhorias chegam todos os dias, e acho que é muito empolgante no geral.

O que o MetaMask Snaps significa para você?

Espero que adicionar capacidades de autenticação multifator à MetaMask por meio do MetaMask Snaps ajude os milhões de usuários comuns da MetaMask a gerenciar suas contas com mais segurança e os proteja de golpes e ataques. A MFA já faz isso hoje para bilhões de usuários Web2, e queremos trazer essas boas práticas de segurança para o Web3.

Que oportunidades você enxerga no MetaMask Snaps e nas possibilidades que ele abre para o espaço Web3?

De forma geral, acredito que o MetaMask Snaps representa uma maneira realista de a MetaMask abrir seu código para que outros possam contribuir sem comprometer a segurança.

Algum conselho que gostaria de compartilhar com desenvolvedores interessados em experimentar o MetaMask Snaps?

Experimente! Pode parecer um pouco novo, mas tem sido muito acessível até agora, e o suporte é excelente no canal do Discord da Consensys dedicado ao MetaMask Snaps. Muitos desenvolvedores incríveis estão trabalhando nisso, e se você quiser fazer parte da conversa que está moldando o MetaMask Snaps, agora é o momento de começar a construir e dar feedback!

Construindo com o MetaMask Snaps

Para começar com o MetaMask Snaps:

  1. Confira a documentação para desenvolvedores

  2. Instale o MetaMask Flask

  3. Confira um guia do MetaMask Snaps

  4. Fique conectado conosco no Twitter, nas discussões do GitHub e no Discord

Fique de olho na nossa equipe no próximo hackathon perto de você! Bom BUIDLing ⚒️

Aviso legal: Os MetaMask Snaps são geralmente desenvolvidos por terceiros que não a Consensys Software. O uso de MetaMask Snaps desenvolvidos por terceiros é feito a seu próprio critério e risco, com a concordância de que você será o único responsável por qualquer perda ou dano resultante de tais atividades. A Consensys não oferece nenhuma garantia expressa ou implícita, seja verbal ou escrita, em relação a MetaMask Snaps desenvolvidos por terceiros, e se isenta de toda responsabilidade por MetaMask Snaps desenvolvidos por terceiros. O uso de softwares relacionados a blockchain envolve riscos, e você os assume integralmente ao utilizar o MetaMask Snaps.

Traduzido por IA. Pode conter erros. Por favor, verifique sempre as informações.

Avalie a tradução
  • MetaMask
    MetaMask

    A principal carteira cripto de autocustódia e portal para a Web3, desenvolvida pela Consensys.

    Ler todos os artigos