Ведущий криптокошелек с самостоятельным хранением и шлюз к Web3, созданный Consensys.
Читать все статьиSnap хакатона Sozu House, созданный в Боготе

MetaMask Snaps — это дорожная карта, которая превратит MetaMask в самый расширяемый кошелёк в мире. Как разработчик, вы можете добавлять свои функции и API в MetaMask совершенно новыми способами. Разработчики Web3 — это основа этого роста, и данная серия материалов призвана продемонстрировать новаторские MetaMask Snaps, создаваемые прямо сейчас.

Репозиторий Snap: https://github.com/Web3Auth/openlogin-snap/
Почему вы его создали?
В Web3Auth мы всегда считали, что многофакторная аутентификация — лучший способ защиты криптоактивов, значительно превосходящий сид-фразы. Когда на ETHBogota мы увидели, что последняя сборка MetaMask Snaps позволяет Snaps предоставлять возможности внешнего управления ключами, мы решили бросить себе вызов и интегрировать технологию MPC в MetaMask на хакатоне Sozu House.
Можете рассказать о технической реализации?
Наша цель состояла в том, чтобы новый пользователь мог войти в систему и настроить двухфакторную аутентификацию (2FA) для доступа к своему аккаунту в MetaMask. В дальнейшем, при каждой попытке подписать транзакцию, наш MPC SDK выполняет пороговую подпись ECDSA. Это достигается путём разделения приватного ключа на две части: локальную долю, хранящуюся в snap, и долю, хранящуюся на сервере подписи. В ходе нескольких раундов коммуникации сервер подписи и snap совместно подписывают транзакцию Ethereum, которая затем подтверждается в сети Goerli. В отличие от сид-фраз, такая схема не имеет единой точки отказа, ведущей к безвозвратной потере ключей: если ноутбук пользователя взломан или скомпрометирован сервер подписи, пользователь не теряет свой приватный ключ.
Как и любой другой snap, наш snap состоит из двух частей: собственно пакета snap и страницы, которая загружает snap и взаимодействует с ним. В идеале мы хотели, чтобы все взаимодействия по управлению ключами происходили внутри интерфейса расширения MetaMask, однако из-за ограничений в правах доступа это оказалось невозможным. Вместо этого аутентификация пользователя происходит за пределами snap, а после её завершения мы переносим состояние в snap. Затем мы подключаемся к RPC-движку MetaMask и обрабатываем запросы на транзакции, используя наш MPC SDK и перенесённое состояние в snap для генерации пороговых подписей ECDSA для транзакций. Примечательно, что часть с переносом состояния мы завершили уже в первые несколько часов хакатона, и нам осталась только функциональность подписи.
Оставшийся процесс можно разделить на две основные задачи:
Адаптация существующих Web3-провайдеров с нашим MPC SDK для обработки входящих запросов на транзакции
Запуск MPC SDK в среде SES MetaMask Snaps
Если вы знакомы с тем, как работает MetaMask или другие кошельки, вы знаете, что подписание транзакции Ethereum требует значительно большего, чем просто использование приватного ключа для подписи сообщения. Большая работа уходит на формирование объекта сообщения, которое нужно подписать. Каждая транзакция следует определённому формату, специфичному для каждой сети и типа транзакции, должна поддерживать устаревшее поведение для обратной совместимости, получать информацию о текущих ценах на газ, рассчитывать расход газа и лимиты газа, а также отслеживать nonce аккаунта и т. д. К счастью, большинство существующих Web3-провайдеров уже делают всё это из коробки. Однако, чтобы наша библиотека пороговых подписей корректно работала с этими SDK, нам пришлось глубоко погрузиться в каждый модуль и заменить функции подписи библиотеки eth-sig-util нашими собственными функциями библиотеки пороговых подписей — это заняло значительное количество времени. Кроме того, поскольку наш MPC SDK был агностичен к конкретной сети и не учитывал проверки, специфичные для Ethereum, нам также пришлось методом обратной разработки воссоздать и переимплементировать проверки из библиотек eth-sig-util, которые мы заменили. Например, EIP-2 указывает, что значение s в подписи ECDSA не должно быть больше n/2 + 1, где n — порядок эллиптической кривой secp256k1, во избежание атак на пластичность транзакций. Это требует от библиотек подписи ECDSA выполнять «переворот» подписи, если её значение s выходит за пределы этого диапазона.
Ещё одной проблемой стал запуск наших MPC SDK в среде MetaMask Snaps. Наш MPC SDK использует wasm (скомпилированный из Rust) для эффективной работы в браузере. Из-за множества раундов коммуникации между SDK и сервером подписи он также использует Socket.IO для связи, чтобы избежать накладных расходов HTTP-заголовков. При попытке загрузить наш wasm-код в snap мы столкнулись со странными проблемами со смешанными типами аргументов в wasm-методах. К сожалению, инструменты отладки wasm по-прежнему весьма ограничены: сообщения об ошибках неинформативны и бесполезны (например, «Uncaught RuntimeError: unreachable»). В итоге мы обошли это ограничение, принимая все смешанные входные аргументы как строки и разбирая их как целые числа или байтовые массивы непосредственно внутри wasm-кода. Другой проблемой стало то, что socket.io не работал в среде MetaMask Snaps. Socket.IO — это отдельная библиотека/спецификация, построенная поверх обычных WebSockets, которая обрабатывает такие вещи, как обновление соединения, обрыв соединений, переключение на long polling и т. д. — всё это очень полезно при использовании WebSockets в производственных средах. К сожалению, нам не удалось запустить библиотеки Socket.IO в среде MetaMask Snap. Поэтому нам пришлось вернуться к обычным WebSockets, а также переписать сервер подписи для использования стандартных WebSockets вместо socket.io и реализовать стратегию опроса на случай проблем с WebSocket.
Расскажите немного о себе и своей команде.
Мы с Чженом — сооснователи Web3Auth, и наша компания специализируется на предоставлении интуитивных, безопасных и некастодиальных решений для управления ключами. Мы убеждены, что хорошая безопасность должна быть простой в использовании и незаметной — иначе она не получит широкого распространения. Именно поэтому мы являемся активными сторонниками использования многофакторной аутентификации для приватных ключей.
Когда вы впервые познакомились с MetaMask Snaps и каким был этот опыт?
Мы попробовали MetaMask Snaps около года назад, но, к сожалению, тогда у него не было возможностей для расширения функций управления приватными ключами внутри MetaMask. С недавним введением SIP-2 (спасибо, Олаф!), которое позволяет MetaMask Snaps расширять keyring MetaMask, мы с большим воодушевлением ждём, что станет возможным! В процессе создания нашего snap я также изучил систему SES, на которой основан MetaMask Snaps, и считаю, что это очень надёжная основа для того, чтобы MetaMask стал платформой, позволяющей разработчикам добавлять функциональность через MetaMask Snaps.
Чем MetaMask Snaps отличается от других кошельков?
Расширяемостью! Я считаю, что MetaMask Snaps предоставляет безопасный интерфейс для разработчиков, позволяющий экспериментировать и дополнять MetaMask, не ставя под угрозу безопасность самого расширения MetaMask. В отличие от других типов проектов, кошельки требуют высоких стандартов безопасности, а это означает, что внедрение новой функциональности от третьих сторон всегда является долгим и трудоёмким процессом проверки кода и аудитов, что сдерживает инновации. MetaMask Snaps позволяет команде MetaMask продолжать создавать безопасный продукт, одновременно давая внешним разработчикам возможность экспериментировать и расширять его функциональность.
Расскажите, каково это — создавать Snaps с MetaMask для вас и вашей команды?
Я думаю, что MetaMask Snaps — это определённо путь вперёд: он позволяет людям создавать функциональность, сохраняя при этом безопасность базового расширения MetaMask. Сейчас есть некоторые шероховатости, но улучшения приходят каждый день, и в целом я считаю это очень захватывающим.
Что MetaMask Snaps значит для вас?
Я надеюсь, что добавление возможностей многофакторной аутентификации в MetaMask через MetaMask Snaps поможет миллионам обычных пользователей MetaMask более надёжно управлять своими аккаунтами и защитит их от мошенничества и взломов. MFA уже сегодня делает это для миллиардов пользователей Web2, и мы хотим привнести эти надёжные лучшие практики в Web3.
Какие возможности вы видите в MetaMask Snaps и то, что он открывает для пространства Web3?
В целом я считаю, что MetaMask Snaps представляет собой реалистичный способ для MetaMask открыть свою кодовую базу для вклада других участников без ущерба для безопасности.
Есть ли советы, которыми вы хотели бы поделиться с разработчиками, желающими попробовать MetaMask Snaps?
Просто попробуйте! Это может показаться немного новым, но до сих пор всё было очень доступно, и поддержка отличная — в канале Consensys Discord для MetaMask Snaps. Над этим работает множество замечательных разработчиков, и если вы хотите участвовать в формировании MetaMask Snaps, сейчас самое время начать создавать на его основе и давать обратную связь!
Чтобы начать работу с MetaMask Snaps:
Ознакомьтесь с документацией для разработчиков
Установите MetaMask Flask
Изучите руководство по MetaMask Snaps
Оставайтесь на связи с нами в Twitter, обсуждениях GitHub и Discord
Следите за нашей командой на следующем хакатоне рядом с вами! Удачного BUIDLing'а ⚒️
Отказ от ответственности: MetaMask Snaps, как правило, разрабатываются третьими сторонами, а не Consensys Software. Использование MetaMask Snaps, разработанных третьими сторонами, осуществляется по вашему собственному усмотрению и на ваш риск, и вы соглашаетесь с тем, что несёте единоличную ответственность за любые убытки или ущерб, возникшие в результате такой деятельности. Consensys не даёт никаких явных или подразумеваемых гарантий, устных или письменных, в отношении MetaMask Snaps, разработанных третьими сторонами, и отказывается от какой-либо ответственности за MetaMask Snaps, разработанные третьими сторонами. Использование программного обеспечения, связанного с блокчейном, сопряжено с рисками, которые вы полностью принимаете на себя при использовании MetaMask Snaps.
Переведено ИИ. Может содержать ошибки. Пожалуйста, всегда проверяйте информацию.