【问题标题】:Debiting and crediting (changing) state data in Hyperledger Fabric在 Hyperledger Fabric 中借记和贷记(更改)状态数据
【发布时间】:2020-11-18 11:47:07
【问题描述】:

Hyperledger Fabric 的所有示例似乎都侧重于发布一个新状态,该状态仅覆盖记录的先前状态,例如,车主 A 被车主 B 替换为汽车 1。

不过,我还没有找到任何“有状态”改变状态的例子。例如,当我们在该州有一个银行账户记录时,有余额。我们会将借记或贷记交易发布到需要读取帐户当前余额并减少或增加的分类帐中。这可能涉及锁定帐户状态记录,直到更改完成。有没有这方面的例子,如何在链码中正确完成以确保数据一致性?

【问题讨论】:

  • 余额转移示例展示了如何做到这一点github.com/hyperledger/fabric-samples/tree/release-1.4/…。至于你提到的锁,Hyperledger Fabric 是这样设计的,没有双花。交易的执行顺序验证架构,具有用于状态管理的链代码处理问题中提到的问题。

标签: transactions state hyperledger-fabric blockchain hyperledger


【解决方案1】:

Hyperledger Fabric 有一个类似银行转账的示例 here - 高吞吐量

由于读写集,我们不能创建一个链码同时多次修改同一个键([MVCC_READ_CONFLICT] 错误)。你可以阅读更多关于 RW 集here,或this article

这个示例的关键思想是它为每个事务创建一个具有相同前缀的唯一键:varName~op~value~txID,其中一个事务参数包括:

  • 变量名称:帐户
  • 操作:+ 或 - 运算符
  • 价值:交易价值
  • txID:这将使密钥唯一

之后,在GET查询阶段,使用GetStateByPartialCompositeKey()函数获取key中包含账户的这些记录,然后求和得到该账户的当前余额

希望这能给你一些想法!

【讨论】:

  • 仍然,在这个例子中,为了避免当前余额超支,我们需要检查账户中是否有足够的钱,然后才允许提款交易并记录在账本中,所以我们还需要对当前余额进行“锁定” - 如何正确完成?
  • 我认为您需要第三方服务来处理这种情况。我有两种方法:(1)使用自动递增的随机数,而不是 txID 作为唯一键。在这种情况下,我们可以在提交交易之前计算当前余额。 (2) 将每个账户的值作为世界状态进行管理,结合nonce保证数据的准确性。银行问题是相当困难的,所以我认为可以保持安全的系统会复杂得多
猜你喜欢
  • 2016-06-16
  • 2017-07-29
  • 2011-08-10
  • 1970-01-01
  • 2019-07-12
  • 1970-01-01
  • 2014-05-13
  • 2019-02-16
  • 2021-04-02
相关资源
最近更新 更多