Contract verify()方法的CorDapp依赖项

时间:2019-06-10 15:40:13

标签: kotlin corda

我正在努力了解所面临问题的原因。

我有一个带有合同的模块和一个带有验证器的模块。合同模块中使用了某些验证程序。例如:

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

我开始流程,在合同验证期间,我看到: ClassNotFoundException ,因此在类加载器中找不到 Validators 模块中的类。显然,节点中存在带有验证器的CorDapp。

在调试Corda Framework时,我可以看到附件将在启动期间上载到AttachmentStorageInternal中,但只有包含合同的 jar 会被上载。

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

此外,我可以看到在 验证 阶段,当发生ClassNotFoundExceptionClassNotDefFoundException时,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将如何加载帮助程序类 在我的实现中可能需要使用Contract的verify()方法?
  2. 是否可以使用Contacts的CorDapp中其他模块中的类?

2 个答案:

答案 0 :(得分:1)

您是否正在使用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

答案 1 :(得分:1)

有几种选择:

  1. 可能的解决方法是将DummyContract添加到依赖帮助器模块中。添加类似的内容:

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

将强制Corda在Corda Node启动时以及在 Verification 阶段上载附件,Corda会将缺少的附件添加到 transactionClassLoader

  1. 总是有可能创建脂肪-jar 。合同模块可能(甚至应该)在其中包含所有依赖项。如果您的合同具有任何外部依赖性,则它们是合同本身不可避免的一部分。从理论上讲,如果发布新版本的从属模块,则将需要启动合同升级流程。

  2. 可能的选择之一是,尽可能避免完全具有依赖性。 R3团队的建议之一是不要依赖: addMissingAttachments ,并尽可能避免使用它。

  3. R3团队将通过Corda未来版本中的依赖项来增强工作。可能在Corda 5中。

对Dan N,Stefano和Roger W表示敬意。