关于此帖子:Corda - java.lang.IllegalArgumentException being thrown from a validating notary
我已经在Corda中发现了一个案例,其中有时需要存储自定义数据类型,但是在使用验证公证人时,使用这些状态进行的交易失败。
请考虑在同一包,同一jar文件中实现以下类型:
自定义类型示例
package com.example.statescontracts
@CordaSerializable
data class Foo(
val bar: Int,
val baz: String
)
示例状态
package com.example.statescontracts
data class FooState(
override val linearId: UniqueIdentifier,
val obligor: AbstractParty,
val obligee: AbstractParty,
val foos: Set<Foo>
) : LinearState {
override val participants get() = listOf(obligor, obligee)
}
向分类帐发出新的FooState
实例可能不会受到影响,因为它不消耗先前的FooState
实例,但随后消耗FooState
实例似乎无法验证公证人。
例外
java.lang.IllegalArgumentException:一个无效的Java名称: java.util.Set
假设
对于拥有州/合同JAR文件的州所有参与者都可以进行验证,因此可以访问Foo
类型,但是这对于公证人不起作用,因为它没有副本状态/合同JAR文件在本地。
据我了解,州/合同JAR文件在提议时应附加在交易中,因此应保持较小,因此验证公证人应该可以使用附加在JAR中的类进行验证交易。
问题
任何人都可以验证我的假设是否正确,如果正确,为什么会发生此问题以验证公证人,以及如何纠正此问题?
答案 0 :(得分:1)
从Corda 3开始,验证公证人需要为他们所公证的每笔交易提供州/合同JAR文件。
答案 1 :(得分:1)
如技术白皮书中所述,最终的最终设计是将合同JAR从附件中提取并在确定性JVM中运行,并在其中对其进行沙盒化和资源监视。
Corda 4附带了一个独立的DJVM预览,但未集成。随着时间的推移,我们将继续努力,这将使没有合同JAR的节点能够验证交易。目前,验证公证人确实需要安装他们可能会遇到的每个应用程序的每个版本。非验证公证人不会遇到这个问题。