什麼是 SSZ 部分?
什麼是SSZ部分?它有什麼好處,是否有任何現有的類似概念可以幫助理解它?
一些參考資料:
SSZ 部分的想法是任何 SSZ 類型(請參閱 SSZ 規範SSZ 是什麼)僅用於提供類型化的“視圖”:您擁有可能存在的所有內容的類型資訊,但您可能只需要部分訪問實際價值。
此外,由於 SSZ 的目標是為所有類型的數據提供 merkle-proofs,因此 partial 也可以具有 merkle-proof,但僅證明 partial 中包含的數據子集。
為了建構這些 merkle 證明,每個 SSZ 數據類型都有一個定義明確的方法來將其表示為二叉樹。
對於小塊數據,更常見的做法是將其表示為抽象的數據類型,使用您用來與值互動的任何程式語言。然後它只在值的默克爾化過程中最後一分鐘被轉換為二叉樹。
對於大塊數據,比如
BeaconState
類型,Eth2 信標客戶端開始記憶體這棵樹的一部分,或者將其完全表示為樹。這裡的目的是使用持久樹(函式式程式概念)來共享不會在不同狀態之間改變的子樹。當您只需要大量數據的一小部分時,您可以省略樹中不需要的部分,同時仍然可以使用相同的其他部分,這就是為什麼它被稱為“部分”。
此外,使用您的部分數據,您可以保留您修剪掉的不相關子樹的根節點(稱為“助手”或“兄弟”節點)。然後你就剩下你想要讀取的樹的部分,以及允許你為你感興趣的數據建構默克爾證明的輔助節點。
理想情況下,partial 仍然具有相同的類型資訊,因此您不必考慮 merkle 證明或從部分數據中提取值。它只是作為完整類型工作,除了您無法訪問某些值,因為它們不是所選值的一部分。
每當您嘗試訪問一些不存在的值子集時,部分的簡單實現可能只會引發異常。更好的實現可以定義類型的哪些部分不可用,同時在使用不破壞部分資訊的限制時保持類型與完整版本兼容。
好處
現在您可以混合使用小型和大型數據類型:當您只想讀取
latest_block_header
欄位和一些驗證器(例如effective_balance
ofvalidators[0]
和slashed
ofvalidators[23]
)的少量資訊時,無需提供完整的 BeaconState。相反,您只提供您需要的資訊,以及一些“幫助”節點來建構更大封裝類型(BeaconState)的 merkle-proof。這裡的意圖是輕客戶端可以以類型安全的方式與來自更大狀態的資訊進行不信任的互動,而根本不需要考慮所需的默克爾證明。
TLDR:在 Eth2 中為輕客戶端鍵入有效的任意 merkle 證明
擴大了解
為了更好地理解默克爾證明部分,我建議在 Eth2 規範問題中搜尋“多重證明”(涵蓋多個值的默克爾證明類型),對於高級用法,您還可以查找“SSZ 類型擴展”(Eth2標頭可以表示為塊的一部分)。
我還在為新的 SSZ 規範(完全兼容,沒有更改,只需擴展更多資訊)編寫此草案,以涵蓋這些類型的高級 SSZ 功能。正在進行的工作可以在這裡找到:https ://github.com/protolambda/eth2.0-ssz