На странице Использование вложений указано:
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.
Я предполагаю, что мы не передаем контрактную банку с транзакцией. То, что происходит, можно описать так:
verifyConstraints(contractAttachmentsByContract)
, и эти ограничения (например, HashAttachmentConstraint) будут проверяться на соответствие вложениям, которые Node имеет в своем локальном хранилище.Вопросы:
Вы правы, что вложение не передается внутри транзакции. Транзакция содержит только хэш-ссылку на вложение для целей ссылки на данные. Это также означает, что вложения могут повторно использоваться во многих транзакциях, поскольку они хранятся вне цепочки в своей собственной таблице базы данных.
Когда узел получает транзакцию, содержащую вложение, которое он не видел до того, как 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 обычно не устанавливаются программно.
@AshishSinha Вложения контракта автоматически извлекаются принимающим узлом, если у него нет копии jar контракта. Однако вы должны убедиться, что jar контракта совместим с принимающим узлом. Ограничения подписи, минимальная версия платформы и совместимость схем должны учитываться, чтобы гарантировать, что узел может запускать jar контракта.
Привет. Означает ли это, что автоматическая загрузка не применяется к приложениям к контракту? Или даже вложения контракта извлекаются автоматически, и на принимающем узле не требуется предварительно устанавливать jar контракта?