如何区分节点参与或广播的事务与tx链

时间:2018-01-12 06:16:12

标签: corda

问题:有没有办法区分节点参与或广播的交易与tx链?

场景:

  1. A和B执行涉及状态X的交易#1
  2. B和C执行涉及状态X的事务#2
  3. C和D执行涉及状态X的事务#3(将监管机构作为FinalityFlow中的额外参与者)
  4. 当监管机构运行下面的代码来查询其保险库时,打算只获得tx#3,它实际上获得了所有3个tx。没有办法区分3个tx并且只能过滤tx#3。

    val transactionsSnapshot = serviceHub.validatedTransactions.track().snapshot

    是否有办法区分节点所涉及的事务,由于某个节点的广播而收到的事务以及由于广播而收到的链的一部分的事务。

    随后,当SGX到来时,只有在出处期间接收到的用于验证/处理的交易才会进入安全区域,而节点是广播的一部分并作为广播的一部分接收的事务存在于保管库存储中查询?

2 个答案:

答案 0 :(得分:1)

要广播交易,您可能会遇到类似的事情 ReportToRegulatorFlow。但另外,在响应者方面你可以做到这一点

val recorded = subFlow(ReceiveTransactionFlow(otherSideSession, true, StatesToRecord.ONLY_RELEVANT))

// Currently there's no way to distiguish transactions that are from a tx that was broadcasted versus ones from walking the chain and kept in storage
// We use memo/notes to keep track of this to differentiate during tx snapshot enquiry

serviceHub.vaultService.addNoteToTransaction(recorded.id, "BROADCASTED")

仅查询广播的tx。

val transactionsSnapshot = serviceHub.validatedTransactions.track().snapshot
val broadcastedTx = transactionsSnapshot.filter{ serviceHub.vaultService.getTransactionNotes(it.tx.id).firstOrNull() == "BROADCASTED" }

仅查询参与的Tx。

val participatedTx = transactionsSnapshot.filter{ it.tx.requiredSigningKeys.any { resolveKey(it) != null && resolveKey(it) == ourIdentity} }  

答案 1 :(得分:0)

没有直接尝试我将要完整建议的内容;但我已经实现了一些非常相似的东西....基于VaultQueryCriteria实现未来,它只观察参与者C& D.在每次此类更新时,检索事务(从节点已知的已验证事务列表中),其中输出状态=从VaultQueryCriteria返回的状态。

这可能是一种很好的方式;但我基本上采取了一种非常类似的方法来满足我的要求......似乎工作令人满意。警告:我还不太熟悉V2.0。

只是一个想法 - 希望它有所帮助。