我已经安装了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感到非常困惑。
答案 0 :(得分:0)
在Hyperledger Fabric的fabcar示例中,具有beddb是可选的。根据该选项,脚本是否添加docker-compose-couch.yaml
文件。正如您所说的那样,您已经看到了Sofadb容器,很可能您的对等方已配置为使用couchbed。
方法putState
和getState
对于下面的任何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”链代码的世界状态。