Eth2將使用Proof of Stake(權益證明)來維護網(wǎng)絡安全,但實行PoS需要每個活躍的參與者(“驗證者”)擁有一定資產(chǎn)來進行質押。如果持有資產(chǎn)的是eth1賬戶,那么這些資產(chǎn)需要轉移到eth2的驗證者處才能進行質押。
驗證者的職責主要是提議區(qū)塊并證明(attest)其他區(qū)塊,而質押者(staker)則提供資金進行質押。驗證者和質押者的角色可以是相同或不同的實體,最佳實踐建議將這兩者區(qū)分開以最大程度保證資金的安全性。
將資金從eth1轉移到eth2以及定義質押者和驗證者的過程稱為Staking,第一步是在eth1上發(fā)送質押存款交易(staking deposit transaction)。質押存款交易包含的細節(jié)信息有質押者身份、驗證者身份等等,并被統(tǒng)稱為存款協(xié)議(deposit agreement)。本文將詳細探析抵押存款,并闡釋在eth1上提交ETH給eth2驗證者的過程。
1. 創(chuàng)建存款協(xié)議
存款協(xié)議將對質押者和驗證者進行定義,并構成存款程序所需交易的基礎。
2. 驗證者身份證明
要確保將存款交給了正確的驗證者,就需要驗證者身份證明。驗證者通過將其公鑰添加到協(xié)議中來證明自己的身份:
注意,由于是在eth2中對驗證者進行身份證明,因此使用的是eth2公鑰而非eth1公鑰。
3. 質押金額
其次,存款協(xié)議中需要包含質押金額,以確保雙方(以及雙方網(wǎng)絡)就質押金額達成一致。質押者可以將其期望質押的金額添加到協(xié)議中:
4. 提款身份證明
提款身份證明用于提供驗證者提出存款的賬戶。質押者可以通過向協(xié)議中添加可操縱的公鑰來識別提款賬戶身份:
1. 公鑰經(jīng)由哈希以壓縮其大??;
2. 哈希字符串的首字節(jié)由類型標識符代替(目前標識符為“0”)
注意,提款身份證明使用的也是eth2的公鑰。因此,其必須直接由質押者提供,而無法像eth1智能合約通常那樣從交易簽名中恢復。
還要注意的是,如果驗證者和質押者是同一實體,則應使用不同的密鑰進行驗證者身份識別和提款身份識別。如此以來提款密鑰可以安全地離線保存,直到質押者做好提款準備。
5. 驗證者授權
要表明驗證者同意遵守協(xié)議條款進行驗證,則需要驗證者授權。驗證者要使用與驗證者身份證明相同的密鑰對協(xié)議條款進行簽名來進行授權,并將該簽名添加到協(xié)議中:
6. 提交存款協(xié)議
此時,存款協(xié)議中包含四條信息:驗證者身份證明、質押金額、提款身份證明和驗證者授權。如果質押者想繼續(xù)完成存款,還需要將包含該協(xié)議和資金的交易發(fā)送給eth1存款合約(deposit contract):
此處有兩點需要注意:
1. 質押者沒有在存款協(xié)議中明確授權,而是在交易廣播之前將其簽名添加到交易中提供所需授權;
2. 交易必須附帶存款協(xié)議中所涉及的ETH確切金額,任何其他金額都將導致交易被存款合約拒絕。
接著由以太坊存款合約(deposit contract)接收并處理交易,如果一切正常進行,則存款合約將創(chuàng)建一個存款收據(jù)事件,收據(jù)包含存款協(xié)議中的所有數(shù)據(jù),并且表示存款合約已經(jīng)接收存款協(xié)議和所質押的ETH。
7. 激活存款協(xié)議
與前序步驟不同,激活合約主要進行在eth2中。
Eth2會跟蹤eth1的更新以獲取存款收據(jù)。每個eth2節(jié)點在其提議的區(qū)塊中都包含有最新的存款收據(jù)。隨著這些區(qū)塊的最終確認,存款就會成為eth2整體狀態(tài)的一部分。存款收據(jù)將作為驗證者狀態(tài)存儲在eth2中。
同樣,驗證者也會跟蹤eth2中的更新以獲知驗證者狀態(tài)的變化。當觀察到帶有公鑰的驗證者狀態(tài)條目時,說明該存款已在eth1上完成,且已經(jīng)得到了eth2的識別,剩下的就是證明工作了。
全程
結束提交和激活步驟之后,就完成了在eth2中質押eth1資產(chǎn)的全部過程:
注:盡管在理論過程中沒有說明,但隨著安全性的提升,Staking的過程會存在許多延遲。譬如在eth2中,在獲取到存款收據(jù)事件和將該信息添加到驗證者狀態(tài)之間會存在一定的延遲,這樣做是為了確保eth1網(wǎng)絡中不會發(fā)生區(qū)塊鏈重組而導致存款無效。