
一.示例網絡

四個組織 R1、R2、R3 和 R4,他們共同決定,並且達成了一個協議,他們將會設置並開發一個 Hyperledger Fabric 網絡。R4 被分配作為網絡的初始者,它有權設置網絡的初始版本。R4 不會在網絡中去進行任何的業務交易。R1 和 R2 在整個網絡中有進行私有通信的需求,R2 和 R3 也是。組織 R1 有一個客戶端的應用能夠在通道 C1 中進行業務的交易。組織 R2 有一個客戶端應用可以在通道 C1 和 C2 中進行類似的工作。組織 R3 可以在通道 C2 中做這樣的工作。節點 P1 維護了 C1 的賬本 L1 的副本。節點 P2 維護了 C1 的賬本 L1 和 C2 的賬本 L2 的副本。節點 P3 維護了 C2 的賬本 L2 的副本。這個網絡是根據在網絡配置 NC4 中指定的規則來進行管理的,整個網絡由組織 R1 和 R4 管理。通道 C1 是根據在通道配置 CC1 中指定的規則來管理的,這個通道由組織 R1 和 R2 管理。通道 C2 是根據在通道配置 CC2 中指定的規則來管理的,這個通道由組織 R2 和 R3 管理。這有一個排序服務 O4 作為這個網絡 N 的一個網絡管理員節點,並且使用系統通道。排序服務同時也支持應用通道 C1 和 C2,來對交易進行排序、加入區塊然后分發。每個組織都有一個首選的 CA。
下面開始一步步的搭建和敘述上述過程
二.創建網絡

在定義 網絡 N 的時候,第一件事情就是定義一個 排序服務, O4。O4 最初被配置並且由組織 R4的一個管理員來啟動,並且由 R4 管理。配置 NC4 包含了描述網絡管理能力初始集合的規則。
你也能夠看到一個證書頒發機構,CA4,它會被用來給管理者和網絡節點頒發證書。CA4 在我們的網絡中扮演着重要的角色,因為它會分配 X.509 證書,這個證書能夠用來識別屬於組織 R4 的組件。也可以用來為交易提供簽名,來表明一個組織對交易的結果進行背書,背書是一筆交易可以被接受並記錄到賬本上的前提條件。
讓我們對有關 CA 的兩個方面更詳細的介紹一下。
-
在區塊鏈網絡中的不同組件之間,彼此是使用證書來標識自己是來自於特定組織的。這就是為什么通常會有多個 CA 來支持一個區塊鏈網絡,因為不同的組織通常會使用不同的 CA。在示例網絡中,使用了 4 個 CA,每個組織會有一個 CA。事實上,CA 是非常重要的,所以 Hyperledger Fabric 提供給你一個內置的 CA(被稱為 Fabric-CA)以方便使用,盡管在實際當中,組織會選擇使用它們自己的 CA。
將證書同成員組織進行匹配是通過一個稱為
成員服務提供者(Membership Service Provider, MSP)的結構來實現的。網絡配置 NC4 使用一個已命名的 MSP 來識別由 CA4 頒發的證書的屬性,這些證書會關聯到組織 R4 下的證書持有者。NC4 接下來會使用在策略中的這個 MSP 名字來分配在網絡資源上的特殊權利。這個策略的一個例子就是,在 R4 中識別管理員,這個管理員可以向網絡中添加新的成員組織。我們沒有在這些圖標中顯示 MSP,因為他們會很雜亂,但是他們是非常重要的。 -
接下來我們會看到由 CA 簽發的證書是如何在交易的生成和驗證的流程中處於核心位置的。特別的,X.509 證書被用於客戶端應用的交易提案和智能合約的交易響應,來對交易進行數字簽名。接下來持有賬本副本的網絡節點在接受將交易更新到賬本之前會驗證交易簽名是否有效。
讓我們重新整理一下我們的區塊鏈網絡示例的基本結構。這有一個資源,網絡 N,有一些用戶能夠訪問這個網絡,這些用戶是由一個證書頒發機構 CA4 定義的,他們具有網絡配置 NC4 中包含的規則中所描述的在網絡 N 中的權利。當我們配置和啟動排序服務節點 O4 的時候上邊講的事情都會發生。
三.添加網絡管理員
NC4 最初被配置為僅僅允許 R4 用戶在網絡中具有管理的權限。在接下來的階段,我們會允許組織 R1 用戶也具有管理的權限。讓我們來看看網絡是如何演變的:

