# Starknet：一个不同的zkVM技术流

By [scarlet](https://paragraph.com/@kol8) · 2023-03-14

---

**简介** 1 Starknet如何工作。与以太坊相比，Starknet只需要一个排序器来执行链外计算。然后，为了减少数据量，验证者为交易生成一个ZK-STARK证明。最后，验证者在链上验证证明的正确性，最后将多个L2交易捆绑成以太坊上的一个交易（被称为Rollup）。因此，Starknet减少了链上的执行和存储成本，从而降低了gas费用，提高了TPS。 2 EVM-equivalent。Starknet有一个ZK友好的Cairo VM，它与EVM不同，这意味着Starknet不支持EVM和Solidity。但是随着Solidity编译器[Warp](https://github.com/NethermindEth/warp)和Cairo zkEVM [Kakarot](https://github.com/sayajin-labs/kakarot)的引入，Starknet可以实现第三类[EVM-equivalent](https://vitalik.ca/general/2022/08/04/zkevm.html)。

3 STARK证明系统。与其他ZK证明系统相比，[STARK](https://eprint.iacr.org/2018/046.pdf)更安全，更具可扩展性。它的证明生成速度可线性扩展，[验证时间和证明大小可对数扩展](https://en.wikipedia.org/wiki/Logarithmic_scale)（$O(polylog(N))$）。证明越大，总成本和验证时间就越低。此外，STARK纯粹依赖于hashing 和信息理论，所以它有更简单的密码学假设，使它能抵抗量子攻击。但它的缺点是，初始证明生成的规模很大。

4 Cairo VM和语言。[Cairo](https://www.cairo-lang.org/)VM是一个对STARK友好的、图灵完备的冯-诺曼CPU架构。通过软件编程，它的性能可以无限接近于ASIC。而且它有一种叫做Cairo的编程语言，它是基于Cairo汇编AIR和[Sierra](https://medium.com/starkware/cairo-1-0-aa96eefb19a0)的。这使得它具有很高的效率和安全的编译能力。它与Rust类似，有一定的学习难度。Cairo支持验证器，通过字节码HASH来验证程序，提高了链上可扩展性和隐私性。但Cairo仍在更新中。

在另一篇文章中，我们会展示验证器、排序器、全节点、客户端、Cairo、协议和其他Starknet网络组件的去中心化进展。

**🛒 Starknet如何运作**

首先，让我们看看Ethereum是如何工作的。在以太坊中，验证交易的正确性需要所有节点检查、验证和执行每笔交易。这个过程确保了计算的准确性，并在整个网络中广播了所产生的状态变化

![https://ethereum.org/en/developers/docs/evm/](https://storage.googleapis.com/papyrus_images/628f718b814a2cf14d970a04e64cd1b2128731d31358e430be7c0235bf00e718.png)

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

但是Starknet只在链外执行计算并生成证明，然后在链上验证证明的正确性，最后将多个L2交易捆绑成以太坊上的一个交易。准确地说，ZKR将把交易作为`calldata`写入以太坊，在智能合约函数的外部调用中包含的数据会被存储起来（类似于内存）。

所以Starknet可以极大地提高网络运行速度，减少链上通信，提高网络吞吐量，因此与Ethereum相比具有更高的TPS和更低的gas。

简而言之，验证计算的正确性可以比作老师需要检查全班同学是否掌握了某个课题。

以太坊的方法是检查每个学生（节点）是否已经记住了整个教科书（国家历史），而Starknet的方法是进行paper test。后者的效率更高，成本更低，但仍能保证安全

![](https://storage.googleapis.com/papyrus_images/1da497a7d3431ead85f4eca6b75addcdfce08335caa25547e8eb0713e7893377.png)

与大多数ZKRs一样，如Validity Rollup、Scroll、Polygon zkEVM和zkSync，Starknet有一类称为证明者的角色来生成证明。而验证者将证明作为L1（Ethereum）上的合约进行验证。

具体来说，Starknet由五个部分组成。Starknet上的证明者、排序者和全节点，以及验证者和Starknet核心（他们都部署在Ethereum上）。

下图显示了Starknet的架构，感谢[David](https://twitter.com/barretodavid)的出色工作

![](https://storage.googleapis.com/papyrus_images/8c774724bc0ba136206a05c74a0d2e9d82d7c0b0e2a9a5cba11a1fb1391af3fe.png)

Starknet的工作流程如下

1 当我们在Starknet上发起交易时，一个链外服务器--排序器--会接收、排序、验证，并将其捆绑成块。执行交易，然后将状态转换发送到Starknet核心合约。

2 证明者为每笔交易生成一个证明，并将其发送给部署在以太坊上的验证者合约。

3 验证者将验证结果发送到以太坊上的StarkNet核心合约，并从StarkNet核心合约中触发一组新的以太坊交易，以更新链上的全局状态，以保持记录。状态转换被作为 "calldata"（EIP-4844之后的Blob）发送，以保存L1交易gas。这些 "元数据 "可以由Starknet全节点(full node)解密

一个全节点（[full node](https://github.com/eqlabs/pathfinder))存储状态变化、元数据、证明，并记录Rollup中执行的所有交易。它跟踪系统当前的全球状态。解密 "元数据 "可以在必要时重建Starknet的历史。

**🚄EVM-equivalent**

Starknet网络本身并不等同于EVM，它设计了一个对ZK友好的Cairo虚拟机。Starknet没有为以太网操作码制作电路，而是自己制作了一套对ZK更友好的汇编语言、AIR（Algebraic Intermediate Representation）和高级语言Cairo

![https://drive.google.com/file/d/1dhZ5GtSK4sHCNcklGzNHfR-lSzplpD8J/view](https://storage.googleapis.com/papyrus_images/27b5debeb8de9bbade4982f6d41ac59d628720e0a96ce912f68966f75d6cbf61.png)

https://drive.google.com/file/d/1dhZ5GtSK4sHCNcklGzNHfR-lSzplpD8J/view

与EVM不对等的缺点是不能继承Ethereum的Solidity代码和工具链，所以不存在将Ethereum应用生态系统大规模迁移到Starknet的基础。Cairo语言对开发者来说有一定的学习门槛，Cairo工具链和库也处于起步阶段。

然而，设计独立的虚拟机有其好处。例如，Starknet的Cairo虚拟机对ZK更加友好，执行电路的效率更高，从而在未来带来更高的TPS和更低的gas使用量（更多细节将在后面介绍）。此外，放弃EVM设计为应用创新提供了许多可能性，这在Ethereum上是不可能的。 Starknet属于Vitalik定义的第四类EVM-equivalent（严格来说，Starknet是一个zkVM）。

![https://vitalik.eth.limo/general/2022/08/04/zkevm.html](https://storage.googleapis.com/papyrus_images/29de69c128d6e6649d2023608c978579436069a59a2a6950e449c6dc1784fa10.png)

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

尽管Starknet "本身 "并不等同于EVM，但Starknet在其他方面仍与Ethereum等同。

Warp是一个Solidity-Cairo翻译器，现在已经完成，由Nethermind开发。Warp有可能将Ethereum智能合约转译为Starknet Cairo合约。

![https://github.com/NethermindEth/warp](https://storage.googleapis.com/papyrus_images/6ff34bfcc59d0f445d6c93e2da6297271f58a7eba2facf75dc71c96ec009cb8c.png)

https://github.com/NethermindEth/warp

然而，Solidity的一些功能在Starknet中还不被支持或没有类似的功能。[虽然其中一些功能](https://github.com/NethermindEth/warp)可能会在未来被引入，但由于平台之间的根本差异，其他功能可能无法实现。

[Kakarot](https://twitter.com/KakarotZkEvm)是一个用Cairo编写的zkEVM（所以它是一个合约），相当于bytecode-equivalent EVM，并允许开发人员运行任何EVM字节码程序。以太坊的应用程序可以通过部署到Kakarot在Starknet上部署。

![https://github.com/sayajin-labs/kakarot](https://storage.googleapis.com/papyrus_images/f0b68f89ac2fc3375e2c4d50d4d17844411ae5ecdb3ff124eb7c65aceb149101.png)

https://github.com/sayajin-labs/kakarot

Kakarot是一项正在进行的工作，还没有准备好用于生产。 Starknet的ZK友好的Cairo VM不支持EVM和Solidity。然而，通过引入Solidity编译器Warp和Cairo zkEVM Kakarot，Starknet将有可能实现上面提到的type 3的EVM-equivalent.。

**🧬 STARK证明系统**

目前，有许多不同的证明系统可用于生成和验证证明，如Halo、PLONK、Groth16、Groth09、Marlin和Plonky2等，它们都属于SNARK证明系统。每个证明系统都有一个生成证明的验证者和一个验证证明的核实者。不同的ZK项目几乎使用不同的证明系统。主要的证明系统是SNARK和STARK。而Starknet使用STARK。

![https://medium.com/alliancedao/zkps-in-web-3-now-and-the-future-21b459348f29](https://storage.googleapis.com/papyrus_images/16c441af461de7fc1de676f0b15354bf931c31524293534b8f98a3c3f77ef389.png)

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

SNARK代表简洁的非交互式知识论证(Succinct Non-interactive Argument of Knowledge,)，而STARK代表可扩展的透明的知识论证(Scalable Transparent Argument of Knowledge)。STARK是SNARK的一种特殊和创新类型，"S "从Succinct变为Scalable，"T "代表透明，取代了非交互式特征

![https://www.altoros.com/blog/zero-knowledge-proof-improving-privacy-for-a-blockchain/](https://storage.googleapis.com/papyrus_images/4f06b2588714ebae154e9e7c8ceaf16f332822628118bf811a65e425eaf7112d.png)

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

STARK比SNARK有更多的创新。它不需要像SNARKs那样依赖 "可信设置"。它还带有更简单的密码学假设，避免了对椭圆曲线、配对和指数知识假设的需要，纯粹依靠hashing和信息理论，因此可以抵抗量子攻击。一般来说，STARK比SNARK更安全。

![https://research.thetie.io/zero-knowledge-starks-snarks/](https://storage.googleapis.com/papyrus_images/b56dd0d2391f98b7376e1047b5e56e18a39ba6d1cdbe3acbb1b3a749bb404af7.png)

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

而且STARK的可扩展性更强。证明生成速度是线性可扩展的，验证时间和证明大小是对数可扩展的（logarithmically scalable.。然而，缺点是生成的证明较大。随着证明范围的增加，验证的成本会有小幅下降，也就是说，证明越大，平均成本越低。

**证明时间是线性扩展的**

让我们看一下STARKs的[文档](https://eprint.iacr.org/2021/582.pdf)。验证者花费的时间几乎与哈希调用的数量成线性比例。

在80-bit安全的情况下，STARK每调用12,288个哈希值就需要1秒钟的时间，每秒产生12,288个调用；而每调用98,304个哈希值就需要10秒钟，每秒产生9830个调用。因此，我们可以知道验证器所花费的时间与哈希调用的数量几乎成线性比例，如下图所示。

![https://eprint.iacr.org/2021/582.pdf](https://storage.googleapis.com/papyrus_images/3429b8c4423df9e09c6d25c5c41128e36f05c91dcce04cd314b6504781e95cf5.png)

https://eprint.iacr.org/2021/582.pdf

**验证的时间和证明大小以对数方式扩展**

![https://eprint.iacr.org/2021/582.pdf](https://storage.googleapis.com/papyrus_images/41d1559a6c42e39a76993a6a57f594e04e15cdaf419270f06585fab338eeda26.png)

https://eprint.iacr.org/2021/582.pdf

正如你在左边看到的，当哈希调用从3,072增加到49,152，验证时间从40毫秒增加到60毫秒。而当哈希调用量从49,152增加到786,432时，验证时间只从60毫秒增加到80毫秒。证明的大小是一样的。因此，我们可以得出结论，哈希调用越多，平均验证时间越短，平均证明大小越小。

作为一个例子。验证两个100万步的程序的证明

`每个被验证者的总验证成本：2美元对数（T） （约794美元）。`

`两者一起验证的总验证成本：$log2(2T)\约438$`

成本降低1.8倍（或近2倍）

所有的实验，包括验证者和被验证者，都在同一台机器上运行，其规格如下。

1.  Operating-System: Linux 5.3.0-51-generic x86 64.
    
2.  CPU: Intel(R) Core(TM) i7-7700K @ 4.20GHz (4 cores, 2 threads per core).
    
3.  RAM: 16GB DDR4 (8GB × 2, Speed: 2667 MHz) 虽然验证器使用多线程，但在所有的实验中，验证器被限制为只使用单线程。
    
    **递归证明**
    
    一个普遍而简洁的知识证明/论证系统，比如STARKs，可以用来增量地验证计算。这意味着，一个计算可以产生一个证明，证明该计算的前一个实例的正确性。这个概念被非正式地称为 "递归证明构成 "或 "递归STARKs"。
    
    换句话说，一个递归STARK证明者将为一个声明生成一个证明，说一个系统的状态可以从a移到a+1，因为证明者已经验证了一个证明a的计算完整性的(递归)证明，并且忠实地执行了对状态a的计算，达到了新状态a+1。
    
    **简而言之，你可以理解为递归证明将两个证明，即a和a+1，合并为一个证明。正如下图所示。**
    

![https://medium.com/starkware/recursive-starks-78f8dd401025](https://storage.googleapis.com/papyrus_images/7b06eb62d1ea01a9a9b73a94dc8345d2a064c1e9355146c41c127afb458dc114.png)

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

在这个例子中，四个语句被发送到SHARP（一个验证器），每个语句都被并行证明。然后，每一对证明由一个递归验证器语句验证，这是一个验证STARK证明的cairo程序，每次验证都会产生一个证明。这个递归验证器语句确认两个证明已被验证为正确。接下来，这两个证明被另一个递归验证器语句再次合并。这就产生了一个证明，证明了所有四个原始声明。最后，这个证明可以在链上提交，由Solidity验证器智能合约进行验证。

根据StarkWare的联合创始人[Eli Ben-Sasson](https://cointelegraph.com/news/60-million-nfts-could-be-minted-in-a-single-transaction-starkware-founder)的说法，新的递归有效性证明有可能在以太坊区块链上将6000万个交易rollup成一个。

**⭐Cairo VM and Cairo Language**

![](https://storage.googleapis.com/papyrus_images/f6faafa4c57cdc9c6b2f4ee2d9ef4241218cf084a55f15ba5e8bea7d09c5da05.png)

[Cairo](https://www.cairo-lang.org/)VM是一个对STARK友好的、图灵完备的冯-纽曼CPU架构。它包括一种叫做Cairo的编程语言，它基于Cairo汇编和AIR（代数中间表示法），使得它的编译效率很高。

我们先来看看Cairo VM。Cairo VM是一个并行状态机，允许事务并发执行，大大增加了TPS。相比之下，EVM是一个串行状态机。

Cairo是一种智能合约语言，可以在Starknet上或在Starknet外部署。任何Cairo程序都可以生成STARK证明。它的语法与Rust相似。

这是一个[Cairo投票系统](https://www.cairo-lang.org/docs/hello_cairo/voting.html)的例子。

import json

from starkware.crypto.signature.signature import ( pedersen\_hash, private\_to\_stark\_key, sign)

Set an identifier that will represent what we're voting for.
============================================================

This will appear in the user's signature to distinguish
=======================================================

between different polls.
========================

POLL\_ID = 10018

Generate key pairs.
===================

priv\_keys = \[\] pub\_keys = \[\]

for i in range(10): priv\_key = 123456 \* i + 654321 # See "Safety note" below. priv\_keys.append(priv\_key)

    pub_key = private_to_stark_key(priv_key)
    pub_keys.append(pub_key)
    

Generate 3 votes of voters 3, 5, and 8.
=======================================

`votes = [] for (voter_id, vote) in [(3, 0), (5, 1), (8, 0)]: r, s = sign( msg_hash=pedersen_hash(POLL_ID, vote), priv_key=priv_keys[voter_id]) votes.append({ 'voter_id': voter_id, 'vote': vote, 'r': hex(r), 's': hex(s), })`

Write the data (public keys and votes) to a JSON file.
======================================================

`input_data = { 'public_keys': list(map(hex, pub_keys)), 'votes': votes, }`

`with open('voting_input.json', 'w') as f: json.dump(input_data, f, indent=4) f.write('\n')`

Cairo程序是汇编代码的集合，Cairo开发者会用高级语言Cairo而不是Cairo汇编来编写智能合约。当我们写一个Cairo程序时，Cairo编译器会将Cairo代码编译成Cairo汇编，Cairo汇编器会将汇编代码，生成Cairo字节码（在Cairo CPU上运行），在Cairo虚拟机上执行。

以下是Cairo的一些特点

**启动加载。从它们的哈希中加载程序**

一个程序可以将另一个程序的字节码写入内存，然后将程序计数器设置为指向该内存段，从而开始执行另一个程序。

这个想法的一个具体用法是 "从哈希值引导"。一个被称为 "the bootloader "的程序计算并输出另一个程序的字节码的哈希值，然后像上面那样开始执行它。这样，验证者只需要知道被执行的程序的哈希值，而不是它的完整字节码

**这同时提高了隐私和可扩展性。**

隐私性：验证者可以验证程序的执行而不知道计算的内容。

可扩展性：假设程序的哈希值被验证者知道，那么验证时间就不会线性地依赖于程序的大小，如果程序--而不是它的哈希值--被作为输入给验证者，就会出现这种情况。验证时间和程序大小有一个对数关系，正如在STARK部分提到的。

**CPU Architecture**

![Cairo VM很灵活。它可以通过软件编程无限接近于AISC的性能。](https://storage.googleapis.com/papyrus_images/4085d3d8ab02a479b39fa3bc3be8289a2e3237f077ae575da0ccd98bdf711ba5.png)

Cairo VM很灵活。它可以通过软件编程无限接近于AISC的性能。

Cairo VM很灵活。它可以通过软件编程无限接近于AISC的性能。

**Builtins**

开发人员可以直接调试和使用内部设置功能，以减少所需的计算开发量，而无需转换任何代码。

![https://medium.com/@pban/demystifying-cairo-white-paper-part-i-b71976ad0108](https://storage.googleapis.com/papyrus_images/0c30ca57dbc00876e109116ccaa2f47a97cc119e1dccb011ebeec92f382ad23d.png)

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

ASIC芯片所代表的电路或开发者数学中描述的实验与Cairo的电路是等同的。然而，Cairo仍在更新，最新版本被称为[Cairo 1.0。](https://medium.com/starkware/cairo-1-0-aa96eefb19a0)

![https://medium.com/starkware/cairo-1-0-aa96eefb19a0](https://storage.googleapis.com/papyrus_images/1bddcb7f90353a482a45a4e5a8320a6b69fdb8a7b39390eb3682ca0aaa769165.png)

https://medium.com/starkware/cairo-1-0-aa96eefb19a0

Cairo 1.0的主要新增内容是Sierra（Safe Intermediate Representation）。它作为Cairo 1.0和Cairo字节码之间的一个新的中间表示层。Sierra的目标是确保每个Cairo运行--即一个Cairo程序和它的输入--都能被证明。

原文链接

[https://mirror.xyz/0xb9e749FD3802D4A2162320ea7dB5AB8bf66a0AEA/o01pUdqNRRudOEoH8\_beZK2vK7nmbku6PO2Nzgo9iQA](https://mirror.xyz/0xb9e749FD3802D4A2162320ea7dB5AB8bf66a0AEA/o01pUdqNRRudOEoH8_beZK2vK7nmbku6PO2Nzgo9iQA)

参考链接 在原文中

---

*Originally published on [scarlet](https://paragraph.com/@kol8/starknet-zkvm)*
