Перейти к содержимому

Revoke Snap: отзыв оставшихся разрешений для контрактов токенов ERC20

Snap с хакатона ETHWarsaw, позволяющий пользователям отзывать оставшиеся разрешения контрактов.

7 мин чтения
Revoke Snap: отзыв оставшихся разрешений для контрактов токенов ERC20

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

Revoke Snap вместе со Swix Jedi и Адрианом

Мы поговорили с Web3-разработчиком Swix Jedi и Адрианом, которые создали Revoke Snap на хакатоне ETHWarsaw.

Репозиторий Snap: https://github.com/SwixJedi/revokesnap

Почему вы его создали?

Для обеспечения безопасности использования токенов внешними участниками стандарт токенов ERC20 реализует механизм разрешений (allowance), при котором владелец токена должен одобрить действия участника (например, смарт-контракта DEX), позволяя ему использовать токены в пределах выбранного лимита.

Чтобы сгладить несколько неудобный пользовательский опыт в DeFi, многие DeFi-протоколы используют максимальное значение uint256 для подтверждений, чтобы пользователю не приходилось каждый раз одобрять токены и тратить деньги на лишние комиссии за газ при взаимодействии с их контрактами.

Особенно это актуально для активных DeFi-пользователей, у которых легко может возникнуть ситуация, когда после использования указанных протоколов остаются неиспользованные разрешения — а это потенциальная угроза безопасности.

Хотя существуют решения, помогающие пользователям справляться с остаточными разрешениями, лишь некоторые из них предлагают отзыв одобрений непосредственно из пользовательского интерфейса. Этот процесс занимает много времени, поскольку каждое разрешение нужно обрабатывать отдельно и подтверждать вручную. Несмотря на то что такой подход безопасен, он требует постоянного ручного взаимодействия со стороны пользователя.

Именно это навело нас на мысль о незаполненной нише, где мы могли бы использовать возможности MetaMask Snaps, чтобы улучшить ситуацию.

Можете рассказать о технической реализации?

Мы решили использовать следующие преимущества MetaMask Snaps:

  • Доступ ко всем аккаунтам в MetaMask

  • Возможность выполнять сложные операции с единственным подтверждением от пользователя

Чтобы предложить решение этой проблемы, которое в будущем должно позволить:

  • Показывать пользователю только один запрос для получения доступа ко всем текущим и будущим аккаунтам (за исключением аппаратных кошельков)

  • Отзывать все разрешения со всех текущих аккаунтов пакетно, без необходимости отдельных подтверждений и переключения между аккаунтами

  • Активно отслеживать все аккаунты пользователя (включая аккаунты на аппаратных кошельках) на предмет новых разрешений и отображать уведомление пользователю при их обнаружении.

При установке Revoke Snap через веб-интерфейс MetaMask запросит необходимые разрешения.

Все разрешения указаны в файле snap.manifest.json:

"initialPermissions": {
    "snap_confirm": {},
    "snap_getBip44Entropy_60": {},
    "snap_notify": {},
    "endowment:long-running": {}
  },
Копировать

Два разрешения, заслуживающих особого внимания:

1. Управление вашими аккаунтами и активами в Ethereum. Это означает, что для работы наш snap требует родительский ключ (секретный ключ) пользователя из MetaMask, чтобы иметь возможность генерировать аккаунты и подписывать транзакции от имени пользователя.

2. Работа без ограничений по времени. Хотя Revoke Snap не предназначен для непрерывной фоновой работы, проведение транзакций в блокчейне занимает время, а в MetaMask Snaps есть встроенный механизм принудительного завершения через 60 секунд, чего может не хватить для завершения транзакций. Это разрешение позволяет RevokeSnap обходить данное ограничение безопасности.

После получения необходимых разрешений RevokeSnap сгенерирует ряд аккаунтов из приватного ключа пользователя:


// Get chosen amount of wallets (signers) from provider (in this case Metamask)
export async function getSigners(provider: ethers.providers.Provider, amount: number): Promise<Wallet[]> {
    let wallets: Wallet[] = [];

    for (let i=0; i<amount; i++) {
        wallets.push(await getSigner(provider, i));
    }

    return wallets;
}

