Polygon Chain Development Kit,一個開源框架,用於在以太坊上快速部署由 ZK 驅動的 L2。
使用 Polygon CDK 開發的鏈的高級架構,可以像 L1 區塊鏈一樣定制業務規則
為什麼要選擇 Polygon CDK ?#
Polygon CDK 的設計原則
- 高度模塊化,開發人員可以根據自己的需要定制鏈,從執行環境到 gas token
- 高度可擴展性,CDK 開發的 L2 可提高交易速度
- 統一的流動性,CDK 開發的鏈可確保在 Polygon 2.0 L2 生態系統內鏈間的資產轉移
- 獨立的 DA,CDK 開發的鏈具有專用的 DA 和 DAC,可提供強大的鏈外數據訪問和可靠性
- 可組合可操作性,借助 LXLY Bridge, 實現鏈間的無縫互動和資產交換
- 近乎即時的最終確認,使用 Polygon CDK 部署的鏈依賴於加密安全,無需完整節點即可確保交易完整性
Key Factors
- Scalability for Ethereum, CDK 鏈可擴展以太坊
- 業務邏輯定制,CDK 鏈完全支持 EVM,允許自定義 gas limit,op code 兼容性和技術集成
- 隱私選項,CDK 鏈可以創建私有的 app chain。為優先考慮隱私的人提供一種選擇,支持客戶維護其應用數據的機密性,同時享受區塊鏈技術帶來的好處
- 以合規為導向,CDK 鏈可實現網絡主權和合規性,允許網絡維護者選擇符合當地法規的管理者,確保符合地區法規要求
- 廣泛的 Web3 支持,CDK 鏈是 zkEVM stack 的直接分叉,便於服務的移植,利用了一個全面的生態系統
Polygon CDK Data Avalilablity#
數據可用性將交易的執行和數據存儲分離,允許交易數據駐留在鏈外 (off-chain data),同時仍可用於驗證,大大提高了可擴展性,降低了成本。
Polygon CDK Validium 是一種基於 zkEVM 基礎的獨特的擴展方案,它為 zkEVM 整合了 DAC,一種獨特的數據可用性方法。
Polygon CDK 框架內,數據可用性委員會 (DAC) 成員運行 DA 節點,以確保鏈外數據的安全性、可訪問性和完整性。鏈外數據由 DAC 管理,確保可用性。
Data Availability Committees 數據可用性委員會,有一個核心職責:核實每個人都能訪問根據鏈上事件重建 L2 狀態所需的數據。這意味著,即使 L2 運營商離線,用戶仍可訪問其資產的數據。
在 CDK-developed 鏈中,DAC 作為一個安全的節點聯盟,確保鏈外數據訪問。
DAC 的優勢:
- Lower Transaction Fees 計算要求降低,費用也隨之降低
- State Privacy,確保數據完整性
DAC 成員由 L1 上的智能合約進行管理。sequencer 將 L2 batch 數據發送給 DAC 成員,只在 L1 上傳 hash 值 (accumulated input hash),而不是完整的 L2 交易數據。
- sequencer 有一個 ECC 私鑰,在將 L2 batch 數據發送給 DAC 之前,會用自己的私鑰簽名。
// 帶有sequencer簽名的sequence
type SignedSequence struct {
Sequence Sequence `json:"sequence"`
Signature types.ArgBytes `json:"signature"`
}
// sequencer需要發送到L1的數據,以及一些metadata
// 排好序的交易列表,稱為sequence
type Sequence struct {
Batches []batch.Batch `json:"batches"`
OldAccInputHash common.Hash `json:"oldAccInputhash"`
}
// batch結構體
type Batch struct {
Number types.ArgUint64 `json:"number"`
GlobalExitRoot common.Hash `json:"globalExitRoot"`
Timestamp types.ArgUint64 `json:"timestamp"`
Coinbase common.Address `json:"coinbase"`
L2Data types.ArgBytes `json:"batchL2Data"`
}
- DAC 成員向 sequencer 提供 API (datacom 服務)
- 從 L1 合約中讀取 sequencer 地址 (如果有更新,會監聽合約進行更新)
- 接收 & 存儲 sequencer 發過來的 L2 batch 數據 (CDK 稱這部分為 offchain data)
- 驗證 sequencer 地址 (通過 sequencer 的 ECC 簽名恢復)
- 存儲數據
-
func (db *DB) StoreOffChainData(ctx context.Context, od []offchaindata.OffChainData, dbTx pgx.Tx) error
- 存儲成功後,對 accumulated input hash 進行簽名,並返回給 sequencer (每個 DAC 成員有一個 ECC 私鑰)
- 核心代碼
-
func (d *DataComEndpoints) SignSequence(signedSequence sequence.SignedSequence) (interface{}, types.Error)
-
zkEVM 和 Validium 在部署上的區別#
-
zkEVM 部署
-
zkEVM Node,管理 polygon zkEVM 網絡、處理交易、維護狀態並與 L1 交互
- 組件包括:JSON RPC, Pool DB, Sequencer, State DB, Synchronizer,Aggregator, Prover
- 代碼庫:https://github.com/0xPolygonHermez/zkevm-node
-
zkEVM Contracts, 部署在以太坊上的一系列合約,主要有
PolygonZkEVM
,PolygonZkEVMBridge
和PolygonZkEVMGlobalExitRoot
-
-
Validium 部署
- Data Availability Layer 數據可用性層
- zkEVM Node with Validium Extensions 帶有 Validium 擴展的 zkEVM Node
- Validium-specific DAC Contract Validium 專用的 DAC 合約,主要有 **
CDKDataCommittee.sol
和CDKValidium.sol
**
zkEVM vs. Validium
Feature | zkEVM | Validium |
---|---|---|
Transaction Data Storage | 所有交易數據保存到 L1 | 只將交易數據 hash 保存到 L1 |
Data Availability | 所有數據都在鏈上提供,數據可用性高 | 鏈外數據可用性由 DAC 管理,DAC 負責驗證交易數據的哈希值 |
Security | 由於鏈上數據的可用性和零知識證明(ZKPs)的使用,它具有很高的安全性 | DAC 成員可能會串通,降低安全性。不過通過使用 ZKP,安全性仍然可以得到保證。 |
Gas Fees | 高 gas 費 | gas 費低,因為鏈上只存儲了交易數據 hash |
Proof Generation | 使用 Prover 生成批處理事務的 ZKPs 以進行驗證 | 使用 Prover 生成批處理事務的 ZKPs 以進行驗證 |
Transaction Validation | 驗證通過以太坊上的智能合約實現 | 驗證涉及一個附加層,由 DAC 成員簽署交易數據的哈希值 |
Final Settlement | 交易批次及其相應的 ZKP 被添加到以太坊狀態中 | 交易數據的哈希值及其 ZKP 被添加到以太坊狀態 |
zkEVM Node 的關鍵組件#
- Aggregator 聚合器
- 負責向 L2 提交 L2 state 的有效性證明。
- 它需要向 sequencer 獲取交易的 batch
- 並和 prover 交互獲得 zk proof,將多個證明匯總成單個證明
- 使用 EthTxManager 將聚合的 zk proof 發送到 L1
- 負責向 L2 提交 L2 state 的有效性證明。
- Prover
- 負責為 batched transactions 生成 zk proof,這些 proof 用於在 L1 上驗證 L2 state。
- Sequencer
- 負責對 L2 交易進行排序,推動 L2 狀態向前。
- Transaction Ordering 交易排序,從 tx pool 中獲取交易,並添加到 state 中
- State Transition 狀態轉換,與 Executor 協作,執行交易,並更新 state
- Trusted finality 可信的最終性確認,一旦 sequencer 將交易添加到 state 中,就會與其它節點共享該信息,使交易最終確認 (排序器級別的信任)。
- 其它節點在獲得 zkp 確認之後,才是最終級別的確認。
- 負責對 L2 交易進行排序,推動 L2 狀態向前。
- SequenceSender
- SequenceSender 將排好序的交易列表 (稱為 sequence) 發送給 L1
- 發送的其實是 sequence 的 fingerprint(可以理解為一個 hash 值)
- 使用 EthTxManager 來處理 L1 交易
- 它還與數據可用性層協作,確保所有交易數據能在鏈外訪問
- SequenceSender 將排好序的交易列表 (稱為 sequence) 發送給 L1
- Synchronizer
- Synchronizer 使節點的本地狀態和以太坊 L1 保持同步,是 L1 和 L2 節點之間的橋樑
- 監聽 L1 合約的事件
- 根據 L1 事件,從數據可用性層下載數據
- 更新狀態,使本地狀態和主網保持一致
- 處理 L1 區塊重組:檢測和管理區塊鏈重組,以保持數據的完整性
- Synchronizer 使節點的本地狀態和以太坊 L1 保持同步,是 L1 和 L2 節點之間的橋樑
- Executor
- 狀態轉換 (state transition) 的實現,也即 VM 的實現
- Batch execution: 接收一批交易的執行請求
- EVM-compatible 的交易處理
- 從執行中提取必要的 metadata,如 state root, transaction receipts, logs (events)
- 狀態轉換 (state transition) 的實現,也即 VM 的實現
- EthTxmanager
- 用於和 ETH 主網交互,包括:
- 管理 SequenceSender 和 Aggregator 向 L1 發送交易的請求
- 為交易涉及的賬戶管理 nonce
- 動態調整 gas 價格,以確保交易被及時打包
- 用於和 ETH 主網交互,包括:
- State
- 是節點數據管理的重要組件。
- 狀態管理,處理所有狀態相關的數據,包括 batch, block 和 transaction
- 與 Executor 通信,以處理交易和更新狀態
- StateDB 用於狀態持久化
- 是節點數據管理的重要組件。
- Pool
- 交易池,用於交易的臨時存儲
- 臨時存儲經過 RPC 提交的交易
- 為 Sequencer 提供交易,以進行交易排序和打包 batch
- 交易池,用於交易的臨時存儲
- JSON RPC
- 給用戶交互的 HTTP 接口
- L2GasPricer
- 根據 L1 gas price 計算 L2 gas price
合約#
主要有 3 個合約
CDKDataCommittee
合約#
CDKDataCommittee
合約用於管理 DAC 成員、驗證 DAC 簽名。主要有 2 個方法:
-
admin 可以設置 DAC 成員和 N/M 多簽
function setupCommittee( uint _requiredAmountOfSignatures, string[] calldata urls, bytes calldata addrsBytes ) external
-
驗證 DAC 簽名
- 驗證
signedHash
是否達到足夠的簽名閾值
function verifySignatures( bytes32 signedHash, bytes calldata signaturesAndAddrs ) external view // signedHash是根據BatchData計算得到,並不是transactionsHash
- 驗證
CDKValidium
合約#
管理和更新 L2 的狀態。
-
trusted sequencer
向該合約提交交易 batchessequenceBatches
會調用CDKDataCommittee
合約的verifySignatures
方法,驗證 DAC 簽名是否達到閾值
function sequenceBatches( BatchData[] calldata batches, // BatchData包含transactionsHash address l2Coinbase, bytes calldata signaturesAndAddrs ) external ifNotEmergencyState onlyTrustedSequencer struct BatchData { bytes32 transactionsHash; // L2交易的keccak256 bytes32 globalExitRoot; // 該批次的Global exit root,用於L1提款 uint64 timestamp; uint64 minForcedTimestamp; }
-
verifyBatches
驗證交易 batches- 提供 zk proof,證明一批交易
// 只有TrustedAggregator才可以調用 function verifyBatchesTrustedAggregator( uint64 pendingStateNum, uint64 initNumBatch, uint64 finalNewBatch, bytes32 newLocalExitRoot, bytes32 newStateRoot, bytes32[24] calldata proof ) external onlyTrustedAggregator function verifyBatches( uint64 pendingStateNum, uint64 initNumBatch, uint64 finalNewBatch, bytes32 newLocalExitRoot, bytes32 newStateRoot, bytes32[24] calldata proof ) external ifNotEmergencyState
PolygonZkEVMBridge
合約#
部署在 L1 和 L2 上的橋,用於資產跨鏈。
數據流#
- 批次 (batches) 組裝,Sequencer 收集用戶交易,並將其整理成批次 (batches)
- 批次認證,批次組裝完成後,Sequencer 將批次數據及其對應的 hash 值發送給 DAC
- 數據驗證和存儲,各 DAC 節點獨立驗證批次數據,驗證通過後,哈希值會存儲在每個節點的本地數據庫中
- 簽名生成,每個 DAC 節點都會為批次 hash 值生成一個簽名,這是對批次完整性和真實性的認可
- 與 Ethereum 通信,Sequencer 收集 DAC 成員的簽名和原始批次的 hash 值,並提交給 Ethereum 網絡進行驗證
- Ethereum 上的驗證,Ethereum 上的 rollup 合約會根據有效的 DAC 成員列表驗證提交的簽名,並確認批次 hash 值得到足夠的批准
- 使用 ZKP 進行最終確認,聚合器為該批次的交易準備 ZKP 並提交給 Ethereum。該證明確認批准交易的有效性,但不透露交易細節,從而更新 Ethereum 上 CKD 鏈的狀態。
Polygon CDK 的整個數據流流程
[以上純個人理解 (搬運),如有錯誤,歡迎指正!]