Likecoin 節點的設立文件
立埸X Oursky 節點因為立場新聞的停止運作而下線,相關的社群也提問過節點相關的後續及有關私鑰的管理。我也在Google 上查了一下相關的中文文章,找不到很技術的文章。大概都是跟據官方文件的docker 方法。比喻:LikeCoin 區塊鏈驗證人節點操作筆記 - Soul & Shell Blog,也找到有節點代租的相關的服務,https://matters.news/@catding/提供驗證人節點代租-代架-代管服務-bafyreihuqzu34v57ubjzya566w5ck2pslzxnxc4pycolakoak6dzozlmma
代管也沒有說明如何安全交接私鑰。
有關私鑰的部份Like.co 的官方文件也只有英文Technical Introduction - LikeCoin,相關中文文件是沒有的。
相關英文技術文件在當然有很多,但我不打算一一翻譯了。所以這文章的主題是:如果我現在再架設一個節點,會如何設立。以下的步驟也不是最安全的做法,大概是容易管理和安全的一個個人取拾。希望提出一個角度讓社群參考一下。
在架設任何伺服器之前,先準備工具如下
- 一台Linux 筆電
- 二隻USB 手指
- 一隻已經設定好GPG 的Yubikey
第一步,準備liked
先在一部Linux 準備好一隻用來放liked
和私鑰的USB.
- 把其中一隻USB 清空及用cryptsetup 設定好LUKS 加密。
- 把自己的GPG public key 抄到同一隻手指。
- 篇譯
liked
如下,並抄到USB 手指。
篇譯(compile) 可執行的liked
,我使用自己建立的Makefile,可看:likecoin-chain/Makefile at fotan1.1 · rickmak/likecoin-chain · GitHub 。
如果沒有golang 要先安裝golang
sudo add-apt-repository ppa:longsleep/golang-backportssudo apt-get update sudo apt-get install golang-1.16
然後跑make build
就可以了。
第二步,下載並安裝Tails 到第二隻手指。有關步驟可到Tails - Home查。
第三步,筆電執行離線(Air-gapped)的Tails 並創造金鑰。
把載有Tails 的手指插入筆電跑起Tails,不要連到互連網。
把第一隻手指插入筆電,把GPG public key import 到GPG keyring。
執行USB 上的liked
。liked init
和liked keys add validator
輸入passphrase,在另一台電腦把passphrase 放到pass
Pass: The Standard Unix Password Manager。 liked
會把mnemonic 印出來,把mnemonic 用自己的GPG public key encrypt 到USB 手指上。
把整個$HOME./liked
抄到USB 上。
第四步,在GCP 上架設驗證節點(Validator Node)及簽署節點(Signer Node)。
在GCP 上開一個新的VPC。設立好兩部機 VM 以及相對應的Firewall 如下。我用的OS 是Ubuntu。
- 驗證節點;4vCPU/8GB, 300 GB SSD; Firewall 只開26656給互聯網;Port 22 只開放給自己和簽署節點的IP
- 簽署節點:1vCUP/1GB, 10GB HHD; 不要Public IP;Firewall 只開Port 22 給驗證節點的IP
把在在Yubikey 的id_ed25519_sk.pub
放到兩個節點的SSH authorized_keys
檔案中。
因為簽署節點沒有公開的互聯網IP ,所以會用驗證節點做Jump Host。以下是相關的.ssh/config
。(更好的是另外一部伺服器只做Jump Host,不過太貴,太麻煩了 )
Host likecoin-validator HostName xx.xx.xx.xx User rickmak IdentityFile /Users/rickmak/.ssh/id_ed25519_sk_rk Host likecoin-signer HostName 10.140.0.xx User rickmak IdentityFile /Users/rickmak/.ssh/id_ed25519_sk_rk ProxyJump likecoin-validator
設立驗證節點
先建立一個叫fotan 的user
sudo adduser fotan sudo passwd -l fotan
用scp 把USB 中相關的檔案抄到節點的/home/fotan
。 需要的檔案為liked
, .liked/config
中的addrbook.json
, app.toml
, config.toml
, node_key.json
。記得不要抄private key 和validator key( priv_validator_key.json
)。
打開config.toml
把priv_validator_laddr
改做tcp://127.0.0.1:26658
安裝systemd ,可參考在likecoin-chain/liked.service at fotan1.1 · rickmak/likecoin-chain · GitHub
sudo cp liked.service /etc/systemd/system/liked-fotan.service sudo systemctl daemon-reload
設立簽署節點
要設立的是 tmkms GitHub - iqlusioninc/tmkms: Tendermint KMS: Key Management System for Tendermint Validators。但因為簽署節點並不能連接到互聯網。所以會在另一台機把tmkms
篇譯好再抄到簽署節點。這𥚃用的是softsign
,當然在網上很多文檔都叫大家不要用在正規環境(Production environment),大家知道自己做甚麼就好,這𥚃不作討論。
先在手邊的電腦篇譯好tmkms
再抄到節點(懶惰的可以暫時給節點互聯網連接)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh # 1) Proceed with installation (default) source $HOME/.cargo/env cargo install tmkms --features=softsign --version=0.10.1
在節點建立tmkms User並generate ssh-key
sudo adduser tmkms sudo passwd -l tmkms sudo su tmkms ssh-keygen -t ed25519
把簽署節點的公鑰(Public key)加到驗證節點的 /home/fotan/.ssh/authorized_keys
把 USB 的驗證節點私匙抄到簽署節點,並改變成tmkms 要的格式。
scp /mnt/usb/.liked/config/priv_validator_key.json . tmkms softsign import priv_validator_key.json likecoin_validator_consensus.key tmkms init likecoin mv likecoin_validator_consensus.key likecoin/secrets/
設立好tmkms.tmol 的內容如下
[[chain]] id = "likecoin-mainnet-2" key_format = { type = "bech32", account_key_prefix = "cosmospub", consensus_key_prefix = "cosmosvalconspub" } state_file = "/home/tmkms/likecoin/state/likecoin-mainnet-2-consensus.json" [[providers.softsign]] chain_ids = ["likecoin-mainnet-2"] key_type = "consensus" path = "/home/tmkms/likecoin/secrets/likecoin_validator_consensus.key" [[validator]] chain_id = "likecoin-mainnet-2" addr = "tcp://127.0.0.1:26658" secret_key = "/home/tmkms/likecoin/secrets/kms-identity.key" protocol_version = "v0.34" reconnect = true
安裝tmkms 到systemd
sudo vim /etc/systemd/system/tmkms.service
[Unit] Description=Tendermint Key Management Service [Service] User=tmkms WorkingDirectory=/home/tmkms/likecoin ExecStart=/home/tmkms/.cargo/bin/tmkms start -c /home/tmkms/likecoin/tmkms.toml Restart=always RuntimeMaxSec=86400 [Install] WantedBy=multi-user.target
看看能不能跑起
sudo systemctl daemon-reload sudo systemctl start tmkms.service journalctl -u tmkms.service -f
應該會看到connection error ,因為以上設定全都是對127.0.0.1
。我們還要把兩個節點連起來。
安裝autossh
,跑以下的指令
autossh -M 16662 -f -N -L 26658:localhost:26658 validator
跑起節點
最後同時分別在驗證節點和簽署節點跑起相關的liked
和tmksm
。
驗證節點 sudo systemctl start liked-fotan.service
簽署節點 sudo systemctl start tmkms.service
應該能跑起來。
第五,平日的投票,佣金操作
實質私匙是在USB 手指,所以日常投票不在節點執行,而在另一台電腦做。我也會用在USB 上的Tails 執行乾淨的OS,不過這次不用Air-gapped,連到互聯網,然後用Yubikey 和SSH 連到驗證節點如下。
ssh -L 26657:localhost:26657 likecoin-validator
直接跑在USB 的liked
去拿佣金。
./liked --home . --keyring-backend file \ --chain-id likecoin-mainnet-2 tx distribution withdraw-rewards \ cosmosvaloperxxxxx \ --from cosmosxxxxxx --commission
後記
再認真一點的設置還有很多改善的空間,比如:
- 用Cloud HSM 或是自己用實體機的YubiHSM/Ledger
- Multisig
- 平日投票都在Air-gapped 的機跑,再另外發佈到網絡
- 哨兵節點(Sentry Node)
但那部分成本和繁複程度應該不是一般人會願意付出。這篇文都的目標群眾是在雲端跑節點的人,希望大家看完後會起碼不會直接把私鑰放在驗證節點上。