我們看到了新的組織 R1 變成了管理員,R1 和 R4 現在在網絡中具有了相同的權限。我們看到證書頒發機構 CA1 也被添加進來了,他用來標識 R1 組織的用戶。現在從 R1 和 R4 來的用戶就已經是網絡的管理員了。
盡管排序節點 O4 是運行在 R4 的基礎設施上的,如果 R1 能夠訪問到的話就可以共享管理的權限。也就是說 R1 或者 R4 可以更新這個網絡配置 NC4 來允許組織 R2 進行網絡維護中的部分功能。通過這種方式,盡管 R4 運行着排序服務,但是 R1 在其中也具有着全部的管理員權限,R2 具有有限的創建新聯盟的權限。
在這個最簡單的模式中,排序服務在網絡中是一個獨立的節點,就像你在例子中看到的。排序服務通常是多節點的,也可以被配置為在不同組織中的不同節點上。比如,我們可能會在 R4 中運行 O4 並連接到 O2,O2 是在組織 R1 中的另一個排序節點。通過這種方式,我們就有了一個多節點、多組織的管理結構。
四.定義聯盟

由於 NC4 的配置方式,只有 R1 和 R4 能夠創建新的聯盟。這個圖標顯示了一個新的聯盟 X1,它定義了 R1 和 R2 是它的聯盟組織。我們也看到了 CA2 也被添加進來標識來自 R2 的用戶。注意一個聯盟可以包含任意數量的組織,這里我們僅包含了兩個組織作為一個最簡單的配置。
為什么聯盟這么重要?我們能夠看到聯盟定義了網絡中的一部分組織,他們共享了彼此能夠交易的需求,在這個示例中就是 R1 和 R2 能夠進行交易。這對於一組有着共同的目標的組織來說是有意義的。
這個網絡雖然最初僅包含一個組織,現在已經由多個組織來管理了。我們將從 R1、R2 和 R4 共享管控權的方式開始,這樣的構成更容易被理解。
五.為聯盟創建通道
現在我們要使用聯盟 X1 創建一個對於 Hyperledger Fabric 區塊鏈非常重要的部分——通道。通道是一個聯盟中的成員彼此進行通信的主要機制。在一個網絡中可能會有多個通道,但是現在讓我們從一個通道開始。

