Cosmos SDK節點架構及外交用節點 (Sentry Node)
這篇文會解釋一下使用單一公共IP地址時需要使用的節點架構,因為我把節點搬到自家伺服器後只有單一公共IP地址,所以我必須使用此架構
單一節點
在Cosmos區塊鏈網絡上驗證其實只需要一個節點,其他都是額外的
網絡連線大概像這樣:
- 自家驗證節點 (公共IP Z1) ==連上==> 其他節點 A (公共IP A)
- 自家驗證節點 (公共IP Z1) ==連上==> 其他節點 B (公共IP B)
只有一個節點加單一公共IP地址,用預設設定即可,很簡單沒壓力
多個節點 + VPS
這是我搬到自家伺服器前的架構,除驗證用節點外還有一個備份用節點(實際上可以叫驗證用節點去搞備份,但是會掉塊,每次主網備份時間都用小時計)
不過因為VPS(主機商)每一部主機都會派一個公共IP(否則用戶怎麼連線),所以只是單一節點xN,沒特別
多個節點 + 單一公共IP = 爆炸
由於tendermint(Cosmos SDK底層,非本文重點不介紹)在某版本後把設定allow_duplicate_ip預設為false(拒絕同一IP地址重複連線)(詳看https://github.com/tendermint/tendermint/pull/2992)
第一個節點連線情況變成:
- 自家節點 1 (公共IP Z1) ==連得上==> 其他節點 A (公共IP A)
因為其他節點 A 沒連過公共IP Z1 - 自家節點 1 (公共IP Z1) ==連得上==> 其他節點 B (公共IP B)
因為其他節點 B 沒連過公共IP Z1
第一個節點還好,第二個開始就出事了:
- 自家節點 2 (公共IP Z1) ==連不上==> 其他節點 A (公共IP A)
因為其他節點 A 已連過公共IP Z1 - 自家節點 2 (公共IP Z1) ==連不上==> 其他節點 B (公共IP B)
因為其他節點 B 已連過公共IP Z1
其他節點看到同一公共IP地址嘗試多次連線:
除了第一個節點外的其他節點:
多個節點 + 單一公共IP + Sentry Node
詳看https://forum.cosmos.network/t/sentry-node-architecture-overview/454
要令其他節點能被自己所有節點連上
直接與其他節點連線的節點就只能有一個
那就是Sentry Node(我暫稱為外交用節點,感覺比機翻的哨兵節點好)
連線情況大概是:
- 自家驗證節點 (私人IP P1) ==連上==> 自家外交節點 A (私人IP P3)
- 自家備份節點 (私人IP P2) ==連上==> 自家外交節點 A (私人IP P3)
- 自家外交節點 1 (公共IP Z1) ==連得上==> 其他節點 ABCD... (公共IP ABCD...)
設定上也需要更改:
外交節點:
- private_peer_ids:設為其他節點的節點ID
其實不設也可以但是沒必要在PEX(Peer Exchange)時交出其他節點的資訊
實際上交了也沒用,因為是私人IP,根本連不上
但是更進階的架構可以把有公共IP的節點都設為私人,在此不詳談 - addr_book_strict:false
容許私人IP的連線,即其他節點
當然這是因為其他節點都在LAN(Local area network,區域網路)內
其他節點:
- persistent_peers:外交用節點ID(外交用節點是可多於一個,但受公共IP地址數限制,用VPS主機當額外外交用節點是可行的)
不論其他設定,永遠連上這堆節點 - pex:false
不嘗試PEX(Peer Exchange),以免發生此節點先啟動並連上外部節點令外交用節點反而連不上的情況 = 又變成只有一個節點能連上
外交用節點實際上還可被設定為非公開和公開兩種(多層節點結構),對安全性有影響,基本上就像是HTTP上的Reverse Proxy,但目前沒必要就不搞了