Ведущий криптокошелек с самостоятельным хранением и шлюз к Web3, созданный Consensys.
Читать все статьиПобедитель хакатона ETHLisbon

MetaMask Snaps — это дорожная карта к созданию самого расширяемого кошелька в мире. Как разработчик, вы можете добавлять свои функции и API в MetaMask совершенно новыми способами. Web3-разработчики — основа этого роста, и данная серия материалов призвана продемонстрировать новаторские MetaMask Snaps, создаваемые сегодня.
Репозиторий Snap: https://github.com/Tbaut/template-snap-monorepo
Почему вы его создали?
Когда речь заходит о подписании транзакций в Ethereum, главная проблема состоит в том, что большинство пользователей практически не понимают, что именно они подписывают. Декодирование методов и аргументов — хороший первый шаг, но если пользователь взаимодействует с вредоносным контрактом, отображаемая информация может вводить в заблуждение. Чтобы компенсировать это, я решил показывать количественные данные в очень простом виде, используя цветовую кодировку 🟥 🟧 🟩. Идея заключается в отображении показателя доверия на основе данных, которые легко проверить из нескольких источников. Я выбрал 4 критерия:
Сколько пользователей взаимодействовало со смарт-контрактом в целом.
Как часто текущий аккаунт взаимодействовал с этим контрактом.
Насколько старый этот контракт.
Был ли верифицирован код этого контракта.
Можете рассказать о технической реализации?
Snap очень прост и легко расширяем. Вот полный код, который мы разберём.
При нажатии на вкладку insights в MetaMask вызывается функция onTransaction. Внутри неё мы вызываем каждую функцию, предоставляющую нам выбранные критерии.
Эти функции, как правило, обращаются к API и обрабатывают результаты. Давайте разберём одну из них подробнее.
Рассмотрим функцию, которая вычисляет оценку на основе общего количества транзакций, полученных контрактом. Здесь мы используем API Etherscan, однако для проверки тех же данных подойдёт любой другой API.
Теперь, когда у нас есть TrustResult для каждого из критериев, пришло время применить веса. Действительно, показатели доверия для разных критериев не должны иметь одинаковый вес. Например, количество прошлых транзакций с контрактом сопряжено с затратами. Если мошенник захочет манипулировать этим показателем, ему придётся потратить ETH на газ. В результате этот критерий считается более сложным для фальсификации и, следовательно, более важным — я присвоил ему вес 3.
Аналогично, возраст контракта не может быть обойдён злоумышленником: ему пришлось бы задеплоить контракт, а затем ждать перед запуском атаки, если бы он хотел получить высокий показатель доверия. Я присвоил этому критерию вес 2.
Остальные критерии считаются менее надёжными и имеют вес 1.
Итак, у нас есть показатель доверия смарт-контракта, и нам нужно отобразить его в простом виде. API MetaMask insights позволяет отображать только пары «ключ — значение». Ключи выделяются жирным шрифтом, а значения имеют обычное начертание. Я решил использовать эмодзи, чтобы создать интерфейс, не пугающий пользователей, но при этом отображающий всю собранную информацию.
Функция преобразования показателя доверия в эмодзи:
И возвращаемая часть функции onTransaction с некоторыми приёмами для красивого отображения пар «ключ — значение»:
Наконец, я создал очень простой интерфейс для вызова 2 типов контрактов: одного широко известного и используемого контракта Uniswap и одного совсем недавно задеплоенного контракта хранилища — того, что представлен по умолчанию в Remix. Если бы вы использовали этот snap и взаимодействовали с контрактом роутера Uniswap, вы бы увидели следующее:
Каковы следующие шаги, если бы вы продолжили разработку?
Это лишь верхушка айсберга той информации, которая могла бы укрепить доверие пользователей или защитить их от фишинга. Очевидным первым шагом было бы использование большего числа источников данных. Верификация контракта уже использует Sourcify и Etherscan, но лучше было бы задействовать несколько источников для каждого критерия.
Затем следует применить более продвинутые алгоритмы, чтобы мошенникам было сложнее манипулировать оценками. Например, нужно считать количество уникальных аккаунтов, совершавших транзакции с контрактом. Можно также провести анализ аккаунтов, взаимодействовавших с ним в прошлом, чтобы убедиться, что они не происходят из одного источника. Обратная сторона — весь этот анализ сложнее проводить при использовании нескольких источников истины.
Существуют также интересные исследования по обнаружению мошенничества со смарт-контрактами, которые можно было бы интегрировать. Подробнее здесь.
В целом, огромное количество положительных откликов, которые я получил на этот хак, показывает, что пользователи хотят получать больше информации, и я считаю, что простота восприятия сыграла ключевую роль.
Расскажите немного о себе.
Я инженер-программист в ChainSafe, ранее работал в Parity. Я люблю создавать продукты с акцентом на хороший UX. Web3 — отличная площадка для меня, потому что здесь всё очень сложно, и попытка сделать это понятным для как можно большего числа людей — настоящий вызов. Я в этой сфере уже почти 5 лет, и хотя участвовал во многих хакатонах, как правило выступаю волонтёром, ментором или судьёй, а не хакером. Главная причина в том, что я перфекционист и обычно не люблю быстрые и грязные решения :).
Когда вы впервые познакомились с MetaMask Snaps и каким был ваш опыт?
Интересно, что мои коллеги из ChainSafe создали один из первых когда-либо существовавших snap — для Filecoin. Я, вероятно, заглядывал в тот код, но не стал разбираться глубже.
Во время хакатона API insights на самом деле ещё не был доступен разработчикам. Я разговаривал с командой MetaMask в Лиссабоне и не ожидал, что смогу добавить пользовательский интерфейс в MetaMask. Они сказали мне, что релиз вот-вот состоится и что я могу начать разработку прямо сейчас. На самом деле это было доступно только в кастомной сборке, и документация ещё не была опубликована.
Чем MetaMask Snaps отличается от других кошельков?
Возможность добавлять пользовательский код во вкладку, при этом гарантируя безопасность его выполнения, открывает двери для огромного спектра улучшений. Я очень жду, что из этого получится.
Расскажите, каково это — создавать Snaps с MetaMask?
Шаблонный монорепозиторий сделал старт невероятно лёгким. То, что весь мой код можно было писать в одном репозитории, с одной командой для запуска и тестового dapp, и snap — оба с автообновлением — это был отличный опыт разработчика.
Что для вас значат Snaps?
Это расширение для расширения. Ни один продукт не может подойти всем пользователям. Добавление этого компонуемого слоя — отличная возможность для каждого, кто хочет реализовать нужную ему функцию самостоятельно.
Какие возможности вы видите в MetaMask Snaps и что они открывают для пространства Web3?
Я говорю в частности об insights, который открывает безграничные возможности кастомизации в зависимости от потребностей. Уверен, что в будущем будет разработано ещё много insights, связанных с безопасностью.
Есть ли советы для разработчиков, желающих попробовать MetaMask Snaps?
Склонируйте монорепозиторий и наслаждайтесь очень быстрым стартом.
Чтобы начать работу с MetaMask Snaps:
Ознакомьтесь с документацией для разработчиков
Установите MetaMask Flask
Изучите руководство по MetaMask Snaps
Оставайтесь на связи с нами в Twitter, GitHub discussions и Discord
Следите за нашей командой на следующем хакатоне рядом с вами! Удачной разработки ⚒️
Отказ от ответственности: MetaMask Snaps, как правило, разрабатываются третьими сторонами, а не Consensys Software. Использование MetaMask Snaps, разработанных третьими сторонами, осуществляется по вашему собственному усмотрению и на ваш риск, и вы соглашаетесь с тем, что несёте единоличную ответственность за любые убытки или ущерб, возникшие в результате такой деятельности. Consensys не даёт никаких явных или подразумеваемых гарантий, устных или письменных, в отношении MetaMask Snaps, разработанных третьими сторонами, и отказывается от какой-либо ответственности за Snaps, разработанные третьими сторонами. Использование программного обеспечения, связанного с блокчейном, сопряжено с рисками, которые вы полностью принимаете на себя при использовании MetaMask Snaps.
Переведено ИИ. Может содержать ошибки. Пожалуйста, всегда проверяйте информацию.