先說明Pi節點怎麼運作的。
Pi Network採用的共識協議是「恆星共識協議 (Stellar Consensus Protocol, SCP)」,SCP的節點程式就叫做Stellar Core。
因為不是每個人都有足夠的技術能力可以自行安裝與設定Stellar Core,所以Pi核心團隊想了一個辦法,將相關的程式與設定都打包好,做成一個image檔,只要安裝了Docker Desktop這個虛擬化軟體,就能執行。
Docker Desktop是一個虛擬化軟體,它載入image檔,建立一個Container(容器)。Container就是一個執行的應用程式(此例是Stellar Core)加上執行它的簡易版Linux環境(包括root使用者權限、程式空間、使用者空間和網路空間等)。
(以上內容摘至於 https://yuanrui919.github.io/whatisnode/ )
所以第一個要看的log就是Container運行的log,如果有重大的問題,這裡應該都能看出來,例如Linux環境啟動失敗。另外它也包含了supervisor的log(後面說明)。
而pi-consensus Container主要運行三個程式:
l PostgreSQL:Stellar Core及Horizon的資料庫,它一定要先啟動,其餘兩個才能正常執行。
l Stellar Core:就是SCP的節點程式。
l Horizon:Troubleshooting頁面中的API Services。
另外還有Supervisor這個程式管理工具要提,它可用來管理容器中的多個程式,上述三個程式都是透過Supervisor來管理、啟動、停止。所以進一步要看的log就是這幾個程式的log。
Log的位置可以從Docker查看 /VAR/LOG/SUPERVISOR 在本機的掛載路徑,Windows跟MAC不一樣。
Windows位於 %appdata%\Pi Network\docker_volumes\supervisor_logs 目錄。
MAC位於 ~Library/Application Support/Pi Network/docker_volumes/supervisor_logs 目錄。
不管是Windows的%appdata%或MAC的~Library都是隱藏檔,請自行上網搜尋怎麼開啟它,這裡不說明電腦操作技巧。
如下圖是Windows的範例:
該目錄有6種檔案:
檔名 |
說明 |
horizon-stdout---supervisor-xxxxxx.log |
API Services (Horizon)的標準輸出。 |
postgresql-stderr---supervisor-xxxxxx.log |
PostgreSQL的標準錯誤輸出。 |
postgresql-stdout---supervisor-xxxxxx.log |
PostgreSQL的標準輸出。 |
stellar-core-stderr---supervisor-xxxxxx.log |
Stellar Core的標準錯誤輸出。 |
stellar-core-stdout---supervisor-xxxxxx.log |
Stellar Core的標準輸出,這是本文討論的重點。 |
supervisord.log |
Supervisor的log。 |
其中xxxxxx是隨機產生的,每台節點的檔名都不一樣。當檔案大小到達50MB的時候,會自動產生一個新檔,而舊檔案則在檔名後面接上 .1 .2 .3 等數字,最多10個檔案。
但log裡面紀錄的時間是時區UTC+0,跟台灣的時間差了8小時,閱讀起來不是很方便,還要自己在腦袋中加8小時,我習慣裝好節點後先調整時區(不改也沒關係,這不是必要的)。
到pi-consensus開CLI,執行sudo dpkg-reconfigure tzdata
stellar-core-stdout---supervisor-xxxxxx.log範例:
時間,包含日期和時間,精準到毫秒。要注意,如果沒有改時區,這裡的時間要再加8小時才是台灣時間。
節點ID,或稱節點的Public Key,每個節點都是獨一無二的,這裡只顯示前5碼。
log類型,Stellar Core由好幾個元件組成,各自負責不同的功能,由log類型可以知道是哪個元件的log,還可以看出來是錯誤(ERROR)、警告(WARNING)還是訊息(INFO)。
l [SCP] 恆星共識協議子系統,負責產生共識。
l [Herder] 負責SCP和Stellar Core的其餘部分之間的接口。Herder經常通過委派給其他元件來完成其任務。
l [Overlay] 負責節點之間的點對點連線,以及管理廣播(broadcast)消息、任播(anycast)請求/回复消息。
l [Ledger] 套用SCP共識的結果,將帳本內容提交給[Bucket]存儲,觸發歷史帳本的發布。當Ledger檢測到本地帳本落後於網路太多時,它也會觸發歷史系統的catchup程序。
l [History] 將交易和帳本發佈到異地永久存儲以供審計,並作為其他節點的追趕資料來源。當該節點落後時,歷史系統會獲取追趕數據並將其提交給 Ledger 兩次:首先驗證(Verify)其安全性,然後套用(Apply,寫到core DB及XDR檔)它。
l [Bucket] 將帳本存儲在磁碟上。
l [Tx] 執行各種交易與操作。
l [Perf] 效能相關的訊息。
log內容,詳細的訊息。
案例:
上面的log是因為我不小心重啟了路由器,外部IP也變了,所以原本已經連上的節點(不管是in或out連線),通通都中斷了,重新連線。還記得節點間的連線是由Overlay負責嗎?所以log類型是[Overlay INFO]。
以上只是大略介紹,至少在節點有問題時,知道要去哪裡找log。