Создание приложения Tendermint и Cosmos SDK (часть 9): реализация клиента JavaScript

Добро пожаловать в сообщение блога номер 9 из серии сообщений блога, в которых показано, как создать приложение с помощью Tendermint и Cosmos-SDK. В этом сообщении в блоге основное внимание будет уделено тому, как связать интерфейс JavaScript с базовой цепочкой блоков на основе Cosmos. Предыдущую запись в блоге можно найти здесь.

вступление

На данный момент существует несколько библиотек JS (cosmos, binance-chain, irisnet и т. д.), однако многие из них либо устарели, либо созданы не для Cosmos, а для цепочек на основе Cosmos. Это означает, что эти библиотеки, которые позволили бы вам легко подключить приложение JavaScript к блокчейну на основе Cosmos, не полностью совместимы. Чтобы упростить общение, мы будем использовать промежуточное ПО REST API, которое мы описали в предыдущем сообщении блога. REST API работает с JSON и внутри конвертирует все в амино. И JavaScript совершенно удобен для общения через вызовы HTTP REST API.

Для приложения мы решили использовать React.js, популярный интерфейсный фреймворк JavaScript. Он прост в использовании и идеально подходит для нашего случая использования. В этом сообщении блога предполагается, что вы хотя бы немного знакомы с JavaScript, и мы постараемся не вдаваться в подробности реализации внешнего интерфейса. Подробные этапы интеграции и весь интерфейс React.js будут описаны в следующем посте блога. В основном мы сосредоточимся на реальной связи между блокчейном и нашим интерфейсом. Это общение может быть легко реализовано в рамках по вашему выбору.

Предпосылки

Чтобы следить за этим сообщением в блоге, вам необходимо установить Node.js и Golang. Если вы не читали наши предыдущие сообщения в блоге, сделайте это, так как это прямое продолжение, и его нельзя использовать отдельно.

Итак, для начала вам нужно убедиться, что блокчейн на основе Cosmos работает в фоновом режиме, а также запущен REST API.

Полнофункциональное приложение, являющееся продуктом этого сообщения в блоге, общедоступно в нашей организации GitHub. Проверьте Sentrylink/крестики-нолики-интерфейс. Большая часть коммуникационной части находится в каталоге services.

Коммуникация

Поиск состояния

Прежде всего, нам понадобится механизм для получения текущего состояния из блокчейна. Узлы Tendermint имеют API RPC, который может достичь этого, но состояние будет закодировано в амино, что в настоящее время неприменимо в JavaScript.

Для получения состояния мы будем использовать следующие конечные точки из REST API:

  • GET /auth/accounts/:accountAddress
    Получить текущую информацию об учетной записи, включая номер учетной записи, последовательность, баланс и другие важные данные.
  • GET /tictactoe/game/:gameId
    Получить текущие игровые данные.

Использование этих конечных точек API довольно просто с библиотекой с открытым исходным кодом axios.

Создание сделки

Чтобы изменить состояние блокчейна, мы должны использовать подписанные транзакции. Создание транзакций в правильном формате может быть затруднено в JavaScript, но мы можем использовать REST API, чтобы сделать это за нас. Он принимает переменные параметры транзакции и создает транзакцию в формате JSON, готовую к подписанию.

В нашем случае мы можем использовать только две возможные транзакции: tictactoe/StartGame и tictactoe/Play.

Для создания транзакций мы будем использовать следующие конечные точки из REST API:

  • POST /tictactoe/game
    Начать новую игру.
  • POST /tictactoe/game/:gameId/play
    Сделать ход в существующей игре.

Новая игра

Чтобы начать новую игру, вам нужно будет предоставить закрытый ключ приглашающего и адрес (в формате bech32) противника, против которого вы хотите сыграть. Вы также можете поставить несколько монет в игре, предоставив сумму токена больше 0.

Играть ход

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

Полный код находится в api/index.js, вы можете посмотреть его там.

Подписание транзакции

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

Подписи в Cosmos-SDK на самом деле довольно просты. На основе значений транзакций вам нужно будет сформировать объект полезной нагрузки в определенном формате, преобразовать его в строку, вычислить хэш SHA256 и подписать его своим закрытым ключом. И вуаля, ваша транзакция подписана и готова к трансляции.

Вспомогательные функции, такие как hash, sortJson и convertSignature, доступны в репозитории. Ознакомиться с ними поближе можно в файле api/util.js.

Полный код находится в api/index.js, вы можете посмотреть его там.

Трансляция транзакции

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

Мы собираемся использовать следующую конечную точку в REST API для трансляции транзакций:

  • POST /txs
    Отправить подписанные транзакции для трансляции.

И это все. Вы отправили транзакцию, и коммуникационная часть выполнена.

Полный код находится в api/index.js, вы можете посмотреть его там.

Outro

На сегодня все. Вы узнали, как использовать REST API, предоставляемый Cosmos-SDK, получать состояние блокчейна и как создавать, подписывать и транслировать действительные транзакции.

Оставайтесь с нами для следующего!

Подпишитесь на SentryLink на Medium, чтобы получать последние статьи и руководства!

https://medium.com/sentrylink

Если у вас есть какие-либо вопросы или идеи, которыми вы хотите поделиться, напишите нам по адресу [email protected]

Для получения дополнительной информации посетите: https://sentrylink.io