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

问题描述 投票:0回答:1

我已经安装了Hyperledger fabric 2.0。我在 fabric samples 目录下运行 fabcar 示例。fabcar链码使用test-network作为fabric-network。我想知道 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还是statedb来做fabcar的例子。

hyperledger-fabric hyperledger hyperledger-chaincode
1个回答
0
投票

在Hyperledger Fabric的fabcar例子中,可以选择使用couchdb。根据这个选项,脚本添加了 docker-compose-couch.yaml 文件与否。由于你说你已经看到了couchdb容器,很可能你的对等体已经被配置为使用couchdb。

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

我想你的困惑是,富查询是如何在简单的键值对上运行的。简而言之,查询是基于值的,即如果你把这样的数据放在 ABC={"color":"red"} 在分类账上,你可以写一个基于颜色属性的查询,但这在level-db中是不可能的(你会在运行时出现错误)。然而这在level-db中是不可能的(在运行时你会得到错误信息)。

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


0
投票

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

无论是'LevelDB'还是'CouchDB'都可以作为状态DB(这些都是软件)。這取決於從 HLF 2.0 開始,在 startFabric.sh 中的 'byfn.sh' 所傳遞的開關。

移除'-s couchdb',HLF将使用'LevelDB'。

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

同样在'fabric-samples/first-network/docker-compose-couch.yaml'中,你会有下面的条目,它将说明你的peer连接到哪个couch DB实例。

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 "连接到 "couchdb0",端口为5984。假设整个设置是在'localhost'上运行的,下面的URL会显示出CouchDB实例,你也可以Monkey一下,看看保存在它上面的'状态'。

http://localhost:5984/_utils/

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

© www.soinside.com 2019 - 2024. All rights reserved.