通道 C1 為聯盟 X1 提供了一個私有的通信機制。我們能夠看到通道 C1 已經關聯到了排序服務 O4 但是這並沒有附帶任何功能。盡管 C1 是網絡 N 中的一部分,它還是跟這個網絡非常不同的。同時也要注意組織 R3 和 R4 並沒有在這個通道中,因為這個通道僅僅是為了處理在 R1 和 R2 之間進行的交易的。
需要注意的是通道 C1 如何具有一個同網絡配置 NC4 完全分開的配置 CC1。CC1 包含了賦予 R1 和 R2 在通道 C1 上的權利的規則,就像我們看到的那樣,R3 和 R4 在這個通道中沒有權限。R3 和 R4 只有被 R1 或 R2 添加到通道配置 CC1 中的規則后才能夠跟 C1 進行交互。這樣做的一個例子是定義誰能夠向通道中添加新的組織。
為什么通道會如此重要?通道非常有用,因為提供了一個聯盟成員之間進行私有通信和私有數據的機制。通道提供了與其他通道以及整個網絡的隱私性。Hyperledger Fabric 在這一點上是很強悍的,因為它允許組織間共享基礎設施的同時又保持了私有性。這里並不矛盾,網絡中不同的聯盟之間會需要將不同的信息和流程進行適合的共享,通道為之提供了有效的機制。
我們也能夠看到一旦通道被創建之后,它會真正地代表了“從網絡中解放出來”。從現在開始和未來,只有在通道配置中指定的組織才能夠控制它。同樣的,從現在開始,之后的對於網絡配置 NC4 的任何改動都不會對通道配置 CC1 造成任何直接的影響。比如如果聯盟定義 X1 被改動了,它不會影響通道 C1 的成員。所以通道是有用的,因為他們允許構成通道的組織間進行私有的溝通。並且在通道中的數據跟網絡中的其他部分是完全隔離的,包括其他的通道。
同時,這里還有一個被排序服務使用的特殊的系統通道。它跟常規的通道是完全一樣的方式運行的,因此常規的通道有時候又被稱為應用通道。我們通常不會關心這個通道,但是以后我們會更詳細的討論它。
六.節點和賬本
現在,讓我們開始使用通道來將這個區塊鏈網絡以及組織的組件關聯到一起吧。在網絡開發的下一個階段,我們能夠看到我們的網絡 N 又新增了兩個組件,稱作 Peer 節點 P1 和賬本實例 L1。

Peer 節點是存儲區塊鏈賬本副本的網絡組件。P1 在這個網絡中的目的是單純地放置被其他人訪問的賬本 L1 的副本。我們可以想象 L1 會被物理地存儲在 P1 上,但是邏輯上是存儲在通道 C1 上。當我們向通道中添加更多的節點之后,我們對這些就會更加清楚。
P1 的配置中一個關鍵部分就是一個由 CA1 頒發的 X.509 身份信息,它將 P1 和組織 R1 關聯了起來。當 P1 啟動之后,它就可以使用排序 O4 加入通道C1。當 O4 收到這個加入請求,它會使用通道配置 CC1 來決定 P1 在這個通道中的權限。比如,CC1 決定 P1 是否能夠向賬本 L1 中讀取或寫入信息。
七.應用程序和智能合約鏈碼
現在通道 C1 擁有了一個賬本,我們可以連接客戶端應用來使用由 Peer 節點提供的服務了。

智能合約 S5 被安裝在了 P1 上。在組織 R1 中的客戶端應用 A1 (就像 Peer 節點和排序節點一樣,客戶端應用也會有一個使它和組織相關聯的身份信息。)可以通過 Peer 節點 P1 使用 S5 來訪問賬本。A1、P1 和 O4 都加入了通道 C1,他們都可以使用由這個通道提供的通信設施。
智能合約可以被每個組織的應用開發者創建來實現一個在聯盟成員間共享的業務流程。智能合約被用來幫助生成被分發到網絡中每個節點的交易。我們接下來會詳細討論。
現在,為了達到這一點,需要對智能合約執行兩項操作,它必須被安裝,然后在通道中被定義。
-
安裝鏈碼包
在智能合約 S5 被開發完之后,組織 R1 中的管理員必須要把它安裝到節點 P1 上。當完成之后,P1 就完全了解了 S5。特別地,P1 能夠看到 S5 的實現邏輯(用來訪問賬本 L1 的程序代碼)。當一個組織在一個通道中有多個 Peer 節點時,可以選擇在哪個節點安裝智能合約,而不需要每個 Peer 節點上都安裝。
-
定義鏈碼 💫
盡管鏈碼會被安裝在組織的 Peer 節點上,但是它是在一個通道范圍內被管理和維護的。每個組織需要批准一個鏈碼定義,和一系列參數來定義在一個通道中鏈碼應該被如何使用。一個組織必須要批准一個鏈碼定義,才能使用已經安裝的智能合約來查詢賬本和為交易背書。在我們的例子中,只有一個單獨的 Peer 節點 P1,一個組織中的管理員 R1 必須要批准 S5 的鏈碼定義。在鏈碼定義提供的信息中最重要的部分就是背書策略。它描述了在交易被其他的組織接受並存儲在他們的賬本副本上之前,哪些組織必須要同意此交易。在我們的示例網絡中,只有當 R1 和 R2 對交易進行背書之后,交易才能夠被接受並存儲到賬本 L1 中。
注意,雖然在這個通道上的每個組件現在都可以訪問 S5,但是他們是不能夠看到它的程序邏輯的。這對於安裝了這個智能合約的節點還是保持隱私性的,在我們的示例中指的是 P1。從概念上講,這意味着實際上是定義並提交了智能合約的接口到通道。為了強調這個想法,安裝智能合約展示了我們是如何將它物理地存儲在 Peer 節點上,而實例化智能合約展示了我們是如何將它邏輯地存儲在通道中。
當智能合約被安裝在 Peer 節點並且在通道上定義之后,它就可以被客戶端應用調用了。客戶端應用是通過發送交易提案給智能合約背書策略所指定的 Peer 的節點方式來調用智能合約的。這個交易的提案會作為智能合約的輸入,智能合約會使用它來生成一個背書交易響應,這會由 Peer 節點返回給客戶端應用。這些交易的響應會和交易的提案打包到一起形成一個完整的經過背書的交易,他們會被分發到整個網絡。
在網絡開發的這個階段,我們能夠看到組織 R1 完整參與了這個網絡。它的應用,從 A1 開始,通過智能合約 S5 訪問賬本 L1,並生成將要被 R1 背書的交易,最后會被接受並添加到賬本中,因為這滿足了背書策略。
八.完成網絡
我們的目標是為聯盟 X1(由組織 R1 和 R2 構成)創建一個通道。網絡開發的下一個階段是將組織 R2 的基礎設施添加到網絡中。

