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

Вот где гибрид вступает в игру.

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

И все же эта проверка не так проста, и это самая уязвимая точка во всем приложении, потому что злоумышленники всегда могут попытаться притвориться действительным пользователем.

Конечно, для этого есть несколько подходов, как вы знаете, самые известные — доказательство Меркла и проверка подписи.

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

Если вы не знакомы с подписью и EIP712, вам лучше сначала пройтись по ней,

Вот основная диаграмма ниже о потоке.

Описание изображения

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

Шаг 1. Как только пользователь инициирует действия во внешнем интерфейсе, ему потребуется подписать сообщение.
А затем он сделает запрос API к серверной части, чтобы получить подпись, подписанную приватным кошельком.

Пример тела запроса будет таким

{
    ...
    userAddress: string,
    userSignature: string,
}
Войти в полноэкранный режим

Выйти из полноэкранного режима

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

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

Самая простая структура ваучера будет примерно такой

{
    user: address;
    ...
    nonce: uint256;
    expiry: uint256
    signature: bytes;
}
Войти в полноэкранный режим

Выйти из полноэкранного режима

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

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

mapping(address => uint256) public nonces;
mapping(bytes => bool) public signatures;

nonces[_voucher.user]++;
signatures[_voucher.signature] = true;
Войти в полноэкранный режим

Выйти из полноэкранного режима

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

Вы вызовете API для этого с телом запроса, включающим

{
    ...
    userSignature: string, // signature by user
    txSignature: string, // signature by private wallet
}
Войти в полноэкранный режим

Выйти из полноэкранного режима

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

и вы можете сделать некоторые обновления в своей БД, а затем вернуть результат пользователю.

Наконец, пользователь получит результат своего действия в пользовательском интерфейсе.

Спасибо за внимание, я постарался сделать это как можно короче, но в то же время постарался донести до вас больше смысла.))

Я собираюсь пройтись по реализации tableland для динамических метаданных, которые необходимо решить в играх P2E.

Так что следите за обновлениями.