Зависимости CorDapp для метода Contract verify () - PullRequest
0 голосов
/ 10 июня 2019

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

У меня есть модуль с контрактами и модуль с валидаторами.Некоторые из Валидаторов используются в модуле Контрактов.Например:

override fun verify(tx: LedgerTransaction){
   validator.validate(tx.outputs)
}

Я запускаю поток и во время проверки Контракта вижу: ClassNotFoundException , поэтому модуль из Валидаторы модуль не можетбыть найденным в загрузчике классов.Очевидно, что в узле существует CorDapp с валидаторами.

Во время отладки Corda Framework я вижу, что вложения будут загружены в AttachmentStorageInternal во время запуска, но только те jar , которыевключает в себя контракты.

private fun loadContractsIntoAttachmentStore(): Map<SecureHash, URL> =
        cordapps.filter { !it.contractClassNames.isEmpty() }.map {
            it.jarPath.openStream().use { stream -> //some code}

Более того, я вижу, что на этапе Проверка , когда происходит ClassNotFoundException или ClassNotDefFoundException, Corda попытается загрузить отсутствующий класс, но он попытается найти его только из Приложений Контракта, которые были загружены при запуске Узла.

fun AttachmentStorage.internalFindTrustedAttachmentForClass(className: String): Attachment? {
    val allTrusted = queryAttachments(
            AttachmentQueryCriteria.AttachmentsQueryCriteria().withUploader(Builder.`in`(TRUSTED_UPLOADERS)),
            AttachmentSort(listOf(AttachmentSort.AttachmentSortColumn(AttachmentSort.AttachmentSortAttribute.VERSION, Sort.Direction.DESC))))

    for (attId in allTrusted) {
  1. Может кто-нибудь указать мне, как Corda будет загружать классы помощников, которые в Контракте* В моей реализации может потребоваться метод verify()?
  2. Можно ли использовать классы из других модулей в приложении CorDapp для контактов?

Ответы [ 2 ]

1 голос
/ 11 июня 2019

Есть несколько вариантов:

  1. Возможный обходной путь - добавить DummyContract в зависимый вспомогательный модуль. Добавляя что-то вроде:

    class DummyContract : Contract {
        override fun verify(tx: LedgerTransaction)
    }
    

Вынудит Corda загружать вложение при запуске узла Corda, и на этапе Проверка Corda добавит отсутствующие вложения в TransactionsClassLoader

  1. Всегда есть возможность создать толстый кувшин . Модуль Contracts может (и даже должен) иметь все зависимости внутри него. Если ваш договор имеет какие-либо внешние зависимости, они являются неотъемлемой частью самого договора. Теоретически, если вы выпускаете новую версию зависимого модуля, вам потребуется инициировать процесс обновления контракта.

  2. Возможно, один из вариантов - вообще избежать зависимости, если это возможно. Одним из предложений команды R3 было не полагаться на: addMissingAttachments и избегать его, если это возможно.

  3. R3 Team улучшит работу с зависимостями в будущих версиях Corda. Вероятно, в Корде 5.

Слава Дану N, Стефано и Роджеру W.

1 голос
/ 11 июня 2019

Вы используете Corda v4.0?Я помню, что v4.1 внес некоторые изменения, чтобы вернуться к загрузчику классов, если вы не добавляете cordapp вручную в качестве вложения.Можете ли вы попробовать добавить Cordapp со своими зависимостями в качестве вложения и посмотреть, работает ли он?https://docs.corda.net/head/cordapp-advanced-concepts.html?advanced-cordapp-concepts#code-samples-for-dependent-libraries-and-cordapps

...