Fabric 环境搭建时bootstrap.sh帮我们做了什么?
00 導(dǎo)言
? ? ??在上一講中,我們手把手帶著大家一步一步《在Ubuntu 18.04上搭建HyperLedger Fabric 1.2.0 環(huán)境》,其中有兩個(gè)步驟是:下載bootstrap.sh引導(dǎo)腳本和執(zhí)行該引導(dǎo)腳本。很多朋友執(zhí)行這兩個(gè)步驟時(shí)可能會(huì)有疑問(wèn):為什么要下載這個(gè)腳本?執(zhí)行這個(gè)腳本的作用是什么?
? ? ??別急,接下來(lái)我們會(huì)深入分析一下這個(gè)文件的源碼,探個(gè)究竟。不過(guò)在分析之前,我們先來(lái)回顧一下上一講是怎么下載和執(zhí)行這個(gè)腳本的。
02 如何下載和執(zhí)行bootstrap.sh腳本
? ? ??我們先來(lái)看看官方是怎么說(shuō)的。官方提供的命令如下:
$ curl -sSL http://bit.ly/2ysbOFE | bash -s 1.2.0 1.2.0 0.4.10? ? ??我們來(lái)解釋一下這條命令:curl -sSL http://bit.ly/2ysbOFE,這條命令是通過(guò)請(qǐng)求短鏈接http://bit.ly/2ysbOFE,該短鏈接會(huì)重定向到真正的目標(biāo)地址,目標(biāo)地址會(huì)響應(yīng)我們要的內(nèi)容,響應(yīng)的內(nèi)容就是bootstrap.sh文件里的內(nèi)容。很不幸的是,上面的短鏈接已經(jīng)失效,不過(guò)我們已經(jīng)找到了一個(gè)有效的長(zhǎng)鏈接:https://raw.githubusercontent.com/hyperledger/fabric/release-1.2/scripts/bootstrap.sh,用它替換掉短鏈接就可以了。于是我們得到了下面的命令:
$ curl -sSL https://raw.githubusercontent.com/hyperledger/fabric/release-1.2/scripts/bootstrap.sh | bash -s 1.2.0 1.2.0 0.4.10? ? ??這里要解釋一下-sSL的作用,小s指的是沉默模式,表示不輸出請(qǐng)求過(guò)程的任何信息,只輸出最終響應(yīng)的內(nèi)容,大S指的是如果有錯(cuò)顯示出來(lái),L指的是短鏈接要進(jìn)行重定向。
? ? ??接下來(lái)是一根豎線 |,學(xué)過(guò)linux的朋友應(yīng)該都知道,這根豎線表示管道,意思是上一個(gè)命令輸出的內(nèi)容,交給下一個(gè)命令去執(zhí)行,這里表示交給bash去執(zhí)行。
? ? ??bash 后面是-s ,-s后面的所有內(nèi)容將做為參數(shù)傳給bootstrap.sh。1.2.0 1.2.0 0.4.10這3個(gè)對(duì)應(yīng)的是 Fabric, Fabric-ca 和 thirdparty(couchdb, kafka and zookeeper) 這三個(gè)模塊的版本。如果我們想要安裝更早的版本,我們可以修改它們,腳本程序會(huì)知道下載對(duì)應(yīng)的版本。
? ? ??上面實(shí)際上是兩條命令通過(guò)管道( | )連接在一起執(zhí)行,實(shí)際上我們也可以將它們分開(kāi):
$ curl -sSL https://raw.githubusercontent.com/hyperledger/fabric/release-1.2/scripts/bootstrap.sh -o bootstrap.sh $ chmod 755 bootstrap.sh $ sudo ./bootstrap.sh 1.2.0 1.2.0 0.4.1003 bootstrap.sh到底幫我們做了什么?
? ? ??bootstrap.sh實(shí)際上幫我們作了如下幾件事情:
? ? ??1. 從github上克隆 hyperledger/fabric-samples并進(jìn)入該目錄,然后檢出適當(dāng)?shù)陌姹?
? ? ??2. 在fabric-samples目錄下安裝特定平臺(tái)的 Hyperledger Fabric 二進(jìn)制可執(zhí)行文件 和配置文件
? ? ??3.下載 指定版本的Hyperledger Fabric 的docker鏡像
? ? ?? 整個(gè)腳本幫我們做了上面這三件事情,bootstrap.sh中對(duì)應(yīng)的代碼如下:
218 if [ "$SAMPLES" == "true" ]; then219 echo220 echo "Installing hyperledger/fabric-samples repo"221 echo222 samplesInstall223 fi224 if [ "$BINARIES" == "true" ]; then225 echo226 echo "Installing Hyperledger Fabric binaries"227 echo228 binariesInstall229 fi230 if [ "$DOCKER" == "true" ]; then231 echo232 echo "Installing Hyperledger Fabric docker images"233 echo234 dockerInstall235 fi? ? ??其中samplesInstall對(duì)應(yīng)的是克隆fabric-samples,binariesInstall對(duì)應(yīng)的是安裝二進(jìn)制文件,dockerInstall對(duì)應(yīng)的是下載docker鏡像。
接下來(lái)我們分析一下它們對(duì)應(yīng)的代碼部分。
56 samplesInstall() { 57 # clone (if needed) hyperledger/fabric-samples and checkout corresponding 58 # version to the binaries and docker images to be downloaded 59 if [ -d first-network ]; then 60 # if we are in the fabric-samples repo, checkout corresponding version 61 echo "===> Checking out v${VERSION} branch of hyperledger/fabric-samples" 62 git checkout v${VERSION} 63 elif [ -d fabric-samples ]; then 64 # if fabric-samples repo already cloned and in current directory, 65 # cd fabric-samples and checkout corresponding version 66 echo "===> Checking out v${VERSION} branch of hyperledger/fabric-samples" 67 cd fabric-samples && git checkout v${VERSION} 68 else 69 echo "===> Cloning hyperledger/fabric-samples repo and checkout v${VERSION}" 70 git clone -b master https://github.com/hyperledger/fabric-samples.git && cd fabric-samples && git checkout v${VERSION} 71 fi 72 }
? ? ??我們可以看到第70行代碼,這行代碼的作用就是 從github上克隆 hyperledger/fabric-samples,然后進(jìn)入該目錄,并檢出指定的版本。
? ? ??該倉(cāng)庫(kù)的地址是:
https://github.com/hyperledger/fabric-samples.git05 第二件事:安裝二進(jìn)制可執(zhí)行文件 和配置文件
? ? ?? 對(duì)應(yīng)bootstrap.sh中的binariesInstall函數(shù),代碼如下:
133 binariesInstall() { 134 echo "===> Downloading version ${FABRIC_TAG} platform specific fabric binaries" 135 binaryDownload ${BINARY_FILE} https://nexus.hyperledger.org/content/repositories/releases/org/hyperledger/fabric/hyperledger-fabric/${ARCH}-${VERSION}/${BINARY_FILE} 136 if [ $? -eq 22 ]; then 137 echo 138 echo "------> ${FABRIC_TAG} platform specific fabric binary is not available to download <----" 139 echo 140 fi 141 142 echo "===> Downloading version ${CA_TAG} platform specific fabric-ca-client binary" 143 binaryDownload ${CA_BINARY_FILE} https://nexus.hyperledger.org/content/repositories/releases/org/hyperledger/fabric-ca/hyperledger-fabric-ca/${ARCH}-${CA_VERSION}/${CA_BINARY_FILE} 144 if [ $? -eq 22 ]; then 145 echo 146 echo "------> ${CA_TAG} fabric-ca-client binary is not available to download (Available from 1.1.0-rc1) <----" 147 echo 148 fi 149 }? ? ??可以看到第135行和第143行分別調(diào)用binaryDownload函數(shù)去下面這兩個(gè)地址下載fabric和fabric-ca相應(yīng)的二進(jìn)制文件打成的壓縮包。實(shí)際上我們也可以使用瀏覽器或者下載軟件單獨(dú)下載它們。
1.https://nexus.hyperledger.org/content/repositories/releases/org/hyperledger/fabric/hyperledger-fabric/linux-amd64-1.2.0/hyperledger-fabric-linux-amd64-1.2.0.tar.gz
2.https://nexus.hyperledger.org/content/repositories/releases/org/hyperledger/fabric-ca/hyperledger-fabric-ca/linux-amd64-1.2.0/hyperledger-fabric-ca-linux-amd64-1.2.0.tar.gz
? ? ??我們接下來(lái)看看binaryDownload函數(shù):
113 binaryDownload() { 114 local BINARY_FILE=$1 115 local URL=$2 116 echo "===> Downloading: " ${URL} 117 # Check if a previous failure occurred and the file was partially downloaded 118 if [ -e ${BINARY_FILE} ]; then 119 echo "==> Partial binary file found. Resuming download..." 120 binaryIncrementalDownload ${BINARY_FILE} ${URL} 121 else 122 curl ${URL} | tar xz || rc=$? 123 if [ ! -z "$rc" ]; then 124 echo "==> There was an error downloading the binary file. Switching to incremental download." 125 echo "==> Downloading file..." 126 binaryIncrementalDownload ${BINARY_FILE} ${URL} 127 else 128 echo "==> Done." 129 fi 130 fi 131 }? ? ??可以看到第122行,執(zhí)行curl命令去下載tar包,并用tar命令解壓。解壓后的命令出現(xiàn)在bin目錄下。實(shí)際上,這些二進(jìn)制命令我們也可以通過(guò)編譯hyperledger fabric的源碼生成!后面我們有文章會(huì)講到怎么編譯源碼去生成這些二進(jìn)制文件。
-rwxrwxr-x 1 1001 1001 16784432 7月 4 03:04 configtxgen* -rwxrwxr-x 1 1001 1001 17925784 7月 4 03:04 configtxlator* -rwxrwxr-x 1 1001 1001 8660280 7月 4 03:04 cryptogen* -rwxrwxr-x 1 1001 1001 17611704 7月 4 03:04 discover* -rwxrwxr-x 1 1001 1001 14298688 7月 4 04:41 fabric-ca-client* -rwxrwxr-x 1 1001 1001 817 7月 4 03:04 get-docker-images.sh* -rwxrwxr-x 1 1001 1001 7152824 7月 4 03:04 idemixgen* -rwxrwxr-x 1 1001 1001 22075240 7月 4 03:04 orderer* -rwxrwxr-x 1 1001 1001 29880000 7月 4 03:04 peer*? ? ??我們解釋一下其中這些命令的作用:
| peer | 負(fù)責(zé)啟動(dòng)節(jié)點(diǎn),存儲(chǔ)區(qū)塊鏈數(shù)據(jù),運(yùn)行維護(hù)鏈碼 |
| order | 負(fù)責(zé)啟動(dòng)排序節(jié)點(diǎn),對(duì)交易進(jìn)行排序,并將排序好的交易打包成模塊 |
| cryptogen | 生成組織結(jié)構(gòu)和身份文件 |
| configtxgen | 生成配置區(qū)塊和配置交易 |
| configtxlator | 解讀配置信息 |
06 第三件事:下載docker鏡像
? ? ??對(duì)應(yīng)bootstrap.sh中的dockerInstall函數(shù),代碼如下:
151 dockerInstall() { 152 which docker >& /dev/null 153 NODOCKER=$? 154 if [ "${NODOCKER}" == 0 ]; then 155 echo "===> Pulling fabric Images" 156 dockerFabricPull ${FABRIC_TAG} 157 echo "===> Pulling fabric ca Image" 158 dockerCaPull ${CA_TAG} 159 echo "===> Pulling thirdparty docker images" 160 dockerThirdPartyImagesPull ${THIRDPARTY_TAG} 161 echo 162 echo "===> List out hyperledger docker images" 163 docker images | grep hyperledger* 164 else 165 echo "=========================================================" 166 echo "Docker not installed, bypassing download of Fabric images" 167 echo "=========================================================" 168 fi 169 }? ? ??可以看到第156行,第158行,第160行,分別調(diào)用了dockerFabricPull 、dockerCaPull 、dockerThirdPartyImagesPull 三個(gè)函數(shù)去拉取相應(yīng)的docker鏡像并打標(biāo)簽。最后下載完還執(zhí)行docker images | grep hyperledger*(第163行)查看是否已下載好下面所列的鏡像。
hyperledger/fabric-ca 1.2.0 66cc132bd09c 4 weeks ago 252MB hyperledger/fabric-tools 1.2.0 379602873003 4 weeks ago 1.51GB hyperledger/fabric-ccenv 1.2.0 6acf31e2d9a4 4 weeks ago 1.43GB hyperledger/fabric-orderer 1.2.0 4baf7789a8ec 4 weeks ago 152MB hyperledger/fabric-peer 1.2.0 82c262e65984 4 weeks ago 159MB hyperledger/fabric-zookeeper 0.4.10 2b51158f3898 4 weeks ago 1.44GB hyperledger/fabric-kafka 0.4.10 936aef6db0e6 4 weeks ago 1.45GB hyperledger/fabric-couchdb 0.4.10 3092eca241fc 4 weeks ago 1.61GB hyperledger/fabric-baseos amd64-0.4.10 52190e831002 4 weeks ago 132MB hyperledger/fabric-ca x86_64-1.0.4 8e691b3509bf 9 months ago 238MB hyperledger/fabric-javaenv x86_64-1.0.4 a517b70135c7 9 months ago 1.41GB? ? ??dockerFabricPull函數(shù)代碼如下:
28 dockerFabricPull() {29 local FABRIC_TAG=$130 for IMAGES in peer orderer ccenv tools; do31 echo "==> FABRIC IMAGE: $IMAGES"32 echo33 docker pull hyperledger/fabric-$IMAGES:$FABRIC_TAG34 docker tag hyperledger/fabric-$IMAGES:$FABRIC_TAG hyperledger/fabric-$IMAGES35 done36 }? ? ??dockerCaPull 函數(shù)代碼如下:
48 dockerCaPull() {49 local CA_TAG=$150 echo "==> FABRIC CA IMAGE"51 echo52 docker pull hyperledger/fabric-ca:$CA_TAG53 docker tag hyperledger/fabric-ca:$CA_TAG hyperledger/fabric-ca54 }? ? ??dockerThirdPartyImagesPull 函數(shù)代碼如下:
38 dockerThirdPartyImagesPull() {39 local THIRDPARTY_TAG=$140 for IMAGES in couchdb kafka zookeeper; do41 echo "==> THIRDPARTY DOCKER IMAGE: $IMAGES"42 echo43 docker pull hyperledger/fabric-$IMAGES:$THIRDPARTY_TAG44 docker tag hyperledger/fabric-$IMAGES:$THIRDPARTY_TAG hyperledger/fabric-$IMAGES45 done46 }? ? ??上面dockerThirdPartyImagesPull 函數(shù)內(nèi)部使用了一個(gè)for循環(huán)(第40行)挨個(gè)去下載couchdb、kafka、zookeeper三個(gè)鏡像。
? ? ??部分鏡像說(shuō)明如下:
| hyperledger/fabric-tools | 可選 | 包含crytogen、configtxgen、configtxlator我第二次工具的鏡像文件 |
| hyperledger/fabric-couchdb | 可選 | CouchDB的數(shù)據(jù)庫(kù)鏡像文件、狀態(tài)數(shù)據(jù)庫(kù)選擇CouchDB的時(shí)候才需要 |
| hyperledger/fabric-kafka | 可選 | Kafka的鏡像文件 |
| hyperledger/fabric-zookeeper | 可選 | Zookeeper的鏡像文件 |
| hyperledger/fabric-peer | 必選 | Peer節(jié)點(diǎn)的鏡像文件 |
| hyperledger/fabric-orderer | 必選 | 排序服務(wù)節(jié)點(diǎn)的鏡像文件 |
| hyperledger/fabric-javaenv | 可選 | java鏈碼的基礎(chǔ)鏡像文件 |
| hyperledger/fabric-ccenv | 必選 | Golang鏈碼的基礎(chǔ)鏡像文件 |
| hyperledger/fabric-ca | 可選 | fabric-ca的鏡像文件,用到fabric-ca的時(shí)候才需要 |
07 總結(jié)
? ? ??通過(guò)上面的介紹,相信大家已經(jīng)了解了bootstrap.sh的作用了。讀者可能會(huì)納悶了,為啥要花這么大篇幅來(lái)介紹這個(gè)腳本文件??吃飽了撐的嗎。這是因?yàn)槲覀兺ㄟ^(guò)分析這個(gè)文件,知道了具體內(nèi)部干了什么,知其然也要知其所以然嘛。這樣,我們也可以不需要這個(gè)腳本文件,手動(dòng)就能把環(huán)境搭建好!!
08 參考資料
1.https://hyperledger-fabric.readthedocs.io/en/release-1.2/install.html
2.《深度探索區(qū)塊鏈:Hyperledger技術(shù)與應(yīng)用》作者: 張?jiān)鲵E / 董寧 / 朱軒彤 / 陳劍雄 出版社: 機(jī)械工業(yè)出版社
3. 《區(qū)塊鏈開(kāi)發(fā)實(shí)戰(zhàn) Hyperledger Fabric關(guān)鍵技術(shù)與案例分析》作者: 馮翔 劉濤 吳壽鶴 周廣益 出版社:機(jī)械工業(yè)出版社
4. 《HyperLedger Fabric開(kāi)發(fā)實(shí)戰(zhàn)快速掌握區(qū)塊鏈技術(shù)》作者:楊毅 出版社: 電子工業(yè)出版社
總結(jié)
以上是生活随笔為你收集整理的Fabric 环境搭建时bootstrap.sh帮我们做了什么?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 创业者应警惕可疑的成功
- 下一篇: 3月25日助学作业答案