是否可以将参与者动态添加到流中的状态,以便在不使用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));


这两种方法都将导致接收节点验证状态的依赖关系(构成其历史的所有输入和事务)

10-07 18:47