首页 > 解决方案 > 如何限制观察者节点进行任何交易

问题描述

需要实现corda节点,它是纯粹的观察者手段,它持久化状态但不会与其他节点参与任何事务。

为了实现它,我做了以下事情:

制作了3个节点如下:

PartyA - 节点包含 cordApp jar,包括事务流、观察者流和合同和状态

PartyB - 节点包含 cordApp jar,包括事务流、观察者流和合同和状态

观察者 - 节点仅包含合同和状态以及观察者流。

在观察者节点上,所有事务节点都被有意删除,以便观察者无法与其他节点进行交易。

节点启动后,通过保持 Observer 节点作为观察者来执行从 PartyA 到 PartyB 的事务。它完美地工作。

现在我尝试了从 PartyA 到观察者的相同操作,并将 PartyB 保留为观察者。我预计事务会失败,但即使观察者节点没有事务流,事务也会在观察者节点上提交。

当我尝试执行从观察者到 PartyA 的事务时,它会给出错误,因为没有找到预期的流。

我正在使用的示例具有可拥有状态并使用简单的启动流程。

我的问题是一个定向事务如何与观察者一起工作,尽管观察者没有流量。

我如何防止观察者不与其他节点进行任何交易,只是充当纯粹的观察者。

标签: corda

解决方案


从 Corda 3 开始,节点在启动时实际上会为以下四个流安装默认流响应器:

  1. FinalityFlow
  2. NotaryChangeFlow
  3. ContractUpgradeFlow.Initiate
  4. SwapIdentitiesFlow

这是在AbstractNode.installCoreFlows

private fun installCoreFlows() {
    installCoreFlow(FinalityFlow::class, ::FinalityHandler)
    installCoreFlow(NotaryChangeFlow::class, ::NotaryChangeHandler)
    installCoreFlow(ContractUpgradeFlow.Initiate::class, ::ContractUpgradeHandler)
    installCoreFlow(SwapIdentitiesFlow::class, ::SwapIdentitiesHandler)
}

因此,观察者节点仍将能够接收和记录事务作为对 的调用的一部分FinalityFlow

在 Corda 的未来版本中,此默认FinalityFlow处理程序将被删除。节点必须显式创建一个接收和存储事务的流,从而允许您实现上述行为。


推荐阅读