Каков наилучший способ создания событий изменения регистра, которые включают команду транзакции? - PullRequest
0 голосов
/ 01 мая 2019

Цель состоит в том, чтобы генерировать события на каждом участвующем узле при изменении состояния, которое включает в себя бизнес-действие, вызвавшее изменение. В нашем случае Business Action сопоставляется с командой Transaction и предоставляет бизнес-намерение или то, что пользователь делает в бизнес-терминах. Таким образом, в нашем случае, когда мы моделируем жизненный цикл кредита, действие может быть «закрыть» кредит.

Мы моделируем Событие на уровне состояния следующим образом: Каждое Событие инкапсулирует Команду транзакции и однозначно идентифицируется (TxnHash, OutputIndex) и созданным / потребленным статусом.

Мы бы предпочли механизм опроса для генерации событий по требованию, но асинхронный подход для генерации событий в изменениях бухгалтерской книги был бы приемлемым. В любом случае наша задача заключается в получении команды из транзакции. Мы рассмотрели запросы к состояниям с помощью API Vault Query vaultQueryBy () для решения опроса (или vaultTrackBy () для решения asynch Obvservalble Stream). Мы смогли создать поток, который получает txn для состояния. Это должно было быть сделано в потоке, поскольку Corda устарела функцию, которая позволила бы нам сделать это в нашем клиенте Springboot. В клиенте мы используем vaultQueryBy (), чтобы получить список состояний. Затем мы вызываем поток, который перебирает состояния, получает txHash от каждого StateRef и затем вызывает serviceHub.validatedTransactions.getTransaction (txHash), чтобы получить подписанный перенос, из которого мы в конечном итоге можем получить Команду. Это лучший или рекомендуемый подход?

В качестве альтернативы, мы также подумали о генерации событий Транзакции путем запроса транзакций, а затем создания события для каждого состояния ввода и вывода в транзакции. Если мы пойдем этим путем, каков наилучший способ запрашивать транзакции из хранилища? Есть ли опция на основе наблюдаемого потока?

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

Каков наилучший способ создания событий, которые инкапсулируют команду транзакции для каждого состояния, созданного или потребляемого в регистре?

Ответы [ 2 ]

0 голосов
/ 10 мая 2019

Просто чтобы закончить мой комментарий: несмотря на то, что подход отвечал требованиям, проблема этого решения состоит в том, что мы должны добавлять и поддерживать наш собственный код во всех соответствующих состояниях для сбора информации на уровне транзакций, которая уже отслеживается Платформа. Я думаю, что лучшим решением для платформы было бы предоставление потребителям доступа к информации на уровне транзакций (возможно, выборочно), как это делается для государств. В конце концов, транзакция, в частности, представляет собой бизнес / функциональную конструкцию, которая имеет смысл на уровне клиентских приложений. Например, если я «перевожу» ссуду, это может быть сложная бизнес-транзакция, которая включает в себя множество входных и выходных состояний и может быть важной конструкцией / понятием для управления клиентским приложением.

0 голосов
/ 02 мая 2019

Если я правильно понимаю, вы пытаетесь получить уведомление, когда происходят определенные типы обновлений регистра (открытые, утвержденные, закрытые и т. Д.).

Во-первых: асинхронные уведомления являются наилучшей практикой в ​​Corda, поэтому следует избегать опроса из-за дополнительного веса, который он придает узлу для постоянных запросов и задержек.Corda предоставляет несколько механизмов для Observables, которые вы можете использовать: https://docs.corda.net/api/kotlin/corda/net.corda.core.messaging/-corda-r-p-c-ops/vault-track-by.html

Second: Избегайте запросов транзакций из базы данных, так как они предназначены для внутреннего использования узлу.См. Этот ответ , чтобы узнать, почему следует избегать запросов транзакций.Как правило, запросы запрашиваются только к таблицам, которые начинаются с «VAULT_ *».

Одним из способов решения вашего варианта использования было бы поле «состояние», которое отражает команду, использованную для создания текущего состояния.Например: если команда «Закрыть» использовалась для создания состояния, ее поле состояния могло бы быть «закрытым».Таким образом, вы можете использовать вышеупомянутый vaultTrackBy, чтобы посмотреть на поле состояния каждого состояния и вывести действие, которое произошло.

...