Likecoin 節點的設立文件

rickmak
·
·
IPFS
·
如果我現在再架設一個節點,成本、容易管理和安全的一個個人取拾,會如何設立。以下的步驟也不是最安全的做法,只是希望提出一個角度讓社群參考一下。

立埸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 上的likedliked initliked keys add validator

輸入passphrase,在另一台電腦把passphrase 放到passPass: 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.jsonapp.tomlconfig.tomlnode_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

跑起節點

最後同時分別在驗證節點和簽署節點跑起相關的likedtmksm

驗證節點 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)

但那部分成本和繁複程度應該不是一般人會願意付出。這篇文都的目標群眾是在雲端跑節點的人,希望大家看完後會起碼不會直接把私鑰放在驗證節點上。

CC BY-NC-ND 2.0

Like my work? Don't forget to support and clap, let me know that you are with me on the road of creation. Keep this enthusiasm together!

rickmakSoftware engineer located at Cosmos
  • Author
  • More

*立場 x Oursky*

立場 x Oursky 節點

建立ETH2.0 節點