StarkNet 有很多有趣的東西,這篇文章將從 ZKR 設計、EVM 兼容、STARK 證明系統、Cairo 語言和虛擬機等方面論述 StarkNet 技術優越性。

作者:Maxlion

TL;DR

  1. ZKR 設計:匯總經濟學使得交易越多,Gas 越低;ZK 證明-驗證的方法取代了節點執行全部交易以驗證正確性的方法,大大降低鏈上計算與存儲數據量,提高執行效率;工作流優越性需要等待其他 zkEVM/zkVM 確定設計後再對比優越性;原生賬戶抽象可以 “消滅” 助記詞,已經實現手機硬錢包,並為更加易用、安全、低成本的鏈上可編程奠定基礎。
  2. EVM 兼容:Solidity-Cairo 轉譯器 Warp 使得 StarkNet 語言級兼容 EVM;用 Cairo 編寫的 zkEVM Kakarot 使得 StarkNet 字節碼兼容 EVM。
  3. STARK 證明系統:純粹依賴哈希和信息論,不依賴可信設置,抗量子攻擊,比 SNARK 更安全;證明生成速度具備線性擴展性,驗證時間和證明大小具備對數擴展性;缺點在於生成的證明尺寸更大;遞歸證明可將多個證明驗證後合併,理論合併量上限達到 6000 萬,也為 L3 奠定技術基礎;STARK 友好的哈希函數如 Rescue hash function 等相比以太坊 keccak256 有更高執行效率。
  4. Cairo 虛擬機與語言:Cairo VM 是一個 STARK 友好的、圖靈完備的 CPU 架構;CPU 架構靈活性高,可通過軟件編程無限接近 ASIC 性能,理論上可以復刻任意虛擬機;Cairo 語言基於 Cairo 彙編和 AIR,執行效率非常高,但開發體驗類似 Rust 和 C 語言,指針+內存大套餐使得學習難度中上;開發者可使用證明者一側的 “提示”(hints)來創建快捷方式並啟用某些計算,降低了開發難度;Cairo 支持通過字節碼哈希加載程序,大大提高鏈上擴展性和隱私性,成為隱私方案的強力替代。

一、ZK-Rollup 優越性

在以太坊上,每提交一筆交易都需要所有節點檢查、驗證並執行交易來驗證計算正確性,並將計算後的狀態變化在網絡中廣播。

https://ethereum.org/zh/developers/docs/evm/

StarkNet 僅在鏈下執行計算並生成一個 ZK 證明,然後在鏈上驗證該證明的正確性,最後把多個 L2 交易打包為以太坊上的一筆交易。因此,StarkNet 上發生的交易成本可以被同一打包批次的其他交易所均攤,就像拼車(拼多多)一樣,交易越多,成本越低。

除此之外,相比以太坊讓每個節點完整執行交易的方法,StarkNet 為交易生成 ZK 證明的方法可以大大提高網絡運行速度、減少鏈上通信量、增加網絡吞吐,因此 StarkNet 相比以太坊具有更高 TPS 和更低 Gas。

簡而言之,將驗證計算正確性比喻為老師需要檢查同學們是不是掌握了知識。以太坊的方法是檢查每個同學是否能背誦整本教科書,而 StarkNet 的方法是讓同學們做卷子。後者的效率更高,成本更低,但仍然保證安全。

StarkNet 工作流程

與大部分 ZKR/ZK 項目一樣,StarkNet 存在一類稱之為證明者的角色來生成證明。驗證者作為 L1(以太坊)上的合約來驗證證明,驗證者合約代碼都是相同的。

具體而言,StarkNet 有五個組成部分,分別是在 StarkNet 上的 Prover(證明者)、Sequencer(排序器)和全節點,以及部署在以太坊上的驗證者(Verifier)和核心狀態合約(StarkNet Core)。

系統架構如下圖:

https://david-barreto.com/starknets-architecture-review/#more-4602

StarkNet 的工作流程如下:

1、當我們在 StarkNet 上發起一個交易,一個鏈下服務器——排序器將會接收、排序、驗證,並將它們打包到區塊。執行交易,然後狀態轉換發送給 StarkNet Core 合約;

2、證明者將為交易生成證明,並發送給以太坊的驗證者合約;