這個網絡通過增加新組織 R2 的基礎設施變得更大了。具體來說,R2 添加了 Peer 節點 P2,它會存有賬本 L1 的一個副本,和鏈碼 S5。R2 像 R1 一樣批准了相同的鏈碼定義。P2 也加入了通道 C1,也有一個客戶端應用 A2。A2 和 P2 使用由 CA2 頒發的證書來標識 A2 和 P2。所有這些都說明了 A1 和 A2 能夠使用 Peer 節點 P1 或者 P2 來調用在 C1 上的 S5。
簡化視覺詞匯表
隨着網絡的增長,之前幫助我們理解通道的連線將會變得越發笨拙。設想一下如果我們添加了另外一個 Peer 節點或者客戶端應用,又或者另外一個通道的話,我們的圖表將會變得有多復雜。
我們接下來要為網絡中添加更多內容,在我們做這個之前,讓我們來一起簡化一下視覺詞匯表吧。下邊是我們目前開發的網絡的簡圖:

這個圖表展示了在網絡 N 中和通道 C1 的相關內容:客戶端應用 A1 和 A2 能夠通過節點 P1 和 P2 以及排序節點 O4 使用通道 C1 來進行通信。Peer 節點 P1 和 P2 可以使用通道 C1 的通信服務。排序服務 O4 可以使用通道 C1 的通信服務。通道配置 CC1 應用於通道 C1。注意,這個網絡的圖表通過將通道連線替換成了連接點的方式進行了簡化,連接點顯示為一個藍色的圓圈,里邊包含了通道數字。
九.添加另外一個聯盟定義
回到網絡級別並且為 R2 和 R3 定義一個新的聯盟 X2:

來自 R1 或者 R4 的網絡管理員添加了一個新的聯盟定義 X2,其中包含了 R2 和 R3。這將會被用來為 X2 定義一個新的通道。新通道只能夠由網絡配置策略 NC4 中指定的組織比如 R1 或者 R4 來創建,因為只有他們才有相關的權限(聯盟定義 X2 已經被添加進了網絡配置 NC4)。這是一個區分在網絡級別和通道級別誰能管理資源的策略的例子。
十.添加一個新的通道

