Corda 如何更新vault中的项目?

Corda 如何更新vault中的项目?,corda,Corda,我目前正在接受培训,准备成为corda开发者 我创建了一个简单的corDapp,只有一个参与者,以下是我创建的状态: @BelongsToContract(UserContract::class) class UserState(val name: String, val age: Int, val address: String, val gender: GenderEnums,

我目前正在接受培训,准备成为corda开发者

我创建了一个简单的corDapp,只有一个参与者,以下是我创建的状态:

@BelongsToContract(UserContract::class)
class UserState(val name: String,
                val age: Int,
                val address: String,
                val gender: GenderEnums,
                val node: Party,
                val status: StatusEnums,
                override val linearId: UniqueIdentifier,
                override val participants : List<Party>
) : LinearState
@BelongsToContract(UserContract::class)
类UserState(val名称:String,
年龄:Int,
val地址:字符串,
val性别:性别,
val节点:党,
val状态:状态枚举,
重写val linearId:唯一标识符,
覆盖val参与者:列表
):LinearState
因此,当我运行corDapp时,我会得到所需的输出

但我想做的是更新保险库。例如,我想把地址从“潘潘加”改为“马尼拉”,但我不知道从哪里开始。我所知道的是,由于状态是不可变的,所以必须首先使用状态

我尝试创建一个流:

@InitiatingFlow
@StartableByRPC
class UpdateUserFlows(private val name :String,
                      private val age : Int,
                      private val address : String,
                      private val gender: GenderEnums,
                      private val status : StatusEnums,
                      private val counterParty: Party): FlowLogic<SignedTransaction>() {

    private fun userStates(): UserState {
        return UserState(
                name = name,
                age = age,
                address = address,
                gender = gender,
                status = status,
                node = ourIdentity,
                linearId = UniqueIdentifier(),
                participants = listOf(ourIdentity, counterParty)
        )
    }

    @Suspendable
    override fun call(): SignedTransaction {
        val transaction: TransactionBuilder = transaction()
        val signedTransaction: SignedTransaction = verifyAndSign(transaction)
        val sessions: List<FlowSession> = (userStates().participants - ourIdentity).map { initiateFlow(it) }.toSet().toList()
        val transactionSignedByAllParties: SignedTransaction = collectSignature(signedTransaction, sessions)
        return recordTransaction(transactionSignedByAllParties, sessions)
    }

    private fun transaction(): TransactionBuilder {
        val notary: Party = serviceHub.networkMapCache.notaryIdentities.first()
        val issueCommand = Command(UserContract.Commands.Issue(), userStates().participants.map { it.owningKey })
        val builder = TransactionBuilder(notary = notary)
        builder.addOutputState(userStates(), UserContract.ID)
        builder.addCommand(issueCommand)
        return builder
    }

    private fun verifyAndSign(transaction: TransactionBuilder): SignedTransaction {
        transaction.verify(serviceHub)
        return serviceHub.signInitialTransaction(transaction)
    }


    @Suspendable
    private fun collectSignature(
            transaction: SignedTransaction,
            sessions: List<FlowSession>
    ): SignedTransaction = subFlow(CollectSignaturesFlow(transaction, sessions))

    @Suspendable
    private fun recordTransaction(transaction: SignedTransaction, sessions: List<FlowSession>): SignedTransaction =
            subFlow(FinalityFlow(transaction, sessions))
}
@InitiatingFlow
@星表
类UpdateUserFlows(私有值名称:String,
私人年龄:Int,
私有val地址:字符串,
私人val性别:性别,
私有val状态:StatusEnums,
私人val交易对手:交易方):FlowLogic(){
private fun userStates():UserState{
返回用户状态(
name=name,
年龄=年龄,
地址,
性别=性别,
状态=状态,
节点=用户身份,
linearId=UniqueIdentifier(),
参与者=名单(身份、交易对手)
)
}
@暂停
重写趣味调用():SignedTransaction{
val事务:TransactionBuilder=事务()
val signedTransaction:signedTransaction=verifyAndSign(交易)
val会话:List=(userStates().participants-ourIdentity).map{initiateFlow(it)}.toSet().toList()
val transactionSignedByAllParties:SignedTransaction=collectSignature(SignedTransaction,会话)
返回记录事务(由各方、会话签名的事务)
}
private fun transaction():TransactionBuilder{
val公证人:Party=serviceHub.networkMapCache.notaryIdentity.first()
val issueCommand=Command(UserContract.Commands.Issue(),userStates().participants.map{it.owningKey})
val builder=交易生成器(公证人=公证人)
builder.addOutputState(userStates(),UserContract.ID)
builder.addCommand(issueCommand)
返回生成器
}
私人娱乐验证和签名(交易:TransactionBuilder):已签名交易{
事务。验证(serviceHub)
返回serviceHub.signInitialTransaction(事务)
}
@暂停
私人签名(
交易:已签名交易,
会话:列表
):SignedTransaction=子流(CollectSignaturesFlow(事务、会话))
@暂停
private fun recordTransaction(事务:SignedTransaction,会话:List):SignedTransaction=
子流(最终流(事务、会话))
}
但它不起作用。

  • 您是对的,状态在Corda中是不可变的,为了模拟更新,您基本上需要创建一个事务,其中输入是状态的当前版本(即address=Pampanga),输出将是
    UserState
    的一个新实例,该实例具有与输入相同的
    linearId
    和其他属性值,但地址值不同(即马尼拉)

  • 这样您就创建了一个新状态(事务的输出),但因为它将具有相同的
    linearId
    值;就好像您将输入更新为输出一样,这将允许您通过其
    linearId
    查询vault来查看状态的所有以前版本

  • 您没有共享合同的代码,但需要添加一个新命令(我们称之为
    Update
    );此外,还需要添加适用于它的验证规则

  • 在您的流程中,您应该使用该命令(而不是
    Issue