Hyperledger fabric Ledger 和 couchdb 问题

Hyperledger fabric Ledger and couchdb Problem

我对 hyperledger fabric 如何存储数据感到困惑。在阅读官方文档后,我知道 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 换个couchdb好像不行。

我想知道为什么会这样,如何避免别人更改数据库,如何确保我得到的数据得到所有同行的认可? 任何帮助都可能有用,谢谢。

每个节点都有自己的 CouchDB 数据库。该 DB 是存储分类账世界状态的数据库,因此,如果您直接在 DB 上更改数据,则该特定对等方 的世界状态 将会改变。但是这样你就不会篡改 Fabric 网络中通道的世界状态。你正在破坏对等体的状态。那个特定的对等点会 return 错误的(改变的)状态。但是其他同龄人会 return 好的。当该节点执行背书时,它会与其他节点的背书不匹配,因此背书将失败(这就是您稍后会发生的事情)。在区块链网络中,如果您不同意共识,您将退出网络。

  1. 没有。你已经打破了那个同伴的世界状态。 Fabric 网络的通道账本(以及其他节点)保持不变。您需要完成 Fabric transaction flow,这需要履行背书政策。更改后的对等方的响应不再有效。

  2. 您的同伴状态已被篡改。因此,它的背书并不像预期的那样与来自未被篡改的同行的背书相匹配。即使您的背书策略只需要一个节点的背书,其他节点在尝试提交时也会检测到 readset/writeset 版本不匹配。

因此,它按预期工作。您不能直接从 CouchDB 篡改状态。您只是在破坏对等方的状态。相应组织的系统管理员有责任提供避免破坏peer状态的措施。

无论如何你总是可以清除被篡改节点(链+状态)的账本并使其再次与网络同步。