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 еще не полностью реализовал все свои функции. Надеюсь, эта деталь сэкономила кому-то время.