我可以使用验证注解(例如 Spring、JPA 或自定义注解)来验证 Corda 合约中的逻辑吗?
Can I use validation annotations (e.g. Spring, JPA, or custom annotations) for verification logic in Corda contracts?
我想在我的状态中添加验证注释,以避免在验证 Corda 交易时出现样板代码。例如,我可能想用一个注释来注释我的状态,以防止使用负数创建状态:
class MyState(@Min(0) val amount: Int): ContractState {
override val participants = listOf<AbstractParty>()
}
然后我想在合同验证期间检查这些注释,如果违反任何注释,则抛出异常。
Corda 是否支持在合约验证中使用现有的验证注解库?我可以提供自己的自定义验证注释吗?
注释方法会使代码更加清晰,尤其是在数据模型非常复杂的情况下。
现在您有两种选择
将验证器引擎作为普通依赖项嵌入到您的 cordapp 中,在这种情况下,您是在向必须信任您的成员提供实现。
个人成员可以将他们选择的验证器引擎作为普通附件附加到交易,这将使验证器 类 在合约验证期间在类路径上可用。在这种情况下,交易的每个交易对手都负责检查附件哈希是否列在他们之前审计过的验证器白名单中。
但是,我们想提醒您注意下面列出的一些相关风险。
决定论。将来,Corda 将 运行 确定性 JVM(DJVM)中的合同,其中任何 non-deterministic 代码都将无法执行。一些可用的 JSR303 验证器实现可能依赖于 non-deterministic 代码。重要的是要强调,一旦 DJVM 完全实施,现在有效的合约将来可能会停止工作。 R3 打算提供一个 Gradle 插件,它将在构建期间验证代码的确定性,这将帮助开发人员从他们的合同中删除所有 non-deterministic 库。
一些 JSR303 实现,例如来自 Hibernate 的实现,非常繁重(大约 120k 行代码)。将来,合约 类 将由交易范围的类加载器加载,即 类 将从头开始重新加载以验证每个交易。鉴于 hibernate validator 需要大约 20-30 秒才能达到 self-initialise,这将成为性能瓶颈。可能需要编写 JSR 的自定义实现 re-using Hibernate 的验证器逻辑,但去除与合同上下文无关的更高级的功能。
作为一般性建议,我们鼓励您考虑将一些繁重的工作转移到流中,因为它们没有任何 DJVM-related 限制。
如果使用注释,Corda 仍然需要一些 JSR303 注释不提供的验证形式,例如交易级别的验证,例如匹配签名者与参与者等。因此,一些合约代码还是得写。
您必须为您的成员提供一种机制来审核和验证所选的验证实施。因为这现在将成为他们作为签约方的合同的一部分。如果将来发现验证器有问题,值得围绕这种情况进行讨论。
我们非常喜欢使用 JSR303 注释进行数据模型验证的想法,我们将帮助您完成实现它的过程,所以如果您遇到任何问题,请告诉我们。
我想在我的状态中添加验证注释,以避免在验证 Corda 交易时出现样板代码。例如,我可能想用一个注释来注释我的状态,以防止使用负数创建状态:
class MyState(@Min(0) val amount: Int): ContractState {
override val participants = listOf<AbstractParty>()
}
然后我想在合同验证期间检查这些注释,如果违反任何注释,则抛出异常。
Corda 是否支持在合约验证中使用现有的验证注解库?我可以提供自己的自定义验证注释吗?
注释方法会使代码更加清晰,尤其是在数据模型非常复杂的情况下。
现在您有两种选择
将验证器引擎作为普通依赖项嵌入到您的 cordapp 中,在这种情况下,您是在向必须信任您的成员提供实现。
个人成员可以将他们选择的验证器引擎作为普通附件附加到交易,这将使验证器 类 在合约验证期间在类路径上可用。在这种情况下,交易的每个交易对手都负责检查附件哈希是否列在他们之前审计过的验证器白名单中。
但是,我们想提醒您注意下面列出的一些相关风险。
决定论。将来,Corda 将 运行 确定性 JVM(DJVM)中的合同,其中任何 non-deterministic 代码都将无法执行。一些可用的 JSR303 验证器实现可能依赖于 non-deterministic 代码。重要的是要强调,一旦 DJVM 完全实施,现在有效的合约将来可能会停止工作。 R3 打算提供一个 Gradle 插件,它将在构建期间验证代码的确定性,这将帮助开发人员从他们的合同中删除所有 non-deterministic 库。
一些 JSR303 实现,例如来自 Hibernate 的实现,非常繁重(大约 120k 行代码)。将来,合约 类 将由交易范围的类加载器加载,即 类 将从头开始重新加载以验证每个交易。鉴于 hibernate validator 需要大约 20-30 秒才能达到 self-initialise,这将成为性能瓶颈。可能需要编写 JSR 的自定义实现 re-using Hibernate 的验证器逻辑,但去除与合同上下文无关的更高级的功能。
作为一般性建议,我们鼓励您考虑将一些繁重的工作转移到流中,因为它们没有任何 DJVM-related 限制。
如果使用注释,Corda 仍然需要一些 JSR303 注释不提供的验证形式,例如交易级别的验证,例如匹配签名者与参与者等。因此,一些合约代码还是得写。
您必须为您的成员提供一种机制来审核和验证所选的验证实施。因为这现在将成为他们作为签约方的合同的一部分。如果将来发现验证器有问题,值得围绕这种情况进行讨论。
我们非常喜欢使用 JSR303 注释进行数据模型验证的想法,我们将帮助您完成实现它的过程,所以如果您遇到任何问题,请告诉我们。