如何知道我在 hyperledger fabric 中使用的 stateDB

How to know the stateDB I'm using in hyperledger fabric

我已经安装了 Hyperledger fabric 2.0。我在 fabric 示例目录中 运行ning 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)));

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

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

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

我认为您的困惑是富查询如何处理简单的键值对。简而言之,查询是基于值的。也就是说,如果你把这样的数据 ABC={"color":"red"} 放在账本上,那么你可以写一个基于颜色属性的查询。然而,这对于 level-db 是不可能的(你会在 运行 时间得到错误)。

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

'State 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'。假设整个设置是 运行 on 'localhost' following URL will显示 CouchDB 实例,您可以四处观察并查看 'state' 也保存到它。

http://localhost:5984/_utils/

假设您的频道名称是 'mychannel' 并且链代码名称是 'mycc',您将在 'CouchDB' 中拥有一个名为 'mychannel_mycc' 的数据库。这包含 'mycc' 链码的世界状态。