一個使用聯盟定義 X2 為 R2 和 R3 的創建的新通道 C2。這個通道具有通道配置 CC2,完全同網絡配置 NC4 以及通道配置 CC1 分離。通道 C2 由 R2 和 R3 來管理,他們兩個就像 CC2 中的一個策略定義的那樣具有相同的權利。R1 和 R4 在 CC2 中是沒有任何權利的。
通道 C2 為聯盟 X2 提供了一個私有的通信機制。這里,需要注意的是聯盟將組織統一到一起的方式就是通道。通道配置 CC2 現在包含了管理通道資源的策略,通過通道C2 來向組織分配管理權限。這由 R2 和 R3 唯一管理,R1 和 R4 在通道 C2 中是沒有權力的。比如可以更新通道配置 CC2 來添加新的組織以支持網絡的增長,但是這個只能由 R2 或者 R3 來完成。
網絡和通道配置:
在我們的示例網絡中,我們看到了網絡和通道配置的重要性。這些配置很重要,是因為他們封裝了網絡成員同意的策略,這提供了對網絡資源訪問控制的共享參考。網絡和通道配置也包含了有關網絡和通道組成的一些情況,比如聯盟的名字以及它所包含的組織。
比如,當使用排序服務節點 O4 首次組建網絡的時候,它的行為是由網絡配置 NC4 來管理的。NC4 的初始配置中只包含了允許組織 R4 來管理網絡資源的策略。NC4 接下來被變更為也允許 R1 來管理網絡資源。一旦這個改動生效后,任何來自於組織 R1 或者 R4 的管理員連接到 O4 都將具有網絡管理的權限,因為這是網絡配置 NC4 中的策略所允許的。在內部來說,在排序服務中的每個節點都記錄着網絡配置中的每個通道,所以在網絡級別中每個通道被創建時都會有一條記錄。
最后,理解網絡和通道配置是如何在物理上來實現的是非常重要的。我們能夠看到網絡和通道的配置在邏輯上是獨立的,網絡會有一個配置,每個通道也會有一個配置。這一點非常重要,任何訪問網絡或者通道的組件必須對不同組織的授權有共同的理解。盡管在邏輯上是獨立的配置,實際上它會被復制到組成網絡或者通道的每個節點,並保持一致。比如,在我們的網絡中,節點 P1 和 P2 都有通道配置 CC1 的副本,在這個網絡完成的時候,節點 P2 和 P3 也會有通道配置 CC2 的副本。類似的,排序服務節點 O4 有網絡配置的副本,但是在多節點配置中,每個排序服務節點都會有他們自己的關於網絡配置的副本。
實際上,排序服務節點運行着一個小型的區塊鏈,通過我們前邊提到過的系統通道連接。使用系統通道排序服務節點分發網絡配置交易。這些交易被用來維護每個排序服務節點間網絡配置副本的一致性。類似的,應用程序通道中的 Peer 節點分發通道配置交易。同樣,這些交易被用來維護每個 Peer 節點通道配置的一致性。
十一.添加另外一個 Peer 節點

這個圖展示了在網絡 N 中關於通道 C1 和 C2 的以下內容:客戶端應用程序 A1 和 A2 可以使用通道 C1 來同節點 P1 和 P2,以及排序服務 O4 進行通信。客戶端應用程序 A3 能夠使用 C2 同節點 P3 和排序服務 O4 進行通信。排序服務 O4 可以使用通道 C1 和 C2 的通信服務。通道配置 CC1 應用到了通道 C1 上,CC2 應用到了通道 C2 上。
首先,要注意的是因為 Peer 節點 P3 連接到了通道 C2,所以它有一個和使用通道 C1 的節點不同的賬本 L2。賬本 L2 被有效地控制在了通道 C2 中。賬本 L1 是完全獨立的,它被限制在了通道 C1。這么做是有意義的,通道 C2 的目的是為聯盟 X2 的成員提供私有通信,並且賬本 L2 是他們的交易的私有存儲。
同樣的方式,智能合約 S6 安裝在 Peer 節點 P3,定義在通道 C2 上,用來為賬本 L2 提供可控的訪問。應用程序 A3 現在能夠使用通道 C2 來調用智能合約 S6 提供的服務來生成交易,這些交易會在網絡中被每個賬本的副本所接受。
十二.把一個 Peer 節點添加到多個通道中

