rickmak
rickmak

Software engineer located at Cosmos

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 上的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 版权声明

喜欢我的文章吗?
别忘了给点支持与赞赏,让我知道创作的路上有你陪伴。

加载中…
加载中…

发布评论