// Exctract addresses out of wallets
export function getAddresses(wallets: Wallet[]): string[] {
    let addresses: string[] = [];

    for (let i=0; i<wallets.length; i++) {
        addresses.push(wallets[i].address);
    }

    return addresses;
}
Копировать

// Fetch parent key from Metamask and generate a wallet from it, base on the input index
export async function getSigner(provider: ethers.providers.Provider, index: number): Promise<Wallet> {
    // Metamask uses default HD derivation path
    // https://support.metamask.io/managing-my-wallet/secret-recovery-phrase-and-private-keys/importing-a-seed-phrase-from-another-wallet-software-derivation-path/
    const ethereumNode = (await wallet.request({
      method: 'snap_getBip44Entropy_60',
    })) as unknown as BIP44CoinTypeNode;
    const deriveEthereumAccount = await getBIP44AddressKeyDeriver(ethereumNode);
    // A bug:
    // The current public version of @metamask/key-tree's derive function returns the private key and chain code in a single buffer
    // Ether.js also accepts a 64 byte buffer without errors and returns wrong keys
    // Related issue: https://github.com/ethers-io/ethers.js/issues/2926
    // TODO(ritave): Update to newest key-tree when available and use deriveEthereumAccount(0).privateKey
    const mainAccountKey = (await deriveEthereumAccount(index)).privateKey;
    return new Wallet(mainAccountKey, provider);
  }
Копировать

Затем выполнит проверку на наличие остаточных разрешений и, после завершения поиска, отобразит кнопку для отзыва всех найденных разрешений.

При нажатии кнопки «Revoke All» Snap выпустит серию транзакций, соответствующих остаточным разрешениям, обнуляя их одно за другим. Поскольку Snap уже владеет приватными ключами сгенерированных кошельков, это не требует никаких дополнительных подтверждений от пользователя — помимо первоначального.

Каковы следующие шаги, если бы вы продолжили реализацию?

Поскольку на хакатоне было ограниченное время для создания оптимальных решений, мы использовали ряд функциональных реализаций, которые можно улучшить.

Для начала: в настоящее время количество аккаунтов, генерируемых в snap, передаётся как параметр функции и жёстко задано как 3. Лучшим вариантом могло бы быть использование snap внешнего API (или выделенного бэкенда) для проверки следующего nonce транзакции на каждом аккаунте для выбранной сети (сетей) и учёта только адресов с nonce больше 0.

Кроме того, для проверки разрешений мы использовали короткий список известных адресов токенов и участников для демонстрации функциональности, но в идеале проверка разрешений должна быть более глобальной. Это можно реализовать, например, с помощью API RPC-провайдера (например, Infura) для поиска всех транзакций с разрешениями и их парсинга для отображения на сайте.

Расскажите немного о себе и своей команде?

Я — Jedi, работаю ведущим разработчиком в Swix. В крипте я с 2017 года, а с 2019 года полностью погрузился в эту сферу и начал работать с DeFi-протоколами, преимущественно на стороне смарт-контрактов. В Swix я сейчас работаю над переносом доходности от недвижимости в блокчейн и привлечением новых пользователей в криптопространство.

Я — Адриан, работал разработчиком программного обеспечения и архитектором в небольших стартапах и крупных компаниях. Блокчейн является моей основной областью интересов на протяжении многих лет, особенно экосистема Ethereum.

В процессе разработки Revoke Snap мы разделили работу так: Jedi сосредоточился на изучении принципов работы MetaMask Snaps и настройке необходимой основы для взаимодействия со смарт-контрактами в рамках нашего Snap, а Адриан занимался веб-интерфейсом и объединением транзакций в пакеты.

Когда вы впервые познакомились с MetaMask Snaps и каким был ваш опыт?

Мы впервые узнали о MetaMask Snaps во время презентации на ETHWarsaw — она была довольно технической и охватывала более глубокие внутренние механизмы работы протокола. Это побудило нас подробнее изучить тему, и вот — мы здесь.

Чем MetaMask Snaps отличается от других кошельков?

Ну… сама идея. MetaMask Snaps выходит за рамки стандарта, принятого в сфере некастодиальных браузерных расширений-кошельков, согласно которому каждая транзакция при взаимодействии с web3-приложениями должна быть индивидуально подтверждена пользователем. Кроме того, функциональность кошельков ограничена тем, что команда разработчиков решает реализовать.