3、驗證者將驗證結果發送到以太坊上的 StarkNet Core 合約,並從 StarkNet Core 合約觸發一組新的以太坊交易,以更新鏈上的全局狀態以進行記錄保存。狀態事務作為 “calldata”(EIP-4844 後為 Blob)來發送,以節省 L1 事務 gas。這些 “metadata” 可被 StarkNet 全節點解密。

全節點基本發揮存儲功能。全節點存儲狀態改變、元數據、證明以及記錄在 StarkNet 中的已被執行的所有事務,並跟踪系統的當前全局狀態。在有必要的時候,全節點將解密 “metadata” 來重構 StarkNet 的歷史。

工作流程方面的優越性結論可能需要等待其他 ZKR/Validity Rollup 工作流基本確定後,通過對比得出。

原生賬戶抽象

不同於以太坊 EOA+CA 的雙賬戶設計,StarkNet 實現了原生賬戶抽象,只有一種賬戶設計。

這對合約錢包以及更加低成本、安全、易開發的鏈上可編程打開了大門,這可以推動 ECDSA 以外的簽名驗證方式、多簽管理、社會恢復、聚合簽名、交易限制、隱私保護、gas 優化、gas 代付、異幣 gas、應用聚合、自動收益等各個方面的發展。

下圖為 StarkNet 交易流程圖(仍然借鑒了 4337 的設計思路):

https://community.starknet.io/t/starknet-account-abstraction-model-part-1/781

而且 StarkNet 已經實現了 “手機硬錢包”。

我總結了 StarkNet 的開發倡導者 @barretodavid,提到的在 StarkNet 上實現手機硬錢包的思路

1. 以太坊上的 EOA 僅支持 Secp256k1 橢圓曲線上的簽名方案 ECDSA

2. 大部分的智能手機都不支持以太坊的橢圓曲線。

3. 所以移動錢包需要依靠軟件簽署交易,移動錢包因此是熱錢包。

4.StarkNet 原生賬戶抽象,支持多種橢圓曲線,簽名驗證高度可編程,因此基於 StarkNet/Cairo 的手機錢包完全可以變成硬錢包。

StarkNet 上原子化 NFT 協議 Briq  的開發者 @sylvechv  在博客中也寫到,在實現了原生賬戶抽象的 StarkNet(編程語言為 Cairo)上,可以授權一個 mobile_key  簽署一定數額的交易,和/或只為某些合同,和/或只為某些功能(例如沒有 transfer()而只有 play())。用戶甚至可以在一定時間後撤銷它。

在 StarkNet 中的合約錢包,授權手機簽名的流程類似於

1)在手機上生成 pub/priv 密鑰

2)使用 “管理員密鑰” 在智能錢包上授權 pubkey

3)Cairo 已經有一個 nistp256(用於智能手機 Secure Enlave)的實現(我們一起學硬錢包叫 (●'◡'●))。

https://github.com/spartucus/nistp256-cairo

二、EVM 兼容

StarkNet 網絡本身不兼容 EVM,而設計了另外一套 ZK 友好的 Cairo VM。

StarkNet 沒有針對以太坊操作碼做 ZK 電路,而是自己做了一套更加 ZK 友好的彙編語言、AIR(代數中間表示)以及高級語言 Cairo。

https://www.youtube.com/watch?v=SEp5SFaYQHY&t=6s

不兼容 EVM 的弊端在於無法繼承以太坊代碼和工具鏈,因此,**以太坊應用生態沒有大規模移植到 StarkNet 的基礎。**且 Cairo 語言對開發者存在一定學習門檻,Cairo 語言和 STARK 證明系統相關工具鍊和庫也處於起步階段。

但獨立設計 VM 的好處在於,StarkNet 的 Cairo VM 更 ZK 友好,電路執行效率更高(代碼更少),在未來將表現為 TPS 更高,Gas 更低,拋棄 EVM 設計後還能實現許多以太坊不能完成的應用創新,如原生賬戶抽象的合約錢包。

StarkNet 屬於 Vitalik 定義的 type 4 級別——語言兼容的 zkEVM(StarkNet 由於定制了虛擬機嚴格來講屬於 zkVM)。

https://vitalik.eth.limo/general/2022/08/04/zkevm.html

儘管 StarkNet 本身不兼容 EVM,但 StarkNet 仍然可以通過其他方式兼容以太坊。

1、Warp:將 Solidity 轉譯為 Cairo 語言的轉譯器

