【问题标题】:How to know the stateDB I'm using in hyperledger fabric如何知道我在超级账本结构中使用的 stateDB
【发布时间】:2020-06-10 05:00:42
【问题描述】:

我已经安装了 Hyperledger Fabric 2.0。我正在织物示例目录中运行 fabcar 示例。 fabcar 链代码使用测试网络作为结构网络。我想知道 fabcar 示例正在使用哪个 stateDB。

当我运行命令 docker ps -a 时,我得到的输出为 couchdb,如下所示。

bdf6370d6f5d        hyperledger/fabric-couchdb                                                                                                                                            "tini -- /docker-ent…"   16 minutes ago      Up 16 minutes              4369/tcp, 9100/tcp, 0.0.0.0:5984->5984/tcp   couchdb0



660ba3f7d2a4        hyperledger/fabric-couchdb                                                                                                                                            "tini -- /docker-ent…"   16 minutes ago      Up 16 minutes              4369/tcp, 9100/tcp, 0.0.0.0:7984->5984/tcp   couchdb1

但是链码在 fab-car 链码中以键值对的形式存储数据。键值对存储用于level-db

        await ctx.stub.putState(carNumber, Buffer.from(JSON.stringify(car)));

对于我是使用 level-db 还是 state-db 作为 fabcar 示例,我真的很困惑。

【问题讨论】:

    标签: hyperledger-fabric hyperledger hyperledger-chaincode


    【解决方案1】:

    在 Hyperledger Fabric 的 fabcar 示例中,可以选择使用 couchdb。根据该选项,脚本是否添加 docker-compose-couch.yaml 文件。正如您所说,您已经看到了 couchdb 容器,很可能您的对等方已配置为使用 couchdb。

    putStategetState 方法对于底层的任何 DB 实现都是通用的,因为它们是强制方法。但是如果你想运行丰富的查询,那么键值对数据库实现是不够的,你需要使用 couchdb(或类似的)。

    我认为您的困惑在于富查询如何处理简单的键值对。简而言之,查询是基于值的。即,如果您将此类数据ABC={"color":"red"} 放在分类帐上,那么您可以编写基于颜色属性的查询。但是,这对于 level-db 是不可能的(运行时会出错)。

    此外,单个或复合属性上的索引定义可以提高查询性能(参见 fabric-samples: marble 示例)。

    【讨论】:

      【解决方案2】:

      'State DB' = 存储状态的 DB。这是术语,不是软件。

      “LevelDB”或“CouchDB”都可以作为状态数据库(这些是软件)。这取决于从 HLF 2.0 开始将哪些开关传递到“startFabric.sh”中的“byfn.sh”

      “startFacric.sh”中的以下命令将导致“CouchDB”被用作“State DB”。从中删除“-s couchdb”,HLF 将使用“LevelDB”。

      echo y | ./byfn.sh up -a -n -s couchdb
      

      此外,在“fabric-samples\first-network\docker-compose-couch.yaml”中,您将拥有以下类型的条目,这些条目会说明您的对等方连接到哪个沙发数据库实例。

      peer0.org1.example.com:
      environment:
        - CORE_LEDGER_STATE_STATEDATABASE=CouchDB
        - CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=couchdb0:5984
        # The CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME and CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD
        # provide the credentials for ledger to connect to CouchDB.  The username and password must
        # match the username and password set for the associated CouchDB.
        - CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME=
        - CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD=
      depends_on:
        - couchdb0
      

      在这种情况下,“peer0.org1.example.com”连接到端口 5984 上的“couchdb0”。假设整个设置在“localhost”上运行,以下 URL 将显示 CouchDB 实例,您可以使用 Monkey到处看看保存到它的“状态”。

      http://localhost:5984/_utils/
      

      假设您的频道名称为“mychannel”且链码名称为“mycc”,您将在“CouchDB”中拥有一个名为“mychannel_mycc”的数据库。这保存了“mycc”链码的世界状态。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-09-09
        • 2023-02-21
        • 2021-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多