我正在努力了解所面临问题的原因。
我有一个带有合同的模块和一个带有验证器的模块。合同模块中使用了某些验证程序。例如:
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}
此外,我可以看到在 验证 阶段,当发生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) {
verify()
方法?答案 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)
有几种选择:
可能的解决方法是将DummyContract添加到依赖帮助器模块中。添加类似的内容:
class DummyContract : Contract {
override fun verify(tx: LedgerTransaction)
}
将强制Corda在Corda Node启动时以及在 Verification 阶段上载附件,Corda会将缺少的附件添加到 transactionClassLoader
总是有可能创建脂肪-jar 。合同模块可能(甚至应该)在其中包含所有依赖项。如果您的合同具有任何外部依赖性,则它们是合同本身不可避免的一部分。从理论上讲,如果发布新版本的从属模块,则将需要启动合同升级流程。
可能的选择之一是,尽可能避免完全具有依赖性。 R3团队的建议之一是不要依赖: addMissingAttachments ,并尽可能避免使用它。
R3团队将通过Corda未来版本中的依赖项来增强工作。可能在Corda 5中。
对Dan N,Stefano和Roger W表示敬意。