Warp 是一個 Solidity-Cairo 轉譯器,目前已經由以太坊著名基礎設施團隊 Nethermind  開發完成。Warp 可以把 Solidity 代碼轉譯為 Cairo,但轉譯後的 Cairo 程序往往需要修改並增添 Cairo 特性(如調用內置函數,優化內存等)才能最大化執行效率。

2、Kakarot:一個用 Cairo 語言編寫的 zkEVM

Kakarot 是一個用 Cairo 寫的 zkEVM,是一個字節碼等效 EVM 的 zkEVM,目前處於測試階段。以太坊應用可以通過部署到 Kakarot 的方式移植到 StarkNet。

此前以太坊聯創 Vitalik 和 StarkWare 聯創 Eli Ben-Sasson 參與了 Kakarot 舉辦的 Twitter Space

三、STARK 證明系統

3.1 簡介

目前有許多不同的證明系統(生成和驗證證明),如 Halo、PLONK、Groth16Groth09 、Marlin、Plonky2 等,它們都屬於 SNARK 證明系統。證明系統存在一個證明者生成證明,一個驗證者驗證證明。而不同的 ZK 項目幾乎都會使用不同的證明系統,StarkNet 使用的 STARK 某種意義上屬於一種特別的 SNARK 。

https://medium.com/alliancedao/zkps-in-web-3-now-and-the-future-21b459348f29

SNARK 全稱 Succinct Non -interactive Argument of Knowledge(零知識簡潔非交互論證),STARK 全稱 S calable Transparent Argument of K nowledge(零知識可擴展透明知識論證)。

SATRK 作為一種特殊而創新的 SNARK,S 的含義從簡潔(Succinct)變為可擴展(Scalable),T 代表透明,取代了非交互屬性。

https://www.altoros.com/blog/zero-knowledge-proof-improving-privacy-for-a-blockchain/

STARK 相比 SNARK 有更多創新。它不需要和 SNARK 一樣依賴 “可信設置”。它還帶有更簡單的密碼學假設,避免了對橢圓曲線、配對和指數知識假設的需要,純粹依賴哈希和信息論,因此抗量子攻擊。總體來講 STARK 比 SNARK 更安全。

在擴展性方面,STARK 的擴展性更強。證明生成速度具備線性擴展性,驗證時間和證明大小具備對數擴展性。但缺點在於生成的證明尺寸更大。但隨著證明規模增加,驗證成本將會邊際遞減——這意味證明越大,總成本越低。

https://research.thetie.io/zero-knowledge-starks-snarks/

3.2 擴展性詳解

3.2.1 證明時間線性擴展:證明人花費的時間與哈希調用的數量呈近似線性關係。

在 80 比特的安全級,STARK 每 12288 次哈希調用的證明者執行時間為 1 秒,得 12288 次/S;而每 98304 次哈希調用需要 10 秒,得 9830 次/S,因此,我們可以知道 STARK 的證明時間和哈希調用基本呈近似線性關係。如下圖所示

https://eprint.iacr.org/2021/582.pdf(左圖 80 比特安全性右圖 100 比特安全性,y 軸單位為秒)

3.2.2 驗證和證明大小對數擴展:驗證時間(與證明大小)與哈希調用呈現對數關係。

如下圖所示:

https://eprint.iacr.org/2021/582.pdf(y 軸單位為毫秒)

左圖可以看出,當哈希調用從 3072 增加到 49152,驗證時間從 40 毫秒增加到 60 毫秒。而當哈希調用從 49152 增加到 786432,驗證時間僅從 60 毫秒增加到 80 毫秒。證明大小同理。因此,我們可得知,哈希調用次數越多,平均驗證時間越短,平均證明大小也會更小。

上述試驗的配置統一如下

1、操作系統:Linux 5.3.0-51-generic x86 64。

2、CPU: 英特爾(R)酷睿(TM)i7-7700K @ 4.20GHz(4 個核心,每個核心 2 個線程)。

3、內存:16GB DDR4(8GB × 2,速度:2667 MHz)

4、證明者使用多線程,驗證者被限制為單線程。

3.2.3 遞歸證明

任何通用的、簡潔的知識系統的證明/論證(特別是 STARKs)都可以用來遞增地驗證計算。這意味著一個計算可以產生一個證明,以證明該計算的前一個實例的正確性,這個概念被非正式地稱為 “ 遞歸證明組合” 或者” 遞歸 STARKs”。

