EOSIO開發(一)使用Docker構建本地環境

前言

一直想學習EOS開發,但是不知道怎麼入門。最近從GitHub上下載了源碼,發現官方已經提供了完整的EOSIO開發入門教程,既然如此趕緊開始行動。今天是系列文章的第一篇,介紹如何使用Docker搭建本地環境。

選擇構建方式

官方支持兩種方式搭建本地環境

  • 使用源碼
  • 使用Docker

我個人首選Docker,因爲可以將與EOSIO相關的軟件、環境都封裝在一個鏡像中,不管是出了問題要回退,還是學完以後刪除相關的軟件,Docker都很方便。

所以在這篇文章中我就不介紹怎麼使用源碼構建了,有興趣的同學可以參考官方文檔的Building EOSIO章節。

前期準備

EOSIO的構成

在正式開始構建之前,我們先來了解EOSIO的組成部分,官方文檔對於EOSIO是這麼介紹的。

EOSIO comes with a number of programs(EOSIO由下面的程序構成):

  • nodeos - server-side blockchain node component(服務端的區塊鏈節點組件)
  • cleos - command line interface to interact with the blockchain(與區塊鏈進行交互的命令行界面)
  • keosd - EOSIO wallet(EOSIO錢包)
  • eosio-launcher - application to assist with deploying a multi-node blockchain network(用來協助部署一個多節點區塊鏈網絡的應用程序)

中文是我自己翻譯的,請原諒我的學渣翻譯水平,由於對EOSIO不瞭解,所以只能按照字面意思硬譯。翻譯完之後,我發現除了keosd(EOSIO錢包),其它幾個程序的作用仍然不明所以。

好在今天的任務是搭建環境,能夠將這幾個程序安裝起來並且正常運行就可以了,各個程序的具體作用後面再做深入學習。

開始構建

參考開發文檔,執行下面的命令,如果源碼已下載可忽略第一行。

git clone https://github.com/EOSIO/eos.git --recursive
cd eos/Docker
docker build . -t eosio/eos

開始執行以後不需要人工干預,讓機器自動運行就可以了,整個過程會持續半小時到一小時。

在執行的過程當中,我們來分析一下構建的步驟,打開eos/Docker/DockerFile 文件,可以看到下面的內容。

FROM eosio/builder as builder

RUN git clone -b master --depth 1 https://github.com/EOSIO/eos.git --recursive
&& cd eos
&& cmake -H. -B"/tmp/build" -GNinja -DCMAKE_BUILD_TYPE=Release -DWASM_ROOT=/opt/wasm -DCMAKE_CXX_COMPILER=clang++
-DCMAKE_C_COMPILER=clang -DCMAKE_INSTALL_PREFIX=/tmp/build -DSecp256k1_ROOT_DIR=/usr/local
&& cmake --build /tmp/build --target install

FROM ubuntu:16.04

RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get -y install openssl && rm -rf /var/lib/apt/lists/*
COPY --from=builder /usr/local/lib/* /usr/local/lib/
COPY --from=builder /tmp/build/bin /opt/eosio/bin
COPY --from=builder /tmp/build/contracts /contracts
COPY --from=builder /eos/Docker/config.ini /eos/genesis.json /
COPY nodeosd.sh /opt/eosio/bin/nodeosd.sh
ENV EOSIO_ROOT=/opt/eosio
RUN chmod +x /opt/eosio/bin/nodeosd.sh
ENV LD_LIBRARY_PATH /usr/local/lib
VOLUME /opt/eosio/bin/data-dir
ENV PATH /opt/eosio/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

整個構建過程可以分成下面幾個步驟:

  1. 下載eosio/builder鏡像。這個鏡像包含了EOSIO運行時需要的各種軟件和配置信息。
  2. 編譯生成可執行文件並安裝。這一步與直接使用源碼構建環境是一樣的,環境參數可能會有細微差別。
  3. 下載ubuntu鏡像。看來Docker環境使用的是Ubuntu系統16.04版本。
  4. 安裝軟件,拷貝配置信息,設置環境變量等等。

構建失敗

正當我以爲構建會很順利的時候,命令行上出現一條錯誤信息:
0406001

在執行"COPY --from=builder /eos/Docker/config.ini /eos/genesis.json /" 語句時出錯,eos/genesis.json文件不存在。

這就奇怪了,難道官方開發人員自己沒有跑過構建腳本?還是我本地環境的原因導致的錯誤?

我嘗試着將DockerFile中的"eos/genesis.json / “替換成"eos/genesis.json”,因爲結尾那個多餘的 / 看着非常可疑,與前面的地址中間隔了一個空格。

修改之後沒有報錯,構建成功並且生成了鏡像,但是在啓動鏡像時出現異常,此法不通。

我又另外嘗試了幾個方法,仍然無法生成正確的鏡像,無奈之下,我去GitHub上提交了一個Bug,看看官方開發人員怎麼說。

0406002

然並卵,只有兩個同病相憐的小夥伴說跟我遇到了一樣的問題,官方開發人員並沒有答覆。

0406003

生成不了正確的鏡像,難道我的EOS開發之旅要就此夭折?

當然不會,否則我也沒必要寫今天這篇文章了,正所謂條條大路通羅馬,自己生成不了鏡像,就拿官方已經生成好的。

下載eosio/eos鏡像

還記得前面執行的命令麼

docker build . -t eosio/eos

這句話的意思是讓我們生成一個名爲eosio/eos的鏡像文件,在Docker的命名習慣下,eosio/eos對應了Docker公共倉庫eosio命名空間下的eos倉庫。也就是說,EOS官方很有可能已經把編譯好的鏡像文件上傳到Docker公共倉庫中。

事實是否如此?我嘗試做了以下操作。

1.刪除本地異常的eosio/eos鏡像

docker rmi e7bc2acf31bf

0407001

2.下載eosio/eos鏡像

docker pull eosio/eos

0407002
還真讓我下載到了。

環境驗證

下載好了鏡像,我們來進一步驗證該鏡像是否可用,不管是自己生成的鏡像,還是從Docker倉庫下載的,下面的驗證步驟都是一樣的。

參考開發文檔Start nodeos docker container only章節。

1.啓動一個nodeos節點

docker run --name nodeos -p 8888:8888 -p 9876:9876 -t eosio/eos nodeosd.sh arg1 arg2

0407003
啓動成功

2.驗證nodeos節點是否可用

curl http://127.0.0.1:8888/v1/chain/get_info

0407004
驗證通過

3.同時啓動nodeos和kesod節點

docker volume create --name=nodeos-data-volume
docker volume create --name=keosd-data-volume
docker-compose up -d

0407005

這一步要注意幾點:

  • 執行命令前先把第1步啓動的nodeos節點停掉
  • docker-compose命令相關的配置信息在/eos/Docker/docker-compose.yml文件中
  • 官方文檔是說啓動nodeos和kesod兩個節點,但實際上還啓動了builder節點,經過測試這個節點是沒有用的,大家可以從docker-compose.yml文件中將builder節點相關的配置信息刪掉。

4.執行cleos命令

alias cleos=‘docker-compose exec keosd /opt/eosio/bin/cleos -H nodeosd’
cleos get info
cleos get account inita

0407007

注意head_block_num的值時10239,在前面驗證nodeos節點是否可用時,返回的head_block_num是711,這說明nodeos節點已經在自動生成區塊了。

至此環境驗證完畢,部署成功。

小結

整個環境構建過程並不複雜,開發文檔已經寫得比較清楚,順利的話1到2個小時可以完成。

不過大家還是要注意隨機應變,不能完全依賴開發文檔,比如當我遇到生成鏡像失敗的問題時,直接從Docker倉庫下載鏡像,這一點EOS的開發文檔中是沒有的。

另外還有一點要注意,開發文檔的內容變動很頻繁。我剛開始看文檔的時候,還是在 https://github.com/EOSIO/eos 裏面,不知什麼時候開始就變到 https://github.com/EOSIO/eos/wiki 裏面,目錄結構也變了。

最後還是要吐槽一下EOS官方開發人員

  • 既然可以直接下載鏡像,幹嘛還讓我們自己構建,太浪費時間。
  • 讓我們自己構建就算了,能不能測一下構建腳本,沒有BUG了再上傳?

今天中午在GitHub看到昨天提交的BUG已經Close,官方開發人員的回覆是:已經刪除genesis.json文件。我還沒有測試,希望這次修改之後不會再有新的問題。

0407006

系列文章

EOSIO開發(一)使用Docker構建本地環境

EOSIO開發(二)運行合約樣例

EOSIO開發(三)錢包、賬戶與賬戶權限之概念篇

EOSIO開發(四)- nodeos、keosd與cleos

EOSIO開發(五)- 錢包之實戰篇

EOSIO開發(六)- 賬戶之實戰篇

EOSIO開發(七)- 使用CLion查看EOS代碼

EOSIO開發(八)- 智能合約基礎概念

博文地址

https://www.taowong.com/blog/2018/06/23/eos-develop-1.html

發佈了27 篇原創文章 · 獲贊 10 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章