您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關(guān)Fabric Node SDK中CouchDB錢包怎么用,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
有三種類型的錢包:文件系統(tǒng)錢包、內(nèi)存錢包和CouchDB錢包。
文件系統(tǒng)錢包:
文件系統(tǒng)錢包就是一個簡單的文件夾,在大多數(shù)情況下這是不錯的默認選擇。在fabric-samples/balance-transfer示例中,使用的就是文件系統(tǒng)錢包。當你運行這個示例代碼時,它就會創(chuàng)建一個fabric-client-kv-orgName文件夾并在其中保存所有需要的Fabric身份資料。該配置定義可以參考orgname.yaml
內(nèi)存錢包:
顧名思義,內(nèi)存錢包就是暫存在應用內(nèi)存中的錢包。當運行在受限環(huán)境中或不需要訪問文件系統(tǒng)時可以使用這種錢包,例如在瀏覽器中。需要提醒的是,這種錢包中的身份資料在應用終止后就沒有了。內(nèi)存錢包的具體文檔可以查看這里。
CouchDB錢包:
也就是使用CouchDB保存身份資料,在生產(chǎn)環(huán)境中這是最常見的選擇。
錢包使用兩個庫來保存證書和私鑰:
狀態(tài)庫:
狀態(tài)庫用于保存已登記身份的證書,它存儲的是一個身份的基本信息:
{ "name": "test", "mspid": "org1", "roles": null, "affiliation": "", "enrollmentSecret": "<ENROLLMENT_SECRET>", "enrollment": { "signingIdentity": "<PRIVATE_KEY_NAME>", "identity": { "certificate": "<SIGN_CERT>" } } }
注意:signingIdentity
指向私鑰和公鑰在密碼學資料庫中的保存地址。
密碼學資料庫:
密碼學資料庫用于保存身份的私鑰和公鑰。
首先引入Fabric Node SDK提供的CouchDBKeyValueStore
庫:
const CDBKVS = require("fabric-client/lib/impl/CouchDBKeyValueStore.js");
然后設置狀態(tài)庫:
let stateStore = await new CDBKVS({ url: "https://<USERNAME>:<PASSWORD>@<URL>", name: "<DB_NAME>" }); const Client = require("fabric-client"); const client = Client.loadFromConfig("path of network.yaml"); client.setStateStore(stateStore);
其中:
< USERNAME>:couchdb的用戶名
< PASSWORD>:couchdb的密碼
< URL>:couchdb的URL
< DB_NAME>:可選,狀態(tài)庫名。默認的名稱為userdb,當指定的狀態(tài)庫 不存在時Fabric Node SDK會自動創(chuàng)建該庫
最后設置密碼學資料庫:
const cryptoSuite = Client.newCryptoSuite(); let cryptoKS = Client.newCryptoKeyStore(CDBKVS, { url: "https://<USERNAME>:<PASSWORD>@<URL>", name: "<DB_NAME>" }); cryptoSuite.setCryptoKeyStore(cryptoKS); client.setCryptoSuite(cryptoSuite);
Balance Transfer是Hyperledger Fabric官方提供的一個示例代碼。
首先按照示例說明啟動balance transfer網(wǎng)絡,該網(wǎng)絡包含:
2個CA
1個SOLO排序節(jié)點
2個機構(gòu)共4個對等節(jié)點
啟動couchdb的docker鏡像:
~$ docker run --name couch-userdb -e COUCHDB_USER=admin \ -e COUCHDB_PASSWORD=password -p 5984:5984 -d couchdb
上面的命令會自動拉取docker hub上的couchdb鏡像。
其中CouchDB詳情如下:
容器名稱: couch-userdb
CouchDB用戶名:admin
CouchDB密碼:password
URL:localhost:5984
CouchDB連接URL如下:
https://<USERNAME>:<PASSWORD>@<URL> https://admin:password@localhost:5984
然后更新balance-transfer示例中的client配置:打開文件/helper.js
,更新其中的getClientForOrg
函數(shù):
'use strict'; var log4js = require('log4js'); var logger = log4js.getLogger('Helper'); logger.setLevel('DEBUG'); var path = require('path'); var util = require('util'); var hfc = require('fabric-client'); hfc.setLogger(logger); // couchDB config const CDBKVS = require("fabric-client/lib/impl/CouchDBKeyValueStore.js"); async function getClientForOrg(userorg, username) { logger.debug('getClientForOrg - ****** START %s %s', userorg, username) // get a fabric client loaded with a connection profile for this org let config = '-connection-profile-path'; // build a client context and load it with a connection profile // lets only load the network settings and save the client for later let client = hfc.loadFromConfig(hfc.getConfigSetting('network' + config)); // This will load a connection profile over the top of the current one one // since the first one did not have a client section and the following one does // nothing will actually be replaced. // This will also set an admin identity because the organization defined in the // client section has one defined client.loadFromConfig(hfc.getConfigSetting(userorg + config)); //********************** CouchDB configuration ************************************** // set the state store let stateStore = await new CDBKVS({ url: "https://<USERNAME>:<PASSWORD>@<URL>", name: "<DB_NAME>" }); client.setStateStore(stateStore); // set the cryto store const cryptoSuite = hfc.newCryptoSuite(); let cryptoKS = hfc.newCryptoKeyStore(CDBKVS, { url: "https://<USERNAME>:<PASSWORD>@<URL>", name: "<DB_NAME>" }); cryptoSuite.setCryptoKeyStore(cryptoKS); client.setCryptoSuite(cryptoSuite); //********************** CouchDB configuration END ************************************** if (username) { let user = await client.getUserContext(username, true); if (!user) { throw new Error(util.format('User was not found :', username)); } else { logger.debug('User %s was found to be registered and enrolled', username); } } logger.debug('getClientForOrg - ****** END %s %s \n\n', userorg, username) return client; }
我們的修改如下:
13行:Import the CouchDBKeyValueStore....
31–52行: 設置狀態(tài)庫和密碼學資料庫
在上面的代碼中還有一個小改動:
// Client variable is used as hfc var hfc = require("fabric-client"); // Instead of Client const Client = require("fabric-client");
然后在balance transfer中注冊一個新的用戶,一旦注冊成功,就可以使用couchdb的api查看狀態(tài)庫和密碼學資料庫了。
例如,可以使用下面的參數(shù)注冊一個用戶。對于org1,我們使用同一個庫org1db用于狀態(tài)庫和密碼學資料庫:
Name: alice
Org: org1
DBNAME: org1db
CouchDB URL: http://admin:password@localhost:5369
打開瀏覽器訪問http://localhost:5369/org1db/_all_docs
,可以看到 在org1db中保存的所有文檔。
其中0#、1#、2#是admin的證書。
3#是alice保存在狀態(tài)庫中的證書
4#和5#是alice保存在密碼學資料庫中的公鑰和私鑰
訪問http://localhost:5369/org1db/alice
,可以看到alice在狀態(tài)庫中的全部細節(jié):
查看signingIdentity
:
"signingIdentity":"d37a97a8c2377c21537801ec1a929d81905ae57963a2f6c8ba0308931a7fc791"
現(xiàn)在查看上圖中的4#和5#,可以看到是一樣的。
可能你還記得,signingIdentity
字段是指向保存在密碼學資料庫中的私鑰和公鑰的。
關(guān)于“Fabric Node SDK中CouchDB錢包怎么用”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。