換句話說,一個遞歸 STARK 證明者可為一個陳述生成一個證明,即係統的狀態可以從 a 移到 a+1。因為證明者已經驗證了一個證實 a 的計算完整性的 (遞歸) 證明,並且忠實地執行了狀態 a 的計算,達到了新的狀態 a+1。簡而言之,你可以理解該過程將 a 和 a+1 兩個證明合併為了一個證明。如下圖所示:

https://medium.com/starkware/recursive-starks-78f8dd401025

這些陳述各自被平行證明。然後,每對證明都由遞歸驗證器語句(一個驗證 STARK 證明的 Cairo 程序)進行驗證,並為其生成一個證明。該聲明斷言兩個證明已被驗證是正確的。

接下來,這兩個證明通過遞歸驗證程序語句再次合併。這導出為證明所有四個原始陳述的一個證明。然後可以最終在鏈上提交該證明,由 Solidity 驗證者智能合約進行驗證。

遞歸證明為 L3 的發展奠定技術基礎。類似於 StarkNet 作為 L2 在 L1(以太坊)上工作的方式——StarkNet 將計算證明交給以太坊上用 Solidity 編寫的驗證者合約驗證證明。L3 可以在 StarkNet 上部署一個用 Cairo 編寫的驗證者合約以驗證 L3 中的遞歸證明。

關於 L3,我將在下一篇關於 StarkNet 生態盤點的文章中更詳細地描述。

3.2.4 遞歸證明歷史線索

StarkWare 在 2020 年 8 月 31 日發布的文章中提到,能夠將 30 萬筆交易在 6 分 3 秒內聚合為一個證明。

https://medium.com/starkware/hello-cairo-3cb43b13b209

StarkWare 聯合創始人 Eli Ben-Sasson 2022 年 8 月 8 日在韓國首爾會議表示,其新的遞歸有效性證明理論上可以將以太坊區塊鏈上多達 6000 萬筆交易匯總為以太坊上的一筆交易。

https://cointelegraph.com/news/60-million-nfts-could-be-minted-in-a-single-transaction-starkware-founder

不過我沒找到相關實現細節。

ZK 友好的哈希函數

哈希函數在以太坊(以太坊使用 keccak256)中常用於生成區塊、交易、狀態哈希,是區塊鏈基礎技術。

ZK 友好的哈希函數的意義在於,EVM 本身使用的 keccak256 ZK 不友好,變成電路執行效率非常低(很多行),使用 ZK 友好的哈希函數轉為電路的代碼量更少,因此可以提高證明效率。

因此,StarkNet 使用 STARK 友好的哈希函數(SFH)可以顯著提高執行效率。

STARK 友好的哈希(SFH)函數,如 Rescue hash function(擴展性部分的 Hash 調用),特點包括以下三點

1、帶有證明的算術化電路,能夠將 10 萬個哈希值(3.2MB 的數據)壓縮到 200kB,有 80 比特的安全性。

2、證明者在四核 CPU 和 16GB 內存的配置下能夠每秒壓縮 100 個哈希值。

3、驗證者在單核 CPU 和 4GB 內存的情況下,能夠在 10ms 內對證明進行驗證。

https://twitter.com/Ingo_zk/status/1573033153672921093

四、Cairo 虛擬機和語言

4.1 簡介

Cairo VM 是一個是一個採用馮諾依曼架構的 CPU VM,其編程語言也叫 Cairo。整個 Cairo VM 以及 Cairo 語言基於 STARK 設計。

Cairo 是 C PU  A lgebraic  I ntermediate  R epresentation(代數中間表達)的首字母縮寫。Cairo VM 包含單個 AIR 來驗證這個「CPU」的指令集。Cairo 語言基於 Cairo 彙編,因此編譯效率非常高。

Cairo 語言的編程體驗偏彙編(C 和 Rust,經常會用到指針),它具有以下特性:內存、函數調用、遞歸和分支條件。它還使用證明者一側的 “提示”(hints)來創建快捷方式並啟用某些計算。

https://www.cairo-lang.org/docs/how_cairo_works/index.html#how-cairo-works(我捏)

Cairo VM 和 Cairo 讓我有一種 Unix 和 C 語言的感覺。

https://www.cairo-lang.org/docs/hello_cairo/amm.html(AMM 代碼片段)

接下來將介紹 Cairo 的一些強大特性。

4.2 啟動加載:從哈希加載程序

