kotlin - 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}
此外,我可以看到在验证阶段,当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) {
- 有人能指出我,Corda 将如何加载 Contract 的
verify()
方法在我的实现中可能需要的辅助类吗? - 是否可以在 Contacts 的 CorDapp 中使用其他模块中的类?
解决方案
有几种选择:
可能的解决方法是将 DummyContract 添加到依赖的帮助程序模块中。添加类似:
class DummyContract : Contract { override fun verify(tx: LedgerTransaction) }
将强制 Corda 在 Corda 节点启动时上传附件,并且在验证阶段,Corda 会将丢失的附件添加到transactionClassLoader
总是有可能创建一个胖罐。Contracts 模块可能(甚至应该)在其中包含所有依赖项。如果你的合约有任何外部依赖,它们是合约本身不可避免的一部分。理论上,如果您发布了依赖模块的新版本,您将需要启动合约升级流程。
可能的选择之一是尽可能避免依赖。R3 团队的建议之一是不要依赖:addMissingAttachments并尽可能避免它。
R3 团队将在 Corda 的未来版本中增强依赖项的工作。可能在 Corda 5 中。
感谢 Dan N、Stefano 和 Roger W.
推荐阅读
- java - Java Spring Security:将用户数据与用户详细信息分开是一种好习惯吗?
- reactjs - Typescript React 输入 onchange 不安全分配'任何'
- swift - 当我删除 DispatchQueue.main.async 我没有收到错误
- html - 如何使输入中的文本从顶部开始?
- string - 当字符串可能是-e,-E或-n时,如何在Bash中将字符串转换为小写?
- javascript - 使用 MongoDB mongoose 填充的正确方法是什么?
- ionic-framework - 离子编译你的应用程序不会编译
- python - PDF 文本提取中缺少字母
- javascript - 使用