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

Smart Account Session Snap: автоматические подтверждения для игровых Dapp

Snap хакатона ETHBogota

7 мин чтения
Smart Account Session Snap: автоматические подтверждения для игровых Dapp

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

Smart Account Sessions

Репозиторий Snap: https://github.com/livingrockrises/snap-auto-approvals

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

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

Расскажите о технической реализации.

Приложение

Наш Snap состоит из двух частей. Первая — веб-сайт, с которым взаимодействуют пользователи. Вторая — сам Snap. Эти два элемента работают по принципу клиент-серверной архитектуры, где Snap выступает сервером, а веб-сайт — клиентом.

Пользовательский сценарий на сайте:

  1. Подключите свой EOA и установите Snap для Smart Account Sessions.

  2. Включите Smart Account поверх адреса MetaMask. EOA MetaMask будет контроллером этого Smart Account.

  3. Включите Session Module на вашем Smart Account. Модули добавляют дополнительную логику контроля доступа для вашего Smart Safe аккаунта. По сути, каждый Smart Account управляется двумя способами: владельцем аккаунта MetaMask с помощью ключей подписи и опциональными модулями с собственной логикой доступа.

  4. Создайте сессию.

  5. Это создаст временные сессионные ключи на вашем смарт-аккаунте, авторизованные для совершения транзакций через модуль. Сессия может иметь такие параметры, как startTime, endTime и разрешения для пользовательских действий с контрактами Dapp.

  6. Отправляйте автоматически подтверждённые транзакции с использованием указанного сессионного ключа без всплывающих окон MetaMask для подтверждения газа или подписей.

MetaMask API

MetaMask предоставляет вызовы API, которые могут использоваться MetaMask Snaps при наличии разрешения от пользователя.

В данном случае мы использовали следующие:

snap_manageState — позволяет хранить зашифрованные данные внутри MetaMask. Например, мы используем его для хранения созданной пары сессионных ключей.

export type SessionKeyStorage = {
  owner: string;
  sessionKey: string;
  pk: string;
};

export const storeSessionInfo = async (data: SessionKeyStorage) => {
  await wallet.request({
    method: 'snap_manageState',
    params: ['update', data],
  });
};

export const clearSessionInfo = async () => {
  const result = await wallet.request({
    method: 'snap_manageState',
    params: ['clear'],
  });
  return result;
};

export const getSessionInfo = async () => {
  const result = await wallet.request({
    method: 'snap_manageState',
    params: ['get'],
  });
  return result;
};
Копировать

snap_confirm — позволяет хранить зашифрованные данные внутри MetaMask. Например, мы используем его для хранения созданных аккаунтов.


export const promptUser = async (
  prompt: string,
  description: string,
  content: string,
): Promise<boolean> => {
  const response: any = await wallet.request({
    method: 'snap_confirm',
    params: [
      {
        prompt,
        description,
        textAreaContent: content,
      },
    ],
  });
  console.log('Prompt user response', response);
  if (response) {
    return response;
  }
  return false;
};

promptUser(getMessage(origin),
            'Do you want to use Smart Account',
            `Your Smart Account Address is ${_smartAccount.address}`,
          ).then((approval) => {
            if (approval) {
              console.log('Sending smart acccount response ', _smartAccount);
              resolve({
                address: _smartAccount.address,
                owner: _smartAccount.owner,
              });
            } else {
              reject(new Error('EOA user'));
            }
          });
Копировать

Snap будет обрабатывать входящие JSON-RPC запросы, отправленные через wallet_invokeSnap с сайта.

Для описанного выше сценария приложения мы создали пользовательские методы запросов: connect, enable_session_module, create_session и interact. Один из примеров приведён ниже, а код доступен здесь.


export const useSmartAccount = async () => {
  console.log('invoke Snap...');
  const smartAccountResponse: any = await window.ethereum.request({
    method: 'wallet_invokeSnap',
    params: [
      defaultSnapOrigin,
      {
        method: 'connect',
        params: [],
      },
    ],
  });
  return smartAccountResponse;
};
Копировать

Session Key Module

Мы написали модуль в стиле Gnosis Safe для расширения функциональности кошелька на смарт-контракте с использованием контроля доступа через сессионные ключи.

Код модуля и контрактов кошелька можно найти здесь.

struct Session {
        address smartAccount;
        address sessionKey;
        uint256 startTimestamp;
        uint256 nonce;
        uint256 endTimestamp;
        bool enable;
        PermissionStorage permission;
    }

struct PermissionStorage {
        address[] whitelistDestinations;
        mapping(address => bool) whitelistDestinationMap;
        mapping(address => bytes4[]) whitelistMethods;
        mapping(address => mapping(bytes4 => bool)) whitelistMethodsMap;
        mapping(address => TokenApproval) tokenApprovals;
    }
