miles

miles

for starknet

StarkNet 介紹:重點部件概述

本文將對 StarkNet 中的重要組件進行簡要解釋,不會涉及太多技術細節或代碼部分,但希望讀者能對 ZK-Rollup(Validity-Rollup)有基本的理解。

同時,由於 StarkNet 的系統設計涉及大量與零知識證明和 Merkle 樹相關的數據結構,因此讀者也需要大致了解什麼是零知識證明和相關的 Merkle 樹,這將有助於閱讀過程的順暢!未來可能會繼續深入討論各個系統組件。

簡介
StarkNet OS(操作系統)主要由 Cairo 這個 StarkNet 的原生語言編寫,Cairo 就像 StarkNet 上的 Solidity,可用於編寫(基於 Cairo 的)智能合約,但同時也是一種零知識證明語言,可用於構建 StarkNet 核心操作系統和各種功能。

在 StarkNet 這條鏈上的所有邏輯都將包含在 StarkNet OS 中,例如如何定義賬戶狀態、交易原理、合約執行,甚至如何進行位運算、哈希運算和原生的簽名算法等,都會在這裡定義。

總的來說,操作系統需要在交易和合約接收輸入之後生成輸出,並將這個輸出更新到 StarkNet 這個 L2 的狀態(State)中。

那為什麼要使用零知識證明語言來編寫 StarkNet OS 呢,而不是其他常見的語言?

相信大家都知道擴容的其中一個大方向就是 “把繁瑣的計算丟到 Off-Chain 並且只要在 On-Chain 做驗證即可”,而 StarkNet 作為 ZK-Rollups 的一員,他會將 Cairo 編寫的 ZK-STARK 程序執行完的內容通過 STARK-proof system 進行證明(prove)並在 Ethereum 上進行驗證(verify)。

如果看到這裡還不是非常了解也沒關係,接下來幾個小節會依序補完這些名詞解釋和使用場景!

StarkNet 系統概述
StarkNet Sequencer
StarkNet 作為一個 Rollups 沒有類似過去我們認識的礦工角色存在,但依然需要一個角色來 “驗證交易”、“決定交易順序”、“構建區塊”,而負責這三者工作內容的人就是 Sequencer。

Sequencer 是一個 off-chain 伺服器,工作流程的第一步是接收用戶提交的交易(來自不同用戶的多個不同交易),然後 Sequencer 會決定交易的順序並構建 L2 的區塊。

Sequencer 需要確認交易是經過賬戶所有者授權的(由於 StarkNet 使用了原生 AA 的賬戶系統,因此這裡不一定是簡單確認簽名正確,可能是多簽或其他驗證邏輯)。然後通過 StarkNet OS 執行一次交易,概念上類似於 EVM,接收輸入後執行合約邏輯並生成輸出。

Sequencer 執行交易會產生一個 trace(需要注意這個 trace 不是函數返回而是執行過程的證明),然後將這些執行內容的 “過程證明” 發送給 Prover,告訴大家:“我執行過這段代碼了。”

在接下來要講的 Prover 和 Verifier 驗證成功之後,Sequencer 會更新 L1 StarkNet 核心合約中的狀態。

StarkNet Prover & Verifier
Prover 同樣也是一個 Off-Chain 伺服器,主要任務是接收 Sequencer 執行完代碼產生的 trace,並生成相應的 STARK 證明,然後交給運行在 L1 上的 Verifier 合約進行驗證,驗證通過後將註冊 fact 以供未來的 L1 StarkNet 核心合約進行查詢。

Verifier 合約會在 L1 上負責驗證一切是否合法,它會接受輸入和 STARK 證明來決定。

補充說明:目前 StarkNet 中只有一個 Prover,它不僅為 StarkNet 生成證明,還為運行在 StarkWare 自己的 StarkEx rollup 上的所有其他應用程序(例如 Immutable X、dYdX、Sorare 等)生成證明。這就是為什麼該服務被稱為 Shared Prover 或 SHARP 的原因。

