Blockchain 在Corda 4.0中将参与者动态添加到状态

Blockchain 在Corda 4.0中将参与者动态添加到状态,blockchain,corda,Blockchain,Corda,是否可以将参与者动态添加到流中的状态,以便将状态存储在第三方vault中,而不使用StatesToRecord.ALL\u在ReceiveFinalityFlow中可见 我们在Corda 2.0中也做了同样的事情,它在Corda 4.0中不起作用 Corda 3.2及以后版本是否不支持此功能?我看到@KeepForDJVM被添加到ContractState 我尝试在IoState中动态添加参与者,作为[IoState.participants.add(第三方)]将IoState中的参与者更新为可

是否可以将参与者动态添加到流中的状态,以便将状态存储在第三方vault中,而不使用StatesToRecord.ALL\u在ReceiveFinalityFlow中可见

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

Corda 3.2及以后版本是否不支持此功能?我看到@KeepForDJVM被添加到ContractState

我尝试在IoState中动态添加参与者,作为
[IoState.participants.add(第三方)]
将IoState中的参与者更新为可变列表,作为
[override val participants:mutableList=mutableListOf(贷款人、借款人)]
,这样IoState也将存储在第三方保险库中。我正在通过借款人和第三方的流程会议来收集TaureFlow和FinalityFlow。IOUFlowTests
[流量在双方的保险库中记录正确的IOU]
失败,第三方保险库中未找到IOUTE

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()))
iostate:
@BelongsToContract(IOUContract::class)
数据类Iute(val值:Int,
val贷款人:一方,
借款方:缔约方,
瓦尔第三党:党,
重写val linearId:UniqueIdentifier=UniqueIdentifier()):
LinearState,QueryableState{
/**相关方的公钥*/
//覆盖val参与者:MutableList get()=mutableListOf(贷款人、借款人)
覆盖val参与者=可变列表(贷款人、借款人)
示例流程:
var ioute=ioute(iouValue,serviceHub.myInfo.legidenties.first(),另一方,第三方)
Ioutate.参与者.添加(第三方)
val txCommand=Command(IOUContract.Commands.Create(),iostate.particients.map{it.owningKey})
val counterparties=iostate.participants.map{it as Party}.filter{it.owningKey!=ourIdentity.owningKey}.toSet()
forEach{p->flowSessions.add(initiateFlow(p))}
val fullySignedTx=子流(CollectSignaturesFlow(partSignedTx、flowSessions、GATHERING_SIGS.childProgressTracker())
//第五阶段。
progressTracker.currentStep=完成交易
//在双方的保险库中对交易进行公证和记录。
返回子流(FinalityFlow(fullySignedTx、flowSessions、Finalizing_TRANSACTION.childProgressTracker()))
交易对手借款人和第三方均接收流量并签署交易,但未在参与者列表中看到第三方,也未存储在第三方保管库中


我希望第三方应该在参与者列表中,IoState也应该存储在第三方Vault中。

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

这里有两种实现目标的方法:

  • 使用更新的参与者列表创建新的输出
  • 在流的主体中,您应该使用更新的参与者列表创建一个新的iItate。您必须更新iItate,以便
    参与者
    是主结构中的一个值。然后您可以使用如下帮助器方法添加参与者:

    fun addParticipant(partyToAdd: Party): IOUState = copy(participants + partyToAdd)
    
    这里是重要的部分:然后必须将旧iOtate作为输入包含在此事务中,将新iOtate作为输出。Corda基于UTXO模型-更新状态的唯一方法是将其标记为历史记录(将其用作输入),然后将更新版本保留到分类账中

    注:作为一名参与者,知情方现在可以对该协议提出变更建议——这些变更必须在Corda合同中予以说明

  • 使用SendStateAndReflow(可能是针对您的问题的更好的解决方案)
  • SendStateAndReflow将(按照其名称中的指定)向接收节点发送状态及其关联的stateRef。对方(接收节点)必须在流对话的正确点使用
    ReceiveStateAndReflow

    subFlow(new SendStateAndRefFlow(counterpartySession, dummyStates));
    

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

    感谢Nick的回复,我尝试添加您提到的复制方法,但在复制方法中看不到ContractState的参与者。这会导致编译错误。我们遵循您在第1点中提到的方法。由于它是可变列表,我们可以在流中添加参与者,它在Corda 2.0中工作,但在Corda 4.0中不工作。这是wo在参与者属性被添加到构造函数而不是主体之后立即执行rking。如果覆盖val参与者=mutableListOf(贷款人、借款人)移动到构造器后,我们将能够与第三方一起复制IudState,并且工作良好。@Muthu-非常好!很高兴它成功了。坦率地说,我在Corda 2.0方面的经验较少,但我知道您需要生成一个新状态,并更新参与者列表,以实现分发的更改。这解决了您的问题吗?我应该编辑m吗你能回答更多信息吗?