【问题标题】:consensus among peers in hyperledger fabric after transaction is committed交易提交后,超级账本结构中的对等点之间达成共识
【发布时间】:2018-11-04 23:08:07
【问题描述】:
假设我已经在一个组织中与两个同行一起开始使用 Fabric。通过作曲家运行我的应用程序/休息服务器并提交事务之后。通过地址http://localhost:6984/_utils/#/_all_dbs,我能够更改 peer1 的 Couchdb 实例的值。现在,两个对等点彼此不同步 - 应用程序应该抛出一些错误,但事实并非如此。主要是因为它只是从第一个对等点(即对等点 1)获取数据。
那么,首先我如何从多个对等点获取数据 - 如果我也想从对等点 2 获取数据?
其次,为什么它从状态数据库而不是从账本中获取数据?
第三,即使提交后数据也应该保持同步我该如何配置?如果某些对等方篡改了其数据库,则应通知它。我已经阅读了共识部分,并知道这是为了交易和区块的正确顺序,但是如果有人篡改了状态数据库怎么办?
【问题讨论】:
标签:
hyperledger-fabric
hyperledger
hyperledger-composer
【解决方案1】:
如果您能够更改状态数据库中 1 个对等点的条目,并使用强大的背书策略(例如 AND),您的交易将由于两个对等点的数据不同而无法验证。这是去中心化网络最重要的优点之一。
状态数据库和分类帐不是一回事。 this 应该可以帮助您了解两者之间的区别。
Hyperledger Fabric 网络的每个参与成员本身都是一个已知实体(因为 Fabric 是经过许可的区块链)。也就是说,单个对等点的状态数据库的更改将再次导致上面的场景 #1,其中事务中的读/写集不会与多个对等点匹配(因为它们的状态数据库包含不同的资产值)。这将导致交易无效。现在它只是成为网络如何知道损坏的对等点(和后续状态数据库)的问题。可以有多个相同的解决方案。
但最重要的是,Fabric 是一个许可的区块链网络,状态数据库也必须在网络之外受到非常严格的访问保护和授权。
【解决方案2】:
您修改了世界数据库这一事实并不意味着什么。您对该数据库所做的任何更改都不代表账本。
账本本身、区块和它们包含的交易都存储在一个物理文件中。世界状态数据库只是每个资产当前状态的集合。这是一个很好的设计,因为应用程序不会关心项目经历的每个状态更改,它只会关心当前状态。需要时可以轻松地重新创建世界状态数据库。
现在,您不应该直接对世界状态数据库进行任何更改,因为那是没有用的。任何更改都需要通过适当的流程,通过由 peer 提交的提案,然后通过 orderer。只有当一切都被遵循时,账本才会发生变化并与每个节点同步,世界状态数据库会反映这一点。
就您应该从哪里获取数据而言,答案是这无关紧要。每个对等点都将拥有账本的精确副本,因此如果您从对等点 1 或 2 获取数据是无关紧要的,那将是同一件事。
同样,仅仅因为您更改了世界状态,这并不意味着任何事情,账本没有受到影响,但是您的应用程序从世界状态数据库报告了当前状态,由于您的更改,现在这是不正确的。