簡體   English   中英

Hyperledger Fabric Ledger 和 couchdb 問題

[英]Hyperledger fabric Ledger and couchdb Problem

我對超級賬本結構如何存儲數據感到困惑。在閱讀了官方文檔后,我知道 Ledger 中有兩個部分:WORLD_STATE 和 BLOCKCHAIN。 我使用 couchdb 在我的計算機中啟動了一個結構網絡,使用如下命令: ./network.sh createChannel -ca -s couchdb ,並初始化存儲在 Ledger 中的一些數據。
但是有我的困惑:

  1. 如果我直接在 couchdb 中更改數據,例如:http://localhost:port/_utils/,我發現當我使用命令時查詢結果也發生了變化: peer chaincode query -C mychannel -n CC_NAME -c '{"Args":["QueryAll"]}'這是否意味着任何人都可以在未經一半同行批准的情況下更改賬本?
  2. 我正在使用 golang 編寫代碼,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 網絡中通道的世界狀態。 您正在破壞對等方的狀態。 該特定對等方將返回錯誤的(更改的)狀態。 但是其他同行會返回好的。 當該節點執行並背書時,它將與其他節點的背書不匹配,因此背書將失敗(這就是您以后會發生的事情)。 在區塊鏈網絡中,如果你不同意共識,你就離開了網絡。

  1. 不,你已經打破了那個同伴的世界狀態。 Fabric 網絡的通道分類帳(以及其他對等點)保持不變。 您需要完成Fabric 交易流程,這需要履行背書政策。 來自已更改對等方的響應不再有效。

  2. 您的對等方的狀態已被篡改。 因此,它的背書與未篡改的同行的背書不匹配,正如預期的那樣。 即使您的背書策略只需要一個對等方的背書,其他對等方在嘗試提交時也會檢測到 readset/writeset 版本中的不匹配。

因此,它按預期工作。 不允許直接從 CouchDB 篡改狀態。 您只是在破壞對等方的狀態。 相應組織的系統管理員有責任提供避免破壞對等體狀態的措施。

無論如何,您始終可以清除被篡改的對等方(鏈 + 狀態)的分類帳,並使其再次與網絡同步。

正如我們所知,state 由每個對等級別維護,因此如果我們嘗試直接從 CouchDB url 更改數據,那么它將破壞 state 的驗證失敗。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM