摘要#
-
Starknet 的工作原理:与以太坊相比,Starknet 只需要一个排序器在链外执行计算。然后,为了减少数据量,证明者为交易生成 ZK-STARK 证明。最后,验证者在链上验证证明的正确性,并最终将多个 L2 交易打包成以太坊上的单个交易(称为 Rollup)。因此,Starknet 降低了链上的执行和存储成本,从而导致更低的燃气费用和更高的 TPS。
-
EVM 等效性:Starknet 具有一个 ZK 友好的 Cairo 虚拟机,与 EVM 不同,这意味着 Starknet 不支持 EVM 和 Solidity。但随着 Solidity 编译器 Warp 和 Cairo zkEVM Kakarot 的引入,Starknet 可以实现 3 型 EVM 等效性。
-
STARK 证明系统:与其他 ZK 证明系统相比,STARK 更安全且更具可扩展性。其证明生成速度线性可扩展,验证时间和证明大小是 对数可扩展的($O (polylog (N))$)。证明越大,总成本和验证时间越低。此外,STARK 完全依赖于哈希和信息理论,因此具有更简单的密码学假设,使其抵御量子攻击。但其缺点是初始证明生成的大小较大。
-
Cairo 虚拟机和语言: Cairo 虚拟机是一个 STARK 友好的、图灵完备的冯・诺依曼 CPU 架构。它可以通过软件编程无限接近 ASIC 的性能。它有一种名为 Cairo 的编程语言,基于 Cairo 汇编 AIR 和 Sierra。这使得编译高度高效且安全。它类似于 Rust,具有一定的学习难度。Cairo 支持验证者通过字节码哈希验证程序,提高链上可扩展性和隐私性。但 Cairo 仍在更新中。
在另一篇文章中,我们将展示证明者、排序器、全节点、客户端、Cairo、协议和其他 Starknet 网络组件的去中心化进展。
🛒 Starknet 的工作原理#
首先,让我们看看以太坊是如何工作的。在以太坊中,验证交易的正确性需要所有节点检查、验证和执行每个交易。这个过程确保了计算的准确性,并在网络中广播结果状态的变化。
但 Starknet 只在链外执行计算并生成证明,然后在链上验证证明的正确性,最后将多个 L2 交易打包成以太坊上的单个交易。准确地说,ZKR 将交易写入以太坊作为 calldata
,其中包含对智能合约函数的外部调用的数据被存储(类似于内存)。
因此,Starknet 可以大大提高网络操作速度,减少链上通信,增加网络吞吐量,因此与以太坊相比具有更高的 TPS 和更低的燃气费用。
简而言之,验证计算的正确性可以比作老师需要检查班级是否掌握某个主题。
以太坊的方法是检查每个学生(节点)是否记住了整个教科书(状态历史),而 Starknet 的方法是进行纸质考试。后者更高效且成本更低,但仍然保证安全。
与大多数 ZKR(如 Validity Rollup、Scroll、Polygon zkEVM 和 zkSync)一样,Starknet 有一类角色称为证明者来生成证明。验证者作为 L1(以太坊)上的合约验证证明。
具体来说,Starknet 由五个组件组成:证明者、排序器和 Starknet 上的全节点,以及验证者和 Starknet 核心(它们都部署在以太坊上)。
下图展示了 Starknet 的架构,感谢 David 的出色工作!
Starknet 的工作流程如下:
-
当我们在 Starknet 上发起交易时,一个链外服务器 —— 排序器 —— 接收、排序、验证并将其打包成区块。执行交易,然后将状态转换发送到 Starknet 核心合约。
-
证明者为每个交易生成证明并将其发送到部署在以太坊上的验证者合约。
-
验证者将验证结果发送到以太坊上的 StarkNet 核心合约,并触发一组新的以太坊交易,从 StarkNet 核心合约更新链上的全局状态以进行记录。状态转换作为 “calldata”(EIP-4844 后的 Blob)发送,以节省 L1 交易的燃气。这些 “元数据” 可以被 Starknet 全节点解密。
一个 全节点 存储状态变化、元数据、证明,并记录在 Rollup 中执行的所有交易。它跟踪系统的当前全局状态。解密 “元数据” 可以在必要时重建 Starknet 的历史。
🚄EVM 等效性#
Starknet 网络本身不是 EVM 等效的,并设计了一个 ZK 友好的 Cairo 虚拟机。
Starknet 没有为以太坊操作码制作电路,而是制作了自己的一套汇编语言 AIR(代数中间表示)和更 ZK 友好的高级语言 Cairo。
与 EVM 不等效的缺点是它无法继承以太坊的 Solidity 代码和工具链,因此没有大规模迁移以太坊应用生态系统到 Starknet 的基础。Cairo 语言对开发者有一定的学习门槛,Cairo 工具链和库仍处于初期阶段。
然而,设计独立的虚拟机有其好处。例如,Starknet 的 Cairo 虚拟机更 ZK 友好,并且更高效地执行电路,从而在未来实现更高的 TPS 和更低的燃气使用(更多细节将随后介绍)。此外,放弃 EVM 设计为应用创新打开了许多在以太坊上无法实现的可能性。
Starknet 属于 Vitalik 定义的 4 型 EVM 等效性(严格来说,Starknet 是一个 zkVM)。
尽管 Starknet “本身” 不是 EVM 等效的,但 Starknet 在其他方面仍与以太坊等效。
Warp 是一个 Solidity-Cairo 转换器,现在已完成,由 Nethermind 开发。它使 Warp 能够将以太坊智能合约转译为 Starknet Cairo 合约。
然而,Solidity 的几个特性尚未得到支持或在 Starknet 中没有类似的实现。虽然 其中一些特性 可能在未来引入,但由于平台之间的根本差异,其他特性可能无法实现。
Kakarot 是一个用 Cairo 编写的 zkEVM(因此它是一个合约),字节码等效的 EVM,允许开发者运行任何 EVM 字节码程序。以太坊应用可以通过部署到 Kakarot 在 Starknet 上进行部署。
Kakarot 仍在开发中,尚未准备好投入生产。
Starknet 的 ZK 友好的 Cairo 虚拟机不支持 EVM 和 Solidity。然而,通过引入 Solidity 编译器 Warp 和 Cairo zkEVM Kakarot,Starknet 将能够实现 3 型 EVM 等效性。
🧬 STARK 证明系统#
目前,有许多不同的证明系统可用于生成和验证证明,例如 Halo、PLONK、Groth16、Groth09、Marlin 和 Plonky2 等,它们都属于 SNARK 证明系统。每个证明系统都有一个生成证明的证明者和一个验证证明的验证者。不同的 ZK 项目几乎使用不同的证明系统。主要的证明系统是 SNARK 和 STARK。而 Starknet 使用 STARK。
SNARK 代表简洁非交互式知识论证,而 STARK 代表可扩展透明知识论证。STARK 是一种特殊且创新的 SNARK 类型,其中 “S” 从简洁变为可扩展,“T” 代表透明,取代了非交互特性。
STARK 比 SNARK 具有更多创新。它不需要像 SNARK 一样依赖 “可信设置”。它还具有更简单的密码学假设,避免了对椭圆曲线、配对和指数知识假设的需求,完全依赖于哈希和信息理论,因此抵御量子攻击。一般来说,STARK 比 SNARK 更安全。
而且 STARK 更具可扩展性。证明生成速度是线性可扩展的,验证时间和证明大小是对数可扩展的。然而,缺点是生成的证明大小较大。随着证明大小的增加,验证成本会略微降低,这意味着证明越大,平均成本越低。
证明时间线性扩展#
让我们看看 STARK 的 文档。证明者花费的时间几乎与哈希调用的数量线性扩展。
在 80 位安全性下,STARK 每 12,288 次哈希调用执行 1 秒,产生每秒 12,288 次调用;而每 98,304 次哈希调用需要 10 秒,产生每秒 9,830 次调用。因此,我们可以知道证明者花费的时间几乎与哈希调用的数量线性扩展,如下图所示:
验证者时间和证明大小对数扩展#
如左图所示,当哈希调用从 3,072 增加到 49,152 时,验证时间从 40 毫秒增加到 60 毫秒。而当哈希调用从 49,152 增加到 786,432 时,验证时间仅从 60 毫秒增加到 80 毫秒。证明大小保持不变。因此,我们可以得出结论,哈希调用越多,平均验证时间越短,平均证明大小越小。
例如:验证两个程序的证明,步骤为 100 万
● 每个单独验证的总验证成本:$2 log2 (T) \approx 794$
● 两者一起验证的总验证成本:$log2 (2T) \approx 438$
成本降低了 1.8 倍(或几乎 2 倍)
所有实验均在以下规格的同一台机器上运行:
-
操作系统:Linux 5.3.0-51-generic x86 64。
-
CPU:Intel (R) Core (TM) i7-7700K @ 4.20GHz(4 核心,每个核心 2 线程)。
-
RAM:16GB DDR4(8GB × 2,速度:2667 MHz)
当证明者使用多线程时,在所有实验中,验证者仅限于使用单线程。
递归证明#
一种通用且简洁的知识证明 / 论证系统,例如 STARKs,可以用于增量验证计算。这意味着一个计算可以生成一个证明,证明该计算的先前实例的正确性。这个概念非正式地称为 “递归证明组合” 或 “递归 STARKs”。
换句话说,递归 STARK 证明者将为一个声明生成证明,说明系统的状态可以从 a 移动到 a+1
,因为证明者已经验证了一个(递归)证明,证明了 a
的计算完整性,并在状态 a
上忠实地执行了计算,达到了新状态 a+1
。
简而言之,您可以理解递归证明将两个证明结合起来, a
和 a+1
,形成一个单一的证明。如下图所示:
在这个例子中,四个声明被发送到 SHARP(一个验证者),每个声明并行证明。然后,每对证明通过递归验证者声明进行验证,递归验证者声明是一个验证 STARK 证明的 Cairo 程序,并为每个验证生成一个证明。这个递归验证者声明确认两个证明已被验证为正确。接下来,这两个证明通过另一个递归验证者声明再次合并。这导致一个证明证明所有四个原始声明。最后,这个证明可以在链上提交并由 Solidity 验证者智能合约验证。
根据 Eli Ben-Sasson,StarkWare 的联合创始人,新递归有效性证明有潜力将 6000 万个交易汇总到以太坊区块链上的单个交易中。
⭐Cairo 虚拟机和 Cairo 语言#
Cairo 虚拟机是一个 STARK 友好的、图灵完备的冯・诺依曼 CPU 架构。它包括一种名为 Cairo 的编程语言,基于 Cairo 汇编和 AIR(代数中间表示),使其编译高度高效。
让我们首先看看 Cairo 虚拟机。Cairo 虚拟机是一个并行状态机,允许交易并发执行,显著提高 TPS。相比之下,EVM 是一个串行状态机。
Cairo 是一种智能合约语言,可以在 Starknet 上或离线部署。任何 Cairo 程序都可以生成 STARK 证明。其语法类似于 Rust。
这是一个 Cairo 投票系统 示例:
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 的特性。
启动加载:从哈希加载程序#
一个程序可以将另一个程序的字节码写入内存,然后将程序计数器设置为指向该内存段,从而开始执行另一个程序。
这个想法的一个具体用途是 “从哈希启动加载”:一个程序,称为 “引导加载程序”,计算并输出另一个程序字节码的哈希,然后如上所述开始执行它。这样,验证者只需要知道正在执行的程序的哈希,而不需要其完整的字节码。
这提高了隐私性和可扩展性:
-
隐私性:验证者可以在不知道程序计算内容的情况下验证程序的执行。
-
可扩展性:假设程序哈希对验证者是已知的,验证时间不会线性依赖于程序大小,因为如果程序而不是其哈希作为输入提供给验证者,验证时间和程序大小之间的关系是对数关系,如 STARK 部分所述。
CPU 架构
Cairo 虚拟机是灵活的。它可以通过软件编程无限接近 ASIC 的性能。
内置功能#
开发者可以直接调试和使用内部设置功能,以减少所需的计算开发量,而无需转换任何代码。
由 ASIC 芯片表示的电路或开发者数学中描述的实验等同于 Cairo 的电路。然而,Cairo 仍在更新中,最新版本称为 Cairo 1.0.
Cairo 1.0 的主要新增功能是 Sierra(安全中间表示)。它作为 Cairo 1.0 和 Cairo 字节码之间的新中间表示层。Sierra 的目标是确保每次 Cairo 运行 —— 即一个 Cairo 程序及其输入 —— 都可以被证明。
致谢#
特别感谢 Cyberight Capital 对本文的支持。
Cyberight Capital 是一家另类投资机构。我们通过角色转换和对人和技术的尊重,发现行业的有效潜在点。专注于人文、技术驱动和独立思考。
参考文献#
[1] Starknet 架构评审
https://david-barreto.com/starknets-architecture-review/#more-4602
[2]l2beat_final
https://drive.google.com/file/d/1dhZ5GtSK4sHCNcklGzNHfR-lSzplpD8J/view
[3] Web 3 中的 ZKPs:现在与未来
https://medium.com/alliancedao/zkps-in-web-3-now-and-the-future-21b459348f29
[4] 零知识证明:改善区块链隐私
https://www.altoros.com/blog/zero-knowledge-proof-improving-privacy-for-a-blockchain/
[5] 零知识前沿:关于 SNARK、STARK 和未来应用
https://research.thetie.io/zero-knowledge-starks-snarks/
[6] Cairo 白皮书
https://www.cairo-lang.org/cairo-whitepaper/
[7] 揭开 Cairo 白皮书的神秘面纱 — 第一部分 https://medium.com/@pban/demystifying-cairo-white-paper-part-i-b71976ad0108
[8] 揭开 Cairo 白皮书的神秘面纱 — 第二部分
https://medium.com/@pban/demystifying-cairo-white-paper-part-ii-9f9dc51886e9
[9] 可扩展、透明和后量子安全的计算完整性
https://eprint.iacr.org/2018/046.pdf
[10] ethSTARK 文档
https://eprint.iacr.org/2021/582.pdf
[11] 递归 STARKs
https://medium.com/starkware/recursive-starks-78f8dd401025
[12] AIR 文档