开发者社区> netkiller> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Hyperledger Fabric 超级账本的硬伤

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

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实现分布式锁或许能实现,但思考过后决定放弃,转为传统数据库。

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
超级账本(Hyperledger Fabric)共识
超级账本(Hyperledger Fabric)共识
0 0
【超级账本】Fabric 层次结构以及核心模块的介绍(二)
目录 1. 结构介绍 2. 核心代码 3. 核心模块 3.1 peer 系统模块 3.2 order 系统模块 3.3 cryptogen 工具模块 3.4 configtxgen 工具模块 3.5 configtxlator 工具模块 最后
0 0
【超级账本】Fabric介绍及其环境搭建(一)
目录 前言 1. fabric 介绍 1.1 fabric和以太坊的区别 1.2 身份管理介绍 1.3 账本:每个节点中都有 1.4 交易管理介绍 1.5 节点介绍 1.6 通道介绍--channel 2. fabric 环境搭建 2.1 安装虚拟机 2.2 安装必要配置 2.2.1换源 2.2.2 安装vim 2.2.3 安装python2.7 以及 python-pip2 2.2.5 安装go 2.2.6 安装docker 2.2.7 安装docker-compose 2.2.8 Fabric的Docker镜像下载 2.2.9 拉取fabric代码 最后
0 0
区块链之旅(五)超级账本简介及Git、Docker、Fabric的配置
超级账本是推动区块链行业应用的开源项目的总称,组织成员可以发起新的区块链项目,加入超级账本项目,但是还是要遵循Hyperledger的生命周期。
0 0
HyperLedger Fabric 1.2 超级账本项目(5.4)
超级账本(Hyperledger)项目分框架类和工具类两种项目,框架类有Hyperledger Burrow、Hyperledger Fabric、Hyperledger Indy、Hyperledger Iroha和Hyperledger Sawtooth五个顶级项目;工具类有Hyperledger Caliper、Hyperledger Cello、Hyperledger Composer、Hyperledger Explorer和Hyperledger Quilt五个项目。
2169 0
HyperLedger Fabric超级账本项目(5.4)
超级账本(Hyperledger)项目分框架类和工具类两种项目,框架类有Hyperledger Burrow、Hyperledger Fabric、Hyperledger Indy、Hyperledger Iroha和Hyperledger Sawtooth五个顶级项目;工具类有Hyperledger Caliper、Hyperledger Cello、Hyperledger Composer、Hyperledger Explorer和Hyperledger Quilt五个项目。
2146 0
HyperLedger Fabric超级账本组织(5.3)
超级账本组织分为TSC(技术指导委员会)、Governing Board(董事会成员)、LF Staffs(工作人员)三个组织,组织架构图如下:   TSC:技术指导委会员,主导社区的开发工作,下设多个工作组,每个工作组负责具体的项目进行开发; Governing Board:董事会,负责决策社区的所有事物,对社区成员负责; LF Staffs:工作人员,为社区提供服务;        Linux基金会经过票选机制,选举出组织的技术指导委员会主席、董事会主席等关键领导角色,同时公布了10名技术委员会成员,以及13名董事会成员。
1477 0
HyperLedger Fabric 1.2 超级账本组织(5.3)
超级账本组织分为TSC(技术指导委员会)、Governing Board(董事会成员)、LF Staffs(工作人员)三个组织,组织架构图如下:   TSC:技术指导委会员,主导社区的开发工作,下设多个工作组,每个工作组负责具体的项目进行开发; Governing Board:董事会,负责决策社区的所有事物,对社区成员负责; LF Staffs:工作人员,为社区提供服务;        Linux基金会经过票选机制,选举出组织的技术指导委员会主席、董事会主席等关键领导角色,同时公布了10名技术委员会成员,以及13名董事会成员。
1392 0
+关注
netkiller
Nickname:netkiller | English name: Neo chen | QQ: 291379 | 订阅号:netkiller-ebook | 网站:http://www.netkiller.cn
文章
问答
文章排行榜
最热
最新
相关电子书
更多
区块链和可问责服务
立即下载
彪悍的区块链来了
立即下载
彪悍的区块链来了!
立即下载