這個圖展示了在網絡 N 中關於通道 C1 和 C2 的以下內容:客戶端應用程序 A1 能夠使用通道 C1 與節點 P1 和 P2 以及排序服務 O4 進行通信。客戶端應用程序 A2 可以使用通道 C1 與節點 P1 和 P2 進行通信,以及使用通道 C2 與節點 P2 和 P3 以及排序服務 O4 進行通信。客戶端應用程序 A3 能夠使用通道 C2 與節點 P3 和 P2 和排序服務 O4 進行通信。排序服務 O4 能夠使用通道 C1 和 C2 的通信服務。通道配置 CC1 應用在了通道 C1 中,CC2 應用在了通道 C2 中。我們能夠看到,R2 在網絡中是一個特別的組織,因為它是唯一一個同時屬於兩個通道成員的組織!它能夠在通道 C1 上跟組織 R1 進行交易,也能夠同時使用另外一個通道 C2 來跟組織 R3 進行交易。
注意,節點 P2 將智能合約 S5 安裝在通道 C1 中,將智能合約 S6 安裝在通道 C2 中。節點 P2 同時是兩個通道的成員,並且通過不同的智能合約來處理不同的賬本。
通道是一個非常強大的概念,既提供了組織間的分離,又提供了組織間進行合作的機制。總的來說,這個基礎設施是由一系列獨立的組織來提供的,並且在這些組織間進行共享。
重點需要注意的是,在不同通道上交易時 Peer 節點 P2 的行為受到不同的約束。特別地,在通道配置 CC1 中包含的策略決定了 P2 在通道 C1 中進行交易的時候的操作,這也是通道配置 CC2 中的策略對 P2 在通道 C2 中的控制。
排序服務:
排序服務是一個從應用程序搜集背書過的交易的組件,然后它會把這些交易進行排序並放進區塊中,這些區塊會被分發到通道中的每個 Peer 節點。在每個這樣的提交節點(Commiter)中,交易不管是有效的還是無效的都會被記錄下來,並且他們本地賬本副本也會更新。
注意這里,排序服務節點 O4 在通道 C1 扮演着和網絡 N 不同的角色。當在通道級別操作時,O4 的角色是搜集交易並在通道中分發區塊。它依據通道配置 CC1 中定義的策略來操作。當在網絡級別操作時,O4 的角色是提供對網絡資源的管理,這是根據網絡配置 NC4 中定義的策略來操作的。我們應該注意這些不同的角色是如何在通道和網絡的配置中定義的。這個會加強你對 Hyperledger Fabric 中基於配置的可聲明策略的重要性的印象。兩種策略都被定義並且用來管控聯盟中的每個成員都同意的行為。
十三.網絡已經完全形成了
讓我們使用一個統一的視覺詞典來回顧一下我們的網絡應該是什么樣。我們使用更加緊湊的視覺語法來稍微重新組織一下這個網絡,因為它能夠更好地適應更大的一個拓撲結構:

在這個圖中,我們看到了這個 Fabric 區塊鏈網絡包括了兩個應用程序通道以及一個排序通道。組織 R1 和 R4 負責排序通道,R1 和 R2 負責藍色的應用程序通道,R2 和 R3 負責紅色的應用程序通道。客戶端應用程序 A1 是組織 R1 的元素,CA1 是它的證書頒發機構。注意到組織 R2 的節點 P2 可以使用藍色的通信設施,也可以使用紅色的應用程序通道。每個應用程序通道具有它自己的通道配置,這里是 CC1 和 CC2。系統通道的通道配置是網絡配置 NC4 的一部分。(這副圖與開頭示例網絡的圖相呼應)
