Corda: Как приложения к контракту передаются в транзакции?

На странице Использование вложений указано:

Attachments are ZIP/JAR files referenced from a transaction by hash, but not included in the transaction itself.

Однако в API: страница «Ограничения контракта» указано, что:

The JAR containing the state and contract classes, and optionally its dependencies, are all attached to the transaction.

И есть фрагмент кода, показывающий, как добавить ограничение контракта:

transaction.addOutputState(state, constraint = HashAttachmentConstraint(serviceHub.cordappProvider.getContractAttachmentID(CONTRACT_ID)!!))

Однако при проверке кода HashAttachment я не вижу, чтобы он содержал внутренности файла Contract Jar.

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

  1. Во время запуска Nodes Corda сканирует все CorDapps и загружает jar-файлы, состоящие из классов Contract, в локальное хранилище вложений.
  2. Каждое состояние вывода в транзакции может иметь ограничение контракта.
  3. На этапе проверки будет вызываться verifyConstraints(contractAttachmentsByContract), и эти ограничения (например, HashAttachmentConstraint) будут проверяться на соответствие вложениям, которые Node имеет в своем локальном хранилище.

Вопросы:

  1. Включает ли Транзакция Приложение к Контракту?
  2. Будет ли это вложение к контракту передаваться по сети или для проверки будут использоваться вложения из локального хранилища вложений?
  3. Что я упускаю в своем предположении?
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
667
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Когда узел получает транзакцию, содержащую вложение, которое он не видел до того, как Corda автоматически получит вложение от контрагента: https://docs.corda.net/tutorial-attachments.html#протокол

Normally attachments on transactions are fetched automatically via the ReceiveTransactionFlow.

Эта передача будет происходить без каких-либо усилий по разработке, если вложение меньше, чем maxTransactionSize сетевых параметров: https://docs.corda.net/network-map.html#параметры сети

maxTransactionSize: Maximum allowed size in bytes of a transaction. This is the size of the transaction object and its attachments.

Вложения контракта на этом этапе обычно предварительно распространяются и подписываются разработчиком Cordapp и развертываются владельцем узла Corda. На данный момент приложения Cordapps обычно не устанавливаются программно.

Привет. Означает ли это, что автоматическая загрузка не применяется к приложениям к контракту? Или даже вложения контракта извлекаются автоматически, и на принимающем узле не требуется предварительно устанавливать jar контракта?

Ashish Sinha 28.04.2020 20:40

@AshishSinha Вложения контракта автоматически извлекаются принимающим узлом, если у него нет копии jar контракта. Однако вы должны убедиться, что jar контракта совместим с принимающим узлом. Ограничения подписи, минимальная версия платформы и совместимость схем должны учитываться, чтобы гарантировать, что узел может запускать jar контракта.

Austin Moothart 29.04.2020 21:51

Другие вопросы по теме