commands webinar状态(大约3:10)"输入和输出状态始终按类型分组,并且每个组都需要命令。"叙述者似乎暗示如果一个事务由多个命令组成,那么每个命令将与事务中提出的状态转换的不同子集相关联。
然而,在LedgerTransaction
的结构中似乎没有捕捉到这样的观点。它由完全独立的inputs
,outputs
和commands
列表组成。没有任何东西表示特定命令与特定输入或输出状态之间的关联。
在我的合同代码中,我可以按类型分组状态,例如:
override fun verify(tx: LedgerTransaction) {
val fooStates = tx.inputsOfType<FooState>()
val barStates = tx.inputsOfType<BarStates>()
但我只是选择分组 - 我不必这样做,并且没有任何东西将这些群体与特定命令捆绑在一起。
那么网络研讨会在什么时候提到&#34;每个小组都需要一个命令&#34;?
如果网络研讨会中描述的命令和状态转换之间的关系存在,则与命令关联的签名背后的意义将是清楚的。但实际上,由于LedgerTransaction
类没有捕获这种关系,因此不会在每个命令的基础上签署特定的转换。
在关键概念section on commands中,一个人有一个优惠券命令和一个付费命令,有必要签署债券状态转换的人可能与那些需要签字的人不同现金状态转型。但是在代码中没有任何东西将优惠券命令绑定到特定状态,如果他们签名,与命令关联的签名者同意。
这是否要求每个组必须具有关联命令,这只是开发人员应该在他们的合同验证逻辑中实现的东西而不是人们试图捕获的东西交易结构?
答案 0 :(得分:3)
好问题。
你谈到了合同中的分组,并且这是正确的,这取决于合同的实施,你只需要进一步扩展它以强制执行哪些方需要根据交易中的命令进行签名。 / p>
因此,您的验证功能可能类似于Option CorDapp示例中的合同的以下简化版本:
覆盖有趣的验证(tx:LedgerTransaction){
val command = tx.commands.requireSingleCommand<Commands>() when (command.value) { is Commands.Issue -> { requireThat { val cashInputs = tx.inputsOfType<Cash.State>() val cashOutputs = tx.outputsOfType<Cash.State>() "Cash.State inputs are consumed" using (cashInputs.isNotEmpty()) "Cash.State outputs are created" using (cashOutputs.isNotEmpty()) val option = tx.outputsOfType<OptionState>().single() "The issue command requires the issuer's signature" using (option.issuer.owningKey in command.signers) } } is Commands.Trade -> { requireThat { val cashInputs = tx.inputsOfType<Cash.State>() val cashOutputs = tx.outputsOfType<Cash.State>() "Cash.State inputs are consumed" using (cashInputs.isNotEmpty()) "Cash.State outputs are created" using (cashOutputs.isNotEmpty()) val inputOption = tx.inputsOfType<OptionState>().single() val outputOption = tx.outputsOfType<OptionState>().single() "The transfer command requires the old owner's signature" using (inputOption.owner.owningKey in command.signers) "The transfer command requires the new owner's signature" using (outputOption.owner.owningKey in command.signers) } } else -> throw IllegalArgumentException("Unknown command.") } }
我们首先从事务中提取命令(或命令)并为我们提供上下文。
基于此,我们可以从输入或输出中拉出我们感兴趣的状态,例如现金/期权,并开始检查我们的约束是否得到满足。
您可以在https://github.com/CaisR3/cordapp-option找到上述示例的完整版本,合同代码可以在base \ src \ main \ kotlin \ net \ corda \ option \ base \ contract \ OptionContract.kt中找到