精通EOS系列 | EOS 原始碼編譯、連線主網與單節點網路
一、從原始碼編譯與安裝
前一章,我們講解了 EOS 在 Docker 環境下的簡單使用,作為一個碼農,不親自從原始碼編譯怎麼對待起碼農這兩個字,本章我們開始從原始碼的獲取開始,依次講解編譯、啟動和外掛系統。
現在 EOS 的編譯比起以前有了很大的改善,幾乎不用費什麼麻煩就可以從原始碼編譯成功。從本章,假設你用的系統為 Mac OS,如果不是請遵守各自系統的規定。
首先,我們來安裝相關的信賴,對於 Mac 系統來說,當然是安裝神器 brew
了。在 Shell 下輸入下面的命令,即可以安裝所有必需的依賴:
brew install automake brew install libtool brew install llvm brew install cmake brew install gmp brew install mongodb brew install doxygen brew install graphviz brew install lcov如果系統中已經安裝過
gettext
,那麼需要執行下面的命令來重新生成連線。
brew unlink gettext && brew link --force gettext
在 Mongodb 安裝後,我們可以使用下面兩個命令之一來啟動它
brew services start mongodb mongod --config /usr/local/etc/mongod.conf
接下來,就要 github 下載 EOS 源了程式碼,Shell 中輸入以下命令:
git clone https://github.com/EOSIO/eos --recursive
具體下載時間要取決於你的網路。在程式碼下載完成之後,就可以進行編譯了,命令如下:
cd eos ./eosio_build.sh
如果沒有什麼意外,一段時間之後,你就會看到下圖:

如果你能看到上面和圖片,那麼恭喜你,你的 EOS 編譯成功了。
當編譯成功之後,接下來我們就開始安裝 eos,輸入以下命令:
sudo ./eosio_install.sh
幾分鐘之後,你就會看到下圖

/usr/local/eosio/bin
目錄,我們把這個目錄加入系統
PATH
變數中,然後就可以在 Shell 中執行相關的命令了。
二、啟動 EOS 節點
對於同步主網、測試網,外加自己單節點測試的,可以不執行上面的安裝,而是單獨執行build
目錄下面的各個程式。
cd build/programs/nodeos ./nodeos -e -p eosio --plugin eosio::chain_api_plugin --plugin eosio::history_api_plugin其中,引數
-e
的作用是開始生成區塊,
-p eosio
是指定節點的名稱,
--plugin
指定了兩個外掛,第一個外掛可以獲取鏈上的資訊,提交交易信息,提供了
/v1/chain
開頭的各種 RPC,第二個外掛提供了獲取指定賬號的交易歷史記錄,這些 API 以
/v1/history
為開頭,
--hard-replay-blockchain
引數是為了
如果啟動時候出現 dirty-flag
這樣的錯誤,需要加上 --hard-replay-blockchain
引數。
如果啟動時候出現 3190003 block_log_not_found: block log can not be found
錯誤,需要把 --hard-replay-blockchain
引數去掉。
執行上面的命令可以看到如下圖所示的內容:

注意紅框中的內容,這個表示節點已經在產生區塊了。
既然本地節點已經執行,並且開始生成區塊了,那我們就另起一個終端,執行 cleos
來檢視當前網路資訊:
cd build/programs/cleos ./cleos get info
執行上面的命令就會顯示網路的資訊:

chain_id
等於
cf057bbfb72640471fd910bcb67639c22df9f92470936cddc1ade0e2f2e7dc4f
這個代表了當前我們執行的是本地測試網,對於公共測試網路的網路 id 是
038f4b0fc8ff18a4f0842a8f0564611f6e96e8535901dd45e43ac8691a1c4dca
。
連線到主網
預設情況下,我們連線到的是自己單節點的私網。如何連線到 EOS 主網?在回答這個問題之前,我們先要想一下為什麼要連線到主網。因為,只有連線到主網,我們才有可能註冊成為生產區塊的節點,並拉票成為超級節點,獲得真正出塊的權力。既然連線到主網這麼重要,那麼如何才能連線到主網呢,下面我們就來研究這個問題。
如何連線到主網,其實非常簡單,只需要主網的一份創世區塊和主網的節點列表就可以了。
為了方便大家,這裡我們提供一份主網的創世區塊。
{ "initial_timestamp": "2018-06-08T08:08:08.888", "initial_key": "EOS7EarnUhcyYqmdnPon8rm7mBCTnBoot6o7fE2WzjvEX2TdggbL3", "initial_configuration": { "max_block_net_usage": 1048576, "target_block_net_usage_pct": 1000, "max_transaction_net_usage": 524288, "base_per_transaction_net_usage": 12, "net_usage_leeway": 500, "context_free_discount_net_usage_num": 20, "context_free_discount_net_usage_den": 100, "max_block_cpu_usage": 200000, "target_block_cpu_usage_pct": 1000, "max_transaction_cpu_usage": 150000, "min_transaction_cpu_usage": 100, "max_transaction_lifetime": 3600, "deferred_trx_expiration_window": 600, "max_transaction_delay": 3888000, "max_inline_action_size": 4096, "max_inline_action_depth": 4, "max_authority_depth": 6 } }我們在當前目錄,即
build/programs/cleos
目錄下,新建一個檔案
genesis.json
,內容為上面的 JSON 內容。
接下來,我們要在配置檔案 config.ini
中增加主網的節點列表,這個檔案位於 ~/Library/Application\ Support/eosio/nodeos/config
目錄下,開啟這個檔案,增加如下節點列表:
p2p-peer-address = p2p.prod.eosgravity.com:80 p2p-peer-address = eu-west-nl.eosamsterdam.net:9876 p2p-peer-address = p2p.mainnet.eosgermany.online:9876 p2p-peer-address = 54.38.250.15:19878 p2p-peer-address = p2p.genereos.io:9876 p2p-peer-address = mainnet.eospay.host:19876 p2p-peer-address = 130.211.59.178:9876 p2p-peer-address = 54.153.59.31:9999 p2p-peer-address = 94.130.250.22:9806 p2p-peer-address = peer.main.alohaeos.com:9876 p2p-peer-address = peer.eosn.io:9876 p2p-peer-address = prod.mainnet.eos.cybex.io:9888 p2p-peer-address = p2p-1.eosnetwork.io:9876 p2p-peer-address = p.jeda.one:3322 p2p-peer-address = eosbattles.com:9877 p2p-peer-address = 34.226.76.22:9876 p2p-peer-address = mainnet.eosoasis.io:9876 p2p-peer-address = node.eosflare.io:1883 p2p-peer-address = p2p.eosio.cr:1976 p2p-peer-address = p2p.eosio.cr:5418 p2p-peer-address = eno.eosvan.io:19866
然後,執行下面的命令:
./nodeos -e --genesis-json ./genesis.json --plugin eosio::chain_api_plugin --plugin eosio::history_api_plugin
注意:
1、如果出現 Incorrect plugin configuration Genesis state can only be set on a fresh blockchain.
這個錯誤,請在命令列上加入 --delete-all-blocks
引數,或者刪除 ~/Library/Application\ Support/eosio/nodeos/data
這個目錄。
2、如果出現 Not producing block because I don't have the private key for EOS7EarnUhcyYqmdnPon8rm7mBCTnBoot6o7fE2WzjvEX2TdggbL3
這個錯誤,請把命令上的 -p eosio
引數去掉。
3、為了本地開發,不建議直接修改 config.ini
檔案,而是應該通過增加 --p2p-peer-address
引數來指定主網的節點。上面的節點轉化為 --p2p-peer-address p2p.prod.eosgravity.com:80 --p2p-peer-address eu-west-nl.eosamsterdam.net:9876 --p2p-peer-address p2p.mainnet.eosgermany.online:9876 --p2p-peer-address 54.38.250.15:19878 --p2p-peer-address p2p.genereos.io:9876 --p2p-peer-address mainnet.eospay.host:19876 --p2p-peer-address 130.211.59.178:9876 --p2p-peer-address 54.153.59.31:9999 --p2p-peer-address 94.130.250.22:9806 --p2p-peer-address peer.main.alohaeos.com:9876 --p2p-peer-address peer.eosn.io:9876 --p2p-peer-address prod.mainnet.eos.cybex.io:9888 --p2p-peer-address p2p-1.eosnetwork.io:9876 --p2p-peer-address p.jeda.one:3322 --p2p-peer-address eosbattles.com:9877 --p2p-peer-address 34.226.76.22:9876 --p2p-peer-address mainnet.eosoasis.io:9876 --p2p-peer-address node.eosflare.io:1883 --p2p-peer-address p2p.eosio.cr:1976 --p2p-peer-address p2p.eosio.cr:5418 --p2p-peer-address eno.eosvan.io:19866
4、只有第一次啟動主網時,需要指定創世區塊,隨後啟動時不需要指定。
如果一切正常,那麼在另一個 Shell 中執行命令:
./cleos get info
就能看到下面類似的圖,之所說是類似,因為截圖的時間不同,顯示的區塊頭部數量和最後一個區塊的數量也不一樣。

aca376f206b8fc25a6ed44dbdc66547c36c6c33e3a119ffbeaef943642f0e906
,也就是主網路。
三、單節點網路
當我們啟動本地節點進行開發、呼叫時,其實啟動了一個本地的單節點網路,在這個網路中包括 4個不同的部分,它們是:nodeos
、
keosd
、
cleos
、
eosiocpp
,它們分別承擔不同的工作,下面分別進行簡要介紹。
- nodeos通過配置不同外掛,啟動節點,同步EOS網路資料或者自己生成塊,也可作為API節點供呼叫。
- keosd管理錢包,錢包中包含EOS公私鑰對資訊
- cleos命令列互動介面,連線錢包與EOS網路,執行檢視網路資訊,推送交易資訊,部署智慧合約等
- eosiocpp編譯智慧合約,生成wasm檔案及abi檔案
它們構成的網路如下圖所示:
四、後記
由於本人水平所限,文中錯誤在所難免,歡迎您踴躍指出錯誤,在下感激不盡。我的微信聯絡方式:joepeak。
原創不易,尤其寒冬,歡迎贊助我一杯咖啡,本人比特幣地址如下:3C1gyc2tsVudvVNQCZfrwHviDQeUpPeT95