關於跨分片交易,以太坊創辦人Vitalik發布了一份新提案
灑脫喜/張詠晴編譯
2019-10-31 10:59

 

10月29日,以太坊聯合創辦人Vitalik Buterin發布了一份關於跨分片交易的新提案,所謂跨分片交易,是以太坊2.0平台需要實現的一種功能。

 

以下是提案譯文:

 

以太坊2.0 階段2 (phase 2)的要求之一,是能夠快速地將ETH從一個分片移動到另一個分片。儘管透過常用接收機制的跨分片交易是可能的,因為協議本身只需提供對彼此分片的每個分片的狀態根的訪問,但跨分片ETH需要在協議活動中實現更安全的目的。原因是我們需要追蹤每個分片中有多少ETH,並且我們需要一個重要的機制,來防止跨分片傳輸的重放(replay)問題。

 

一般來說,基於收據(receipt)的機制,確實解決了這一問題,但它是透過具有「已消耗收據ID」的狀態樹來實現的,這將相當複雜地添加到當前名義上的無狀態系統中。之所以需要此收據ID樹,是因為我們允許收據(receipt)無序使用。

 

也就是說,如果愛麗絲(Alice)從分片A向分片B發送一筆交易,然後Applebaum也從分片A向分片B發送一筆交易,那麼有可能會出現Appelbaum的交易更早在分片B中被接受的情況。這是必要的,因為系統使用的是gas方法來處理收據消耗交易,愛麗絲(Alice)可能會決定不為這筆傳輸交易支付費用。

 

因此,這裡就出現了一個問題:我們是否可用一個按順序處理收據的機制,來代替處理收據的機制,這樣對於「上次從分片A收到的分片B的收據ID」 ,我們只需一個變量可遞增?

 

也就是說,每個分片A保持其狀態,對於每個其他分片B而言,則是兩個值:(i)將從分片A發送到分片B的下一個收據的nonce,以及(ii)將從分片B接收到分片A的下一個收據的nonce。

 

至於「誰來買單」問題的答案很簡單:區塊生產者需處理每個區塊來自其他分片一定數量的收據,透過對收據的源分片收費來限制費率。然而,這裡有一個主要問題:如果一個人透過從所有分片向特定分片發送收據(可能是意外的,也可能是故意的),對其進行了拒絕服務攻擊時,會發生什麼呢?

 

34

N個分片分別發送N個收據,會對目標分片產生pastedGraphic.png的負載。

 

為了解決這個問題,我們可以採用以下機制:每個分片都需在一個區塊中處理最高N個收據(例如N = 64);如果其他分片處理的收據少於N,它可使用其它分片的Merkle證明來證明這一點。每個分片不斷地向信標鏈(beacon chain)轉發它已處理的收據總數,這用於提供更新的「gas價格」,以便將收據發送到該分片。例如,每一區塊分片的收據處理隊列是滿的,gas價格可增加10%,最多可達到N。

 

這確保了在極端情況下,DoS攻擊最終無法增加接受分片隊列的長度,因此,每則消息都會得到處理,但這始終可發送一筆執行最小數量跨分片活動的交易。或者,分片需要將其EIP 1559 gasprice發布到信標鏈來處理區塊費用;該費用也可用於此項功能。

 

如果我們有這種發送ETH跨分片的機制,我們還可以將其用於通用收據發送功能,從而創建一個有強大保證的跨分片交易系統。

 

這裡存在的主要挑戰是,為了計算收據的效果,我們需要有人自願提供狀態的Merkle驗證內容。如果未寫入完整狀態,則無法在協議級別強制執行此操作;但可以做的是添加表單要求:「為了包含你自己的一筆交易,你還必須為隊列中的跨分片收據提供驗證內容。」

 

本文為巴比特資訊授權刊登,原文標題為「Vitalik:實施跨分片交易的一種新方式