鏈客,專爲開發者而生,有問必答!node
此文章來自區塊鏈技術社區,未經容許拒絕轉載。linux
1、編譯git
一、環境準備github
須要提早在linux或者mac機器上安裝以下軟件docker
1)Go,注意設置好gopath(筆者安裝的是go1.8.3,對應的源碼是v1.0.0這個tag,版本不對可能會出現編譯不過或者運行出現問題)bash
2)Docker服務器
3)一些依賴包(筆者當時沒有裝特殊的依賴包,因此這裏不寫了)網絡
二、源碼下載架構
首先先建立源碼目錄(注意這裏必須是gopath下的這個目錄,不然編譯不過)區塊鏈
$ mkdir -p $GOPATH/src/github.com/hyperledger
$ cd $GOPATH/src/github.com/hyperledger
而後在該目錄下複製倉庫
$ git clone http://gerrit.hyperledger.org...
筆者用的是v1.0.0的tag因此還須要
$ git checkout v1.0.0
三、編譯
在源碼目錄中make
不過這樣要求比較高,耗時比較長,會從網上下載一些docker鏡像等等,讀者若是嫌費時間或者因爲網絡緣由搞不定,能夠一個一個make
好比make native是編譯一些bin好比order,peer等
而make order和make peer是編譯兩個關鍵程序
因爲編譯不是本文的重點因此簡單提一下,若是有疑問歡迎給筆者留言交流
2、運行
本身配置聯盟比較麻煩,比較建議是下載一個開源項目使用docker運行,如下是簡單的方式
一、環境要求:
安裝docker-compose
二、下載開源項目
$ git clone https://github.com/yeasy/dock...
$ cd docker-compose-files/hyperledger_fabric/v1.0.0
三、下載鏡像
$ sudo bash scripts/ download_images.sh
四、啓動
$ make start
後面的具體方式能夠看Makefile,有運行、中止、初始化、測試鏈碼等命令
3、架構
聯盟鏈的概念比較多,從比特幣轉過來的同窗可能剛開始會暈(由於我當時研究的時候看各類文章就很暈),因此我這裏儘可能把個人理解路徑寫出來
一、主程序
聯盟鏈真正運行時只有兩個主程序
1)peer,這個程序是參與實體的運行終端,也是命令行的終端(客戶端),能夠理解爲比特幣中的主程序。
2)order,一個排序服務,類比到比特幣,暫時簡單理解爲主程序中的挖礦部分,由於聯盟鏈把這部分功能單獨隔離了出來。隨着代碼的深刻了解,能夠發掘其其餘功能。
二、講解模型
其中order服務是一個單獨的服務,能夠理解爲一個專門各個組織公認的權威服務器(也能夠是服務集羣),主要用來對交易進行排序,而後生成區塊(挖礦)
Org表明組織,講解的模型中有兩個組織,org1和org2,能夠對應的是清華大學和北京大學
而peer通常表明的是組織內的子部門,好比org1.peer1表明清華大學的計算機學院,org2.peer2表明北京大學的計算機學院。
三、啓動命令行
對應上圖中的講解模型每個節點中的運行的命令行以下
1)order服務:order start
2)org1.peer1 : peer node start
3)org2.peer1 : peer node start
4)org1.peer2:peer node start
5)org2.peer2:peer node start
這裏除了order運行是order start之外其餘的所有是peer node start,那怎麼區分他們的功能呢?
答案是經過msp和tls兩個目錄(這個後續再繼續講)
在各個節點運行事後,網絡是這樣的
也就是網絡其實尚未互聯起來
四、網絡互聯
要完成網絡須要三步
1)建立通道
建立通道,能夠單獨在一個機器上運行
peer channel create
-o orderer.example.com:7050
-c testchannel
-f ./ testchannel.tx
ps:爲了簡單,這裏省略了一些證書信息的配置(後文會講解)
其中當前須要理解的參數是-o orderer.example.com:7050 表明了order的url,-c testchannel表明了通道的名字
這個命令其實就是經過鏈接到orderer.example.com:7050服務上,讓服務器增長了一個通道的配置(配置文件是testchannel.tx),這個配置中包括了一些信息,好比證書信息,機構信息,以及一些權限設置等等。而後order會返回一個testchannel.block的文件(也是一些配置信息),加入通道時候會用到。
這一步並無構建網絡,網絡模型依然以下
只是order服務中多了一個叫testchannel的通道
2)加入通道
命令爲
CORE_PEER_ADDRESS=peer1.org1.example.com:7051
peer channel join
-b testchannel.block
ps:這裏省略了msp配置的信息
主要參數列出來
一、CORE_PEER_ADDRESS代表要加入通道的地址(由於實際操做時候是用的cli在另外的機器上操做要加入通道的peer)
二、testchannel.block 建立通道時候的返回文件
該命令執行完之後,網絡模型變成了
能夠看到org1的peer1和order鏈接陳功了,依次執行
CORE_PEER_ADDRESS=peer2.org1.example.com:7051
peer channel join
-b testchannel.block
CORE_PEER_ADDRESS=peer1.org2.example.com:7051
peer channel join
-b testchannel.block
CORE_PEER_ADDRESS=peer2.org2.example.com:7051
peer channel join
-b testchannel.block
最後網絡模型變成了
3)設置錨節點
各個節點都加入網絡後,細心的讀者可能會發現,和咱們要達到的網絡模型還少了幾條線,也就是各個節點的互通線沒有鏈接。而這個的完成須要gossip協議,而gossip協議是一個節點相互發現的協議,其中有一項就是須要一些錨點,fabric中通常每個組織一到多個錨點。這個概念在講解gossip協議的時候會進一步說明,在這裏就只須要知道錨點的設置是爲了網絡互通就能夠了,實在要理解,暫時理解爲p2p協議中的初始域名服務器。命令以下:
peer channel update
-o orderer.example.com:7050
-c testchannel
-f ./Org1MSPanchors.tx \
其中-c表明了通道名稱,-f表示了錨點信息(裏邊會包含錨點的url好比peer1)-o指定了order節點。
在org1和org2中中分別生成錨點配置文件,而後執行以上命令就能把錨點信息更新到通道的配置中,這樣各個節點就能夠經過從order中更新配置,知道錨點,而後經過gossip協議進行全網互聯,互聯後網絡模型以下