Corda-交易中继资料

时间:2019-02-06 23:33:16

标签: corda

我们在Corda中有一个用例,我们想在其中向所有对手可见的事务添加元数据。在这种情况下,由于以下原因,我们无法将此信息添加到状态中:

  • 并非所有交易对手都可以看到交易中的所有状态
  • 这与国家本身无关

此外,建立单独的状态和合同来获取此信息(实际上依靠类型系统来获取附加信息)也没有意义,因为

  • 各州/合同将是相同的
  • 这是对面向对象编程的不良使用

要了解我们要做什么,请考虑Corda IOU演示。发出IOU状态后,我们可以指定一种货币数量,但不能指定有关我们要发出IOU状态的为什么的任何上下文元数据。

我们想要的东西甚至可以添加一个简单的字符串,例如:

  • “您向我们卖了苹果”
  • “您向我们出售了橙子”

为此,我唯一能看到的选择是使用附件,但是对于这么小的数据来说,似乎太过分了。

我所见过的另一件事是函数addTransactionNotegetTransactionNotes,如果将交易票据分发给对手方,它们将是完美的,但事实并非如此。

我们还有什么其他选项可以将简单的元数据添加到交易中?

2 个答案:

答案 0 :(得分:1)

您可以通过在主要业务流程中使用以下子流程,向自己和该交易的其他对手方参与者添加交易记录。

object TxNoteFlow {
    @InitiatingFlow    
    class Initiator(val txNote: TxNote,
                    val counterParties: Collection<Party> = listOf()) : FlowLogic<Unit>() {
        @Suspendable
        override fun call() {            
            serviceHub.vaultService.addNoteToTransaction(txNote.txId, txNote.msg)

            //Distribute the transaction-note to counter parties.
            val flowSessions = mutableSetOf<FlowSession>()
            counterParties.forEach { flowSessions.add(initiateFlow(it)) }
            flowSessions.forEach { session -> session.send(txNote) }
        }

    }

    @InitiatedBy(Initiator::class)
    class Acceptor(flowSession: FlowSession) : FlowLogic<Unit>() {
        @Suspendable
        override fun call() {
            flowSession.receive<TxNote>().unwrap {
                serviceHub.vaultService.addNoteToTransaction(it.txId, it.msg)
            }
        }
    }
}
  

在成功完成交易后,在业务流程结束时将此流程称为subflow

 @InitiatingFlow    
    class BusinessInitiator(val state: SomeState) : FlowLogic<Unit>() {
        @Suspendable
        override fun call() {            
            //Build the transaction.
            val txb=...
            .....

            //Commit signed transaction to ledger.
            val stx=FinalityFlow(tx, ..)

            //Transaction notes.
            subflow(TxNoteFlow.Initiator(...))
        }

    }

答案 1 :(得分:-1)

如何将元数据嵌入命令中?

interface Commands : CommandData {
    data class Action(val metaData: Any) : Commands
}