您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)使用Hyperledger Fabric超級(jí)賬本會(huì)遇到什么坑,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
在使用超級(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)把它分享出去讓更多的人看到。
免責(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)容。