程序可以將另一個程序字節碼寫入內存,並讓 Program Counter 指向該內存段,然後運行該程序。
一個從哈希啟動加載的用例是,一個被稱為啟動加載器的程序計算並輸出另一個程序的字節碼,然後像之前一樣開始執行它。這樣驗證者只需要知道程序的哈希而非完整字節碼。
這有兩個好處:

  1. 可擴展性,驗證時間和程序大小呈現對數關係,正如 STARK 部分提到的。
  2. 隱私性,驗證者可以驗證程序是否正確執行而無需知道計算。

4.3 在同一個證明中運行不同程序

正如前文所述,啟動加載器可以做一個擴展。比如執行好幾個程序。輸出每一個程序的字節碼 hash 和程序的輸出。而程序可以描述完全不同的計算。

因為 proof 的大小和驗證時間都和計算的大小呈亞線性關係,因此可以使用一個加載器執行多個程序,然後生成一個證明來確保所有程序的有效性。

就像滴滴打車一樣

驗證的成本在這些程序之間被攤銷了。隨著更多程序加入批處理,最終的攤銷驗證成本將越來越接近於 0。參考 STARK 部分的 “驗證和證明大小對數擴展”。

4.4 高級優化:即時編譯和字節碼生成

在程序執行過程中,一些高級優化可以通過字節碼的自動生成來實現。

比如,對於一個函數,不同於從內存中預取對應的值,你可以直接拷貝程序的字節碼,然後在對應的指令上直接賦予對應的值;考慮一個指令 “從內存中讀取 x 和 c,然後計算 x+c”,一旦 c 的值是已知的(此時用 C 表示),我們可以用更高效的指令去替代它,“從內存中讀取 x,然後計算 x+C”,C 是指令的立即數。

因此,我們可以進一步提高執行效率

4.5 增量可驗證計算:很牛的遞歸證明

類似 STARK 的遞歸證明 recursive proof 部分提到的。

基於從 hash 啟動加載的概念,整個驗證過程可以編碼成一個 hash,然後整個驗證過程作為參數傳遞給自己(這也是生成遞歸證明的一個步驟)。

4.6 其他重要優勢

內置函數

開發者直接調用內置函數可以減少計算開銷,而不需要代碼轉換。相當於 ASIC 芯片寫好的電路或者數學中給定的、驗證過的公式。

圖靈完備

支持計算(或者驗證,因為 Cairo VM 本身不執行計算,僅驗證計算正確性,計算在鏈下)一切可計算的問題。因此理論上能夠復刻其他虛擬機,比如前面提到的用 Cairo 編寫的 zkEVM,理論上也可以復刻其他在未來可能開源的 zkEVM/zkVM 如 Scroll、Hermerz、zkSync、Miden、Zero 等。

CPU 架構

更加靈活,可以通過軟件編程的方式無限接近 AISC 的性能(所以 Cairo 會做 CPU?)。

提示:關於 CPU 架構、內存、Cairo 語法等方面的更多特性我還在挖掘中(C 語言沒跑了)……

五、參考文獻

StarkNet 部分

StarkNet 架構回顧

賬戶抽像模型設計

https://community.starknet.io/t/starknet-account-abstraction-model-part-1/781

Cairo 部分

Cairo 白皮書

eprint.iacr.org eprint.iacr.org

Cairo 白皮書中文翻譯

k9onu1bzg3.larksuite.comk9onu1bzg3.larksuite.com

https://zhuanlan.zhihu.com/p/485575369

解讀 Cairo 白皮書

https://medium.com/@pban/demystifying-cairo-white-paper-part-i-b71976ad0108

Starknet Cairo AIR 論文 2109.14534.pdf

arxiv.orgarxiv.org

STARK 部分

STARK Documentation – Version 1.1 StarkWare Team∗ January, 2021

eprint.iacr.orgeprint.iacr.org

深入理解 zk-STARK 證明系統系列

Cairo 虛擬機與 Cairo 語言– 深入理解 zk-STARK 證明系統

StarkWare 對遞歸證明的解釋

https://medium.com/starkware/recursive-starks-78f8dd401025

免責聲明:作為區塊鏈信息平台,本站所發布文章僅代表作者及嘉賓個人觀點,與 Web3Caff 立場無關。文章內的信息僅供參考,均不構成任何投資建議及要約,並請您遵守所在國家或地區的相關法律法規。