前言
一直想學習EOS開發(fā)汉嗽,但是不知道怎么入門欲逃。最近從GitHub上下載了源碼,發(fā)現(xiàn)官方已經(jīng)提供了完整的EOSIO開發(fā)入門教程饼暑,既然如此趕緊開始行動稳析。今天是系列文章的第一篇,介紹如何使用Docker搭建本地環(huán)境弓叛。
選擇構建方式
官方支持兩種方式搭建本地環(huán)境
- 使用源碼
- 使用Docker
我個人首選Docker彰居,因為可以將與EOSIO相關的軟件、環(huán)境都封裝在一個鏡像中撰筷,不管是出了問題要回退陈惰,還是學完以后刪除相關的軟件,Docker都很方便毕籽。
所以在這篇文章中我就不介紹怎么使用源碼構建了抬闯,有興趣的同學可以參考官方文檔的Building EOSIO章節(jié)。
前期準備
- 下載源碼(https://github.com/EOSIO/eos.git)
- 下載Docker(17.05或者以上版本)
- 下載docker-compose(1.10.0或者以上版本)
- 打開EOSIO Readme文件(https://github.com/EOSIO/eos/blob/master/Docker/README.md)
EOSIO的構成
在正式開始構建之前关筒,我們先來了解EOSIO的組成部分溶握,官方文檔對于EOSIO是這么介紹的。
EOSIO comes with a number of programs(EOSIO由下面的程序構成):
- nodeos - server-side blockchain node component(服務端的區(qū)塊鏈節(jié)點組件)
- cleos - command line interface to interact with the blockchain(與區(qū)塊鏈進行交互的命令行界面)
- keosd - EOSIO wallet(EOSIO錢包)
- eosio-launcher - application to assist with deploying a multi-node blockchain network(用來協(xié)助部署一個多節(jié)點區(qū)塊鏈網(wǎng)絡的應用程序)
中文是我自己翻譯的蒸播,請原諒我的學渣翻譯水平睡榆,由于對EOSIO不了解后频,所以只能按照字面意思硬譯纽谒。翻譯完之后,我發(fā)現(xiàn)除了keosd(EOSIO錢包),其它幾個程序的作用仍然不明所以征峦。
好在今天的任務是搭建環(huán)境,能夠將這幾個程序安裝起來并且正常運行就可以了溅蛉,各個程序的具體作用后面再做深入學習嫡意。
開始構建
參考開發(fā)文檔,執(zhí)行下面的命令劳曹,如果源碼已下載可忽略第一行奴愉。
git clone https://github.com/EOSIO/eos.git --recursive
cd eos/Docker
docker build . -t eosio/eos
開始執(zhí)行以后不需要人工干預,讓機器自動運行就可以了铁孵,整個過程會持續(xù)半小時到一小時锭硼。
在執(zhí)行的過程當中,我們來分析一下構建的步驟蜕劝,打開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
整個構建過程可以分成下面幾個步驟:
- 下載eosio/builder鏡像岖沛。這個鏡像包含了EOSIO運行時需要的各種軟件和配置信息暑始。
- 編譯生成可執(zhí)行文件并安裝。這一步與直接使用源碼構建環(huán)境是一樣的婴削,環(huán)境參數(shù)可能會有細微差別廊镜。
- 下載ubuntu鏡像“λ祝看來Docker環(huán)境使用的是Ubuntu系統(tǒng)16.04版本嗤朴。
- 安裝軟件,拷貝配置信息虫溜,設置環(huán)境變量等等雹姊。
構建失敗
正當我以為構建會很順利的時候,命令行上出現(xiàn)一條錯誤信息:
在執(zhí)行"COPY --from=builder /eos/Docker/config.ini /eos/genesis.json /" 語句時出錯衡楞,eos/genesis.json文件不存在吱雏。
這就奇怪了,難道官方開發(fā)人員自己沒有跑過構建腳本瘾境?還是我本地環(huán)境的原因導致的錯誤歧杏?
我嘗試著將DockerFile中的"eos/genesis.json / "替換成"eos/genesis.json",因為結尾那個多余的 / 看著非臣娜福可疑得滤,與前面的地址中間隔了一個空格。
修改之后沒有報錯盒犹,構建成功并且生成了鏡像懂更,但是在啟動鏡像時出現(xiàn)異常眨业,此法不通。
我又另外嘗試了幾個方法沮协,仍然無法生成正確的鏡像龄捡,無奈之下,我去GitHub上提交了一個Bug慷暂,看看官方開發(fā)人員怎么說聘殖。
然并卵,只有兩個同病相憐的小伙伴說跟我遇到了一樣的問題行瑞,官方開發(fā)人員并沒有答復奸腺。
生成不了正確的鏡像,難道我的EOS開發(fā)之旅要就此夭折血久?
當然不會突照,否則我也沒必要寫今天這篇文章了,正所謂條條大路通羅馬氧吐,自己生成不了鏡像讹蘑,就拿官方已經(jīng)生成好的。
下載eosio/eos鏡像
還記得前面執(zhí)行的命令么
docker build . -t eosio/eos
這句話的意思是讓我們生成一個名為eosio/eos的鏡像文件筑舅,在Docker的命名習慣下座慰,eosio/eos對應了Docker公共倉庫eosio命名空間下的eos倉庫。也就是說翠拣,EOS官方很有可能已經(jīng)把編譯好的鏡像文件上傳到Docker公共倉庫中版仔。
事實是否如此?我嘗試做了以下操作心剥。
1.刪除本地異常的eosio/eos鏡像
docker rmi e7bc2acf31bf
2.下載eosio/eos鏡像
docker pull eosio/eos
還真讓我下載到了邦尊。
環(huán)境驗證
下載好了鏡像背桐,我們來進一步驗證該鏡像是否可用优烧,不管是自己生成的鏡像,還是從Docker倉庫下載的链峭,下面的驗證步驟都是一樣的畦娄。
參考開發(fā)文檔Start nodeos docker container only章節(jié)。
1.啟動一個nodeos節(jié)點
docker run --name nodeos -p 8888:8888 -p 9876:9876 -t eosio/eos nodeosd.sh arg1 arg2
啟動成功
2.驗證nodeos節(jié)點是否可用
驗證通過
3.同時啟動nodeos和kesod節(jié)點
docker volume create --name=nodeos-data-volume
docker volume create --name=keosd-data-volume
docker-compose up -d
這一步要注意幾點:
- 執(zhí)行命令前先把第1步啟動的nodeos節(jié)點停掉
- docker-compose命令相關的配置信息在/eos/Docker/docker-compose.yml文件中
- 官方文檔是說啟動nodeos和kesod兩個節(jié)點弊仪,但實際上還啟動了builder節(jié)點熙卡,經(jīng)過測試這個節(jié)點是沒有用的,大家可以從docker-compose.yml文件中將builder節(jié)點相關的配置信息刪掉励饵。
4.執(zhí)行cleos命令
alias cleos='docker-compose exec keosd /opt/eosio/bin/cleos -H nodeosd'
cleos get info
cleos get account inita
注意head_block_num的值時10239驳癌,在前面驗證nodeos節(jié)點是否可用時,返回的head_block_num是711役听,這說明nodeos節(jié)點已經(jīng)在自動生成區(qū)塊了颓鲜。
至此環(huán)境驗證完畢表窘,部署成功。
小結
整個環(huán)境構建過程并不復雜甜滨,開發(fā)文檔已經(jīng)寫得比較清楚乐严,順利的話1到2個小時可以完成。
不過大家還是要注意隨機應變衣摩,不能完全依賴開發(fā)文檔昂验,比如當我遇到生成鏡像失敗的問題時,直接從Docker倉庫下載鏡像艾扮,這一點EOS的開發(fā)文檔中是沒有的既琴。
另外還有一點要注意,開發(fā)文檔的內容變動很頻繁泡嘴。我剛開始看文檔的時候呛梆,還是在 https://github.com/EOSIO/eos 里面,不知什么時候開始就變到 https://github.com/EOSIO/eos/wiki 里面磕诊,目錄結構也變了填物。
最后還是要吐槽一下EOS官方開發(fā)人員
- 既然可以直接下載鏡像,干嘛還讓我們自己構建霎终,太浪費時間滞磺。
- 讓我們自己構建就算了,能不能測一下構建腳本莱褒,沒有BUG了再上傳击困?
今天中午在GitHub看到昨天提交的BUG已經(jīng)Close,官方開發(fā)人員的回復是:已經(jīng)刪除genesis.json文件广凸。我還沒有測試阅茶,希望這次修改之后不會再有新的問題。