Ledger
Ledger(賬本)即所有的state transitions(狀態切換),是有序且不可篡改的。state transitions(狀態切換)是由參與方提交的chaincode(智能合約)調用(“transactions/事務”)的結果。每個事務都將產生一組資產鍵值對,這些鍵值對作為創建、更新或刪除而提交給Ledger(賬本)。
Ledger(賬本)由blockchain(區塊鏈)(“chain”)組成,區塊則用來存儲有序且不可篡改的記錄,以及保存當前狀態的state database(狀態數據庫)。在每一個channel中都會存在一個Ledger(賬本)。每一個peer都會維護它作為其中成員的每一個channel中的本地拷貝的Ledger(賬本)。
Chain
chain是一個事務日志,是一個由hash鏈接的鏈接各個區塊的結構,其中每個區塊都包含了N個事務的序列。區塊header包含了該區塊的事務的hash,以及上一個區塊頭的hash。這樣,所有在賬本上的交易都是按順序排列的,並以密碼方式鏈接在一起。換句話說,在不破壞hash鏈接的情況下篡改賬本數據是不可能的。最近的區塊的hash代表了以前的每個事務,從而確保所有的peers都處於一致和可信的狀態。
chain存儲在peer文件系統(本地或附加存儲)上,有效地支持blockchain工作負載的應用程序的特性。
State Database
該賬本的當前狀態數據表示chain事務日志中包含的所有鍵的最新值。由於當前狀態表示channel所知道的所有最新鍵值,因此有時也稱為“World State(世界狀態)”。
在chaincode調用對當前狀態數據執行操作的事務時,為了使這些chaincode交互非常有效,所有鍵的最新值都存儲在一個狀態數據庫中。狀態數據庫只是一個索引視圖到chain的事務日志中,因此可以在任何時候從chain中重新生成它。在事務被接受之前,狀態數據庫將自動恢復(或在需要時生成)。
狀態數據庫選項包括LevelDB和CouchDB。LevelDB是嵌入在peer進程中的默認狀態數據庫,並將chaincode數據存儲為鍵/值對。CouchDB是一個可選的外部狀態數據庫,當你所寫的chaincode數據被建模為JSON時,它提供了額外的查詢支持,允許對JSON內容進行豐富的查詢。
Transaction Flow
在高層業務邏輯處理上,transaction flow(事務處理流程)是由應用程序客戶端發送的事務協議,該協議最終發送到指定的背書節點。背書節點會驗證客戶端的簽名,並執行一個chaincode函數來模擬事務。最終返回給客戶端的是chaincode結果,即一組在chaincode(讀集)中讀取的鍵/值版本,以及在chaincode(寫集)中寫入的鍵/值集合,即返回該peer執行chaincode后模擬出來的讀寫集結果,同時還會附帶一個背書簽名。
客戶端將背書組合成一個事務payload,並將其廣播至一個ordering service(排序服務節點),ordering service(排序服務節點)為當前channel上的所有peers提供排序服務並生成區塊。
實際上,客戶端在將事務廣播到排序服務之前,先將本次請求提交到peer,由peer來驗證事務。
首先,peer將檢查背書策略,以確保指定的peer的正確分配已經簽署了結果,並且他們將根據事務payload對簽名進行身份驗證。
其次,peer將對事務讀取集進行版本控制,以確保數據完整性,並防止諸如重復開銷之類的問題。Hyperledger Fabric具有並發控制,即事務允許並行執行(通過背書)來增加吞吐量,並且在提交(所有peer)的情況下,每個事務都經過驗證,以確保沒有其他事務修改它已經讀取的數據。換句話說,它確保了在執行(批准)時間之后讀取的數據沒有發生變化,因此執行結果仍然有效,並且可以提交到賬本狀態數據庫。如果讀取的數據被另一個事務更改,則該區塊中的相同事務被標記為無效,並且不應用於賬本狀態數據庫。客戶端應用程序被警告,並且可以在適當的情況下處理錯誤或重試。
(備注:上述最后一段話的邏輯理論上是正確的,即讀取本地版本然后根據本地版本發送廣播至排序服務,再由排序服務進行事務處理。但事務處理結果通過實際使用sdk開發,該結果並未即時返回給當前調用客戶端,即客戶端無法實時獲取事務狀態,只能通過再次查詢來確認最終結果。后續版本sdk可能會修復此問題。)
請參閱Hyperledger Fabric Transaction Flow——事務處理流程、Hyperledger Fabric Read-Write set semantics——讀寫集和Hyperledger Fabric CouchDB as the State Database——使用CouchDB,以深入了解事務結構、並發控制和狀態數據庫。