最近在準備開始學習區塊鏈的超級帳本編程,可是在搭建Hyperledger Fabric的時候就出現了不少問題,查閱網上的其餘人寫的博客,可是不多可以完整或者正確的將完整的安裝過程表達清楚,所以將本身的環境搭建過程以及出現的問題寫下來,但願能對其餘人起到一些幫助。
其中在搭建過程參考了其餘人的部分東西:
javascript
感謝博客:https://blog.csdn.net/qq_43681877/article/details/107399250
官方文檔參考
https://hyperledger-fabric.readthedocs.io/en/latest/test_network.html
html
首先說明一下本身的系統環境吧:
採用虛擬機作的操做系統。
內存分配了3g
硬盤分配了30g
Ubuntu16.04.6
java
如何經過虛擬機安裝ubuntu操做系統就不說了,請自行查找資料。
接下來就是正式開始搭建環境了。我這裏安裝的是2.2.0版本。
一、按照Hyperledger Fabric官方提供的文檔來講,首先在你的系統中應該安裝着最新版本的git。對於ubuntu來講,能夠按照如下方式來安裝:
linux
apt-get install git 對於Ubuntu,此PPA提供最新的穩定上游Git版本 add-apt-repository ppa:git-core/ppa apt update; apt install git
這個就不具體進行截圖了,也忘記截圖了。
在安裝完畢以後,輸入來查看安裝的git版本。
git
git version
若是出現如下結果,則證實安裝成功。
二、在完成git的安裝後,應該繼續安裝最新版本的cURL,直接在控制檯輸入命令便可。命令以下:
github
sudo apt-get update
sudo apt install curl
安裝成功的截圖也忘記保存了,若是沒有安裝成功,具體見百度吧。這塊也不是啥重點的地方。
三、接下來就是比較重要的了,安裝 docker和docker-compose。若是打算在Hperledger Fabric 2.x上作開發或者相關的操做,這裏須要安裝的docker版本應該是docker 17.06.2-ce或者更高的版本。我這裏安裝的是docker 19.03.12-ce版本。
首先,若是安裝過docker,應該先卸載舊的版本,具體命令以下:
docker
sudo apt-get remove docker docker-engine docker.io containerd runc
若是以前沒有安裝過docker的能夠跳過這一步。接下來就是安裝docker
運行安裝的命令包,
shell
sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ software-properties-common
而後添加docker的官方GPG密鑰編程
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
再繼續設置stable穩定的倉庫(stable穩定版每季度發佈一次,Edge版每個月一次)json
sudo add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable"
更新目錄
sudo apt-get update
安裝docker-ce
sudo apt-get install docker-ce
安裝完畢以後,能夠輸入如下命令來驗證安裝是否成功:
docker version
若是出現下面的截圖,安裝成功。
因爲docker命令每次須要使用sudo權限來運行,每次都輸入sudo很不方便。爲了方便將當前用戶加入docker用戶組,之後就不用這麼麻煩了。
sudo usermod -aG docker ${USER}
從新登陸便可。
在每次使用docker pull命令pull鏡像時,docker daemon都會去 Docker Hub 拉取鏡像,網速較慢甚至在國內訪問 Docker Hub 有時會遇到問題,因此咱們能夠配置鏡像加速器。具體操做以下:
sudo gedit /etc/docker/daemon.json 輸入如下配置 { "registry-mirrors": ["https://obou6wyb.mirror.aliyuncs.com"] } 保存並退出
重啓docker守護進程
sudo service docker restart
驗證安裝是否成功
docker run hello-world
出現下面截圖,並輸出紅色標記的文字,即爲安裝成功。
安裝dockerp-compose
#1)下載docker-compose $ sudo curl -L https://github.com/docker/compose/releases/download/1.17.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose #2)受權 $ sudo chmod +x /usr/local/bin/docker-compose #3)查看版本信息 $ docker-compose --version
出現下列狀況即爲安裝成功。此時Hyperledger Fabric環境搭建已經算是完成了三分之一。
四、因爲Hyperledger Fabric須要Go環境,接下來還有搭建Go語言環境。
你們能夠安裝本身的虛擬機的版本去GoLang官網上下載相應的版本。我這是提早在windows下載好保存在虛擬機和windows10的共享文件夾中的。只需將下載的GoLang文件拷貝到虛擬機中,進行安裝便可。具體的安裝步驟以及配置環境變量的方法你們就自行百度吧,基本個人方法和網上的也是大同小異。主要是忘記保存相關的截圖了。不過必定得注意GOPATH和GOROOT的配置,若是配置很差,可能在接下來會出現問題。
敲黑板,重點來了。
五、肯定您機器上要放置fabric-samples 存儲庫的位置,而後在終端窗口中輸入該目錄(通常把存儲庫放在剛剛配置的Go工做空間下的src文件夾下)。後面的命令將執行如下步驟:
-
若是須要,克隆hyperledger / fabric-samples存儲庫
-
簽出適當的版本標籤
-
將Hyperledger Fabric平臺特定的二進制文件和配置文件安裝爲指定到Fabric-samples的/ bin和/ config目錄中的版本
-
下載指定版本的Hyperledger Fabric docker映像
-
準備就緒後,在要安裝Fabric Samples和二進制文件的目錄中,繼續執行命令如下拉二進制文件和映像。
我是這樣作的:
首先建立存放代碼的文件夾:
cd #cd 不加內容是默認返回Home文件夾 mkdir -p GoPath/src/github.com/hyperledger/ #進入剛剛建立的文件夾內 cd GoPath/src/github.com/hyperledger/
而後從github上拉取源碼:
git clone "https://github.com/hyperledger/fabric.git" cd fabric/ cd scripts/ #這一步會下載官方的例子以及所須要的Docker鏡像 #下載是比較慢的,若是出現錯誤或者長時間沒有速度只須要從新運行就能夠了 sudo ./bootstrap.sh
這一步是很是慢的,耐心等待就好,若是中途終止,從新執行最後一行命令便可,知道下載完畢。
所有下載完成後,會多出一個fabric-samples文件夾,這是個測試網絡樣例可讓你體驗或者測試。
進入到fabric-samples文件夾
cd fabric-samples
切換到test-network:
cd test-network:
如今便開始啓動網絡了:
./network.sh up createChannel
會出現一大堆上面的東西,等看到下面的這個的時候,就成功了。
加下來就須要在頻道上啓動鏈碼
./network.sh deployCC
又是一大堆,可能沒截全。
注意:在上面的時候可能會出現一個關於端口:7050的錯誤,忘記截圖了:
若是出現這個問題,你先去查看一下7050這個端口是否開放,通常來講這個錯誤是端口沒開放的緣由,本身百度個一下怎麼永久開放這個端口就行。
在執行上面的命令時,若是出現這個問題
通常來講就是訪問沒法下載,此時實在一個Go代理便可,以下:
go env -w GO111MODULE=on go env -w GOPROXY=https://goproxy.cn,direct
再從新執行便可。
接下來就是和官方文檔寫的沒啥區別了,我也就再也不寫了,直接引用官網教程了
啓動測試網絡後,可使用peerCLI與網絡進行交互。peerCLI容許您從CLI調用已部署的智能合約,更新通道或安裝和部署新的智能合約。
確保您正在從test-network目錄進行操做。若是按照說明安裝樣本,二進制文件和Docker映像,則能夠在 存儲庫peer的bin文件夾中找到二進制文件fabric-samples。使用如下命令將這些二進制文件添加到您的CLI路徑:
export PATH=${PWD}/../bin:$PATH
您還須要將設置FABRIC_CFG_PATH爲指向存儲庫中的core.yaml文件fabric-samples:
export FABRIC_CFG_PATH=$PWD/../config/
如今,您能夠設置環境變量,以容許您以peer Org1的形式操做CLI:
Environment variables for Org1
export CORE_PEER_TLS_ENABLED=true export CORE_PEER_LOCALMSPID="Org1MSP" export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp export CORE_PEER_ADDRESS=localhost:7051 該CORE_PEER_TLS_ROOTCERT_FILE和CORE_PEER_MSPCONFIGPATH環境變量指向的ORG1加密材料organizations文件夾。
若是您用於安裝和啓動資產轉移(基本)鏈碼,則能夠調用(Go)鏈碼的功能以在分類賬上放置資產的初始列表(例如,若是使用打字稿或javascript ,則將調用相應鏈碼的功能)。`
./network.sh deployCCInitLedger./network.sh deployCC -l javascriptinitLedger`
運行如下命令以使用資產初始化分類賬:
peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n basic --peerAddresses localhost:7051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses localhost:9051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"function":"InitLedger","Args":[]}'
若是成功,您應該看到相似如下的輸出:
-> INFO 001 Chaincode invoke successful. result: status:200
如今,您能夠從CLI查詢分類賬。運行如下命令以獲取已添加到渠道分類賬的資產列表:
peer chaincode query -C mychannel -n basic -c '{"Args":["GetAllAssets"]}'
若是成功,您應該看到如下輸出:
[ {"ID": "asset1", "color": "blue", "size": 5, "owner": "Tomoko", "appraisedValue": 300}, {"ID": "asset2", "color": "red", "size": 5, "owner": "Brad", "appraisedValue": 400}, {"ID": "asset3", "color": "green", "size": 10, "owner": "Jin Soo", "appraisedValue": 500}, {"ID": "asset4", "color": "yellow", "size": 10, "owner": "Max", "appraisedValue": 600}, {"ID": "asset5", "color": "black", "size": 15, "owner": "Adriana", "appraisedValue": 700}, {"ID": "asset6", "color": "white", "size": 15, "owner": "Michel", "appraisedValue": 800} ]
當網絡成員要轉移或更改分類帳上的資產時,將調用鏈碼。使用如下命令經過調用資產轉移(基本)鏈碼來更改分類賬上資產的全部者:
peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n basic --peerAddresses localhost:7051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses localhost:9051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"function":"TransferAsset","Args":["asset6","Christopher"]}'
若是命令成功,您應該看到如下響應:
INFO 001 Chaincode invoke successful. result: status:200
由於資產轉移(基本)鏈碼的背書策略要求事務由Org1和Org2簽名,因此chaincode invoke命令須要同時針對這兩個目標 peer0.org1.example.com並peer0.org2.example.com使用該–peerAddresses 標誌。因爲已爲網絡啓用TLS,所以該命令還須要使用該–tlsRootCertFiles標誌爲每一個對等方引用TLS證書。
調用鏈代碼後,咱們可使用另外一個查詢來查看該調用如何更改了區塊鏈分類帳上的資產。因爲咱們已經查詢過Org1對等體,所以咱們能夠藉此機會查詢Org2對等體上運行的鏈碼。設置如下環境變量以做爲Org2進行操做:
Environment variables for Org2
export CORE_PEER_TLS_ENABLED=true export CORE_PEER_LOCALMSPID="Org2MSP" export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp export CORE_PEER_ADDRESS=localhost:9051
如今,您能夠查詢運行在上的資產轉移(基本)鏈碼peer0.org2.example.com:
peer chaincode query -C mychannel -n basic -c '{"Args":["ReadAsset","asset6"]}'
結果將顯示"asset6"已轉移到Christopher:
{"ID":"asset6","color":"white","size":15,"owner":"Christopher","appraisedValue":800}
中斷網絡
使用完測試網絡後,可使用如下命令關閉網絡:
./network.sh down
該命令將中止並刪除節點和鏈碼容器,刪除組織加密材料,並從Docker註冊表中移除鏈碼映像。該命令還會從之前的運行中刪除通道工件和docker卷,從而在遇到任何問題時容許您再次運行。
./network.sh up