隨著ETH2.0的合併順利完成,質押的熱度也在不斷的創下新高。根據目前鏈上數據顯示,以太坊鏈上質押總量已達到驚人的1400多萬個ETH ,將近44萬個驗證節點正在穩定運行,每天都有1000-2000個ETH被質押,這些節點在保證以太坊的安全同時,也在賺取豐厚的利潤。

有了驗證者提案手續費的加成,預計年華收益將達到6%-10%左右,縱觀目前市面上的知名質押平台,能安全穩定達到此收益的幾乎屈指可數。

用戶在質押32ETH後將會獲得一個鏈上驗證者,驗證者首先進入質押排隊系統,大約24小時-14天左右激活,這個過程要看目前質押隊列的數量,驗證者在激活後每個週期( 6.4分鐘)都會獲得質押收益。

為了實現上述質押流程,需要為用戶生成提款憑證,提款憑證是用戶未來提取質押本金及收益的憑據,也是創建鏈上驗證者最重要的參數之一。

生成ETH2.0提款憑證主要有兩種方式:

經過查找,目前市面上Ledger硬件錢包實現了EIP2334:BLS12-381 算法,可能受限於開發複雜度或其他方面的緣故,大部分硬件錢包都尚未對此算法進行支持。不過不用擔心,好消息是還有ETH1_WITHDRAWAL_PREFIX這種方式,基本上所有能生成ETH地址的錢包都可以完美支持。

接下來就來看看如何使用這兩種方式,讓每個錢包都能無縫集成ETH2.0質押體系。

如何使用EIP2334:BLS12-381方式生成提款憑證?

該規範主要定義了密鑰樹中密鑰的用途,是將EIP-2333生成的密鑰分配給特定用途的標準。它定義了一個Path字符串,該字符串為EIP-2333生成的密鑰樹時要使用的索引。此規範不僅被設計為ETH2.0的標準,也被其他社區廣泛採用。

為了保證用戶質押的資金安全,每個驗證者都有兩個密鑰對,一個用於資金提款和轉賬(提款密鑰),另一個用於驗證者的簽名(簽名密鑰),驗證者可以執行的操作被分成由兩套不同的密鑰來發起。

(1)提款密鑰:提款密鑰用於用戶質押本金、收益的提取,需要在ETH2.0官方提款功能上線後使用。該密鑰關係到用戶的資金的安全,因此需要保存在硬件錢包、冷錢包中。

(2)簽名密鑰:簽名密鑰是指一個驗證者在簽名消息和提議區塊的時候要用到的密鑰。因為驗證者每一個時段(epoch)都要簽署至少一條消息,所以簽名密鑰需要存放在第三方的聯網服務器上。

(1)基本原理

EIP2334路徑由整數定義,由分隔符號/表示層級關係。路徑中有4個級別(加上主節點),並且必須至少使用4個層級(包括主節點在內總共5個)。

漲姿勢:錢包怎樣安全的參與到 ETH Staking 浪潮中?

開發過HD Wallet的同學可能對這個比較了解,修改最後層級0將生成不同的密鑰對,獲得提款密鑰對後我們就可以提取公鑰,作為用戶的ETH2.0的提款憑證:

漲姿勢:錢包怎樣安全的參與到 ETH Staking 浪潮中?

(2)具體如何實現?

具體的算法由於篇幅原因不在這裡繼續展開,實現完整的算法還需要熟悉EIP-2333 ,官方已經提供了此算法的Python實現,可根據錢包自身的開發語言自行轉換:

https://github.com/ethereum/staking-deposit-cli

如何使用ETH1_WITHDRAWAL_PREFIX方式生成提款憑證?

為了讓ETH1.0錢包地址可以平滑的過度到ETH2.0質押體系,官方提供了一種新的方式來將ETH1.0地址轉換為ETH2.0提款憑證。也就是上面提到的ETH1_WITHDRAWAL_PREFIX方式。

這種方式支持所有能生成ETH1.0地址的APP錢包、硬件錢包、WEB錢包等等,只需要將用戶的ETH1.0地址稍作變換,就可以得到一個ETH2.0的提款憑證。

轉換後的提款憑證都是小寫字母,待ETH2.0提款功能上線後,用戶將使用ETH1.0地址的簽名,進行ETH2.0質押金額的提款,請務必確保轉換正確。

