天天看點

Hyperledger Fabric CouchDB as the State Database——使用CouchDB

使用CouchDB作為狀态資料庫

狀态資料庫選項

狀态資料庫包括LevelDB和CouchDB。LevelDB是嵌入在peer程序中的預設鍵/值狀态資料庫,CouchDB是一個可選的外部狀态資料庫。與LevelDB鍵/值存儲一樣,CouchDB可以存儲任何以chaincode模組化的二進制資料(CouchDB附件函數在内部用于非json二進制資料)。但是,當chaincode值(例如,資産)被模組化為JSON資料時,作為JSON文檔存儲,CouchDB支援對chaincode資料進行豐富的查詢。

LevelDB和CouchDB都支援核心chaincode操作,例如擷取和設定一個鍵(資産),并根據鍵進行查詢。鍵可以通過範圍查詢,可以對組合鍵進行模組化,以支援針對多個參數的等價查詢。例如,作為所有者的組合鍵,資産id可以用于查詢某個實體擁有的所有資産。這些基于key的查詢可以用于針對賬本的隻讀查詢,以及更新總賬的事務。

如果将資産模組化為JSON并使用CouchDB,那麼就可以使用chaincode中的CouchDB JSON查詢語言對chaincode資料值執行複雜的富查詢,這些類型的查詢對于了解賬本上的内容很有幫助。對于這些類型的查詢,事務協定響應通常對用戶端應用程式有用,但通常不會作為事務送出到排序服務。事實上,也無法保證結果集在chaincode執行與富查詢送出時間之間的穩定性,是以使用富查詢的結果去執行最終的事務更新操作是不合适的,除非可以保證結果集在chaincode執行時間與送出時間之間的穩定性,或者可以處理在後續交易中的潛在變化。例如,如果對Alice所擁有的所有資産執行一個富查詢并将其傳輸給Bob,那麼一個新的資産可能會被另一個事務配置設定給Alice,這是在chaincode執行時間和送出時間之間的另一個事務,可能此過程中會錯過這個“虛值”。

CouchDB作為一個獨立的資料庫程序與peer一起運作,是以在設定、管理和操作方面有額外的考慮。我們可以考慮從預設的嵌入式LevelDB開始,如果需要額外的複雜的富查詢,可以轉移到CouchDB。将chaincode資産資料模組化為JSON是一種很好的做法,這樣我們就可以在将來執行需要的複雜的富查詢。

使用Chaincode中的CouchDB

為了使JSON查詢更高效,并且對于任何具有排序的JSON查詢,都需要使用CouchDB中的索引。索引可以和chaincode一起打包 /META-INF/statedb/couchdb/indexes目錄。每個索引必須在其自己的文本檔案中通過擴充*.json被定義,其中索引定義為JSON格式并引用CouchDB索引JSON文法,例如,為了支援上面的marble查詢,提供了一個關于docType和所有者字段的示例索引:

注意:在1.1 alpha中,必須為索引定義中引用的每個字段指定“資料”封裝器。在随後的版本中,指定“資料”封裝器的需求可能會被取消。

 在chaincode的META-INF/statedb/couchdb/indexes目錄中的任何索引都将與chaincode一起被打包和安裝在peer上。當chaincode即安裝在peer上,且又在peer的channel上執行個體化時,該索引将自動部署到peer的channel狀态資料庫(如果已配置為使用CouchDB)。如果是先安裝了chaincode,然後才在channel上執行個體化該chaincode,那麼該索引将會在chaincode執行個體化的時候進行部署。如果chaincode已經在一個channel上執行個體化了,然後又在一個peer上安裝了這個chaincode,該索引還是會在chaincode執行個體化的時候進行部署。

在部署時,索引将自動被chaincode查詢利用。CouchDB可以根據查詢中使用的字段自動确定要使用的索引。或者,在選擇器查詢中,可以使用use_index關鍵字指定索引。

在安裝的chaincode的後續版本中可能存在相同的索引。要更改索引,使用相同的索引名稱,但要更改索引定義。在安裝/執行個體化,索引定義會重新部署到peer的狀态資料庫。

如果所在channle已經擁有大量的資料,并且随後安裝了chaincode,那麼索引的建立在執行個體化上可能需要一些時間。類似地,如果channel已經擁有大量的資料并且執行個體化了後續版本的chaincode,那麼建立索引也可能需要一些時間。是以需要盡量避免在這些時間段内調用查詢狀态資料庫的chaincode函數,因為當索引被初始化時,chaincode查詢可能會逾時。在事務處理期間,因為塊被送出給賬本總賬,是以索引将自動重新整理。

CouchDB配置

通過将狀态資料庫配置選項從goleveldb更改為CouchDB,可以将CouchDB作為狀态資料庫啟用。此外,couchDBAddress需要配置為指向由peer使用的CouchDB。如果将CouchDB配置一個使用者名和密碼,那麼使用者名和密碼屬性應該包含管理者使用者名和密碼。在couchDBConfig中提供了更多的選項,并在适當的地方進行了記錄。在重新開機peer之後,修改過的core.yaml将會立即生效。

當然還可以通過docker環境變量來覆寫core.yaml值,例如CORE_LEDGER_STATE_STATEDATABASE和CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS。

以下是來自core.yaml的狀态資料庫選項:

CouchDB被托管在docker容器中,通過使用Docker Compose腳本來利用Hyperledger Fabric設定CouchDB的username和password的能力,通過已有的環境變量設定,即COUCHDB_USER和COUCHDB_PASSWORD環境變量。

對于在使用Fabric提供的docker映像之外的CouchDB安裝,本地安裝。必須編輯ini檔案以設定admin使用者名和密碼。

Docker Compose腳本隻在建立容器時設定使用者名和密碼。如果要在容器建立後更改使用者名或密碼,則必須對本地.ini檔案進行編輯。

注意:在每個peer啟動時都讀取CouchDB的peer選項。

補充

後續在寫到ca的時候也會将ca啟動部分加入進來。