首先道歉,我仍然是Corda的学习者。已经阅读了有关IOU情况的Hello World示例。据我了解,目前的样本仅涵盖欠条交易,不包括借条后借方和借方的金额变化。如果要这样做,如何修改合同和流程部分?
借条之前
用户A的状态:100个单位
用户B的状态:0个单位
10个单位的借条后
用户A的状态:90个单位
用户B的状态:10个单位
据我所知,合约形状约束必须有两个输入状态和两个输出状态。但是,如何在流部分创建两个新状态,因为大多数示例只有一个输出状态?
非常感谢您的帮助,如果您能以Java而非kotlin格式给我一些提示,请多加感谢。
答案 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);