在哪里检查合同约束

Mak*_*aka 5 constraints corda

从Corda的发布-M13开始,在CordApp-Tutorial示例中,在流本身内进行了一些约束检查(ExampleFlow.Acceptor).我的问题是,我可以检查哪些约束流程,以及合同中的约束条件?或者这仅仅是一个组织问题?

Rog*_*lis 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)
        }
    }
Run Code Online (Sandbox Code Playgroud)

CollectSignaturesFlow和它的对应物,SignTransactionFlow自动化任何类型的交易的签名集合.这种自动化非常有用,因为开发人员不再需要为签名集合手动编写流程!但是,开发人员必须知道,给定任何有效的交易 - 根据交易中引用的合同代码 - 交易对方将始终签署!这是因为事务是独立验证的,而不是相对于某些预期的外部值.

让我举两个例子:

  • 如果我可以访问您之前交易中的一个未花费的现金状态,那么也许我可以创建现金支出交易(从您到我)并要求您通过CollectSignaturesFlow.如果交易有效,那么在没有任何额外检查的情况下,您将对其进行签名,这将导致您向我发送现金.显然你不想要这个!
  • 合同代码只能作为验证交易的一部分.如果您想检查交易是否代表您想要进入的交易,例如价格<某些金额,那么您将需要进行一些额外的检查.合同代码不能为您提供商业上可行的交易.这种检查必须作为SignTransactionFlow覆盖的一部分来完成signTransaction

在生产CorDapp中,人们可能希望推迟人为判断是否签署交易并达成交易.或者,可以通过HTTP API或MQ与某些外部参考数据系统联系来自动化该过程,以确定该交易是否应该进入.

在上面的代码示例中,我们添加了两个简单的约束:

  • 一个阻止借款人创建一个过大(超过100)IOU状态的人
  • 确保交易确实包含IOU状态而不是我们没有预料到的其他状态的那个

请注意,这两个约束不能放在合同代码中.合同代码更适合于定义管理资产或协议应如何随时间演变的约束.例如,关于IOU:

请记住,Corda旨在让潜在的相互不信任的各方就共同的事实达成共识.因此,节点不能隐含地信任他们通过线路从他们的对手那里收到的内容,因此我们总是必须检查我们收到的是我们期望收到的内容.

希望有道理!