动态地将参与者添加到Corda 4.0中的状态

时间:2019-06-18 11:35:12

标签: blockchain corda

可以将参与者动态添加到流中的状态,以便在不使用ReceiveFinalityFlow中使用StatesToRecord.ALL_VISIBLE的情况下将状态存储在第三方库中吗?

我们在Corda 2.0中做了同样的事情,在Corda 4.0中不起作用。

Corda 3.2及更高版本不支持它吗?我看到@KeepForDJVM已添加到ContractState。

在IOUState中的参与者更新为[iouState.participants.add(thirdParty)]的mutableList之后,我试图将IOUState中的参与者动态添加为[override val participants: MutableList<AbstractParty> = mutableListOf(lender, borrower)],以便将IOUState也存储在ThirdVault中。我正在将借方和第三方的流程会话传递给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中。

1 个答案:

答案 0 :(得分:0)

在Corda中,状态是不可变的。这意味着您无法将参与者动态添加到流主体中的给定状态。但是,还有其他解决方案可以将状态通知新的第三方!

有两种方法可以在这里实现目标:

  1. 使用更新的参与者列表创建新的IOUState tx输出。

在流程的主体中,您应该创建一个新的IOUState,其中包含参与者的更新列表。您将必须更新IOUState,以使participants是主要结构中的值。然后,您可以使用像这样的帮助器方法来添加参与者:

fun addParticipant(partyToAdd: Party): IOUState = copy(participants + partyToAdd)

这是重要的部分:然后,您必须包括旧的IOUState作为此事务的输入,并包括新的IOUState作为输出。 Corda基于UTXO模型-更新状态的唯一方法是将其标记为历史记录(将其用作输入),然后将更新的版本持久保存到分类帐中。

注意:作为参与者,知情方现在将能够提出对此IOUState的更改-这些更改必须在Corda合同中说明。

  1. 使用SendStateAndRefFlow(为您的问题提供更好的解决方案)

SendStateAndRefFlow将(按其名称指定)将状态及其关联的stateRef发送到接收节点。对方(接收节点)必须在流对话的正确点使用ReceiveStateAndRefFlow

subFlow(new SendStateAndRefFlow(counterpartySession, dummyStates));

这两种方法都会使接收节点验证状态的依赖性(构成状态历史的所有输入和事务)