Копировать

Когда сессия создаётся путём вызова snap и, в свою очередь, вызова смарт-аккаунта, на модуле сессионных ключей из Smart Account через релейер вызывается следующий метод.

function createSession(
        address sessionKey,
        PermissionParam[] calldata permissions,
        SessionParam calldata sessionParam
    ) external {
        require(
            !sessionMap[sessionKey].enable,
            "Session for key is already enabled"
        );
        Session storage _session = sessionMap[sessionKey];
        ...
Копировать

txHash: https://goerli.etherscan.io/tx/0x8b45f4cb0a7527bb7c44f6923eb9bb391faa656e212829ce0fd9c733ca71352b

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


function executeTransaction(
        address _sessionKey,
        address payable _to,
        uint256 _value,
        bytes calldata _data,
        bytes calldata signature
    ) external returns (bool success) {
        Session storage session = sessionMap[_sessionKey];
        require(session.enable, "Session is not active");
        require(
            session.startTimestamp <= block.timestamp,
            "Session has not yet started"
        );
        require(session.endTimestamp >= block.timestamp, "Session has expired");
        ...
Копировать

txHash: https://goerli.etherscan.io/tx/0xf6d40bf9c74cff266f8bc26dabcf7a44ca1c0e85387f297f43fa5cb89bbea1a0

SDK

Biconomy SDK — это универсальный Web3-инструментарий для разработчиков, позволяющий использовать смарт-аккаунты и упрощать пользовательские сценарии: превращать сложные многоэтапные процессы в простой опыт одного клика.

Каждый пользователь получает кошелёк на смарт-контракте вместо простой криптографической пары ключей, а dApp могут настраивать самые разнообразные бесшовные взаимодействия с помощью пакетов транзакций через этот SC-кошелёк для пользователя.

Мы связали приведённую ниже функцию с RPC-вызовом 'connect' путём вызова snap.


import SmartAccount from '@biconomy-sdk/smart-account';

async function getsmartAccount(): Promise<SmartAccount> {
  smartAccount = new SmartAccount(wallet, {
    activeNetworkId: Number(wallet.chainId),
    // supportedNetworksIds: supportedChains,
  });

  smartAccount = await smartAccount.init();
  console.log('initialized');
  console.log(smartAccount);
  return smartAccount;
}
Копировать

Каковы следующие шаги при дальнейшей реализации?

Мы с нетерпением ждём функции keyrings и возможности отображать информацию о смарт-аккаунтах вместо EOA в интерфейсе MetaMask.

  1. Мы опубликуем Biconomy SDK, совместимый с MetaMask Snaps, для использования разработчиками.

  2. Добавление модуля социального восстановления и кросс-чейн пакетных транзакций в один клик с использованием Smart Accounts, а также отображение уведомлений сразу после выполнения транзакции в целевой сети.

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

Sachin — технический директор и сооснователь Biconomy. Имея образование в области компьютерных наук, он обладает 6-летним опытом в web2 и 5-летним в web3. Он любит структурированный подход к решению задач и предпочитает лично участвовать в реализации своих идей и их тестировании.

Chirag — блокчейн-инженер в Biconomy. Он увлечён программированием и изучением всего, что связано с web3, через исследования и разработку.

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

Мы узнали о MetaMask Snaps незадолго до хакатона ETHBogota. Нас очень впечатлила документация и возможности, открываемые методами snap.

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

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

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

Базовая разработка была очень интуитивной, однако мы потратили немало времени на выяснение требований к разрешениям для отдельных методов. Возможность создавать пользовательские элементы UI — например, для отображения баланса кошельков на смарт-контрактах так же, как у EOA — пока остаётся непростой задачей.

Что для вас значит MetaMask Snaps?

Это секретное оружие, которое позволяет нам поддерживать кошельки на смарт-контрактах ERC4337 внутри MetaMask, не требуя создания или интеграции dapp с пользовательским виджетом на их фронтенде.

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

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

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

Загляните в обсуждения на GitHub и Discord — они помогут устранить многие блокирующие проблемы в процессе разработки. Создавать Snaps может любой, кто знаком с JavaScript и JSON RPC вызовами. snap-monorepos и примеры MetaMask Snaps — отличная отправная точка для ускорения разработки.

Если вам нужно что-то сохранить, учтите, что можно хранить только один объект, поэтому вкладывайте несколько пар ключ-значение в один объект. Когда вам нужно возвращать ответы из пользовательских вызываемых методов snap, убедитесь, что они возвращают обычный JSON-объект.

Разработка с 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

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

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