我们在Corda中有一个用例,我们想在其中向所有对手可见的事务添加元数据。在这种情况下,由于以下原因,我们无法将此信息添加到状态中:
此外,建立单独的状态和合同来获取此信息(实际上依靠类型系统来获取附加信息)也没有意义,因为
要了解我们要做什么,请考虑Corda IOU演示。发出IOU状态后,我们可以指定一种货币数量,但不能指定有关我们要发出IOU状态的为什么的任何上下文元数据。
我们想要的东西甚至可以添加一个简单的字符串,例如:
为此,我唯一能看到的选择是使用附件,但是对于这么小的数据来说,似乎太过分了。
我所见过的另一件事是函数addTransactionNote
和getTransactionNotes
,如果将交易票据分发给对手方,它们将是完美的,但事实并非如此。
我们还有什么其他选项可以将简单的元数据添加到交易中?
答案 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
}