Hyperledger Fabric 超级账本的硬伤

Hyperledger Fabric 超级账本的硬伤

Netkiller Blockchain 手札

本文作者最近在找工作,有意向致电 13113668890

Mr. Neo Chan, 陈景峯(BG7NYT)

中国广东省深圳市龙华新区民治街道溪山美地 518131 +86 13113668890 <netkiller@msn.com>

文档始创于2018-02-10

版权 © 2018 Netkiller(Neo Chan). All rights reserved.

版权声明

转载请与作者联系,转载时请务必标明文章原始出处和作者信息及本声明。

http://www.netkiller.cn

http://netkiller.github.io

http://netkiller.sourceforge.net

微信订阅号 netkiller-ebook (微信扫描二维码)

QQ:13721218 请注明“读者”

QQ群:128659835 请注明“读者”

在使用超级账本的过程中我发现一个问题,超级账本无法并发操作一个 key,stub.PutState 是异步执行,我们无法确认它是否执行完成,在没有执行完成之前再发起操作,就会产生覆盖。这个问题限制了超级账本的很多场景应用,这是超级账本的硬伤。

下面举一个例子来说明超级账本的问题

func (s *SmartContract) counter(stub shim.ChaincodeStubInterface, args []string) pb.Response {
    key  := "counter"
    count,err = stub.GetState(key)
    count = count + 1
    stub.PutState(key,count)
    return shim.Success(count)
}

使用多线程请求chaincode中的counter函数100次。你会发现最终 count 并不等于 100。学习过多线程的朋友一定很清楚出了什么问题。

问题出在 stub.PutState 函数count还没有被写入,其他线程就开始读取stub.GetState(key),导致读取旧数据,最终计数器数字混乱。

很多场景需要更新区块中的数据,如果频繁操作,就会产生覆盖,目前Hyperledger Fabirc 并没有提供解决方案。

1. 我们不知道 stub.PutState是否执行完成,因为存储过程需要共识排序。

2. 超级账本没有提供事物处理或者互斥锁。

我的应用场景是实现代币功能,需要从总账号给注册用户转账,操作频繁。

    从总账中减去 100
    key  := "coinbase"
    money,err = stub.GetState(key)
    money = money - 100
    stub.PutState(key,money)
  
    用户账号额度加100
    key  := "account"
    money,err = stub.GetState(key)
    money = money + 100
    stub.PutState(key,money)

golang 提供的 mutex 也无法解决上面的问题,因为 mutex 锁只能工作在一个进程中。Peer / Orderer 节点不止一个。

使用 redis实现分布式锁或许能实现,但思考过后决定放弃,转为传统数据库。

另一个方案就是代币功能使用以太坊,其他需求使用超级账本。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏SAP最佳业务实践

SAP最佳业务实践:MM–组件收费的委外加工(251)-10清帐

4.12 清帐(基于消耗) 提供的组件过帐到了应收,它将抵销对应的应付金额。 完成对委外加工费用的付款。只有当你支付了委外加工费,系统才允许你冲销可抵扣的应付帐...

44560
来自专栏FreeBuf

币圈用户请小心!WebInjects可以清空你的加密货币账户

网络犯罪分子正在尝试各种各样的方法来将他们的“罪恶之手”伸向广大用户的加密货币钱包。研究人员发现,攻击者正在利用能够劫持浏览器(中间人攻击的一种)的恶意软件来劫...

29540
来自专栏申龙斌的程序人生

用API在Bigone上提交一笔订单

想写一个交易所的量化程序,第一步得利用API建立一笔订单,比如,我想在EOS-BTC市场中创建一笔卖单,价格为0.002985,数量为1个EOS。

22270
来自专栏WeTest质量开放平台团队的专栏

QQ 18年,解密8亿月活的 QQ 后台服务接口隔离技术

据不完全统计,腾讯QQ月活用户达到8.7亿左右,而这个数字还在不断增加,如此庞大的用户群的任何行为,都会产生巨大的影响。年后第一波推送,来看看腾讯内部对QQ后台...

51700
来自专栏友弟技术工作室

EOS.IO 技术白皮书背景区块链应用的要求共识算法 (DPOS)帐户应用程序的确定性并行执行Token 模型与资源使用治理脚本 & 虚拟机跨链通信总结

草案:2017 年 6 月 26 日 (@dayzh (https://steemit.com/@dayzh))

11720
来自专栏一场梦

看片要当心了,不良网站不只掏空你,还可能掏空你的电脑!

16940
来自专栏顾宇的研习笔记

你的 CI 在挖比特币吗?—— 记一次 CI 入侵的调查

我们的持续集成服务器搭建在AWS上的一个EC2的虚拟机中。采用Jenkins 2.46.1并且只有一个Master实例来运行所有的任务。且采用持续部署——团队每...

13020
来自专栏醒者呆

区块链3.0:拥抱EOS

EOS是当下最火的区块链技术,被社会广泛看好为下一代区块链3.0。不同于以太坊的学习,EOS的主语言是C++,本文作为EOS研究的首篇文章,重点介绍EOS的创...

1.4K120
来自专栏FreeBuf

巡风扫描系统试用体验报告

* 本文原创作者:nibiwodong,本文属FreeBuf原创奖励计划,未经许可禁止转载 近期,同程SRC发布了巡风扫描系统,用于内网资产发现和漏洞扫描。首...

34590
来自专栏区块链大本营

超级账本Fabric的架构与设计

531130

扫码关注云+社区

领取腾讯云代金券