●了解超級帳本的架構設計。
●學會搭建超級帳本開發環境。
●掌握 Chaincode 的開發過程。
●通過實例掌握 Fabric 框架開發
超級帳本(Hyperledger),是一個由 Linux 基金會在 2015 年 12 月主導發起的開源項目,目的是通過提供一個可靠穩定、性能良好的區塊鏈框架,供企業創建自定義的分佈式帳本解決方案,以促進區塊鏈技術在商業中的應用。
超級帳本的架構包括 4 個大的模塊:成員(MEMBERSHIP)、區塊鏈(BLOCKCHAIN)、交易(TRANSACTIONS)和智能合約(CHAINCODE),其中成員模塊主要提供成員服務(Membership Services),包括用戶註冊(Registration)、標識管理(Identity Management),以及提供可審計性(Auditability)等;區塊鏈模塊和交易模塊用於提供區塊鏈相關的服務(Blockchain Services),負責提供共識管理(Consensus Manager)、分佈式帳本(Distributed Ledger)、P2P 協議(P2P Protocol)和帳本存儲(Ledger Storage)等功能;智能合約服務負責提供智能合約的功能,智能合約被放置在安全的倉庫(Secure Registry)中,執行時在一個安全的容器(Secure Container)中運行。
超級帳本在實際的發展過程中,基本是參照上述的架構進行開發的,並且孵化出了很多區塊鏈項目,主要包括 Sawtooth(官網首頁如圖 6-2 所示)、Iroha(官網首頁如圖 6-3 所示)、Fabric(官網首頁如圖 6-4 所示)、Burrow(官網首頁如圖 6-5 所示)等。
其中,Sawtooth 是用於構建、部署和運行分佈式帳本的模塊化平台;Iroha 是一個商業區塊鏈框架,其設計簡單且易於並入需要分佈式帳本技術的基礎設施項目中;Fabric 是一個開源的區塊鏈開發框架,它提供了一個模塊化的架構,其架構中包含節點、智能合約以及可配置的共識和成員服務等功能;Burrow 可以看作一個支持以太坊智能合約的框架,它是根據以太坊虛擬機(EVM)規範構建的。這些基於超級帳本的項目中,Fabric 是最有名的,使用 Fabric 可以快速地搭建完成企業級的區塊鏈系統。一般超級帳本基本上指的都是超級帳本 Fabric,本章講解的超級帳本也是指超級帳本 Fabric,即在本章中提到的超級帳本基本上就是指 Fabric。
下面了解下超級帳本 Fabric 的架構
Fabric 的架構經歷了兩個版本的演進。最初發布的 0.6 版本只是被用來做商業驗證,無法被應用於真實場景中。因為 0.6 版本的結構簡單,基本所有的功能都集中在 peer 節點,在擴展性、安全性和隔離性方面有著不足。在後來推出的 1.0 正式版中,將 peer 節點的功能進行分拆,把共識服務從 peer 節點剝離,獨立為 orderer 節點,提供可插拔共識服務。更為重要的是加入了多通道(multi-channel)功能,實現了多業務隔離,如圖 6-6 所示。
在 Fabric 1.0 中需要了解的幾個核心概念說明如下。
●SDK:應用工具開發包。
●Membership:負責身份權限管理,又叫 MemberService 或 Identity Service。
●Chaincode(鏈碼):區塊鏈上的應用代碼,擴展自 “智能合約” 的概念,支持 Go、Java 等編程語言,運行在隔離的容器環境中。
●Orderer(排序節點):Fabric 1.0 架構中的共識服務角色,可以對交易進行排序、批量打包、生成區塊,發給 peer 節點。一個區塊鏈網絡中有多個 orderer 節點,它們共同提供排序服務。
●Endorser(背書節點):Fabric 1.0 架構中的一類 peer 節點角色,負責檢驗某個交易是否合法,是否願意為之簽名背書。
●Committer(提交節點):Fabric 1.0 架構中的另一類 peer 節點角色,負責對 orderer 節點排序後的交易進行檢查,選擇合法的交易執行並寫入存儲。
●Enrollment Certificate Authority(ECA,註冊證書認證中心):負責成員身份相關證書管理的認證中心。
●Transaction Certificate Authority(TCA,交易證書認證中心):負責維護交易相關證書管理的認證中心。
Fabric 中主要可分為兩種類型的節點:peer 節點和 orderer 節點。一個區塊鏈網絡中會有多個 peer 節點,一個 peer 節點可以充當多種角色,如可以充當背書節點 endorser,充當提交節點 committer。鏈碼(Chaincode)部署在 peer 節點上,則這個節點用於執行智能合約。orderer 節點在網絡中起到代理作用,多個 orderer 節點會連接到 Kafka 集群,利用 Kafka 的共識功能,完成對網絡中交易的排序和打包成區塊的工作。另外一個 peer 節點可以加入多個通道,多個通道之間是完全隔離的,每個通道只會接收和處理該通道相關交易的區塊,而與其他交易完全隔離,實現數據隔離和保密。
超級帳本 Fabric 的特點#
超級帳本的架構使它擁有以下特點。
●模塊化設計,包括共識、權限管理、加解密、帳本機制等模塊,可以靈活地進行選擇和替換。
●具有多種節點類型。不同節點被賦予了不同的功能,提升了交易處理效率。
●加強了身份證書管理服務,提供了身份證書、數字簽名、驗證算法以及若干判斷身份是否有效的功能。
●支持多通道特性,不同通道之間的數據彼此隔離,提高隔離安全性。
●引入鏈碼來實現智能合約的功能,實現了可編程性,支持第三方實現自定義功能。
●充分利用 Docker 容器技術,可以根據負載進行靈活部署。
搭建 Fabric 開發環境#
超級帳本主要由 Go 語言開發,並使用 Docker 容器技術進行部署。超級帳本開發環境配置過程比較簡單,在 Windows、Linux 和 Mac 系統下均可進行操作。使用超級帳本開發區塊鏈需要先安裝 Go 語言開發環境和 Docker 工具。然後使用官方提供的安裝腳本即可自動下載安裝所需要的文件和 Docker 鏡像,下載完成後即可進行開發。這裡先簡單介紹一下 Go 語言和 Docker 工具,對這兩部分有了解的讀者可以跳過,直接閱讀 Fabric 本地開發環境安裝部分
Go 語言簡介及其開發環境安裝#
Go 語言是 Google 推出的一門強類型的通用編程語言,Go 語言良好的語言設計、高效的性能以及強大的並發編程能力使其很適合開發區塊鏈這樣的分佈式系統。
要安裝使用 Go 語言可以到 Go 的下載地址https://golang.org/dl/ 選擇對應系統的 Go 語言開發環境的安裝文件進行下載安裝(需要有相應設置才可訪問),go 語言的下載頁面如圖 6-7 所示。
Go 語言的開發環境安裝完成後需要將 Go 的目錄 /usr/local/go/bin 添加至系統的 PATH 環境變量中,命令如下:
$ export PATH=$PATH:/usr/local/go/bin
之後,編寫一個輸出 “Hello,Golang!” 的程序測試 Go 的開發環境是否安裝完成。
新建一個名為 hello.go 的文件,在文件中輸入以下內容:
然後打開系統的命令行終端工具(terminal)執行 go run hello.go 命令,可以看到 “Hello,Golang!” 的輸出信息,如圖
Go 的語法比較簡單,Go 語言官網也提供了在線學習的教程,有需要的讀者可以訪問https://tour.golang.org/welcome/1 進行學習
Docker 是一個開源的應用容器引擎,基於 Go 語言開發。它是目前最流行的容器解決方案。Docker 屬於 Linux 容器的一種封裝,提供簡單易用的容器使用接口。
Docker 讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後發布到任何流行的 Linux 機器上,便可以啟動和運行應用程序了。Docker 使開發者能夠非常方便快捷地管理自己的項目,只需要幾分鐘就能完成項目的發布和更新。
Docker 使用客戶端 / 服務器(C/S)架構模式,包括 Docker 客戶端(Docker Client)和 Docker 守護進程(Docker Deamon)兩部分。Docker 守護進程運行在宿主機上,處理複雜繁重的任務,例如建立、運行、發布 Docker 容器。Docker 客戶端(或者說命令行工具),是用戶使用 Docker 的主要方式,Docker 客戶端與 Docker 守護進程通信並將結果返回給用戶。Docker 客戶端和 Docker 守護進程可以運行在同一個系統上,當然也可以使用 Docker 客戶端去連接一個遠程的 Docker 守護進程。Docker 客戶端和 Docker 守護進程之間通過 socket 或者 RESTful API 進行通信,如圖
了解了 Docker 的基本構成,再來了解一下 Docker 的 3 個主要概念。
●Docker 鏡像:Docker 鏡像是只讀的,鏡像中包含有需要運行的文件。鏡像用來創建容器,一個鏡像可以運行多個容器;鏡像可以通過 Dockerfile 創建(Dockerfile 是一個文本文件,Docker 根據這個文件生成一個鏡像),也可以從 Docker 倉庫上下載。
●Docker 容器:Docker 容器是 Docker 的運行組件,啟動一個鏡像就是一個容器,容器是一個隔離環境,多個容器之間不會相互影響,保證容器中的程序運行在一個相對安全的環境中。
●Docker 倉庫:Docker 倉庫用於共享和管理 Docker 鏡像,用戶可以上傳或者下載鏡像。
Docker 倉庫的官方地址為https://registry.hub.docker.com/,也可以搭建自己私有的 Docker 倉庫
接下來進行 Docker 的安裝,在 Mac 和 Windows 上可以到官網下載安裝包進行安裝,在其他 Linux 系統中可以通過命令方式進行安裝。
Docker 的安裝包的下載地址為:https://www.docker.com/get-started#
下載文件後雙擊 Docker 安裝程序進行安裝即可。安裝完成後就可以雙擊 Docker 圖標啟動 Docker 守護進程,然後使用 Docker 客戶端與 Docker 守護進程進行交互。如一切安裝正常,在終端中輸入 docker run hello-word 命令即可自動下載 hello-world 鏡像,並啟動一個容器輸出 “Hello from Docker”,如圖所示。
這就說明 Docker 已經可以正常使用了。直接輸入 docker 命令可以查看 Docker 客戶端的常見使用方法,如
這裡列舉幾個常用的 Docker 命令。
●啟動容器並啟動命令行工具 bash。
docker run -i -t<image_name/container_id>/bin/bash
●進入正在運行的容器內部,同時運行 bash。
docker exec -t -i<id/container_name>/bin/bash
●查看容器日誌。
docker logs<id/container_name>
●列出當前所有正在運行的容器。
docker ps
●刪除單個容器。
docker rm Name/ID
●停止、啟動、終止、重啟一個容器。
docker stop Name/ID
docker start Name/ID
docker kill Name/ID
docker restart name/ID
●列出鏡像。
docker images
●搜索鏡像。
docker search image_name
●下載 image。
docker pull image_name
●刪除一個或者多個鏡像。
docker rmi image_name
關於 Docker,最後還需要知道如何生成自定義的鏡像文件。生成自定義的鏡像文件需要編寫一個 Dockerfile。Dockerfile 由一行行命令語句組成,並且支持以 #開頭的註釋行。一般而言,Dockerfile 分為基礎鏡像信息、維護者信息、鏡像的操作指令、容器啟動時執行指令這 4 個部分。這裡以一個 nginx(一個高性能的 HTTP 和反向代理服務器)作為基礎鏡像為例,新建一個 Dockerfile 的空白文件,輸入以下內容:
Dockerfile 示例#
第 1 行必須指定基於的鏡像基礎#
FROM nginx
維護者信息#
MAINTAINER XXX [email protected]
鏡像的操作指令#
RUN echo‘<h1>Hello,Docker!</h1>'>/usr/share/nginx/html/index.html
#容器啟動時執行指令
!!這個示例功能比較簡單,不需要在容器啟動時執行指令!!#
完成後保存文件,然後在終端中執行 docker build-t hello_docker. 命令構建鏡像,執行完成後可以看到本地多了個名為 hello_docker 的鏡像,如圖所示。
以上即為 Docker 的簡要介紹,若需深入學習可購買專門的 Docker 教程自學,如《Docker 入門與實戰》,《Docker 第一本書》
對 Go 語言和 Docker 有了一定了解後,就可以正式搭建 Fabric 的開發環境了。
當前 Fabric 的最新版本為 1.2.1,打開命令行工具使用以下命令就可以進行安裝:
curl-sSL http//bit.ly/2ysbOFE|bash-s 1.2.1
這個命令會執行以下操作。
1)檢查是否有 1.2.1 版本的 Fabric 代碼。
2)將 1.2.1 版本的 Fabric 項目中的程序和配置文件下載到當前文件夾中,如圖
3)下載 1.2.1 的 Fabric docker 鏡像到當前系統中,如圖
然後還可以下載 Fabric 項目的示例代碼到本地,這些示例代碼是基於 Fabric 實現的項目,本書也是通過這些示例來講解 Fabric 的使用方法。示例代碼的下載命令如下:
git clone https//github.com/hyperledger/fabric-samples.git
至此,Fabric 的開發環境搭建完成,可以訪問 Fabric 的官網查閱安裝步驟的說明,網頁鏈接地址為 https//hyperledger-fabric.readthedocs.io/en/latest/getting_started.html