中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用Hyperledger Fabric超級賬本會遇到什么坑

發布時間:2021-12-07 09:25:21 來源:億速云 閱讀:315 作者:小新 欄目:互聯網科技

這篇文章將為大家詳細講解有關使用Hyperledger Fabric超級賬本會遇到什么坑,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

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超級賬本會遇到什么坑”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

蒙自县| 萨迦县| 邹平县| 上栗县| 商城县| 西平县| 灵寿县| 涟源市| 七台河市| 香河县| 百色市| 阿尔山市| 都兰县| 奉贤区| 扶沟县| 遵义市| 麦盖提县| 山东省| 南丹县| 琼海市| 福贡县| 新竹市| 河津市| 疏附县| 尼木县| 天峨县| 敦化市| 南岸区| 岱山县| 大城县| 新兴县| 启东市| 美姑县| 永嘉县| 南华县| 宁化县| 湘西| 抚顺县| 汝南县| 环江| 齐河县|