已删除isRelevant()的1.0 for API发生了一些变化.有什么最好的解决方法?
给出一个用例:如果有100个参与者希望看到这个可查询状态以及与之相关的所有更新(但是只读且不需要签名),我是否需要将它们全部添加到参与者列表中?"观察者"角色尚不存在?对于仅仅看到静态参考数据的用例,是否有一个alsoInformed或类似的东西?
这里的一般功能是共享的线性可查询状态,其中发行者具有要更改/更新的主服务器,其将传播到想要"订阅"这些更改的所有方.我相信这可能适用于"俱乐部"的广播,但我认为俱乐部尚未存在,或者它们是否是网络地图的动态分组.
在回答之前我将进入一些背景......相关性的概念仍然存在于平台中.如您所知,在Corda中有两个数据持久性存储; 存储服务和保险库.
存储服务
存储服务是一个键 - >值存储,可以保存数据,例如:
存储服务非常适合存储可以通过哈希索引和检索的大量序列化数据.但是,如果希望在其中一个存储对象中搜索数据,那就太尴尬了.例如,在使用事务存储时,不能轻易地搜索特定类型的事务输出状态.方法是遍历所有事务,逐个反序列化,并按输出类型进行过滤.它很麻烦而且效率不高.这就是为什么存储库和相关性概念存在的原因!
金库
存储库用于存储状态对象,而不是事务.存在一个主states表,其中存储状态引用,事务id(生成输出状态)和一些其他元数据,例如状态是否被消耗.还有LinearStates表和OwnableStates 表.此外,如果希望向其状态添加ORM,则会为反映ORM定义的每种类型的状态对象创建数据库表.然后可以查询这些属性以从保险库中提取满足特定查询的状态,例如"任何超过1000英镑的义务,其中Alice作为尚未消费的贷方".这就是金库的力量!
关联
现在,情况是并非节点接收的所有事务都产生与该节点相关的状态.一个例子是付款与付款交易,其中Alice向Bob发送美元,Bob向Alice发送英镑.由于Bob现在拥有Alice以前拥有的美元,这些美元现在与Alice无关.因此,Alice不应记录代表这些美元的输出状态,因为她没有对这些美元的权利和义务.Alice所做的是将旧的美元状态标记为已消耗,因此现在不会计入其总美元余额,也不能用作另一个事务中的输入(因为它已经花费了).
相关性如何在Corda中发挥作用
因此,当节点接收到新事务时,它会将participants每个输出状态的属性中定义的公钥与所有VaultService知道的公钥相交.如果特定状态的结果集不为空,则状态与节点相关.简单.
这意味着,如果节点收到的事务中其公钥未在输出状态的参与者字段中列出,则它们不会将该输出状态存储在保管库中.但是,它们会将事务存储在事务存储中,并且仍然可以查询它.
OwnableStates 的相关性概念很简单,要么拥有它,要么不拥有它.LinearState代表多边协议的s 的概念更复杂.在版本M14和下文中,一个可以重写的功能isRelevant在一个LinearState,然而,在V1这已被利于刚刚比较参与者键保管库密钥的更简单的方法除去(如上所述).
V1方法对相关性的影响
正如OP所指出的,在V1中,将存在事务观察器的概念,其中不是状态参与者的节点仍然可以将状态存储在其保管库中并将其作为"第三方"状态进行查询.即它无法消耗或有助于平衡总数,但可以查询它.与此同时,我们将不得不解决缺少该功能的问题,其中包括:
LinearStates,将所有预期的观察者添加到participants列表中.然后,向状态对象添加一个额外的属性,称为consumers只包含可以在有效事务中使用此状态的参与者列表,即签署包含它的事务.然后,该状态的合同将比较命令中的公钥和consumers列表中的公钥.这样,所有观察者仍将状态存储在他们的保险库中.在FinalityFlow将播出本次交易的所有participants.如果您不希望其他参与者知道观察者,您可以使用随机生成的公钥.OwnableStates,如Cash,participants所有者中只能有一个身份.因此,方法是使用FinalityFlow将事务发送给一组观察者,然后那些观察者必须直接从事务中获取输出状态.繁琐但暂时的,因为我们现在正在处理交易观察员:https://r3-cev.atlassian.net/browse/CORDA-663.| 归档时间: |
|
| 查看次数: |
278 次 |
| 最近记录: |