StarkNet L1 核心合約
StarkNet L1 核心合約存儲著 L2 上狀態的證明,大家常說 Rollups 的安全性是由 Ethereum 這個 L1 保證的就是來源於此。當我們的 trace 經過 Prover 生成證明並在 L1 Verifier 合約驗證後,將告訴 L1 核心合約這個 “狀態更新” 是正確無誤的。

“狀態更新” 指的是在 StarkNet 執行交易後會改變狀態,我們要想辦法正確地傳達給 L1 核心合約說 L2 上的狀態從 S 更新為 S’了。

當 L1 核心合約通過 Verifier 知道這次的狀態更新是合法的後,Sequencer 就會在合約中更新 State Root。

換句話說,知道 “這次狀態更新是合法” 的意思是,我們通過 ZKP 證明了鏈下的計算是真的被正確執行了,而不是編造出一個隨便的交易結果就叫 L1 核心合約更新狀態。

此外如果 StarkNet 在 L1 有一些 operations 需要定義,也會定義在 StarkNet L1 核心合約中,例如:

官方認可的 Verifiers 合約(Addresses List)
L1 ↔ L2 互動的邏輯(消息傳遞的方式)
討論
去中心化與開源
Rollups 中的 Sequencer 或像 Prover 這樣的角色被該鏈的官方把持著其實會引來社區的質疑,因此對長遠發展來說開源非常重要。不僅有更多雙眼睛可以審視這個代碼,也可以因為社區的協作和貢獻讓系統更安全、有效率。退一萬步來說,社區還能夠獨立地開發並維護整個網絡。

所謂的去中心化在 StarkNet 社區有兩個主要討論層面:

不需要許可就能運作的 Sequencers 和 Provers 可以確保這個網絡是抗審查的(censorship-resistant)。
因為使用了 STARK-proofs,任何人都可以用很低的硬件成本來驗證整條鏈的正確性,同時也不需要信任任何第三方單位。
當前 StarkNet 已經開源了最新的 Sequencer,Prover 也即將開源,有興趣的人可以查看以下資源:

StarkNet 分散式協議 III — 共識
開源:StarkNet 的新 Sequencer
開源 StarkNet Prover
性能與瓶頸
StarkNet 運作的性能和 Gas 費用在這幾個月我自己使用下來,其實並不是非常好(有時甚至差或完全不能使用),但 StarkNet 官方表示過去他們都重點關注在 Functionality 上,現在(Cairo 1.0 即將上線之後)已經做好了基礎建設,將會把開發重心移動到性能上。

StarkNet 認為提高 TPS 最好的方向是在同樣的出塊時間下,提高能夠容納的交易量,也就是區塊限制。因此只要是與區塊生成有關的部件都會需要提高效率。例如 Sequencer 就是其中最大的瓶頸,所以才有規劃未來改成不同算法(從先到者先處理改為並行處理)、不同數據結構(原本是 Patricia-Trie),以及用 Rust(原本是 python)編寫的新 Sequencer — Blockifier。

新的並行化 Sequencer 可參考以下資源:

https://twitter.com/starkience/status/1615502502773903361?s=20
https://twitter.com/Starknet/status/1595341405655683072
https://www.youtube.com/watch?v=9IszIArEt1M
關於這個議題,StarkNet 提出了一個說法解釋為何提高區塊限制對 L2 有用,而對 L1 沒用。原因是如果區塊大小太大,我們對全節點的要求就越高(這樣他們才可以跟上鏈的增長速度並進行驗證)。如果這個要求高到大部分用戶都無法承受,無法自行驗證,那就使得絕大部分人都需要以一個不信任的方式參與網絡。

結語
撰寫 StarkNet 的介紹文時需要不少的參考文獻,我儘量把所有參考到的內容都附上(文中或文末),希望能給願意深入了解的人們提供幫助,也非常感謝這麼多善心人士願意分享自己對 StarkNet 的研究成果!

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。