![](/img/trans.png)
[英]How is data store in Hyperledger Fabric when using CouchDB as the Ledger State database?
[英]Hyperledger fabric Ledger and couchdb Problem
我對超級賬本結構如何存儲數據感到困惑。在閱讀了官方文檔后,我知道 Ledger 中有兩個部分:WORLD_STATE 和 BLOCKCHAIN。 我使用 couchdb 在我的計算機中啟動了一個結構網絡,使用如下命令: ./network.sh createChannel -ca -s couchdb
,並初始化存儲在 Ledger 中的一些數據。
但是有我的困惑:
peer chaincode query -C mychannel -n CC_NAME -c '{"Args":["QueryAll"]}'
,這是否意味着任何人都可以在未經一半同行批准的情況下更改賬本? os.Setenv("DISCOVERY_AS_LOCALHOST", "true")
wallet, err := gateway.NewFileSystemWallet("wallet")
if err != nil {
fmt.Printf("ERROR:%s\n", err)
os.Exit(1)
}
if !wallet.Exists("appUser") {
err = populateWallet(wallet)
if err != nil {
fmt.Printf("Wallet wrong : %s\n", err)
os.Exit(1)
}
}
ccpPath := filepath.Join(
"..",
"..",
"network",
"organizations",
"peerOrganizations",
"org1.example.com",
"connection-org1.yaml",
)
gw, err := gateway.Connect(
gateway.WithConfig(config.FromFile(filepath.Clean(ccpPath))),
gateway.WithIdentity(wallet, "appUser"),
)
if err != nil {
fmt.Printf("failed to connect to net : %s\n", err)
os.Exit(1)
}
defer gw.Close()
network, err := gw.GetNetwork("mychannel")
if err != nil {
fmt.Printf("%s\n", err)
os.Exit(1)
}
fmt.Println("Start to query all")
contract := network.GetContract("project_test")
result, err := contract.EvaluateTransaction("queryAllMessage")
if err != nil {
fmt.Printf("ERROR:%s\n", err)
os.Exit(1)
}
fmt.Println(string(result))
我發現我直接在couchdb中更改數據后,它無法運行,錯誤如下:
Failed to evaluate: endorsement validation failed: Endorser Client Status Code: (3) ENDORSEMENT_MISMATCH. Description: ProposalResponsePayloads do not match exit status 1
Failed to evaluate: endorsement validation failed: Endorser Client Status Code: (3) ENDORSEMENT_MISMATCH. Description: ProposalResponsePayloads do not match exit status 1
如果有人更改了他的 couchdb,它似乎不起作用。
我想知道為什么會發生這些,如何避免其他人更改數據庫,如何確保我獲得的數據得到所有同行的認可? 任何幫助都可能有用,謝謝。
每個對等點都有自己的 CouchDB 數據庫。 該數據庫是存儲分類帳世界狀態的數據庫,因此,如果您直接在數據庫上更改數據,那么該特定對等方的世界狀態就會改變。 但是這樣您就不會篡改 Fabric 網絡中通道的世界狀態。 您正在破壞對等方的狀態。 該特定對等方將返回錯誤的(更改的)狀態。 但是其他同行會返回好的。 當該節點執行並背書時,它將與其他節點的背書不匹配,因此背書將失敗(這就是您以后會發生的事情)。 在區塊鏈網絡中,如果你不同意共識,你就離開了網絡。
不,你已經打破了那個同伴的世界狀態。 Fabric 網絡的通道分類帳(以及其他對等點)保持不變。 您需要完成Fabric 交易流程,這需要履行背書政策。 來自已更改對等方的響應不再有效。
您的對等方的狀態已被篡改。 因此,它的背書與未篡改的同行的背書不匹配,正如預期的那樣。 即使您的背書策略只需要一個對等方的背書,其他對等方在嘗試提交時也會檢測到 readset/writeset 版本中的不匹配。
因此,它按預期工作。 不允許直接從 CouchDB 篡改狀態。 您只是在破壞對等方的狀態。 相應組織的系統管理員有責任提供避免破壞對等體狀態的措施。
無論如何,您始終可以清除被篡改的對等方(鏈 + 狀態)的分類帳,並使其再次與網絡同步。
正如我們所知,state 由每個對等級別維護,因此如果我們嘗試直接從 CouchDB url 更改數據,那么它將破壞 state 的驗證失敗。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.