如何扩展借据情况以修改两个用户的状态

时间:2018-12-02 20:42:19

标签: corda

首先道歉,我仍然是Corda的学习者。已经阅读了有关IOU情况的Hello World示例。据我了解,目前的样本仅涵盖欠条交易,不包括借条后借方和借方的金额变化。如果要这样做,如何修改合同和流程部分?

借条之前

用户A的状态:100个单位

用户B的状态:0个单位

10个单位的借条后

用户A的状态:90个单位

用户B的状态:10个单位

据我所知,合约形状约束必须有两个输入状态和两个输出状态。但是,如何在流部分创建两个新状态,因为大多数示例只有一个输出状态?

非常感谢您的帮助,如果您能以Java而非kotlin格式给我一些提示,请多加感谢。

1 个答案:

答案 0 :(得分:0)

获取两个输入状态

假设您正在UserA上运行流。您可以通过查询保管库来检索UserA的输入状态。例如:

val queryCriteria = QueryCriteria.LinearStateQueryCriteria(
    null, listOf(linearId), UNCONSUMED, null)

val inputStateAndRef = serviceHub.vaultService.queryBy<IOUState>(queryCriteria).states.singleOrNull()
    ?: throw FlowException("IOU with ID $linearId not found.")

检索UserB的输入状态更为复杂,因为它存储在UserB的保管库中,UserA无法直接查询。您需要编写一个响应者流程,其中UserB从其保管库中检索状态,然后将其发送给正在构建事务的发起方。例如:

@InitiatingFlow
class Initiator(val counterparty: Party, val linearId: UniqueIdentifier) : FlowLogic<Unit>() {

    @Suspendable
    override fun call() {
        val flowSession = initiateFlow(counterparty)
        flowSession.send(linearId)
        val inputStateAndRef = flowSession.receive<StateAndRef<IOUState>>().unwrap { it }
    }
}

@InitiatedBy(Initiator::class)
class Acceptor(val flowSession: FlowSession) : FlowLogic<Unit>() {
    @Suspendable
    override fun call() {
        val linearId = flowSession.receive<UniqueIdentifier>().unwrap { it }

        val queryCriteria = QueryCriteria.LinearStateQueryCriteria(
                null, listOf(linearId), Vault.StateStatus.UNCONSUMED, null)

        val inputStateAndRef = serviceHub.vaultService.queryBy<IOUState>(queryCriteria).states.singleOrNull()
                ?: throw FlowException("IOU with ID $linearId not found.")

        flowSession.send(inputStateAndRef)
    }
}

添加两个输出状态

只需两次调用TransactionBuilder.addOutputState,即可将两个输出状态添加到事务中:

transactionBuilder.addOutputState(new TemplateState(), TemplateContract.ID);
transactionBuilder.addOutputState(new TemplateState(), TemplateContract.ID);