То, что MetaMask Snaps привносит на рынок, — это платформа, обеспечивающая создание нативных интеграций кошелька снизу вверх для произвольных блокчейн-взаимодействий, что во многом напоминает магазины мобильных приложений.

Какие возможности вы видите в MetaMask Snaps и что они открывают для пространства Web3? Что MetaMask Snaps значит для вас?

Одна из главных ценностей MetaMask Snaps для криптопространства — это улучшение пользовательского опыта в крипто- и DeFi-протоколах. Будь то объединение транзакций в пакеты, подтверждение всех транзакций в рамках одного dApp в один клик, возможность прямого взаимодействия с контрактами при покупке криптовалюты с банковской карты или какое-то ещё более творческое решение — покажет только время.

Мы твёрдо убеждены, что особенно для новых пользователей криптовалют абстрагирование от сложности и неудобства блокчейн-взаимодействий может стать переломным моментом.

Расскажите, каково это — создавать MetaMask Snaps вместе с MetaMask для вас и вашей команды?

Большим мотиватором при создании Revoke Snap было то, что MetaMask Snaps всё ещё находится в разработке, и поэтому эксперименты, которые мы проводим сейчас, могут оказать ощутимое влияние на то, куда пойдут MetaMask, MetaMask Snaps и, через них в определённой мере, всё криптопространство. Это был хороший опыт — внести свой вклад в будущее web3.

Есть ли советы, которыми вы хотели бы поделиться с разработчиками, желающими попробовать MetaMask Snaps?

Всем разработчикам, желающим попробовать MetaMask Snaps, — просто попробуйте. Начать работу с MetaMask Snaps довольно просто, используя доступный шаблонный репозиторий на GitHub, а команда MetaMask также очень отзывчива. Сама концепция обладает большим потенциалом, и с ней пока сделано не так много, поэтому легко привнести что-то ценное.

Создание с MetaMask Snaps

Чтобы начать работу с MetaMask Snaps:

  1. Ознакомьтесь с документацией для разработчиков

  2. Установите MetaMask Flask

  3. Изучите руководство по MetaMask Snaps

  4. Оставайтесь на связи с нами в Twitter, обсуждениях на GitHub и Discord

Следите за нашей командой на следующем хакатоне рядом с вами! Удачного BUIDLing'а ⚒️

Отказ от ответственности: MetaMask Snaps, как правило, разрабатываются третьими сторонами, а не Consensys Software. Использование MetaMask Snaps, разработанных третьими сторонами, осуществляется по вашему собственному усмотрению и на ваш риск, и вы соглашаетесь с тем, что несёте единоличную ответственность за любые убытки или ущерб, возникшие в результате такой деятельности. Consensys не даёт никаких явных или подразумеваемых гарантий, устных или письменных, в отношении MetaMask Snaps, разработанных третьими сторонами, и отказывается от какой-либо ответственности за MetaMask Snaps, разработанные третьими сторонами. Использование программного обеспечения, связанного с блокчейном, сопряжено с рисками, которые вы полностью принимаете на себя при использовании MetaMask Snaps.

Переведено ИИ. Может содержать ошибки. Пожалуйста, всегда проверяйте информацию.

Оцените перевод

Автор статьи:

  • MetaMask

    MetaMask, ранее известная как Consensys Software Inc, — крупнейшая в мире самостоятельная финансовая платформа, предоставляющая людям единое место для хранения, расходования, накопления и приумножения средств как в криптовалюте, так и в традиционных активах. Компания создаёт потребительскую платформу, объединяющую платежи, сбережения, инвестиции и цифровые активы в едином бесшовном опыте. Вырастая из самого широко используемого в мире self-custodial кошелька, MetaMask предоставляет пользователям прямой контроль над их деньгами и активами, охватывая около 190 стран. MetaMask сыграл основополагающую роль в развитии Ethereum с 2016 года. Сегодня MetaMask занимает центральное место в экономике блокчейна, создавая операционную систему для Open Money и предоставляя людям полный контроль над их финансовой жизнью.

    Читать все статьи