溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

使用Hyperledger Fabric超級(jí)賬本會(huì)遇到什么坑

發(fā)布時(shí)間:2021-12-07 09:25:21 來(lái)源:億速云 閱讀:315 作者:小新 欄目:互聯(lián)網(wǎng)科技

這篇文章將為大家詳細(xì)講解有關(guān)使用Hyperledger Fabric超級(jí)賬本會(huì)遇到什么坑,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

Hyperledger Fabric 超級(jí)賬本的硬傷

在使用超級(jí)賬本的過(guò)程中我發(fā)現(xiàn)一個(gè)問(wèn)題,超級(jí)賬本無(wú)法并發(fā)操作一個(gè) key,stub.PutState 是異步執(zhí)行,我們無(wú)法確認(rèn)它是否執(zhí)行完成,在沒(méi)有執(zhí)行完成之前再發(fā)起操作,就會(huì)產(chǎn)生覆蓋。這個(gè)問(wèn)題限制了超級(jí)賬本的很多場(chǎng)景應(yīng)用,這是超級(jí)賬本的硬傷。

下面舉一個(gè)例子來(lái)說(shuō)明超級(jí)賬本的問(wèn)題

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)
}

使用多線(xiàn)程請(qǐng)求chaincode中的counter函數(shù)100次。你會(huì)發(fā)現(xiàn)最終 count 并不等于 100。學(xué)習(xí)過(guò)多線(xiàn)程的朋友一定很清楚出了什么問(wèn)題。

問(wèn)題出在 stub.PutState 函數(shù)count還沒(méi)有被寫(xiě)入,其他線(xiàn)程就開(kāi)始讀取stub.GetState(key),導(dǎo)致讀取舊數(shù)據(jù),最終計(jì)數(shù)器數(shù)字混亂。

很多場(chǎng)景需要更新區(qū)塊中的數(shù)據(jù),如果頻繁操作,就會(huì)產(chǎn)生覆蓋,目前Hyperledger Fabirc 并沒(méi)有提供解決方案。

1. 我們不知道 stub.PutState是否執(zhí)行完成,因?yàn)榇鎯?chǔ)過(guò)程需要共識(shí)排序。

2. 超級(jí)賬本沒(méi)有提供事物處理或者互斥鎖。

我的應(yīng)用場(chǎng)景是實(shí)現(xiàn)代幣功能,需要從總賬號(hào)給注冊(cè)用戶(hù)轉(zhuǎn)賬,操作頻繁。

從總賬中減去 100
    key  := "coinbase"
    money,err = stub.GetState(key)
    money = money - 100
    stub.PutState(key,money)
  
    用戶(hù)賬號(hào)額度加100
    key  := "account"
    money,err = stub.GetState(key)
    money = money + 100
    stub.PutState(key,money)

golang 提供的 mutex 也無(wú)法解決上面的問(wèn)題,因?yàn)?mutex 鎖只能工作在一個(gè)進(jìn)程中。Peer / Orderer 節(jié)點(diǎn)不止一個(gè)。

使用 redis實(shí)現(xiàn)分布式鎖或許能實(shí)現(xiàn),但思考過(guò)后決定放棄,轉(zhuǎn)為傳統(tǒng)數(shù)據(jù)庫(kù)。

另一個(gè)方案就是代幣功能使用以太坊,其他需求使用超級(jí)賬本。

關(guān)于“使用Hyperledger Fabric超級(jí)賬本會(huì)遇到什么坑”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI