EOS原始碼分析(2)EOS執行

尹成發表於2018-05-13
EOS 安裝完畢後,就可以執行EOS 程式了。目前支援三種方式的執行,分別是:

- 本地私有節點執行
    在本地區域網中部署EOS節點,提供EOS服務,節點可以單個,也可以部署多節點
- 在測試公網下執行
    Block.One 公司提供了測試的公網環境,你可以使自己部署的節點連線公網測試環境
- Docker 中執行
    
## 本地私有節點執行
EOS為了能夠方便開發者測試,目前在公網環境下部署了一套測試網路。如果你部署的節點不與這套公網測試環境連線,那就成為本地私有節點部署。在進行本地部署的時候,可以只部署單一節點,也可以部署多個節點,下面我們會分別介紹這兩種情況:

### 單節點的部署與執行
當成功編譯專案後,就可以在`build/programs/eosiod` 目錄下執行程式了。呼叫`eosiod` 命令可以執行EOS 節點程式,當你第一次執行時,很有可能會出現錯誤而停止執行,不管是否出現錯誤,都通過 `Ctrl-C` 停止程式,你需要先對程式做一些配置後,系統才能真正執行。當第一次執行程式後,會自動生成 `data-dir` 目錄,裡面包含了預設的配置檔案(`config.ini`)和一些其他檔案。你需要對配置檔案做如下的修改:

- 新增創世紀的block
`genesis-json = /path/to/eos/genesis.json`

- 在測試鏈上設定producers,並通過他們生產區塊
    
    ```
    producer-name = inita
    producer-name = initb
    producer-name = initc
    producer-name = initd
    producer-name = inite
    producer-name = initf
    producer-name = initg
    producer-name = inith
    producer-name = initi
    producer-name = initj
    producer-name = initk
    producer-name = initl
    producer-name = initm
    producer-name = initn
    producer-name = inito
    producer-name = initp
    producer-name = initq
    producer-name = initr
    producer-name = inits
    producer-name = initt
    producer-name = initu
    ```
- 載入區塊生產外掛,從而系統可以生產區塊
`plugin = eosio::producer_plugin`
- 載入錢包外掛,從而支援錢包服務
`plugin = eosio::wallet_api_plugin`
- 載入RPC和API外掛,從而可以通過這兩種介面訪問EOS服務

    ```
    plugin = eosio::chain_api_plugin
    plugin = eosio::http_plugin
    ```

再次執行 `eosiod` 命令,當你看到如下日誌的時候,說明你已經成功啟動EOS服務了。

```
1575001ms thread-0 chain_controller.cpp:235 _push_block ] initm #1 @2017-09-04T04:26:15 | 0 trx, 0 pending, exectime_ms=0
1575001ms thread-0 producer_plugin.cpp:207 block_production_loo ] initm generated block #1 @ 2017-09-04T04:26:15 with 0 trxs 0 pending
1578001ms thread-0 chain_controller.cpp:235 _push_block ] initc #2 @2017-09-04T04:26:18 | 0 trx, 0 pending, exectime_ms=0
1578001ms thread-0 producer_plugin.cpp:207 block_production_loo ] initc generated block #2 @ 2017-09-04T04:26:18 with 0 trxs 0 pending
...
```

### 部署多節點網路
在你EOS專案的 `build/programs/eosio-launcher` 目錄下,有一個專門用於EOS節點啟動的應用,名稱為 `eosio-launcher`,下面的命令執行了兩個可以相互互動的節點:

```sh
cd ~/eos/build
cp ../genesis.json ./
./programs/eosio-launcher/eosio-launcher -p2 --skip-signature
```

上面的命令將會建立兩個資料目錄,每個節點對應其中一個目錄,目錄名稱分別是:`tn_data_00``tn_data_01`

你可以在命令列終端中看到如下的日誌輸出, 日誌表示系統生成了兩個子程式,每個程式對應一個執行節點:

```
spawning child, programs/eosiod/eosiod --skip-transaction-signatures --data-dir tn_data_0
spawning child, programs/eosiod/eosiod --skip-transaction-signatures --data-dir tn_data_1
```

為了進一步驗證這兩個節點確實在正常執行,你可以使用`eosioc`客戶端工具分別連線這兩個節點,如下:

```
cd path-to-eos/build/programs/eosioc
./eosioc -p 8888 get info
./eosioc -p 8889 get info
```
上面的兩條`eosioc` 分別連線兩個節點,可以看到,這兩個節點埠號分別是8888和8889,連線後,呼叫 `get info`命令,獲取到不同節點的區塊鏈資訊。

## 在測試公網下執行
Block.One 為測試人員和開發者提供了公網測試環境,如果你已經在本地體驗過EOS節點的執行,希望能夠在公網下測試你的程式碼,那你可以把本地的EOS節點連線到公網環境,具體操作如下:

```
cd path-to-eos/build/scripts
./start_npnode.sh
```

系統編譯後,會生成`start_npnode.sh` 指令碼檔案,此指令碼其實也是呼叫了`eosd`程式,不過其使用的預設資料目錄引數是`testnet_np`,此目錄的`config.ini`檔案中的設定了公網環境下p2p節點的連線地址,因此,程式啟動後就會直接與公網進行連線了,這也是連線公網環境和在私有鏈下執行的主要區別,這行配置如下:
`p2p-peer-address = p2p-testnet1.eos.io:9876`

`p2p-testnet1.eos.io`這個域名就指向Block.One 公網環境的一個節點。`start_npnode.sh` 命令執行後,可以得到如下日誌輸出:

```
Launched eosd.
See testnet_np/stderr.txt for eosd output.
Synching requires at least 8 minutes, depending on network conditions.
```

如果希望瞭解節點執行和同步的具體情況,可以執行如下命令檢視:

```
tail -F testnet_np/stderr.txt
```

當連線公網環境時,節點首先需要從公網中同步已有的區塊鏈資料,這需要一定的時間,當你看到如下日誌資訊的時候,說明資料正在同步:

```
3439731ms chain_plugin.cpp:272 accept_block ] Syncing Blockchain --- Got block: #200000 time: 2017-12-09T07:56:32 producer: initu
3454532ms chain_plugin.cpp:272 accept_block ] Syncing Blockchain --- Got block: #210000 time: 2017-12-09T13:29:52 producer: initc
```

當同步全部完成後,你將看到如下的資訊:

```
42467ms net_plugin.cpp:1245 start_sync ] Catching up with chain, our last req is 351734, theirs is 351962 peer ip-10-160-11-116:9876
42792ms chain_controller.cpp:208 _push_block ] initt #351947 @2017-12-12T22:59:44 | 0 trx, 0 pending, exectime_ms=0
42793ms chain_controller.cpp:208 _push_block ] inito #351948 @2017-12-12T22:59:46 | 0 trx, 0 pending, exectime_ms=0
42793ms chain_controller.cpp:208 _push_block ] initd #351949 @2017-12-12T22:59:48 | 0 trx, 0 pending, exectime_ms=0
```

## Docker 中執行






網址:http://www.qukuailianxueyuan.io/



欲領取造幣技術與全套虛擬機器資料

區塊鏈技術交流QQ群:756146052  備註:CSDN

尹成學院微信:備註:CSDN






網址:http://www.qukuailianxueyuan.io/



欲領取造幣技術與全套虛擬機器資料

區塊鏈技術交流QQ群:756146052  備註:CSDN

尹成學院微信:備註:CSDN

相關文章