July 31, 2023

Injective Typescript Web3 Gateway

Предварительное чтение #1: Жизненный цикл транзакций
Предварительное чтение №2: Транзакции на Injective
Микросервис Web3Gateway предоставляет конечному пользователю API, основной задачей которого является делегирование комиссии за транзакции, происходящие на Injective. Это позволяет пользователям работать с Injective без газа, так как за газ платит исполнитель сервиса Web3Gateway.
Наряду с поддержкой делегирования платы, Web3Gateway позволяет разработчикам конвертировать сообщения в типизированные данные EIP712. После преобразования сообщения в данные EIP712 оно может быть подписано любым нативным кошельком Ethereum, а затем транслировано в Injective.

Делегирование комиссии
Как уже говорилось, делегирование комиссии позволяет пользователям взаимодействовать с Injective (отправлять транзакции) без необходимости платить за газ. В жизненном цикле транзакций каждой цепочки, работающей на Cosmos-SDK, есть _AnteHandler_s, которые, помимо прочего, выполняют проверку подписи, расчет газа и списание комиссии.
Есть несколько моментов, которые нам необходимо знать:
Транзакции могут иметь несколько подписей (т.е. мы можем включать несколько подписей в одну транзакцию),
Плата за газ для транзакции вычитается из значения authInfo.fee.feePayer, а подпись, которая проверяется по отношению к feePayer, является первой подписью в списке подписей транзакции (ссылка),
Остальные подписи проверяются по фактическому отправителю транзакции.
Зная это, мы должны подписать транзакцию с помощью закрытого ключа микросервиса Web3Gateway, включить адрес этого закрытого ключа в качестве feePayer, подписать эту транзакцию с помощью закрытого ключа, с которого мы хотим взаимодействовать с Injective, и транслировать эту транзакцию.

API Web3Gateway
Все желающие могут запустить микросервис Web3Gateway и предоставлять своим пользователям услуги делегирования комиссии. Например, разработчики, создающие биржевые dApp на базе Injective, могут запустить этот микросервис, чтобы предложить трейдерам среду торговли без газа.
Данный микросервис предоставляет API, содержащий два основных метода:
PrepareTx
BroadcastTx

PrepareTx
Метод PrepareTx принимает сообщение (сообщения), включая контекст транзакции, которую пользователь хочет выполнить (chainId, signerAddress, timeoutHeight и т.д.), и возвращает типизированные данные EIP712 конкретного сообщения, которые включают feePayer и его подпись внутри типизированных данных EIP712. Мы можем использовать эти типизированные данные EIP712, чтобы подписать сообщение с помощью любого кошелька Ethereum и получить подпись для пользователя, который хочет взаимодействовать с Injective.
Типизированные данные EIP712 генерируются из proto-определения сообщения, которое мы передаем в метод PrepareTx.

BroadcastTx
Метод BroadcastTx отвечает за трансляцию транзакции на узел. Вместе с полным ответом на вызов API PrepareTx мы передаем сигнатуру типизированных данных EIP712. Затем BroadcastTx упаковывает сообщение в нативную транзакцию Cosmos, подготавливает транзакцию (включая ее контекст) и транслирует ее в Injective. В результате пользователю возвращается хэш транзакции.