如何知道我在超级账本结构中使用的stateDB

时间:2020-06-10 05:00:42

标签: hyperledger-fabric hyperledger hyperledger-chaincode

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

当我运行命令docker ps -a时,我将得到如下所示的长沙发输出。

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感到非常困惑。

2 个答案:

答案 0 :(得分:0)

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

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

我认为您的困惑在于,丰富的查询如何在简单的键值对上工作。简要地说,查询是基于值的。也就是说,如果您将此类数据ABC={"color":"red"}放在分类帐上,则可以根据color属性编写查询。但是,这对于level-db是不可能的(运行时会出错)。

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

答案 1 :(得分:0)

“状态数据库” =存储状态的数据库。这是术语,而不是软件。

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

在“ startFacric.sh”中执行以下命令将导致“ CouchDB”被用作“状态数据库”。从中删除“ -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”链代码的世界状态。