Eth2 系統中每個驗證者都有兩組密鑰:簽名密鑰對和取款密鑰對,在 Phase 0,只需關注簽名密鑰。

原文標題:《科普 | Eth2 Staking 指南 #4:密鑰》
撰文:Carl Beekhuizen
翻譯:阿劍

衷心感謝 Sacha Yves Saint-Leger 和 Danny Ryan 對本文的審覈。

權益證明系統的核心是其簽名方案。簽名用於驗證發出操作的驗證者的身份,即確定哪個操作是由哪個驗證者發出的(不論是 「好」 的操作還是 「壞」 的操作)。

我們既可以根據一個驗證者簽過名的消息來確認 TA 遵守了協議,也可以通過展示觸犯了共識規則的消息來證明某個驗證者的惡意。

實際上,在 Eth2 系統中,驗證者的身份是根據其公鑰(public key)來確定的。每個驗證者都有兩組密鑰:簽名密鑰對和取款密鑰對。

簽名密鑰對

所謂 「簽名密鑰」,是指一個驗證者在簽名見證消息和提議區塊的時候要用到的密鑰。因爲驗證者每一個時段(epoch)都要簽署至少一條消息,客戶端軟件必須託管簽名密鑰。

取款密鑰對

因爲客戶端軟件總是聯網的,因此必然有簽名密鑰丟失、被盜的可能。爲降低此類事件會造成的影響,驗證者可以執行的操作被分成由兩套不同的密鑰來發起。

簽名密鑰,如上所述,用於履行驗證者責任。另一方,「取款密鑰」 則用於控制驗證者的資金。

在驗證者的整個生命週期中,驗證者僅在極少數時候需要用到取款密鑰。這意味着取款密鑰可以放到冷錢包了,(離線)存儲在足夠安全的地方。

注意:驗證者資金轉賬和取款功能都要等 Phase 1 之後纔會上線。

譯者注:這裏的簽名密鑰和取款密鑰,作者在原文中常用單數形態 「a signing key」 「a withdrawal key」,但在這裏我翻成 「簽名密鑰對」 和 「取款密鑰對」。因爲根據我們對密碼學的理解,要保證身份同一性,少不了要用到公鑰密碼學(公私鑰對):驗證者提前使用簽名私鑰和取款私鑰對應的兩把公鑰在註冊表中註冊,然後在其生命週期中,使用其私鑰來簽名消息時,其身份才能得到確認。取款過程也是同理,也跟我們當前使用以太坊賬戶的方法並無二致。

密鑰怎麼這麼多!

如果每要質押 32 ETH,用戶就要保存和使用兩套互不關聯的密鑰,那這也太麻煩了。

在 Eth2 中,我們可以用 EIP-2333 和 EIP-2334 來解決這個問題:這兩個 EIP 提出了一套標準,描述了簽名密鑰和取款密鑰可以如何關聯起來,以及這兩組密鑰如何可以從同一個 Mnemonic (助記詞)中推導出來。

助記詞

助記詞是另一種用編碼來保護密碼的辦法,也是普通用戶存儲和備份私鑰的最簡單辦法。簡而言之,就是把

 0x1e9f2afcc0737f4502e8d4238e4fe82d45077b2a549902b61d65367acecbccba

這樣的私鑰,轉化成

sausage solution loud isolate focus glide frame door clown million shuffle impulse

這樣的可讀單詞,然後記下或者寫下來,這樣就更容易保存、更不容易出錯了。

從一把密鑰推導出其它密鑰

在使用錢包時,您可能會遇到形如 m/44'/60'/0'/0/0 這樣看起來像路徑的東西。這個路徑是用來描述密鑰之間的關係的。

根據 EIP 2333,用一把密鑰(也即一組助記詞)中推導出其它密鑰所形成的體系就像一棵樹一樣,而被推導出來的密鑰是根據樹的 「種子」(即最初那個密鑰)和樹的路徑來決定的。

我們使用種子計算出樹根,根據樹根和樹分支來推導密鑰、一層一層地建構出整棵密鑰樹。因此,可以認爲,整棵密鑰樹都完全是根據樹的分支與樹根之間的關係來決定的。(譯者注:根據這個描述也可以看出,整棵密鑰樹是無限大的,因爲可以無限推導下去。在使用時只需記好哪些分支上的那些密鑰是用過的、有資金的就好。)

在使用過程中,這種推導密鑰的方法讓我們可以找出我們要用的任意密鑰:只需從樹根開始、按分支計算中間密鑰,最終算出我們要用的那個密鑰(葉子)即可。

一個有趣的結果就是,我們可以從單個隨機數(比如一組助記詞)開始,推導出無限多的密鑰。用在 Eth2 中,一組助記詞就可以產生出驗證者需要的任意多的密鑰。舉個例子,如果你需要用一組助記詞產生出 3 個取款私鑰,那麼可以像這樣推導:

科普 | Eth2 Staking 指南 #4:密鑰

每個分支都用 「/」 來標記,所以 「m/2」 表示的是從主密鑰推導出的第 2 分支。

EIP 2334 指出,驗證者的簽名密鑰可以使用取款私鑰的第 0 個子分支。在實踐中這意味着,只要遵循這個標準,只要你知道取款私鑰,你就可以計算出相應的用於簽名的私鑰。計算過程也如上例所示:

科普 | Eth2 Staking 指南 #4:密鑰

這裏我們是爲了儘可能簡化才舉這樣的例子的,實際上的路徑會更長一點(比如 EIP 2334 就要求使用 m/12381/3600/i/0m/12381/3600/i/0/0 這樣長的路徑用於推導取款私鑰和簽名私鑰)。不過,邏輯還是完全一樣的。

謹記:如果你知道自己的助記詞,就可以推導出取款私鑰,然後再推導出簽名私鑰。

存儲密鑰

驗證者客戶端使用 Keystore 文件來交換密鑰。

Keystore 是一種文件格式,包含了用戶用口令(password)加密後的私鑰,因此可以安全地存儲以及在計算機之間安全地傳播(只要口令沒有存在同一臺計算機上就好)。

如果你已經準備好要開始驗證了,你可以把 Keystore 導入客戶端(當然,你還需要輸入口令,好讓客戶端能導出私鑰)。

成爲驗證者

成爲驗證者的第一步是生成密鑰。請保證在安全的環境中使用安全的軟件來生成私鑰,生成後請寫下來。

因爲 Phase 0 階段沒有取款功能也轉不了賬,你不需要用 Keystore 來存儲取款私鑰,保證你的助記詞是安全的就夠了。

如果你的驗證者客戶端需要你的簽名私鑰,那麼在你輸入私鑰之後你可以得到相應的一個 Keystore 文件(加密的口令也是你自己輸入的)。你跑多少個驗證者,就會拿到多少個 Keystore。

爲了註冊成爲驗證者,你需要給每個驗證者準備 32 ETH 的保證金,加上你的保證金數據(包含着你的驗證者公鑰),發送給 Eth1 鏈上的保證金合約。

保證金數據會被記錄在保證金合約中。Eth2 的節點可以觀察到這個合約,因此可以獲得其中的保證金數據。你的保證金數據被 Eth2 鏈接受以後,你就正式成爲驗證者了。

最簡單的方法

我們一直在開發一個友好的界面來幫助驗證者完成註冊過程。我們接下來的更新會介紹 Eth2 Lauchpad 以及如何使用它。

來源鏈接:blog.ethereum.org