具體轉換方式如下:

漲姿勢:錢包怎樣安全的參與到 ETH Staking 浪潮中?

這種方式相比上面的方式要簡單許多,任何支持ETH1.0地址生成的錢包都能很容易的接入,接下來就來看看如何使用生成的ETH2.0提款憑證。

如何讓錢包支持ETH2.0質押?

通過上面兩種方式生成ETH2.0提款憑證後也只是完成了用戶那邊的準備工作。運行ETH2節點還需要生成驗證者節點的簽名密鑰對,這個簽名密鑰對必須和用戶的提款憑證進行簽名關聯才能在服務器上運行驗證者客戶端軟件幫助用戶獲得質押收益。

(1)驗證節點簽名密鑰對生成服務

這個服務只有一個功能,就是讓用戶傳入提款憑證,在服務端生成此憑證的驗證節點簽名密鑰對,同時返回簽名後的一些參數給用戶端,用戶通過錢包調用ETH2.0官方質押合約時傳入即可。

由於官方已經提供了密鑰對生成的相關工具源碼,可以直接改造一下官方提供的ETH-Staking-Deposit-CLI工具降低開發成本。

為什麼需要這樣一個後端服務?不能讓用戶自己使用這個工俱生成驗證者密鑰後,再上傳到錢包這邊嗎?當然可以,但錢包作為節點運營方,一方面要讓用戶的質押流程足夠簡單,另一方面要確保驗證驗證節點密鑰的安全。驗證節點密鑰如果被兩個客戶端同時運行,ETH鏈上會立即因為安全原因懲罰、甚至罰沒節點。驗證節點密鑰如果在用戶手中就很難確定到底是誰導致的罰沒。

最終改造完成後,傳入用戶的提款憑證,會生成兩個文件,其中keystore-*.json是要在服務器上運行的驗證節點簽名密鑰,需要節點運營商安全保管deposit_.*json則是要傳入官方質押存款合約的參數,需要返回給前端,調用質押合約需要這些參數,其內容結構大致如下:

漲姿勢:錢包怎樣安全的參與到 ETH Staking 浪潮中?

(2)調用ETH2.0官方存款合約質押

到這里為止,質押所需的數據就都有了,上面這個JSON對象裡就是官方質押存款合約需要傳入的參數,現在就來調用合約完成質押流程。

ETH2.0 官方存款合約: 0x00000000219ab540356cbb839cbe05303d7705fa

下面以javascript為例,調用官方合約質押創建驗證節點:

漲姿勢:錢包怎樣安全的參與到 ETH Staking 浪潮中?

(3)運行驗證節點客戶端

調用合約質押完成後,在ETH2.0鏈上就已經擁有了一個驗證者,餘額是32ETH,它可能還需要24小時-14天左右生效,具體要參考質押隊列數量。

現在要運行一個驗證者客戶端,執行區塊簽名並保護ETH網絡的安全,同時獲得網絡獎勵的收益。

選擇一個客戶端來運行驗證節點:

  • Nimbus

  • Prysm

  • Lighthouse

  • Teku

這裡使用Lighthouse來運行驗證節點,使用Docker會讓整個流程變得簡單:

詳細安裝方法請參考官方教程:

https://lighthouse-book.sigmaprime.io/mainnet-validator.html

啟動信標鏈:

漲姿勢:錢包怎樣安全的參與到 ETH Staking 浪潮中?

啟動驗證者:

漲姿勢:錢包怎樣安全的參與到 ETH Staking 浪潮中?

這裡要注意將驗證者密鑰存放在/root/validator_keys中,docker會自動導入你的密鑰。

(4)查詢節點狀態

最終就可以在官方的驗證者節點瀏覽器上查詢狀態:

https://beaconcha.in/validator/驗證者節點公鑰

歸納總結

以上就是ETH2.0的整個質押流程,如果過程中不出意外,你的驗證者節點將在(24小時-14天)左右激活,具體要看目前質押排隊情況。驗證者激活後,每6.4分鐘都會看到有收益進入餘額。

目前也有一些平台提供了一站式的接入服務,錢包方只需要簡單的集成一下,就可以擁有上面的全部功能,例如可樂礦池,大家可以根據自身需要進行選擇。