从Corda的发布-M13开始,在CordApp-Tutorial示例中,在流本身内进行了一些约束检查(ExampleFlow.Acceptor)。我的问题是,我可以检查哪些约束流程,以及合同中的约束条件?或者它只是一个组织问题?
答案 0 :(得分:10)
这是一个很好的问题。我相信你指的是:
@InitiatedBy(Initiator::class)
class Acceptor(val otherParty: Party) : FlowLogic<SignedTransaction>() {
@Suspendable
override fun call(): SignedTransaction {
val signTransactionFlow = object : SignTransactionFlow(otherParty) {
override fun checkTransaction(stx: SignedTransaction) = requireThat {
val output = stx.tx.outputs.single().data
"This must be an IOU transaction." using (output is IOUState)
val iou = output as IOUState
"The IOU's value can't be too high." using (iou.iou.value < 100)
}
}
return subFlow(signTransactionFlow)
}
}
CollectSignaturesFlow
及其对应的SignTransactionFlow
自动为任何类型的交易收集签名。这种自动化非常有用,因为开发人员不再需要手动编写用于签名收集的流程!但是,开发人员必须知道,给定任何有效的事务 - 根据事务中引用的合同代码 - 对方将始终签名!这是因为事务是单独验证的,而不是相对于某些预期的外部值。
让我举两个例子:
CollectSignaturesFlow
签名。如果交易有效,那么在没有任何额外检查的情况下,您将对其进行签名,这将导致您向我发送现金。显然你不想要这个! SignTransactionFlow
signTransaction
的一部分完成
在生产CorDapp中,人们可能希望推迟人为判断是否签署交易并达成交易。或者,可以通过HTTP API或MQ联系某些外部参考数据系统来自动执行此过程,以确定该交易是否应该进入。
在上面的代码示例中,我们添加了两个简单约束:
请注意,这两个约束不能放在合同代码中。合同代码更适合于定义管理资产或协议应如何随时间演变的约束。例如,关于IOU:
请记住,Corda旨在让潜在的相互不信任的各方就共同的事实达成共识。因此,节点不能隐含地信任他们通过网络从他们的对手那里收到的内容,因此我们总是必须检查我们收到的是我们期望接收的内容。
希望有意义!