近期报名参加了OpenBuild组织的StarkNetBootcamp,今天听完第一节课后,带着一些困惑和ChatGPT进行了一场对话,内容延伸到StarkNet、公链扩展、智能钱包、消息机制全解读......解决了自己的不少知识盲点,对Web3的了解更进一步。现在将我们对话的内容,整理成文
近期报名参加了OpenBuild组织的 StarkNet Bootcamp,今天听完第一节课后,带着一些困惑和ChatGPT进行了一场对话,内容延伸到 StarkNet、公链扩展、智能钱包、消息机制全解读......解决了自己的不少知识盲点,对Web3的了解更进一步。
现在将我们对话的内容,整理成文。如有不准确的地方,欢迎指出!
答:StarkNet 是一个基于 STARK 零知识证明的 Layer2 扩展网络,由 StarkWare 团队开发。它不兼容 EVM,而是使用自研语言 Cairo 构建合约,运行在 CairoVM 中。
✅ 优势包括:
极强的可扩展性(批量交易压缩)
安全性
来源于以太坊(数据可用性在 L1)
基于 STARK,不依赖可信设置,抗量子计算
原生支持账户抽象(智能钱包)
❌ StarkNet 的劣势与挑战
Cairo 学习门槛高:新语言、新思维模式,不兼容 EVM,限制现有以太坊开发者快速迁移。
生态起步阶段:虽然已有 DEX、NFT 等项目,但与主流 L1 比仍处早期。
开发者工具链不够成熟:虽然已有工具(如 Starknet.js、Voyager、Starkli 等),但生态完整度仍在建设中。
交易延迟与异步交互复杂性:相比同步模型,开发调试难度更高。
与 Arbitrum、Optimism(EVM-compatible Rollup)相比,StarkNet 更追求性能与原生 zk 架构的表达力
项目 | 类型 | 编程语言 | 扩展性 | 安全性 | 去中心化 | 易用性 | 对比简评 |
---|---|---|---|---|---|---|---|
StarkNet | 以太坊 Layer2 (ZK-Rollup) | Cairo | 🌟🌟🌟🌟🌟 | 🌟🌟🌟🌟🌟 | 🌟🌟🌟 | 🌟🌟 | 高扩展性和安全,开发门槛高 |
Optimism / Arbitrum | 以太坊 Layer2 (Optimistic Rollup) | Solidity | 🌟🌟🌟🌟 | 🌟🌟🌟 | 🌟🌟🌟🌟 | 🌟🌟🌟🌟 | 与以太坊兼容性好,上手快 |
Solana | Layer1 公链 | Rust | 🌟🌟🌟🌟🌟 | 🌟🌟🌟 | 🌟🌟 | 🌟🌟🌟 | 吞吐量极高,稳定性问题偶有争议 |
Polygon (PoS) | 以太坊侧链 | Solidity | 🌟🌟🌟 | 🌟🌟 | 🌟🌟🌟 | 🌟🌟🌟🌟 | 成本低,兼容性好,去中心化相对较弱 |
ZkSync Era | 以太坊 Layer2 (ZK-Rollup) | Solidity-like (Zinc, zkEVM) | 🌟🌟🌟🌟 | 🌟🌟🌟🌟🌟 | 🌟🌟🌟 | 🌟🌟🌟 | 更接近开发者习惯的 ZK L2 |
Ethereum 主网 | Layer 1 | Solidity | 🌟🌟 | 🌟🌟🌟🌟🌟 | 🌟🌟🌟🌟🌟 | 🌟🌟🌟 | 安全性与去中心化最强,但交易成本高 |
ZK 系统需要“可证明”的计算(Provable Computation)。STARK/ZK-Rollup 的本质是:
⚠️ 问题是:主流语言如 Solidity、Rust、Move 并不是为“生成可证明计算”设计的。
这些语言运行在标准 CPU 上,而非为生成证明优化过。
想从 Solidity/Rust 的执行轨迹里“提取证明”效率极低,甚至不可行
Cairo 是为 ZK 证明设计的语言(全称:CPU Algebraic Intermediate Representation),是 StarkWare 团队为 STARK 而设计的通用编程语言,它的最大特点是:
特性 | 描述 |
---|---|
✅ 为可证明计算设计 | Cairo 程序天然可以被转换成 STARK 证明,不需要额外改造 |
✅ 零依赖 | Cairo 运行时是为 ZK 特化的,没有操作系统、没有多线程、没有动态内存 |
✅ 通用 | Cairo 可以表达任何图灵完备的逻辑,不只限智能合约,也可以做 AI 推理、游戏状态验证等 |
✅ 高效 | StarkWare 的 prover 可以高效地为 Cairo 生成 ZK 证明,达到大规模扩展性 |
换句话说,Cairo 是 ZK 世界的“汇编语言 + 编程语言”,是 StarkNet 的基础。
假如你写了个函数:
function add(uint a, uint b) public pure returns (uint) {
return a + b;
}
你希望有人离线执行后,把结果和证明一起提交到链上。问题是:
而在 Cairo 里,你写:
func add(a: felt, b: felt) -> (res: felt) {
return (res=a + b);
}
理由 | 说明 |
---|---|
🚀 极限性能优化 | StarkWare 可以从 prover 到语言全栈打通优化,提升证明生成效率 |
🧰 统一开发体验 | Cairo 生态自带 prover / VM / 合约部署 / 调试工具链,避免兼容复杂性 |
🧠 控制权更强 | 不依赖 EVM 规则,可自定义计算模型(比如异步执行) |
🔒 安全性更高 | 语言本身可以防止一些传统漏洞,如重入攻击、整数溢出等 |
因为 Cairo 的问题也很现实:
问题 | 描述 |
---|---|
🧑💻 生态不成熟 | 相比 Solidity,开发者社区小,工具链新 |
🎢 学习曲线陡 | 思维方式和 EVM 不一样,调试和部署方式也不同 |
📦 与 EVM 不兼容 | 没法直接复用 EVM 智能合约、组件和库 |
所以像 zkSync 选择了 zkEVM 路线,兼容 Solidity 和 EVM;而 StarkNet 选择 Cairo,是为了打造一个从语言到底层执行都为 ZK 优化的体系,直接适应这种高度可证明、可验证的计算模型。
现代零知识证明系统(ZKP)时最核心的一对技术路线分歧:STARK vs SNARK。
名称 | 全称 | 代表项目 | 使用证明类型 |
---|---|---|---|
SNARK | Succinct Non-interactive Argument of Knowledge | zkSync, Mina, Zcash, Polygon zkEVM | zkSNARK |
STARK | Scalable Transparent Argument of Knowledge | StarkNet | zkSTARK |
二者都是 零知识证明系统,用来证明“某个计算过程是正确的”,但它们在很多方面有重要区别
对比项 | STARK | SNARK |
---|---|---|
📐 数学基础 | 基于哈希函数和代数中间表示(AIR) | 基于椭圆曲线密码学 |
🔐 安全性 | 抗量子攻击(未来安全) | 不抗量子攻击 |
🧪 可信设置 | 不需要可信设置(Transparent) | 需要可信设置(Trusted Setup) |
⚙️ 证明大小 | 相对较大(数十 KB) | 很小(数百字节) |
⏱️ 验证速度 | 快 | 非常快(更适合主网验证) |
🛠️ 证明生成速度 | 慢一些(但更可并行化) | 快一些 |
📈 扩展性 | 非常好,为大规模计算而设计 | 限于电路大小和约束建模复杂性 |
🧩 语言/工具链 | 需要用 Cairo / 自定义语言(非 EVM 兼容) | 可以集成 EVM,如 zkEVM |
✅ 代表项目 | StarkNet、Herodotus、Celestia DA 等 | zkSync、Polygon zkEVM、Mina、Zcash 等 |
StarkNet 选择 STARK,是为了最大程度提升安全性与开放性
,不依赖外部可信参数生成仪式。
✅ 特别适合去中心化的区块链环境,安全性更强。
🔒 从长期安全性角度,STARK 更具前瞻性。
🚀 StarkNet 推崇 “链下执行 + 证明上传”,完全靠 STARK 来压缩任意复杂逻辑。
问题 | 描述 |
---|---|
📦 证明大 | STARK 证明大小通常在 20KB~100KB,而 SNARK 可小到 200 字节 |
⏳ 验证较慢 | 虽然已经很快,但比 SNARK 验证器稍慢,成本稍高 |
🧑💻 工具不通用 | STARK 通常绑定 Cairo(非 Solidity),生态和开发者支持度仍在发展 |
📉 不适合频繁小交易的场景 | 比如支付场景,SNARK 的快速验证和小证明更合适(如 zkSync Lite) |
场景 | 更适合用 SNARK | 更适合用 STARK |
---|---|---|
支付、NFT 证明、小交易 | ✅ | 🚫 |
大规模链下计算、游戏状态、AI 验证 | 🚫 | ✅ |
与 EVM 高兼容(zkEVM) | ✅ | 🚫 |
长期安全性保障 | 🚫 | ✅ |
需要极高透明性 | 🚫 | ✅ |
STARK 更安全、更透明、可扩展性更强,但体积和复杂度更高;SNARK 更小巧、更成熟、更接近现有生态,但存在可信设置和量子威胁。
StarkNet 并不仅仅是一个 Layer 2,而是 StarkWare 打造的一整套从头到尾为 ZK 优化的栈,包括:
层级 | 技术组件 | 说明 |
---|---|---|
应用层 | Cairo | ZK-native 的语言 |
合约层 | StarkNet | 运行 Cairo 合约的 Layer 2 |
VM 层 | CairoVM | Cairo 的虚拟机,生成执行轨迹用于证明 |
证明层 | STARK Prover(SHARP) | 通用证明系统 |
验证层 | Stark Verifier on L1 | 以太坊上的 STARK 验证合约 |
🧠 你需要知道的是:
特性 | 是否了解? | 简述 |
---|---|---|
异步执行模型 | 🚨 很多人不了解 | StarkNet 合约之间是异步调用的,不像 EVM 是同步堆栈模型 |
账户抽象是默认特性 | ✅ 非 EIP-4337,而是原生 AA | |
链上状态按节点分段存储(state diff) | 🚨 类似 Git,适合历史证明 | |
L1↔L2 跨链机制:消息桥(L1 → L2 Message) | ✅ 内置支持 L1 合约调用 L2 合约 | |
Sequencer 还没去中心化 | ⚠️ 目前由 StarkWare 托管,未来会开放 | |
证明系统采用递归 STARK 合并多个执行 | ✅ 更高效且可压缩百万级交易为一条证明 |
升级项 | 说明 |
---|---|
Cairo 1.0 发布 | 更现代、更类型安全的 Cairo(Rust 风格语法) |
Sequencer 去中心化 | 未来会有多个 Sequencer 提供者,不再由 StarkWare 控制 |
Volition 模式 | 允许用户选择数据可用性:存 L1 还是 L2(影响成本 vs 安全) |
SHARP 作业池共享 | 未来多个 App 的 Cairo 程序可以合并生成一次证明,提升效率 |
隐私 Layer 3 / Validium 架构 | 利用 STARK 提供更深层次隐私保护服务 |
这些内容基本都是面向 未来 6\~12 个月的关键路径,提前理解会对你的 Web3 技术判断力有显著提升。
类别 | 你可以研究什么 |
---|---|
Cairo DSL / 宏系统 | 熟悉如何写自己的宏(类似 Rust macro) |
StarkNet testing | 使用 starknet-devnet 和 pytest-cairo 进行本地测试 |
starknet.js / starknet.py | 前端如何与 StarkNet 合约交互 |
Felt 和类型系统 | Cairo 的基础类型 felt 与 Rust 的 usize 不同 |
StarkNet CLI & tooling | 如 scarb 包管理器、snforge 测试框架等 |
知识点 | 为什么重要? |
---|---|
STARK 的 AIR(Algebraic Intermediate Representation)是什么? | 这是 STARK 的核心中间层,对理解证明生成极关键 |
递归证明在 StarkNet 中怎么工作? | StarkWare 使用递归 STARK 来聚合多个交易轨迹,极大提升扩展性 |
状态证明 vs 执行证明区别? | StarkNet 的重点是“执行证明”,和 Celestia 这类 DA 层的“状态证明”有本质不同 |
Layer 3 的使用场景与挑战 | StarkEx 未来可能支持 L3(如链上游戏、AI 计算) |
StarkNet 与 EigenLayer 未来交互可能 | 高级议题,牵涉到证明可再验证性(re-staking ZK proof)和验证层共享安全性 |
STARK 和智能钱包(Smart Wallet)之间的关系,是 StarkNet 生态的一大亮点,甚至可以说:StarkNet 是最早原生支持智能钱包
的 Layer2,而且这种支持和它采用 STARK 证明系统有密切联系。
关键点 | 说明 |
---|---|
StarkNet 的每个账号默认就是智能钱包 | StarkNet 没有 EOA,所有账号都是合约账户(即智能钱包) |
这一机制得益于 STARK 的高效性 | STARK 生成证明的成本不依赖于账号模型复杂度,所以智能钱包也能被高效证明 |
STARK + Cairo 是 Account Abstraction 原生落地的关键 | Cairo 让账户逻辑自定义成为可能,STARK 能高效证明这些复杂逻辑 |
StarkNet 上的“钱包地址”其实是一个 Cairo 编写的合约地址。可以自定义这个账户合约的行为,比如:
➡️ 因为这是合约,验证逻辑越复杂,EVM 越吃力,但 STARK 却很轻松。
相比 SNARK,STARK 在处理复杂逻辑时表现更好,比如:
这就使得复杂钱包逻辑可以被轻松 ZK 化,而不会拖慢链的整体吞吐。
特性 | StarkNet | 以太坊主网 |
---|---|---|
账户模型 | 全合约 | EOA + 合约 |
AA 支持 | 原生 | 依赖 EIP-4337 和 bundler |
钱包扩展性 | 极强 | 较弱,逻辑绑死在协议层 |
StarkNet 的每个用户都在使用“智能钱包”,比如:
能力 | 实现方式 |
---|---|
零 Gas 钱包 | 自定义 validate_and_execute() + Paymaster 合约 |
生物识别登录钱包 | 钱包只验证 Zero-Knowledge 生物识别 proof |
社交恢复 | 钱包内置社交多签或时间恢复逻辑 |
多因子钱包 | 合约支持多签或 ZK 身份条件解锁 |
可组合模块化钱包(模块间调用可 ZK 验证) | Cairo 是通用语言,逻辑可组合、可递归证明 |
这些想法,如果用 EVM + SNARK 做,会非常困难,甚至无法部署。而 STARKNet 是天然支持这种强扩展性钱包逻辑的平台。
🔍 项目 | 关联点 |
---|---|
StarkNet 全链采用 STARK 证明 | 高效验证任意复杂账户逻辑 |
原生没有 EOA,全用户用智能钱包 | 不再区分“普通账户”和“合约账户” |
Cairo 合约可定制账户逻辑 | 用户掌控验证方式、安全逻辑 |
STARK 执行轨迹 → ZK 证明 | 任意复杂验证逻辑也能轻松 ZK |
可以理解为:Stark 是让智能钱包“从理想变成现实”的底层能力之一。
类型 | 定义 |
---|---|
传统钱包(EOA) | 使用私钥直接控制的账户,像 MetaMask、Rainbow 等。你发交易时用私钥签名,链上验证签名是否匹配地址 |
智能钱包(Contract Account) | 钱包是一个合约,由你设计的逻辑来验证交易(比如:多签、社交恢复、ZK 验证),不依赖私钥本身 |
维度 | 传统钱包(如 MetaMask) | 智能钱包 |
---|---|---|
账户类型 | EOA(外部账户) | 合约账户 |
部署成本 | 无需部署 | 需要部署合约(成本逐步降低) |
签名方式 | 固定(通常是 ECDSA) | 可自定义(支持多签、ZK、社交恢复等) |
安全性 | 私钥即一切,丢了就完 | 可设权限、恢复方案、更安全 |
功能拓展性 | 很弱 | 非常强(比如限额、时间锁、2FA) |
Gas 支付方式 | 自己出 Gas(必须有币) | 可设代付(Paymaster)或用 ERC20 付 |
兼容性 | 全链支持 | 需链支持 AA(如 StarkNet 原生支持) |
用户体验 | 初学者易用,但安全隐患大 | 初期复杂,长远体验优越 |
传统钱包只能签名 → 不能扩展 → 所有复杂逻辑都要写在 DApp 合约里。
智能钱包可以:
趋势 | 描述 |
---|---|
🌱 钱包即平台 | 钱包将集成交易、DeFi、NFT、ZK 身份管理等功能 |
🧩 模块化钱包 | 用户可拼装自己的权限模型 |
🔐 密钥抽象化 | 用户无感知密钥、使用生物识别/社交恢复登录 |
🛰️ 跨链智能钱包 | 钱包不止绑定一个链,而是管理整个 Web3 身份与权限 |
🌉 和 Web2 接轨 | 邮箱、社交账号登录 → 背后转为智能钱包(AA)账户 |
智能钱包就是“账户抽象(Account Abstraction, AA)”的最典型、最核心的实现方式。
账户抽象(Account Abstraction) = 一种设计理念 / 协议标准
↓ 实现方式之一
智能钱包(Smart Wallet) = 账户抽象的落地实现
概念 | 解释 |
---|---|
账户抽象(AA) | 是一种“允许用户账户拥有合约能力”的理念。也就是说:用户账户不再只是私钥控制,而是可以自己定制“如何验证、如何扣 Gas、是否多签”等逻辑。 |
智能钱包 | 是一种具体实现了 AA 理念的钱包类型。它就是一个合约账户,你可以定制它的签名验证、权限管理、恢复逻辑等。 |
换句话说,账户抽象是思想/协议,智能钱包是这个思想落地到产品中的具体表现。
因为智能钱包是一个合约账户,允许自定义以下行为(这是 EOA 无法做到的):
模块 | 实现示例 |
---|---|
签名验证 | 可使用 EdDSA、ZK 验证、Face ID、生物识别等 |
权限控制 | 每天限额、白名单、时间锁、多因子登录 |
Gas 支付 | 自定义 Paymaster 机制,实现 “无 Gas 钱包” |
恢复机制 | 社交恢复、邮箱+验证码找回、预设好友帮助恢复 |
操作打包 | 多个操作一次性发出(batch tx),减少交互麻烦 |
虽然智能钱包是最常见的 AA 实现,但 AA 的落地路径不止一种:
路径 | 描述 |
---|---|
EIP-4337 | 通过 EntryPoint 合约 + bundler 在以太坊实现 AA |
L2 原生 AA | StarkNet、ZkSync Era 直接放弃 EOA,全链只有智能账户 |
Rollup 特化 AA | 某些链(如 Scroll)原生支持 AA 但兼容 MetaMask |
模块化 AA | 钱包逻辑可插拔模块,像 Argent Modular Wallet 一样 |
“以太坊扩展”不等于“兼容 EVM”,它的核心在于:
是否把
安全性
和数据可用性
锚定在以太坊主链上。
条件 | StarkNet 是否满足 |
---|---|
继承以太坊主链的安全性 | ✅ 是,通过将状态变更的有效性证明(STARK)提交到 L1(以太坊主链) |
将交易数据(或压缩形式)写入以太坊保证可用性 | ✅ 是 |
用户资产由以太坊主链控制,L2 是“租用安全性” | ✅ 是 |
允许用户从以太坊原生桥接资产进入 StarkNet,再从 StarkNet 安全提回 | ✅ 是 |
➡️ 所以,虽然 StarkNet 不兼容 EVM,但它仍然是货真价实的 Ethereum L2。
项目 | 运行环境 | 证明机制 | EVM 兼容 | 性能(理论) | 安全模型 | 语言 | 特点 |
---|---|---|---|---|---|---|---|
StarkNet | Cairo VM | ZK-STARK(有效性证明) | ❌ 不兼容 EVM | ✅ 高吞吐,低成本 | L1 继承 + ZK 证明 | Cairo | 原生 ZK L2,非对称能力强 |
Optimism | EVM | Optimistic Rollup(欺诈证明) | ✅ 完全兼容 | ⚠️ 性能受限 | L1 继承 + 7天挑战期 | Solidity | 快速部署,生态兼容 |
Arbitrum | EVM(自研 Arbitrum VM) | Optimistic Rollup | ✅ 高兼容 | ⚠️ 性能提升有限 | L1 + 自研 VM | Solidity | 比 Optimism 更优化版 |
zkSync Era | ZK-EVM(近兼容) | ZK-SNARK | ⚠️ 部分兼容 | ✅ 高吞吐 | L1 + ZK | Solidity / Zinc | 更接近 StarkNet,但保持兼容 |
优势点 | StarkNet 强在哪里? |
---|---|
✅ 原生 ZK Rollup | 相比 optimistic rollup(如 OP、Arbitrum)无需等待挑战期,L1 最终性快,安全性强 |
✅ 极致性能潜力 | 由于 CairoVM 和 ZK 原生设计,不受 EVM 框架限制,理论上吞吐量更高 |
✅ 证明系统先进 | 使用 STARK 而非 SNARK,不依赖可信设置(无需 trusted setup),更透明、更安全 |
✅ 语言设计前瞻 | Cairo 语言天然为可验证计算而设计,更适合构建模块化智能钱包、ZK dApp、链上游戏等复杂场景 |
✅ 未来与以太坊深度整合 | 与以太坊在数据可用性、L1 调用、预言机层有合作潜力;StarkWare 也长期参与以太坊科研演进(Vitalik 多次背书) |
挑战 | 描述 |
---|---|
❌ 开发门槛高 | Cairo 是新语言,有学习曲线,生态成熟度还不如 EVM 体系 |
❌ EVM 不兼容 | 不能直接迁移 Solidity 合约,需要重写 |
❌ 当前 TPS 和 UX 仍在早期 | 2025 年虽有进展,但网络成熟度尚未和主流 Rollup 平起平坐 |
❌ 原生钱包需要新适配 | 不能直接用 MetaMask,需要专门的钱包如 Argent X、Braavos 等 |
StarkNet 并非 EVM 的复制品,而是为 ZK 原生应用设计的“下一代 Layer 2”。它代表的是性能、安全和未来可编程性的极致追求。
如果看好的是 Web3 未来的复杂逻辑(比如链上游戏、智能钱包、链上 AI 模型),StarkNet 是非常值得关注的一条链。
StarkNet 在 L2 执行交易和生成状态变更,在本地生成一个 ZK-STARK 证明,然后把这个证明和交易摘要提交到以太坊 L1,让以太坊只验证这个“压缩后的有效性证明”,无需重算所有交易。
用户交易(tx)
↓
提交到 StarkNet(L2)
↓
由 sequencer 执行 Cairo 合约、更新状态
↓
生成一个状态根变化的 STARK 证明(ZK 证明)
↓
把:
- 状态变化前后根(是Stark的根)
- STARK 证明
- 部分交易数据(或哈希/commit)
提交到以太坊 L1 合约
↓
以太坊 L1 只验证 STARK 证明是否成立(用极少的 gas)
↓
一旦验证成功,认为这些 L2 状态变更是合法的、不可逆的
比较项 | StarkNet(L2) | Ethereum(L1) |
---|---|---|
交易执行 | ✅ 本地执行(高性能) | ❌ 不执行,只验证 |
状态存储 | L2 维护自己的状态树 | 可选上传摘要或数据 |
验证机制 | 生成 STARK 证明 | 验证 STARK 证明 |
数据可用性 | 交易数据以 calldata 或压缩形式发回 L1 | 完整存储 |
优点 | 描述 |
---|---|
✅ 极大节省以太坊 L1 的计算负担 | 主链只做数学验证,不用再重复执行上万个交易 |
✅ 安全性继承自以太坊 | 因为状态的正确性由 ZK-STARK 数学保证,L1 验证后不可更改 |
✅ 扩展性强 | L2 可以执行成千上万笔交易,只需提交一个小小证明(几十 KB) |
✅ 更快最终性 | 不用等 7 天挑战期(像 Optimism),ZK 验证后即定案 |
假设用户在 StarkNet 上进行了 5000 个交易:
StarkNet 的 sequencer 会:
L1 calldata
或 Blob
(未来可能用)写入以太坊;这样即使 StarkNet L2 发生故障,L1 有数据 + 状态根 + 证明,就能恢复所有内容。
安全性来源 | 说明 |
---|---|
✅ 共识机制(PoS) | 超过百万个验证者共同维护网络,恶意行为会被 slash(惩罚抵押金),极高的攻击成本(> 300 亿美元) |
✅ 去中心化客户端 + 客户端多样性 | 不同语言、不同团队开发的多个客户端(如 Geth、Nethermind、Erigon、Lighthouse),互相验证 |
✅ 不可篡改账本 + 可追溯状态变更 | 所有状态变更都有全网共识的“状态根哈希”,任何节点可复验历史状态 |
✅ 经济与生态绑定深 | 超过 $500B 的资产(ETH、DeFi、NFT 等)运行其上,系统风险极度敏感、维护动力足 |
✅ 高安全预算 | 每年支付给验证者的 staking 奖励数十亿美元,买的是网络安全性 |
总结一句话:
以太坊的安全性是通过“昂贵的共识 + 激烈的经济惩罚 + 大量客户端复验”达成的,是 Web3 最坚固的基石。
StarkNet 的证明生成是 灵活的、有批处理能力的:
模式 | 说明 |
---|---|
✅ 按区块生成证明 | 每个区块的交易可生成一个 ZK-STARK 证明,对应一个状态根的变化 |
✅ 多个区块打包生成一个大证明(批处理) | 为提升效率,可将多个区块/交易组合,生成一个大证明,一次上链 |
✅ 并发生成多个证明(未来支持) | Prover 系统可并行工作,提升 throughput(正在优化中) |
如果 StarkNet 执行了 3 个区块,每个区块各有 500 笔交易。
它可以:
大部分 ZK Rollup 项目(包括 StarkNet、zkSync)会选择批处理多个区块 / 交易生成一个证明,以最大化 amortized gas 成本。
可以这么理解:
项目 | 说明 |
---|---|
StarkNet 的证明 | 是一个特殊的 L1 交易,调用特定的 verifier 合约,把:状态根A 、状态根B 、STARK 证明 提交 |
ETH 如何处理 | ETH 不执行这些交易内容,只调用 verifier 合约 【StarkNet部署在ETH上的合约】,验证数学证明的正确性 |
ETH 区块的利用方式 | 一个区块可能包含多个这样的 L2 证明(来自 StarkNet、zkSync、Scroll 等) |
为什么说“扩展了 ETH” | L2 每个证明代表几千甚至上万笔真实用户交易,而 ETH 只处理证明验证。交易处理能力成倍扩展! |
场景 | ETH 传统方式 | ETH + StarkNet |
---|---|---|
处理 10,000 笔交易 | 大约需要 10,000 次执行 + 验证 +存储 | 只需验证一个 STARK 证明(约 200ms) |
ETH 区块空间使用 | 很满 | 空出空间给更多证明 |
Gas 成本 | 高 | 单笔 amortized 成本大幅降低 |
StarkNet 不会主动去获取以太坊的状态根,也不需要将 ETH 的状态根包含在 STARK 证明里
StarkNet 是一个 独立的 Layer 2 执行环境,它只需要对自己链上的状态变更生成证明。 这些状态变更最终提交到 ETH 时,并不需要知道 ETH 的全局状态根(stateRoot),因为:
ETH 的状态根只代表 L1 的全局状态,而 StarkNet 证明的是: “在 StarkNet 的旧状态根
S1
的基础上,执行这批交易后得到了新状态根S2
。”
也就是说,STARK 证明的是:
StateRoot_before --> apply(batch_of_transactions) --> StateRoot_after
这一切都只在 StarkNet 的本地状态空间 里进行。
ETH 上的 Verifier 合约
只做一件事:
✅ 给它:
S1
S2
π
然后它在合约中执行:Verifier.verify(S1, S2, π)
,看这个证明是否有效。
ETH 不会:
所以生成 STARK 证明时也不需要包含 ETH 的状态根!
虽然 StarkNet 生成证明时不需要 ETH 状态根,但它确实有时候需要“从 L1 获取信息”:
场景 | 是否需要读 ETH 状态? | 如何实现? |
---|---|---|
🔁 资产桥接(比如从 ETH 把 USDC 桥到 StarkNet) | ✅ 是 | ETH 发事件(Log),StarkNet 监听 & 消化 |
🔁 读取 L1 合约变量 | ✅ 是 | 通过 L1-to-L2 message 机制传递 |
🔁 StarkNet 写入 L1 | ❌ 不需要读 ETH 状态 | 直接把新状态 + 证明发到 L1 |
┌──────────────┐
│ ETH 状态根 │ ←──✖ 不需要包含或依赖
└──────────────┘
▲
│
╔════════════════════════════╗
║ StarkNet Prover ║
║ 1. 拿到本地的状态根 S1 ║
║ 2. 执行交易 batch ║
║ 3. 生成状态根 S2 ║
║ 4. 构造 STARK 证明 π ║
╚════════════════════════════╝
│
▼
┌────────────────────────────────────┐
│ ETH 上的 StarkNetVerifier 合约 │
│ verify(S1, S2, π) 是否成立 │
└────────────────────────────────────┘
StarkNet 是一个独立的 Layer 2,它有自己的状态空间、交易和账户系统。
但它毕竟是以太坊生态的一部分——要和 ETH 上的合约、资产互动。
假设你想从 ETH 主网上的合约里桥接一些 USDC 到 StarkNet 上:
L1Bridge.deposit(100 USDC)
100 USDC
这时候,StarkNet 就需要从 ETH 那边“感知”到这件事真的发生了。这就是所谓的从 L1 → L2 传信息。
以太坊本身不能直接
“推送消息”给 StarkNet,但可以借助一个机制:
ETH L1 发出事件 / message log,StarkNet 主动来“读取并消费”。
合约 emit 一个事件 / 记录 message:
emit MessageToL2(to, value, selector, payload);
它将这条信息记录为“pending message”
StarkNet 合约中可以调用 consumeMessageFromL1(...)
来正式读取这个 message
以太坊发出的 L1 → L2 消息是通过 StarkNet 官方部署在以太坊上的桥合约 来“标记”接收者的,
StarkNet 的 sequencer 只监听属于自己桥合约的消息队列,不会遍历所有 L2,效率并不浪费。
以太坊不是万能的,它本身并不“知道”哪个 L2 是谁。
但 桥接合约
(Bridge / Inbox / Messaging 合约)是 StarkNet 官方部署的,它帮忙做了这件事。
比如:
// ETH 上部署的桥接合约(比如: StarkNet_L1_Messenger)
function sendMessageToL2(uint256 toStarkNetAddress, bytes calldata payload) external {
// 内部记录消息 hash
messages[computeMessageHash(...)] = true;
emit LogMessageSent(toStarkNetAddress, payload);
}
这时候:
toStarkNetAddress
是发给哪个 StarkNet 合约StarkNet 的 Sequencer 节点 会不断地:
StarkNet_L1_Messenger
)产生的新事件(logs)然后 StarkNet 上合约就可以调用 consumeMessageFromL1(...)
来使用这些消息。
💡 重要点:Sequencer 并不会全网遍历,而是只监听自己合约下的事件。
两处都有保存:
地点 | 内容 | 持久性 |
---|---|---|
🔹 ETH L1 的 Log(事件) | 发出消息的记录 | 永久存在于链上,可验证 |
🔹 StarkNet Sequencer 的 Inbox | 待处理的消息队列 | 临时记录,用完清除 |
🔹 StarkNet 合约的 message 状态映射 | 记录消息是否被消费 | 防止重复使用,状态级别追踪 |
其实 不会造成资源浪费,原因有几个:
Event Filter
非常高效)所以整体是:高效、低干扰、可验证、去中心化友好
我们要从 ETH 主网上发送一条消息到 StarkNet,让 StarkNet 上的某个合约知道“有一条消息来了”,并能消费它。
[1] 以太坊 L1 用户调用合约发送消息
↓ emit 事件
[2] StarkNet 的 Sequencer 监听事件
↓ 拉取并记录 message
[3] StarkNet 的合约消费 message(consumeMessageFromL1)
↓ 更新状态
L1 用户调用一个桥接合约 StarknetCore
的函数 sendMessageToL2(...)
。
假设想告诉 StarkNet 上的 0xabc123
合约说:“你有一笔 100 USDC 的转账来了!”
function sendMessageToL2(
uint256 toAddress, // StarkNet 合约地址
uint256 selector, // StarkNet 合约中的方法选择器
uint256[] calldata payload // 参数,比如金额、发起人地址等
) external payable {
bytes32 msgHash = keccak256(...);
l2Messages[msgHash] = true;
emit LogMessageToL2(toAddress, selector, payload);
}
📌 ETH 上完成后:
l2Messages[msgHash] = true
成为一个“待消费”的状态StarkNet 的 Sequencer 节点做这几件事:
StarknetCore
合约的事件(比如 LogMessageToL2(...)
)to_address
、selector
、payload
、message_hash
💬 这个时候,StarkNet 链上的某个合约知道:“我接到一条 L1 发来的消息了。”
在 StarkNet 上,有个智能合约:
@external
func consume_l1_message():
let (message_hash) = compute_l1_message_hash(...)
starknet::consume_message_from_l1(message_hash)
# 你可以根据 payload 做些事,比如增加余额
update_user_balance(...)
return ()
end
这一步做了两个事:
┌────────────┐ sendMessageToL2() ┌─────────────┐
│ L1 用户 ├────────────────────────────▶ ETH 合约 │
└────────────┘ emit L1→L2 event └─────────────┘
│
L1 event log存储消息
▼
┌────────────────────────┐
│ StarkNet Sequencer │
│ 拉取 L1 日志并转消息入队 │
└────────────────────────┘
│
StarkNet合约调用 consumeMessageFromL1()
▼
✅ 消费 + 执行业务逻辑
L1 → L2 跨链消息机制中最核心也最容易搞混的点之一:消息防重放机制
✅ 防止消息重放(Replay Protection)这件事,是在 StarkNet 链上做的,不在 ETH 上做!
ETH 上的事件日志(Log)是不可变的,不会被修改或清除,也没有“标记消息是否被消费”的操作。
StarknetCore.sendMessageToL2()
)被发送event
记录了消息内容,但它只是日志,不是状态Sequencer 拉到这些消息(增量拉取
)
被拉取的消息,被写入本地 Inbox 或 StarkNet 合约状态(如哈希集合)
当某条消息第一次被消费时:
starknet::consume_message_from_l1(...)
✅ 也就是说:防重放机制,是通过 StarkNet 上记录“message hash 是否已被消费”来实现的
阶段 | 内容 | 防重放措施 |
---|---|---|
在 ETH 上 | 只是发出消息,写进日志 | ❌ 无防重放机制(日志不能变) |
StarkNet 拉取 | 读取日志,生成待消费消息列表 | ✅ 初步处理 hash 入队 |
StarkNet 消费 | 合约调用 consume_message_from_l1(...) |
✅ 只有首次消费成功,之后报错 |
ETH 用户发送消息:调用 sendMessageToL2(...)
ETH 链生成一个 event:消息内容、目标地址、payload
StarkNet 的 Sequencer 把这个消息哈希(msg_hash)加入本地 inbox
某个 StarkNet 合约调用 consume_message_from_l1(msg_hash)
问题 | 答案 |
---|---|
消费消息后 ETH 上的日志会改变吗? | ❌ 不会,ETH 的日志是只写不可改的 |
是 ETH 合约里有个标记字段被修改吗? | ❌ 不是,消息状态只在 StarkNet 管控 |
是 StarkNet 改写 ETH 上的 true/false 标志吗? |
❌ StarkNet 不能改写 ETH 状态,ETH 状态是写入时就定了的 |
消息消费的状态是在哪里控制的? | ✅ 在 StarkNet 自己链上进行消费验证和状态更新 |
eth_getLogs
对目标合约地址 + 事件进行过滤这就防止了 Sequencer 伪造消息或构造恶意 Inbox。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!