目前我们计划有一个“草案”版本的契约(Contract),不会发送给交易对手,发起人可以在将其发送到网络之前进行任何更改,因此这应该是一个“未共享的事实”。我们知道 Corda 和保险库用于共享事实,所以在这里我不确定我们是否仍然可以使用保险库来存储这种类型的“非共享事实”,我的想法如下,我已经可以在我的本地工作在教程 CorDapp 上,但想从其他 Corda 团队/专家那里获得一些意见。

主要变化在于发起者流程:

  • 仅使用发起者的 key 发起创建命令
  • 不要调用“CollectSignaturesFlow”,这样它就不会发送给任何其他人
  • 在 verify() 之后调用“FinalityFlow”,所以这将被提交到账本

  • 以下是上述各点的代码。
    override fun call(): SignedTransaction  {
        // We create a transaction builder
        val txBuilder = TransactionBuilder()
        val notaryIdentity = serviceHub.networkMapCache.getAnyNotary()
        txBuilder.notary = notaryIdentity
    
        // We create the transaction's components.
        val ourIdentity = serviceHub.myInfo.legalIdentity
        val iou = TemplateState(iouValue, ourIdentity, ourIdentity)
        val txCommand = Command(TemplateContract.Create(), listOf(ourIdentity.owningKey))
    
        // Adding the item's to the builder.
        txBuilder.withItems(iou, txCommand)
    
        // Verifying the transaction.
        txBuilder.toWireTransaction().toLedgerTransaction(serviceHub).verify()
    
        // Signing the transaction.
        val partSignedTx = serviceHub.signInitialTransaction(txBuilder)
    
        // Finalising the transaction.
        return subFlow(FinalityFlow(partSignedTx)).single()
    }
    

    最佳答案

    您确实可以在 Corda 中创建一个未共享的事实!这里的关键是在州的 participants 列表中。只需将您自己添加到参与者列表中,并且仅将您的公钥添加到命令中。这是一个简单的例子:

    //Contract and State.
    class UnsharedFact: Contract {
        override val legalContractReference: SecureHash = SecureHash.zeroHash
        override fun verify(tx: TransactionForContract) = Unit // Stubbed out.
        class Create: CommandData
    
        data class State(val parties: Set<Party>): ContractState {
            override val contract: Contract get() = UnsharedFact()
            override val participants: List<AbstractParty> get() = parties.toList()
            fun addParty(newParty: Party) = copy(parties = parties + newParty)
        }
    }
    
    // Create flow.
    @InitiatingFlow
    @StartableByRPC
    class CreateUnsharedFact(): FlowLogic<SignedTransaction>() {
        @Suspendable
        override fun call(): SignedTransaction {
            val me = serviceHub.myInfo.legalIdentity
            val notary = serviceHub.networkMapCache.getAnyNotary()
            val state = UnsharedFact.State(setOf(me))
            val command = Command(UnsharedFact.Create(), listOf(me.owningKey))
            val utx = TransactionBuilder(notary = notary).withItems(state, command)
            val stx = serviceHub.signInitialTransaction(utx)
            return subFlow(FinalityFlow(stx)).single()
        }
    }
    

    FinalityFlow 被调用时,您将是唯一接收输出状态的节点。

    如果您希望随后涉及另一方,那么您可以使用 addParty 上的 UnsharedFact.State 方法创建状态的新版本。然后,创建一个新交易,添加原始状态作为输入,添加新版本(有新方)作为输出。当此交易完成(公证)后,双方将在各自的金库中拥有一份副本。现在,我想“UnsharedFact”这个名字是不合适的:)

    您还可以使用类似的方法删除参与方。

    关于corda - 如何在 Corda 中定义一个未共享的事实,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45078817/

    10-16 05:45