我正在尝试将CouchDB集成为我的Hyperledger网络的saidb,但是在将值传递到putState
函数(go sdk)以更新状态时遇到麻烦。
文档说,“状态”配置需要添加到core.yaml
文件中。但是,该文件在余额转移中不存在,因此我修改了network-config.yaml
文件,将stateDatabase设置为beddb而不是goleveldb,如下所示:
state:
stateDatabase: CouchDB
couchDBConfig:
couchDBAddress: https://localhost:5984
username:
password:
maxRetries: 3
maxRetriesOnStartup: 10
requestTimeout: 35s
queryLimit: 10000
我已经为docker-compose-couch.yaml
文件中的每个对等方设置了一个ouchdb docker容器的配置:
couchdb0:
container_name: peer0.org1.couchdb
image: hyperledger/fabric-couchdb
environment:
- COUCHDB_USER=
- COUCHDB_PASSWORD=
ports:
- "5984:5984"
我为每个对等方添加了以下参数,以使对等方的couchdb地址指向上面创建的容器。
CORE_LEDGER_STATE_STATEDATABASE=couchdb
CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=couchdb0:5984
基于此,ouchdb docker容器全部运行良好,端口5984拥有由链码创建的相关数据库。我正在努力使链式代码中的putState()
请求的值显示出来。 go-sdk文档概述了putState需要一个键(字符串)和值(json字节数组)。
例如,如果我提交一个新事务,该事务将显示在名为mychannel_mycc
的数据库下的长沙发上,该数据库具有我指定的ID,但是我作为json字节数组传递的值都没有通过。 Sofadb中的文档如下所示:
{
"_id": "000000000",
"_rev": "1-6fab10bceb44087355a55b0bdc9bd9a4",
"~version": "\u0000CgMBAwA=",
"_attachments": {
"valueBytes": {
"content_type": "application/octet-stream",
"revpos": 1,
"digest": "md5-caYFgf07HPDwskuoN1DySg==",
"length": 338,
"stub": true
}
}
}
如何确保将json对象传递到沙发数据库文档中?
答案 0 :(得分:0)
我发现问题在于将JSON传递到putState()时的格式。我传递的是JSON对象数组,而不是JSON本身。如果通过该函数传递了无效的JSON,则CouchDB中的数据将反映为附件,而不是JSON本身。
这是我最初通过的内容:
[{"name": "doe", "age": "20"}]
当我应该通过时:
{"name": "doe", "age": "20"}
我还发现JSON对象中的所有内容都必须是字符串。因此,“年龄”必须用引号引起来,而不是整数。