Corda州管理最佳实践

时间:2018-06-15 21:23:45

标签: corda

一个战略问题......当一个州要拥有一对多类型的数据时,我们是否应该始终在父状态对象下创建一个集合,或者为该子对象创建一个单独的状态对象?示例(雇主1:M员工)或(雇主1:M位置)....何时决定采用哪种策略?我列出了一些PROS&每个人的缺点。不确定何时使用什么策略。寻找一些反馈

将子项添加为集合

PROS
=====
- Easier to manage from coding standpoint
- Easy access to child data as it will always be available when querying parent from vault

CONS
=====
- As each collection object is going to be represented as separate table in the database, Each time a new state is created child data is also replicated even though there may not be update on child which will cause database to grow unessential
- If we have too many of such collection objects then serialized transaction size could be huge so performance could be worst

将子项添加为单独的状态对象

PROS
=====
- Child data is not replicated with each time a new parent state is updated
- When there is an update on any of the Child data only that state needs to be communicated other participant

CONS
=====
- More coding needed in order to manage child state object separately
- Child data won't be available when querying parent from vault
- Each state needs to have its own contract so child objects can't be validated on the same parent contract

2 个答案:

答案 0 :(得分:1)

由于状态链接到持久化到后端的单个表,因此很难管理子集合。目前,我认为您需要将集合属性保持为未绑定(即未映射到数据库列并标记为瞬态,以便该类仍可序列化),然后对可分配的子记录执行单独的筛选查询到国家的集合财产。然后,如果持续存在任何更改,则不会尝试保留子记录。子记录的更改应通过自己的状态事务单独完成。如果Corda有一个功能可以支持JPA在@OneToMany等表之间进行连接的功能,那就太好了。这将有助于查询,但仍需要单独处理持久状态更改。可能有一种我不知道的方法。

答案 1 :(得分:1)

这是一个古老的问题,但是似乎没有一个可以接受的答案,所以我去。

首先,Corda节点不仅是应用程序的后端,而且是分散式交易处理系统中的一个节点。后者必须是您的关键要求,否则您将不会使用Corda。

其次,Corda实现了UTXO(未花费的交易输出)范式,用于通过一系列交易使分布式状态发展,其中代表输入状态的一组对象被“花费”(或消耗,变得不可用),并由另一组代表输出状态。状态对象本身可能具有复杂的结构,但是当它们演变时,它们意味着要整体交换。这与以太坊或Hyperledger不同,后者的全局状态基本上是不相关的键值对的大量集合,这些键值对可以任意更改。 UTXO模型允许轻松实现使用全局状态模型很难实现的功能,例如交易隐私。这里的重点是,可以使Corda模仿全局状态模型,但是这样做效率低下,并且会失去其大部分优势。

因此,状态建模的方式必须基于CorDapp分布式状态的预期演变。因此,可能要问自己的问题如下:

  1. 孩子会说“过自己的生活”,即进化吗? 独立于父国家?一个“是”的例子是 Corda Token SDK,其中令牌类型和令牌本身是 尽管父母与子女之间存在明显的亲子关系,但还是两个州分开。网络 参与者可以交易子状态而无需控制 父国家。
  2. 是否需要保留其中的信息 父国家而不是孩子,反之亦然 参与交易?一个“是”的例子是 使用Oracle签署子状态对象输出而无需 向父母展示。 Corda IRS example与 当甲骨文确定利率后,交易便会取消。
  3. 网络参与者可能会需要 知道(即保留在保险库中)子状态,但不知道父状态 州。一个“是”的例子是账外结算 与Corda Settler example类似的工作流程,其中付款代理商 可以在不知道细节的情况下解决义务 导致义务产生的协议。

如果以上任何一个问题的答案为“是”,则必须将子代表示为单独的状态,否则最好将它们嵌入父代状态。