是否可以将参与者动态添加到流中的状态,以便在不使用ReceiveFinalityFlow中使用StatesToRecord.ALL_VISIBLE的情况下将状态存储在ThirdParty保管库中?
我们在Corda 2.0中做了同样的事情,但在Corda 4.0中不起作用。
从Corda 3.2开始不支持吗?我看到@KeepForDJVM已添加到ContractState。
在将IOUState中的参与者更新为mutableList作为[iouState.participants.add(thirdParty)]
后,我尝试将IOUState中的参与者动态添加为[override val participants: MutableList<AbstractParty> = mutableListOf(lender, borrower)]
,以便将IOUState也存储在ThirdParty库中。我正在将借方和第三方的流程会话传递给CollectSigntaureFlow和FinalityFlow。 IOUFlowTests [flow records the correct IOU in both parties' vaults]
失败,在thridParty库中找不到iouState。
IOUState:
@BelongsToContract(IOUContract::class)
data class IOUState(val value: Int,
val lender: Party,
val borrower: Party,
val thirdParty: Party,
override val linearId: UniqueIdentifier = UniqueIdentifier()):
LinearState, QueryableState {
/** The public keys of the involved parties. */
//override val participants: MutableList<AbstractParty> get() = mutableListOf(lender, borrower)
override val participants = mutableListOf(lender, borrower)
ExampleFlow:
var iouState = IOUState(iouValue, serviceHub.myInfo.legalIdentities.first(), otherParty, thirdParty)
iouState.participants.add(thirdParty)
val txCommand = Command(IOUContract.Commands.Create(), iouState.participants.map { it.owningKey })
val counterparties = iouState.participants.map { it as Party }.filter { it.owningKey != ourIdentity.owningKey }.toSet()
counterparties.forEach { p -> flowSessions.add(initiateFlow(p))}
val fullySignedTx = subFlow(CollectSignaturesFlow(partSignedTx, flowSessions, GATHERING_SIGS.childProgressTracker()))
// Stage 5.
progressTracker.currentStep = FINALISING_TRANSACTION
// Notarise and record the transaction in both parties' vaults.
return subFlow(FinalityFlow(fullySignedTx, flowSessions, FINALISING_TRANSACTION.childProgressTracker()))
对方借款人和ThirdParty都接收流和签名交易,但在“参与者”列表中没有看到ThirdParty,也没有存储在ThirdParty保管库中。
我希望ThirdParty应该在“参与者”列表中,并且IOUState也应该存储在ThirdParty Vault中。
最佳答案
在Corda中,状态是不可变的。这意味着您无法将参与者动态添加到流主体中的给定状态。但是,还有其他解决方案可以将状态通知新的第三方!
这里有两种方法可以实现您的目标:
使用更新的参与者列表创建新的IOUState tx输出。
在流程的主体中,您应该创建一个新的IOUState,其中包含参与者的更新列表。您将必须更新IOUState,以便participants
是主要结构中的值。然后,您可以使用这样的帮助方法来添加参与者:
fun addParticipant(partyToAdd: Party): IOUState = copy(participants + partyToAdd)
这是重要的部分:然后,您必须包括旧的IOUState作为此事务的输入,并包括新的IOUState作为输出。 Corda基于UTXO模型-更新状态的唯一方法是将其标记为历史记录(将其用作输入),然后将更新的版本持久保存到分类帐中。
注意:作为参与者,知情方现在可以提出对此IOUState的更改-这些更改必须在Corda合同中说明。
使用SendStateAndRefFlow(可能是更好的解决方案)
SendStateAndRefFlow将(按其名称指定)将状态及其关联的stateRef发送到接收节点。交易对手(接收节点)必须在流对话的正确位置使用
ReceiveStateAndRefFlow
。subFlow(new SendStateAndRefFlow(counterpartySession, dummyStates));
这两种方法都将导致接收节点验证状态的依赖关系(构成其历史的所有输入和事务)