Polygon Hermez架构介绍
Credit: Zelig
<center>https://www.ledger.com/wp-content/uploads/2021/11/cover-14.png</center>
在传统货币理论中存在“不可能三角”,即一国无法同时实现货币政策的独立性、汇率稳定与资本自由流动,最多只能同时满足两个目标,而放弃另外一个目标。
相类似,当前的区块链技术也存在“不可能三角”,即无法同时达到可扩展(Scalability)、去中心化(Decentralization)、安全(Security),三者只能得其二。
可扩展性:每秒可以处理大量交易。
去中心化:拥有大量参与区块生产和验证交易的节点。
安全性:获得网络的多数控制权需要非常高昂的成本。
目前很多区块链会在三者中有所权衡,比如以太坊和比特币比较关心的就是去中心化和安全性。而有一些新公链更注重的是可扩展性和安全性。
从比特币创世开始,一直到以太坊网络中Crypto Kitties游戏的出现。主流公链项目最被人诟病的地方就是低下的TPS,以太坊15左右的TPS完全无法给大多数应用提供实时稳定的支持,这与当前互联网行业动辄上万TPS的业务形成了鲜明的对比。 扩展性也许是排在第一位的问题。扩展性问题已经成为很多系统的坟墓。这是一个重大而艰巨的挑战。-Vitalik Buterin
对于以太坊而言,过去几年内关于以太坊扩容的方案不断出现。其主流的方案如下所示:
链上扩容:
链下扩容:
从中长期来看,随着 ZK-SNARK 技术的改进,ZK rollups 将在所有用例中胜出。— Vitalik Buterin
ZK-Rollup早期为人诟病的地方是不能兼容 EVM,不能支持智能合约功能,例如 Gitcoin 捐赠主要支付途径的 zkSync 1.0 仅能支持转账等基本功能。同时,由于不同 ZK 应用有各种专用电路,无法相互调用,可组合性差。因此市场急需能够支持以太坊智能合约的ZK-Rollup,而其中关键门槛就是能够支持零知识证明的虚拟机。随着引入 EVM 兼容的 zkVM,zk-rollups 才开始支持以太坊 dApps。
由于 ZK-EVM 并没有统一的设计标准,所以每个项目方基于不同角度在兼容 EVM 和支持 ZK 之间权衡设计出各自方案,目前基本分为两种思路:
编程语言层面支持,自定义 EVM 操作码,把 ZK-friendly 的操作抽出来重新设计新的、架构不同的虚拟机,通过编译器将 Soilidity 编译成新的虚拟机操作码
字节码层面支持,支持原生 EVM 操作码
对于第一种策略,由于不受原有 EVM 指令集的约束,可以更灵活的将代码编译成对零知识证明更友好的指令集,同时也摆脱了兼容所有 EVM 原有指令集所需要的艰巨而繁重的工作。
对于第二种策略,由于完全支持了 EVM 现有的指令集,其使用的是和 EVM 一样的编译器,因此天然就对现有的生态系统和开发工具完全兼容,同时还更好的继承了以太坊的安全模型。
第一种思路更灵活,工作量更小,但需要花费额外精力在适配上;第二种思路工作量相对来说会大一些,但是兼容性更好,安全性更高。
Starkware 的 ZK-Rollup 通用解决方案 StarkNet 可以运行任意的以太坊 dApp。开发者可以通过编译器将 Solidity 编译成 StarkNet 的智能合约语言 Cairo,再部署到其 ZK-friendly 的 VM。
类似 Starkware,zkSync 2.0 通过开发编译器前端 Yul 和 Zinc 来实现 ZK-EVM 功能。Yul 是一种中间 Solidity 表示,可以编译为不同后端的字节码。Zinc 是用于智能合约和通用零知识证明电路的基于 Rust 的语言。它们都是基于开源框架 LLVM,能够实现最高效的 ZK-EVM 字节码。
<img src="https://miro.medium.com/max/1400/0*S3TKmlfGRTx5MNkE" alt="img" style="zoom:50%;" />
<center>https://miro.medium.com/max/1400/0*S3TKmlfGRTx5MNkE</center>
与 StarkNet 一样,zkSync zkEVM 在语言层面实现了 EVM 的兼容性,而不是在字节码层面。
Polygon Hermez 是一个具有 zkVM 的 Polygon zk-rollup,旨在支持 EVM 的兼容性。为此,EVM 字节码被编译成 「微操作码(micro opcodes)」 并在 uVM 中执行,uVM 使用 SNARK 证明和 STARK 证明来验证程序执行的正确性。
Scroll 是一个EVM等效的zk-Rollup,可以实现与以太坊字节码级别的兼容性,也就是说,所有的EVM操作码和基础层完全相同。Scroll 团队计划为每个 EVM 操作码设计零知识电路。
https://github.com/privacy-scaling-explorations/zkevm-circuits
"Scroll design, architecture, and challenges" (Ye Zhang, Scroll)
<center>https://vitalik.ca/general/2022/08/04/zkevm.html</center>
在 Vitalik 的博文里,他将 ZK-EVM 分为几种类型。其中,类型 1 是直接在以太坊上面直接开发 ZK-EVM,这个开发过于复杂而且目前效率太低,以太坊基金正在研究中。类型 2、类型 2.5 和类型 3 是 EVM 等效的 ZK-EVM,Scroll 和 Polygon Hermez 目前处于类型 3 这个阶段,朝着类型 2.5 乃至类型 2 努力。类型 4 是高级语言兼容的 ZK-EVM,包括 Starkware 和 zkSync。这些类型并无好坏之分,而且 ZK-EVM 也没有统一的标准。
从理论上讲,以太坊不需要为 L1 使用单一的 ZK-EVM 实现进行标准化;不同的客户可以使用不同的证明,因此我们继续从代码冗余中受益。— Vitalik Buterin
Polygon zkEVM主要包含以下组件:
<img src="https://wiki.polygon.technology/ko/assets/images/fig2-simple-poe-7cb9c3761a3d3c6482eefba525598cd2.png" alt="Figure 2: Simplified Proof of Efficiency" style="zoom:67%;" />
Proof-of-Efficiency(PoE)共识算法分2步实现,由不同参与者完成:
1)第一步的参与者称为Sequencer。sequencer负责将L2的交易打包为batches并添加到L1的PoE智能合约中。任何运行zkEVM-Node的参与者,均可成为Sequencer。每个Sequencer都必须以$Matic token来作为抵押物,以此来获得创建和提交batches的权利。Sequencer赚L2的交易手续费,但是只有相应的证明提交后,Sequencer才能获得其所提交的batch内的L2交易手续费。 2)第二步的参与者称为Aggregator。Aggregator负责检查batches的有效性,并提供相应的证明。作为Aggregator,需要运行zkEVM-Node和zkProver来创建相应的零知识证明,赚取Sequencer为batches支付的Matic费用。
PoE智能合约有2个基本的函数:
1)sendBatch
:用于接收Sequencer提交的batches。
2)validateBatch
:用于接收Aggregator生成的proof,并进行验证。
<img src="https://wiki.polygon.technology/ko/assets/images/fig3-zkNode-arch-aa4d18996fba1849291ea18e3f11d955.png" alt="Figure 3: zkEVM zkNode Diagram" style="zoom:67%;" />
./zkevm-node run --genesis ../config/environments/local/local.genesis.config.json --cfg ../config/environments/local/local.node.config.toml --components synchronizer
每个Sequencer都有一个配置,池子,状态,交易管理者,etherman,gpe等
type Sequencer struct {
cfg Config
pool txPool
state stateInterface
txManager txManager
etherman etherman
checker *profitabilitychecker.Checker
gpe gasPriceEstimator
address common.Address
sequenceInProgress types.Sequence
}
start
loadSequenceFromState
trackOldTxs
tryToProcessTx
tryToSendSequence
type Aggregator struct {
cfg Config
State stateInterface
EthTxManager ethTxManager
Ethman etherman
ProverClients []proverClientInterface
ProfitabilityChecker aggregatorTxProfitabilityChecker
}
start
tryVerifyBatch
tryToSendVerifiedBatch
VerifyBatch 最后会调用POE的VerifyBatch进行验证
Sync
NewServer 在调用NewServer的时候,会调用registerService注册serviceName和service,保存在serviceMap中,serviceMap中包含service和funcMap 具体的:例如eth服务ethEndpoints,会遍历ethEndpoints的所有方法,并保存在funcMap中。 目前的serviceName:
const (
// APIEth represents the eth API prefix.
APIEth = "eth"
// APINet represents the net API prefix.
APINet = "net"
// APIDebug represents the debug API prefix.
APIDebug = "debug"
// APIZKEVM represents the zkevm API prefix.
APIZKEVM = "zkevm"
// APITxPool represents the txpool API prefix.
APITxPool = "txpool"
// APIWeb3 represents the web3 API prefix.
APIWeb3 = "web3"
)
start
Polygon zkEVM 中交易的证明全部由zkProver来处理。通过电路来保证交易执行的有效性。zkProver 以多项式和汇编语言的形式执行复杂的数学计算,随后在智能合约上进行验证。
如上面的流程图所示,整个交互分为4步:
节点将 Merkle 树的内容发送到数据库以存储在那里
节点然后将输入交易发送到 zkProver
zkProver 访问数据库并获取生成证明所需的信息。 这些信息包括Merkle树根、相关siblings的键和hash等
zkProver 然后生成交易证明,并将这些证明发送回节点
<img src="https://docs.hermez.io/zkEVM/zkProver/Overview/figures/fig-main-prts-zkpr.png" alt=" Figure 5: Simplified Data Flow in the zkProver" style="zoom:40%;" />
而zkProver的内部可以看作由以下四个部分组成:
Executor其实就是Main State Machine Executor。它将交易、新旧状态根等作为输入。
同时Exector还使用:
有了这些,Executor会生成承诺多项式和一些公共数据,这些公共数据构成了 zk-SNARK 验证器输入的一部分。
Main State Machine Executor将交易和相关数据转换为承诺多项式之后会作为STARK 递归组件的输入:
为了促进快速 zk-STARK 证明,STARK 递归组件使用Fast Reed-Solomon Interactive Oracle Proofs of Proximity (RS-IOPP),也称为 FRI,用于每个 zk-proof。
<img src="https://img.foresightnews.pro/202209/2b14f1878f792a9d3271d9d31a5e0ab1.png?x-oss-process=style/scale70" alt="img" style="zoom:100%;" />
<center>Credit:Jordi Baylina@Hermez</center>
最初的Circom论文将其描述为定义算术电路的电路编程语言和编译器。
STARK 递归组件生成的单个 zk-STARK 证明会作为 Circom 组件的输入。
Circom是 zkProver 中使用的电路库,用于为 STARK 递归组件生成的 zk-STARK 证明生成witness。
最后一个组件是 zk-SNARK Prover,或者说Rapid SNARK。
Rapid SNARK是一个 zk-SNARK 证明生成器,用 C++ 和英特尔汇编语言编写,可以非常快速地生成Circom输出的证明。目前支持PLONK/Groth16.
之所以采用两套证明系统是因为STARK 证明的生成速度更快,但是证明的规模却很大,在链上验证的时候开销也很大,SNARK 由于更小的证明规模和更快的验证速度,所以在以太坊上验证会更便宜。
<img src="https://i.stack.imgur.com/MCMMl.png" alt="awesomeZKP" style="zoom:50%;" />
<center>https://github.com/matter-labs/awesome-zero-knowledge-proofs</center>
Polygon Hermez zkEVM 使用一个 STARK 证明电路来生成状态转换的有效性证明,用 SNARK 证明验证 STARK 证明的正确性(可以认为是生成「证明的证明」),并将 SNARK 证明提交到以太坊进行验证。
zkProver 遵循模块化设计,包含14个状态机,分别对应不同的一些操作:
<img src="https://docs.hermez.io/zkEVM/zkProver/State-Machines/Overview/figures/fig-actions-sec-sm.png" alt="Figure 2: The Main SM Executor's Instructions" style="zoom:50%;" />
zkEVM-Prover: 128vCPU, 1T RAM Recommended by Hermez Team
zkEVM-Node config: https://github.com/0xPolygonHermez/zkevm-node/blob/develop/config/environments/public/public.node.config.toml
zkEVM-Prover config:https://github.com/0xPolygonHermez/zkevm-prover/blob/main/config/config_prover.json
Github:https://github.com/0xPolygonHermez
Docs:
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!