使用HyperledgerFabric超级账本会遇到什么坑

这篇文章将为大家详细讲解有关使用Hyperledger Fabric超级账本会遇到什么坑,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

成都创新互联公司长期为上千余家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为二连浩特企业提供专业的成都做网站、网站制作,二连浩特网站改版等技术服务。拥有十年丰富建站经验和众多成功案例,为您定制开发。

Hyperledger Fabric 超级账本的硬伤

在使用超级账本的过程中我发现一个问题,超级账本无法并发操作一个 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超级账本会遇到什么坑”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。


本文标题:使用HyperledgerFabric超级账本会遇到什么坑
本文网址:http://pwwzsj.com/article/gjojei.html