Выполнение CRUD в реестре DA через клиент gRPC

Я нахожусь в процессе написания клиентского приложения DA Ledger. Это происходит медленно, потому что в документации по API не объясняется, как объединить предоставляемые сервисы для простого создания, чтения, обновления и удаления в Ledger.
Например, не существует простого сервиса, позволяющего клиенту считывать все контакты из данной партии напрямую. Сначала клиенту нужно получить идентификатор реестра, а затем (я думаю) идентификатор пакета. и т.д. Есть сервис для чтения активных контрактов, а как быть с неактивными контрактами? Было бы полезно иметь некоторую документацию, объясняющую и демонстрирующую, как комбинировать вызовы различных сервисов (например):

  • Читать все контракты для данной стороны
  • Осуществление выбора по данному контракту
  • Создать новый контракт

Мое приложение написано на php. Мне не обязательно нужны примеры в php, но я просто хочу знать, как использовать предоставленные услуги для выполнения простых задач.


person Meyer Auslander    schedule 04.03.2019    source источник
comment
Я считаю, что общие вопросы о том, как использовать API, лучше задавать на канале DAML Driven Slack. digitalasset-dev.slack.com   -  person stefanobaghino    schedule 05.03.2019


Ответы (1)


Прочитать все контракты для данной стороны

DAML Ledger по своей сути является системой, управляемой событиями. Таким образом, он не обеспечивает доступ к запросам, как традиционная база данных. Вместо этого ваше приложение подписывается на TransactionService с помощью GetTransactionsRequest и указав LEDGER_BEGIN в качестве смещения begin. Это предоставит вам все события Created и Archived, которые произошли с момента запуска леджера. В своем приложении вы можете использовать эти события для создания представления (в памяти или сохраняемого) леджера, к которому затем можно удобно запросить. Например, вы можете заполнить словарь по типу контракта, добавляя запись для каждого события Created и снова удаляя ее при получении события Archived.

Создавайте контракты или используйте варианты

Есть два способа сделать это:

  • Отправьте команду создания или выполнения через Submit в CommandSubmissionService и дождитесь сообщения об успехе или ошибке в CommandCompletionService. Обратите внимание, что получение такого сообщения о завершении команды только подтверждает, что команда может быть успешно получена реестром. Он не будет содержать никаких эффектов (событий создания и архивирования) от этой команды. Их вы снова получите на TransactionService, упомянутом выше.

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

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

person GeorgS    schedule 05.03.2019
comment
Я не вижу в вашем сообщении упоминания об идентификаторе пакета или идентификаторе книги. У меня возникли проблемы с получением идентификатора пакета, потому что для php нет daml_lf. Как разобрать archive_payload из GetPackageResponse? - person Meyer Auslander; 07.03.2019
comment
Вы правы, прототипы DAML-LF в настоящее время не поставляются как часть SDK, но мы планируем включить их в ближайшее время. А пока вы можете найти их здесь: digitalassetsdk.bintray.com/DigitalAssetSDK/com/digitalasset/ - person GeorgS; 08.03.2019
comment
Скачал прото DML-LF по ссылке. Я не думаю, что они то, что я ищу. Что я хотел сделать, так это получить доступ к библиотеке функций, необходимых для разбора из archive_payload, который входит в объект GetPackageResponse. Я вижу из привязок java и привязок node.js, что он называется DAML_LF. Например, `DamlLf.ArchivePayload.parseFrom(getPackageResponse.getArchivePayload());' из «PingPongMain.java». Я не думаю, что эта функция зависит от сервера DA Ledger и поэтому не связана с каким-либо файлом .proto. - person Meyer Auslander; 12.03.2019
comment
В любом случае, я думаю, что могу обойтись без функций DAML_LF и просто использовать последний пакет, который был возвращен из ListPackages(). Я могу жестко закодировать имя модуля и имя объекта из моего кода DAML. Если это так, синтаксический анализ archive_payload не требуется. (Как они это делают на своем вебинаре под названием «Использование Ledger API для интеграции с платформой цифровых активов»). - person Meyer Auslander; 12.03.2019