原文:《Understanding Withdrawals》by Jim McDonald
翻譯:John, ECN 審閱:Franci, ECN
提款(withdrawals)是驗證者生命週期(validator lifecycle)中缺失的一部分,從2020 年12 月以太坊共識鏈一開始啟動以來就在開發當中,現在將隨上海昇級而來。由於上海昇級將在今年上半年啟動,所以值得注意和理解什麼是提款,其工作機制,以及這個新特性的使用方法。
歷史
當共識鏈第一次在2020年12月啟動時,你無法從共識鏈上發送任何信息到執行鏈上去。也就是說,儘管餘額能在共識鏈上累積,你也無法通過執行鏈去提現,因為技術上在當時提款是不可能的。經年累月過後以太坊的結構已經被改變得可以容納新的研究成果,轉變為當前以layer 2 為中心的擴容模型,並且很大程度上保持了執行鏈的原貌。在2022年的9 月,執行鏈與共識鏈合併了,執行區塊變成了共識區塊里數據的一個子集。這時信息從共識鏈上轉移到執行鏈上就是可行的了,其中一個例子就是驗證者獎勵。
你可以在”理解合併後的獎勵“(”Understanding post-merge rewards”)一文中找到共識鍊和執行鏈互動以及合併的區塊如何構建的詳細細節。關鍵點在於只有在合併之後提款才變成可能。
驗證者在做些什麼?
自從2020 年12 月的共識鏈創世以來,驗證者一直在產生區塊並維護鏈的安全。具體來說,他們一直在提議新的區塊,並參與對它們自己和其他驗證者提議的區塊的投票(註解2)。當被正確執行時,這些行為會為驗證者帶來獎勵。共識鏈啟動時只有2 萬多名驗證者,但在筆者撰文時已經約有52 萬名活躍的驗證者在確保其安全性。從2020 年12 月到2022 年9 月,共識鏈只維護了其自身的安全,但是這為合併的到來鋪平了道路(註解3),從2022 年9 月之後執行鏈就已經僅由驗證者們保證其安全性。
為了回報他們維護區塊鏈安全性的行動,這些驗證者被許諾以根據以太坊協議直接產生的獎勵,這些獎勵被記錄在共識鏈上。
驗證者的獎勵怎麼樣了?
因為共識鏈本身沒有執行能力,所以積累在上面的ETH 無法從一個賬號被轉移到另一個。確實共識鏈甚至沒有賬戶的概念,鏈上唯一有餘額的實體是驗證者本身。這意味著這些驗證者的獎勵雖然在過去兩年穩定增長,但是卻沒有提取它們的方法。
在所有驗證者中,共識鏈已經產生了超過1 百萬的ETH 作為累計的獎勵。就個人的驗證者而言,他們的獎勵取決於一系列的因素,但最明顯的莫過於他們作為活躍驗證者的時間。有很多驗證者已經積累了一筆數量巨大的獎勵:
大多數驗證者獲得了只有少於2 個ETH 的獎勵, 有些高達5 個ETH,儘管這些獎勵被登記在在共識鏈上,但是它們無法在執行鏈上被實例化,直到提款的功能就位。
注意,自從合併之後,除了上述的獎勵,提議區塊的驗證者會獲得一部分交易費。這些費用會直接在執行鏈上被支付,因此下文不會再論述它們。
上海昇級改變了什麼
上海昇級(註解4)提供了一個從共識鏈上轉移獎勵到執行鏈上的機制,每一個執行區塊都會包括大約16 次把ETH 轉移到執行鏈賬號上的提款(註解5)的數據。提款有以下數據結構:
圖表3:一筆提款
一筆提款的單個組成部分分別為:
提款索引(Withdrawal index) 提款的唯一標識符,便於引用。
驗證者索引(Validator index) 共識鏈上一筆提款來源的驗證者的索引
地址(Address) 提款將會被匯集到的地址
數目(Amount) 將會被添加到賬戶的ETH 數目,單位是Gwei(註解6)
當區塊被導入到執行鏈中時,提款將會根據給定的數量進行處理,相應地址的餘額會增加。注意提款不是交易,它們不消耗gas,它們也不會在提現地址觸發任何智能合約的操作。一旦區塊被處理完畢,相應的餘額將會增加,但不會再有其他的事情發生。
被提款的ETH 是從哪裡來的?
上述的信息描述了什麼是提款,但是提款發生時的ETH 是從哪來的呢?
儘管一個驗證者的信息被創建時,需要向以太坊存款合約存入32 個ETH,但是不能以提款為目的訪問這些ETH,因為合約裡沒有任何允許代幣轉移的機制。這些賬目總和的使用也最終會導致合約出現負的餘額,因為現在驗證者的在共識鏈上的餘額總和超過了一開始存款的總和。
提款是用根據以太坊協議產生的資金(即新增發的ETH)來支付的,而不是從已有的賬戶上轉移。這保證了提款可以一直被支付,即使從共識鏈上提出的總數目高於存入的總數目。
提款時鐘
在內部,共識層的軟件持有一個存有驗證者信息的簡單列表:
每一個驗證者實體的獨立組成部分分別為:
索引(Index) 對應這個驗證者及其列表內位置的唯一索引
狀態(State) 目前這個驗證者的狀態,比如“活躍中”或“退出中”(註解7)
餘額(Balance) 目前該名驗證者的餘額,單位為Gwei
提款憑證(Withdrawal credentials) 該名驗證者的提款憑證
上述這些概念大多數都是不言自明的,然而提款憑證卻需要一些解釋。每一個驗證者都有一組提款憑證。這些憑證控制了共識層資金的流向,包括初始的存款和接下來的獎勵。
目前有兩種提款憑證:
- 從BLS公鑰產生的,被稱為“type 0”提款憑證
- 從執行地址產生的,被稱為“type 1”提款憑證。
我們待會再來詳細地探索這些概念,但是,目前的重大區別在於,type 1 的提款憑證允許共識資金被提款到執行鏈上去,而type 0 提款憑證不行。
共識鏈按順序處理提款,從索引0 開始一直處理到某一集合中最後那個索引,然後再從頭開始。你可以用一個單指針的模擬時鐘作為類比提款進程的一種思考方式。每一個鐘上的刻度代表一個驗證者,從驗證者索引0 開始到最後那個(目前大概是52 萬個)。
圖表4 提款時鐘
一旦上海昇級上線,區塊就會包含提款信息。為了選擇哪些驗證人可以提款,時鐘指針圍繞驗證人轉動,每當它指向一個有資格提款的驗證者時,該名驗證者的部分或全部餘額將根據以下規則被提出:
- 如果驗證者擁有type 1 憑證,並處於”活躍“ 狀態(註解8),並有超過32 個ETH 的餘額,那麼超過32 個ETH 的部分會被提出。
- 如果驗證者擁有type 1 憑證,並處於“可提款” 狀態,餘額不為0,那麼剩餘的所有餘額都會被提出。
如果上述其中一條規則適用,就會有一筆提款產生並被添加到區塊裡;如果上述兩條都不適用,那麼驗證者就會被認為不符合條件,指針會繼續往下走。指針會繼續跳動直到它找夠16 個符合條件的驗證者(註解9),這時單個區塊所需的提款筆數足夠了,提款信息就會被包含進區塊中。
時鐘指針走完一輪的時間取決於符合資格的驗證者數量。
在筆者撰文時有大約520,000 名驗證者處於活躍狀態。若每個區塊有16 筆提款,每天7,200 個區塊,則每處理一輪符合資格的驗證者集將需要大概4.5 天。但正如上圖所示,這個時間將隨著符合資格的驗證者數量改變而改變。
修改提款憑證的過程
正如上文所述,要成為符合資格的驗證者必須擁有type 1 的提款憑證。筆者撰文時有大概40% 的驗證者擁有type 1 的憑證,其餘的則擁有type 0 憑證。上海昇級會帶來從type 0 升級到type 1 提款憑證的能力,如此驗證者便能接收獎勵。修改提款憑證需要創建一個在共識鏈上廣播的簽名操作。這個操作的結構如下圖:
圖表6:修改提款憑證的操作
操作的組成部分分別為:
- 驗證者索引(Validator index) 該操作所適用的驗證者的索引
- 提款的BLS公鑰(Withdrawal BLS public key) 目前BLS提款憑證的BLS公鑰
- 執行地址(Execution address) 用於新提款憑證的執行地址
- 簽名(Signature) 由當前BLS 提款憑證的私鑰在操作的其他字段上所作的簽名。
信標鏈上的操作過程如下:
“就每一個被驗證者索引所定義的驗證者而言,檢查給定的BLS 公鑰是否可以轉換為匹配當前驗證者的type 0 提款憑證。若可以,則把給定執行地址轉換成type 1 的提款憑證並為驗證者更新。”
因此,修改憑證的操作只能發生一次。一旦修改憑證的操作被處理完畢,鏈上驗證者的定義就會包含type 1 提款憑證,所以就據上文所述就沒有type 0 提款憑證可供匹配了。也就是說,type 1 憑證一旦被設定就將在其生命週期內保持不變。 (註解11)
選擇執行地址
修改提款憑證的第一步就是選擇用來接收提款的以太坊執行地址。正如上文所描述的,你只能作一次改變,所以你必須保證你在做設置之前已經確保了地址私鑰的控制權。若你有多個驗證者身份那麼你需要考慮是否要為每一個驗證者身份提供一個不同的提款地址,或者為所有的驗證者身份使用相同的地址:
設置相同的地址方便了你,獎勵會更快地累積到這個地址去,因此消耗的gas 會更少。
設置不同的地址,保持它們互不關聯則增加了你的驗證者身份的安全性,若這些驗證者身份本身就是互不關聯的(不同的儲蓄地址,不同的或者本來就沒有的區塊提議塗鴉等)
創建操作
一旦執行地址被選定,則需要為每一個驗證者創建並簽署一個操作。由於暴露與提款憑證相關的私人信息的敏感性(可能是私鑰或者助記詞),我們推薦離線創建。操作方法超出了這篇文章論述的範圍,但你可以參考使用ethdo 工具這麼做的詳細指南,或者使用未來其他可用的工具和嚮導。
廣播操作
在創建操作之後,你需要把它們廣播在共識鏈上。若操作是在上海昇級之後才被提供給共識節點的,那麼它會在下一次機會被廣播到網絡中以打包進區塊。若操作是在上海昇級之前被提供給共識節點的,那麼它會被儲存起來並在升級完成後被廣播到網絡。注意這需要你連接到一個可以識別上海昇級的共識節點上;就目前來看這些共識節點預計將在2 月的某個時候可用,為主網升級提供了良好的時機。
在線/離線進程
正如上文所述,創建憑證修改操作應該在離線狀態下進行。這避免了提款的私鑰被暴露給不安全的電腦從而導致私鑰被竊取的情況。然而,訪問一台在線的電腦需要從信標節點上獲取信息,並最終廣播憑證修改操作。因此,我們推薦用一個在線/離線的進程來創建並廣播修改操作。
圖表7:在線和離線的配置中創建和廣播修改提款憑證操作
有不少的工具都遵循這個過程,比如ethdo 就有他們自己的文檔交代如何進行這個過程,下文是每一步的概覽,講述其作用和意義。
1.獲取鏈上信息
要創建有效的已簽名的憑證修改操作,你需要從鏈上獲取不同的信息,這些信息應該從鏈本身獲取以保證是正確的信息。我們同樣推薦獲取一份包含目前所有驗證者信息的列表。因為這樣可以更容易地創建操作,同時驗證創建的操作是否適合驗證者。
這些信息來自一個活躍中的共識節點,因此需要從一台聯網的電腦上獲取這些資料。大多數運行驗證者程序的實體應該都有訪問共識節點的權限,但是如果它們將質押過程委託給一個服務商,那它們應該設法從服務商獲取必要信息。
這將產生一份包含鏈上信息的文件。文件本身不會帶有私鑰或其他敏感信息。
2.轉移鏈上信息
一旦鏈的信息被收集完成,那就需要把它從一台在線的電腦轉移到一台離線的電腦。目前的普遍做法是通過USB 存儲,USB 存儲允許兩台電腦不需要直連就能完成信息的轉移。這意味著離線的電腦可以完全與互聯網斷開連接,極大地增加了私鑰或者助記詞的安全性。
3.創建憑證修改操作(Credentials Operations)
一旦離線的電腦上有了鏈的信息,那就可以進行憑證修改操作的創建了。這要求對創建了目前提款憑證的助記詞和私鑰的訪問權,所以在離線的電腦上運行這個進程更加安全。
私鑰和助記詞有可能創建了多個驗證者的憑證,因此創建進程可能會產生多個修改操作。
這會產生一個包含了修改憑證操作的文件,文件自身不會包含私鑰或者其他敏感信息。
4.轉移憑證修改操作
一旦憑證修改操作的文件被創建完成,就需要把它從離線的電腦上轉移到在線的電腦上。再說一次,USB 存儲或類似的方式是普遍的最優做法。
5.廣播憑證修改操作
一旦在線的電腦上有了憑證修改操作的文件,就可以通過將這些操作發送到某個共識節點來向以太坊網絡廣播。最有可能是發送到下載鏈信息回來的那個節點上。
一旦操作被提交到共識節點上,節點就會把它們在全網範圍內廣播,一旦共識區塊打包了這些操作那麼修改就會隨之生效。每一個區塊都有容納16 個修改操作的空間, 所以有可能需要4 天才能讓一個操作被添加到一個區塊裡去,但是更有可能的是1 到2 個小時就可以添加。
總結
提款功能將隨著上海昇級推出,自從共識鏈啟動以來第一次使用戶的共識獎勵變得可用。一旦設置好之後,它們就會自動地為任何驗證者所用,而升級也帶來了一個機制來配置那些尚未準備好提款的驗證者。
驗證者生命週期完成之後,共識鏈就履行了對質押者們從2020 年12 月以來許下的承諾,並准許驗證者離開這個他們此前覺得可能離開不了的系統。額外的驗證者將為以太坊帶來更強的安全性以及一條更強大的鏈。
1.以太坊有多條鏈,通常被稱為共識鏈(或稱信標鏈)和執行鏈,欲了解更多信息請參考文章”理解合併後的獎勵“。
2.他們同樣參與到同步委員會中,但這些都是見證的另一種形式。
3.就是用俗話解釋以太坊從工作量證明共識機製到權益證明共識機制的遷移。
4.與共識鏈上的Capella 升級同時進行。
5.嚴格意義上最高可以達到16 筆提款,除極端情況外,所有slot 都應該是滿的。
6.共識鏈上的所有數值都是以Gwei 為單位的,因此從共識鏈到執行鏈的任何代幣轉移都是一個以Gwei 為單位的整數。
7.狀態實際上來自驗證者信息中的其他字段,所以它不會呈現在驗證者的定義裡,但是由於它在文章其他地方被引用了,所以把它展示在這。
8.“活躍中”和”可提款“的狀態定義可參考文章“理解驗證者生命週期”
9.在16384 名驗證者之後提款時鐘的指針就會停止跳動,即使找不夠16 名符合資格的驗證者,儘管這種情況不太可能在測試網以外發生。
10.筆者撰文時這個數字實際上大約是7160,因為一些區塊沒被提議或者在提議後變成了孤塊。
11.這可能隨著新的操作的引入而在未來改變,但在筆者撰文時尚無這樣的計劃。
12.預計在升級後的頭幾天會有一波驗證者修改他們憑證的初始高峰期,在這之後排隊的人將會很少,因為大多數符合資格修改憑證的驗證者都已經修改完。
點擊“閱讀原文”獲取文章內部鏈接!
原文鏈接:https://www.attestant.io/posts/understanding-withdrawals/
ECN 的翻譯、編輯工作旨在為以太坊中文社區傳遞優質資訊和學習資源,文章版權歸原作者所有,轉載須註明原文出處以及ETH 中文。若需長期轉載,請聯繫eth@ecn.co 進行授權。