首页 > 解决方案 > Contract verify() 方法的 CorDapp 依赖项

问题描述

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

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

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

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

在调试 Corda Framework 时,我可以看到AttachmentStorageInternal在启动期间会上传附件,但只有那些包含 Contracts的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 中使用其他模块中的类?

标签: kotlincorda

解决方案


有几种选择:

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

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

将强制 Corda 在 Corda 节点启动时上传附件,并且在验证阶段,Corda 会将丢失的附件添加到transactionClassLoader

  1. 总是有可能创建一个胖罐。Contracts 模块可能(甚至应该)在其中包含所有依赖项。如果你的合约有任何外部依赖,它们是合约本身不可避免的一部分。理论上,如果您发布了依赖模块的新版本,您将需要启动合约升级流程。

  2. 可能的选择之一是尽可能避免依赖。R3 团队的建议之一是不要依赖:addMissingAttachments并尽可能避免它。

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

感谢 Dan N、Stefano 和 Roger W.


推荐阅读