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

Horizon - это сервер, который предоставляет ядро ​​Stellar с помощью REST API. Это дает вам семантику RESTy HTTP для взаимодействия с сетью. Этот API - это то, на чем основано большинство (все?) Клиентов Stellar SDK. Пока все хорошо.

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

Некоторые эффекты транзакции отсутствуют

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

Для создания предложения требуется идентификатор

Одним из таких эффектов должно быть Создать предложение с идентификатором, который клиент может использовать для последующего управления предложением. При переходе по ссылке эффектов в транзакции этот эффект не проявляется. Но при запросе конечной точки предложений для учетной записи, сделавшей предложение, она есть. Таким образом, кажется возможным получить offerId, но не однозначно или детерминированно. Это ОГРОМНАЯ проблема для торговых приложений. Огромный. Сделка огромна.

После некоторого покопания кажется, что сеть Stellar, вероятно, создает эти эффекты и объединяет offerId в транзакцию, но Horizon не раскрывает их. Оскорбительный файл может быть этим. history.EffectOfferCreate дается местозаполнитель, но позже в коде никогда не обрабатывается. 😢

Решение: проанализировать транзакцию XDR

XDR - это схема сообщений Stellar. Он описывает все сообщения и просто включается в ответы Horizon как двоичный код в кодировке base64. Что особенно важно, эти сообщения от Stellar включаются в транзакцию, возвращаемую Horizon по таким вещам, как предложения.

В частности, вы найдете эти XDR в envelope_xdr, result_xdr и result_meta_xdr. На обработку этих полей намекает этот README, скрытый в JavaScript SDK. Глубоко внутри result_meta_xdr находится offerId. Это немного утомительно, и это тема для другого поста.

Об этой проблеме сообщили

Об этой проблеме было сообщено команде разработчиков. Он был открыт уже 2 месяца и не планируется к развитию. Возможно, по мере того, как мы углубимся в Horizon dev, мы сможем разработать PR. Вы можете следить за развитием проблемы здесь.

Итак, у вас есть: насколько я могу судить, ядро ​​Stellar работает так, как ожидалось, просто Horizon еще не полностью реализовал все свои функции. Надеюсь, эта деталь сэкономила кому-то время.