本文首發於深刻淺出區塊鏈社區 原文連接:聯盟鏈初識以及Fabric環境搭建流程原文已更新,請讀者前往原文閱讀html
這篇文章首先簡單介紹了聯盟鏈是什麼,再詳細的介紹了Fabric環境搭建的整個流程。python
以參與方式分類,區塊鏈能夠分爲:公有鏈、聯盟鏈和私有鏈。linux
咱們知道區塊鏈就是一個分佈式的,去中心化的公共數據庫(或稱公共帳本)。而聯盟鏈是區塊鏈的一個分支,因此它自己也是一個分佈式的,去中心化的公共數據庫,跟其餘鏈的區別就是它是針對特定羣體的成員和有限的第三方,其內部指定多個預選節點爲記帳人,其共識過程受到預選節點控制的區塊鏈git
聯盟鏈本質仍然是一種私有鏈,只不過它要比單個小組織開發的私有鏈更大,可是卻沒有公有鏈這麼大的規模,能夠理解爲它是介於公有鏈和私有鏈的一種區塊鏈。github
R3:由40多加銀行參與的區塊鏈聯盟R3,包括世界著名的銀行(如摩根大通、高盛、瑞信、伯克萊、匯豐銀行等),IT巨頭(如IBM、微軟)。 超級帳本(Hyperledger):由 Linux基金會在2015年12月主導發起該項目, 成員包括金融,銀行,物聯網,供應鏈,製造和科技行業的領頭羊。docker
咱們知道智能合約比較成功的就是以太坊了。以太坊主要是公有鏈,其實對企業應用來講並非特別合適,並且自己並無權限控制功能,面向企業的,主要仍是HyperLedger Fabric,固然還有R3的Corda。這裏咱們主要是講Fabric。 Fabric是一個面向企業應用的區塊鏈框架,基於Fabric的開發能夠粗略分爲幾個層面: 1. 參與Fabric的底層開發,這主要是fabric,fabric-ca和sdk等核心組件。 2. 參與Fabric周邊生態的開發,如支持如支持fabric的工具explorer, composer等。 3. 利用fabric平臺開發應用,這就是利用fabirc提供的各類sdk來爲應用服務(應用開發) 大部分企業會參與2-3的內容,以3爲主來服務應用場景,以2爲輔。由於如今除了區塊鏈核心功能還沒有完善外,對區塊鏈的管理,運維,監控,測試,優化,調試等工具很是匱乏。企業將不得不面對本身開發一些工做。數據庫
fabric官方推薦的開發環境是基於docker搭建的,使用docker搭建須要一下前置條件:json
這裏使用的是Ubuntu 16.04.4版本bootstrap
1.安裝go及環境變量配置 (1)下載最新版本的go二進制文件ubuntu
$ wget https://dl.google.com/go/go1.9.2.linux-amd64.tar.gz
(2)解壓文件
$ sudo tar -C /usr/local -xzf go1.9.2.linux-amd64.tar.gz
(3)配置環境變量
vim ~/.profile
添加如下內容:
export PATH=$PATH:/usr/local/go/bin export GOROOT=/usr/local/go export GOPATH=$HOME/go export PATH=$PATH:$HOME/go/bin
編輯保存並退出vi後,記得使這些環境變量生效
source ~/.profile
2.安裝docker Fabric的chaincode是運行在docker裏的。 (1) 因爲apt官方庫裏的docker版本可能比較舊,因此先卸載可能存在的舊版本:
sudo apt-get remove docker docker-engine docker-ce docker.io
(2) 更新apt包索引:
sudo apt-get update
(3) 安裝如下包以使apt能夠經過HTTPS使用存儲庫(repository):
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
(4) 添加Docker官方的GPG密鑰:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - 備註:可驗證祕鑰指紋 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88 使用以下命令驗證: sudo apt-key fingerprint 0EBFCD88
(5) 使用下面的命令來設置stable存儲庫:
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
(6) 再更新一下apt包索引:
sudo apt-get update
(7) 安裝最新版本的Docker CE:
sudo apt-get install -y docker-ce 注意:在生產系統上,可能會須要應該安裝一個特定版本的Docker CE,而不是老是使用最新版本: 列出可用的版本:apt-cache madison docker-ce 選擇要安裝的特定版本,第二列是版本字符串,第三列是存儲庫名稱,它指示包來自哪一個存儲庫,以及擴展它的穩定性級別。要安裝一個特定的版本,將版本字符串附加到包名中,並經過等號(=)分隔它們: sudo apt-get install docker-ce=<VERSION>
(8) 測試是否安裝成功
docker --version
(9) 使用阿里提供的鏡像,不然後面下載Fabric鏡像會很是慢 cd到/etc/docker目錄下,建立文件daemon.json,輸入下面的內容:
{ "registry-mirrors": ["https://obou6wyb.mirror.aliyuncs.com"] }
保存並退出,接着執行:
sudo systemctl daemon-reload sudo systemctl restart docker
(10) 查看docker服務是否啓動:
systemctl status docker
(11) 若未啓動,則啓動docker服務:
sudo service docker start或者sudo systemctl start docker
3.安裝最新版本的Docker-compose (1) Docker-compose是支持經過模板腳本批量建立Docker容器的一個組件。在安裝Docker-Compose以前,須要安裝Python-pip,運行腳本:
sudo apt-get install python-pip
(2) 安裝Docker-compose:
pip install docker-compose
(3) 驗證是否成功:
sudo docker-compose --version
(這部分還能夠看下此篇文章http://www.javashuo.com/article/p-hrkpytiz-kv.html)
4.Fabric源碼分享 (1) 新建存放測試、部署代碼的目錄。
mkdir -p ~/go/src/github.com/hyperledger/
(2) cd到剛建立的目錄
cd ~/go/src/github.com/hyperledger
(3) 下載Fabric,這裏使用使用git命令下載源碼:
git clone https://github.com/hyperledger/fabric.git
特別注意這裏: 直接使用上面的git clone下載會很是慢,由於github.global.ssl.fastly.Net域名被限制了。只要找到這個域名對應的ip地址,而後在hosts文件中加上ip–>域名的映射,刷新DNS緩存就能夠了。 解決辦法: 步驟【1】:查詢域名global-ssl.fastly.Net
和 github.com
公網地址 可使用https://www.ipaddress.com/ 這個查。 分別查找下面這兩個域名的ip地址:
github.global.ssl.fastly.net github.com
步驟【2】:將ip地址添加到hosts文件
sudo vim /etc/hosts
在文件下方輸入下面內容並保存,前面兩個ip就是咱們剛纔上面查找到的ip:
151.101.185.194 github.global.ssl.fastly.net 192.30.253.113 github.com
步驟【3】:修改完hosts還不會當即生效,你須要刷新DNS緩存,告訴電腦個人hosts文件已經修改了。 輸入指令: sudo /etc/init.d/networking restart 便可,若是不行也能夠嘗試重啓一下電腦。 接下來再去git clone就快不少了。
(4) 因爲Fabric一直在更新,新版本的並不穩定,全部咱們並不須要最新的源碼,須要切換到v1.0.0版本的源碼:
git checkout v1.0.0
5.下載Fabric Docker鏡像 (1) 前面步驟4下載完成後,咱們能夠看到當前工做目錄(~/go/src/github.com/hyperledger/)下多了一個fabric的文件夾, 接下來咱們cd到~/go/src/github.com/hyperledger/fabric/examples/e2e_cli目錄下執行:
source download-dockerimages.sh -c x86_64-1.0.0 -f x86_64-1.0.0
(注:必定要下載完全部鏡像而且鏡像版本要和Fabric版本一致如何沒有下載問繼續執行source download-dockerimages.sh命令直到在完如圖全部鏡像),執行完全部會用到的Fabric docker鏡像都會下載下來了。 運行如下命令檢查下載的鏡像列表:
docker images
注意:若是下載時遇到權限問題,須要切換到root用戶下:su root (2) 重啓docker
service docker restart
6.測試Fabric環境是否成功 在~/go/src/github.com/hyperledger/fabric/examples/e2e_cli下執行以下命令啓動測試
./network_setup.sh up
這個指令具體進行了以下操做:
運行完若是出現下圖所示,說明整個Fabric網絡已經通了。
1. 若是發現運行 ./network_setup.sh up命令 後提示在...fabric/release/linux-amd64/bin文件夾下找不到指定文件 解決辦法: 能夠在~/go/src/github.com/hyperledger/fabric/scripts文件下找到 bootstrap.1.0.0.sh文件,手動運行它 ./bootstrap.1.0.0.sh, 此時能夠在當前文件夾生成一個bin文件夾,bin裏面的文件就是咱們須要的,將它拷貝到前面的...fabric/release/linux-amd64/bin文件夾下
2. 若是出現:Error on outputBlock: Error writing genesis block: open ./channel-artifacts/genesis.block: is a directory不能生成創世塊的錯誤。 解決辦法: 能夠在~/go/src/github.com/hyperledger/fabric/examples/e2e_cli/channel-artifacts目錄下,將genesis.block這個目錄刪除,rm -rf genesis.block/
3. 若是出現:.ERROR: for orderer.example.com Cannot start service orderer.example.com: b'OCI runtime create failed: container_linux.go:348: starting container process caused "process_linux.go:402: container init caused \"rootfs_linux.go:58: 解決辦法: 執行./network_setup.sh down 清除網絡後再啓動便可
fabric提供了SDK和CLI兩種交互方式,這裏咱們使用的是CLI。 這裏咱們使用官方提供的小例子進行測試,在官方例子中,channel名字是mychannel,鏈碼(智能合約)的名字是mycc。 首先要登陸到CLI這個容器中,才能執行Fabric的CLI命令:
docker exec -it cli bash
這時用戶名變爲root@caa22f87a5bf,當前目錄變爲/opt/go/src/github.com/hyperledger/fabric/peer#,接着可執行peer命令,體驗區塊鏈的命令行使用方式。 1.查看a帳戶的餘額
peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
此時咱們能夠看到控制檯輸出有:
Query Result: 90
這裏90就是a帳戶的餘額 2.調用鏈碼,轉帳 這裏咱們讓b帳戶向a帳戶轉帳10:
peer chaincode invoke -o orderer.example.com:7050 --tls true --cafile /opt/go/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n mycc -c '{"Args":["invoke","b","a","10"]}'
轉帳成功後,咱們能夠看到有輸出以下提示:
DEBU 009 ESCC invoke result: version:1 response:<status:200 message:"OK"
接下來咱們使用前面的命令繼續查看a帳戶的餘額,輸出結果以下:
Query Result: 100
很明顯咱們已經轉帳成功了。 退出cli容器: 直接執行
exit
最後若是咱們要關閉Fabric網絡,cd到~/go/src/github.com/hyperledger/fabric/examples/e2e_cli下(注意這裏的路徑按本身前面建立的,不必定要和我同樣),執行:
./network_setup.sh down
參看連接: https://blog.csdn.net/github_34965845/article/details/80610060 https://www.cnblogs.com/preminem/p/7729497.html https://www.cnblogs.com/gao90/p/8692642.html http://www.javashuo.com/article/p-hrkpytiz-kv.html https://blog.csdn.net/iflow/article/details/77951610 https://blog.csdn.net/vivian_ll/article/details/79966210