作者:Nic Lin,imToken 资深区块链工程师
本文受众:区块链开发者或零知识证明爱好者
Cairo 是 STARK 证明系统的其中一个编程语言,让开发者能透过 Cairo 来使用 STARK,撰写效能更高的 DApp。
Warning:本篇会保持在 high level 的介绍,实际深入的部分请见文内附上的文档或是官方开发者文件。
背景介绍
- 建构于密码学的零知识证明能提供计算的隐私性,但同时在区块链生态系也被用来提升 Scalability — 我可以用 10 秒的运算资源来验证原本耗费 1000 秒运算资源的计算过程
- 如同更多人熟悉的 SNARK,STARK 也是一个零知识证明的证明系统,但当前的 STARK 着重的是在 Scalability ,而非大家比较习以为常零知识证明提供的隐私性特质
- 其实目前基于 SNARK 的 Rollup 项目,例如 zkSync、Loopring、Aztec、zkopru,除了 Aztec 外,其他都是利用 SNARK 来增加 Scalability — 这些 Rollup 上资料都还是公开、没有隐私性的
- StarkWare 是目前唯一基于 STARK 的开发团队
- STARK 要加上隐私保护不会太难,只是 StarkWare 还没有把这项功能放在未来规划中
Cairo 简介
标榜为图灵完备的零知识证明系统语言,Cairo 对原本熟悉 Solidity 的开发者来说还是会感到比较难上手和陌生的。再加上套件库还不够充足,目前支援的杂凑函式是 Pedersen,数位签章演算法是 ECDSA(相对于 SNARK,EdDSA 的效能反而比较差所以没有支援)。
但 Cairo 还在早期开发的阶段,相信开发体验会越来越好的。
另外需要注意的是作为一个证明系统,会有 Prover 和 Verifier 的角色。而 STARK 的 Verifier 是开源的,但 Prover 软体预计会有 License 保护。 Prover 一般情况下不得用于商业用途,除非将 proof 上传至官方的 Verifier。
CAIRO 字母分别代表的意思是
- C: CPU
- AIR: Algebra Intermediate Representation
- O: One AIR(verifier smart contract) to rule them all
C 和 AIR 因为比较偏撰写零知识证明应用的细节和经验所以会跳过(详细可以看这),但 O: One AIR(verifier smart contract) to rule them all 代表的是:任何使用 Cairo 写的程式都能用同一个 Verifier 来验证,每个应用不再需要产生自己也只有自己能用的 Verifier 合约。
开发者不需要对自己的应用跑 trusted setup(STARK 本来就不需要),也不需要烦恼 Verifier 的部分,如果你有开发过基于 SNARK 的应用的话你会更有感觉。
最后要提及的是,第一版的 Cairo 是设计来方便开发者将 DApp 的运算迁移至链下。不同于 Rollup,这个链下只会有它自己一个 DApp。这个 DApp 的项目方自己维护自己 DApp 的 state。 ( Rollup 则是 operator 维护所有 DApp 的 state,DApp 开发者不需自己操烦)
这可能有点难懂。如果你有在写 Solidity,想像一下今天你在合约要用到合约里宣告的 storage 变数时,你要自己提供 merkle proof 上来,证明这个storage 变数真的是这个值。这个就是开发者要自己维护 state 的意思。
而第二版的 Cairo 则是 StarkNet 里使用的 Cairo(第一和第二版是不同编译器),这版的 Cairo 就是作为 DApp 在 Rollup 开发所使用 — 开发者可以在合约里宣告变数,变数的值不需开发者维护,可以直接假设存在。
注1:StarkWare 不喜欢 Rollup 这个词,他们觉得 Data Availability 的需求是一段光谱:不一定得要把 data 全都送上 L1,中间有其他方式可以做不同层级的 Data Availability。
注2:第一版和第二版实际上在官方版本里是 0.0.1 及 0.0.2,在撰文当前最新版即是 0.0.2。
官方网站:https://www.cairo-lang.org
开发者文件:Cairo Documentation — Cairo documentation
开发环境
Cairo 有提供像是 Remix 的浏览器 IDE:playground。里面提供各种范例练习和挑战,除了可以编译,还可以直接生成并上传 proof。
注:但有些功能还是没办法在 playground 里使用,例如要给你的程式 custom input 时。这时候只能在本地端开发才能使用这个功能。
开发 Cairo 要先安装python,我将开发者文件整理出来的资料统整在这个 hackmd 文档里:Cairo 基礎介紹 - HackMD
里面包含简介、设置本地开发环境以及 Cairo 基础(因为篇幅原因,所以不将内容复制到这里)
注:我把开发者文件里的代码整理到这里:cairo_practice/practices at master · NIC619/cairo_practice · GitHub
如果不想在研究开发者文件过程中,还要自己手动拼凑里面例子的话,可以直接用整理好的代码来执行。同时 repo 里还有包含一些额外自己测试 Cairo 功能的范例。
深入 Cairo
在那份 hackmd 文档里的开头,可以连结到第二部分 — 深入 Cairo 的部分。里面也是从开发者文件里撷取出来我觉得比较重要的部分。如果你要读开发者文件的话,我建议从 Hello Cairo 开始,它会从例子切入,会比较好知道 Cairo 怎么使用。接着如果要更深入了解,再去读 How Cairo Works。
StarkNet Cairo
第二版的 Cairo 其实功能和第一版的 Cairo 是差不多的,所以不必担心在开发者文件里学到的 Cairo 在 StarkNet 版本会不能用或差很多。在读完 Hello Cairo/How Cairo works 后,就可以接着看 Hello StarkNet。会很顺利的切换到 StarkNet 版本的 Cairo。
注1:我整理的文档里是按照第一版 Cairo 所写的
注2:如果你从开发者文件一路看下来,体验过非 StarkNet 版的 Cairo,那你在体验 StarkNet 版的 Cairo 时一定会发现这更像一般智能合约的使用方式 — 你可以用 view 函式查询 storage 变数,可以用 external 函式去执行合约(非 StarkNet 版本不是这样操作 DApp 的,这边因为篇幅原因没有详细介绍)。
非常建议尝试两种版本的 Cairo,你会知道 1. 操作一个单独在 L2 的 DApp 和2. 操作与其他 DApp 共存在 Rollup 上的 DApp 的不同。这对了解 L2 怎么运行、需要哪些资料、为什么需要这些资料非常有帮助。
0.0.2 版的 StarkNet Cairo 目前还缺少一些功能:
- 函式还没办法宣告阵列或 struct 型态的参数
- 合约和合约之间还没办法互动
- L1 没有办法读取到 L2 的资料,L2 也没办法读取到 L1 的资料。如果要建立跨 L2 Bridge,这个功能非常重要。
补充及个人心得
STARK 的 proof size 相比于 SNARK 系列的 proof size 大很多,又其证明所包含的交易数量对 proof size 和验证时间的影响不大,所以把很多笔交易一并做一个 proof 会是对 STARK 非常有利、节省成本的方式(SNARK、STARK 比较表)。但这同时也是一个缺点,如果你的 DApp 或 Rollup 的 TPS 不高,那就只能等更久时间搜集多一点的交易,要不然就只能提高成本来维持验证 proof 的频率。
StarkWare和 zkSync 一样都有 Rollup 宇宙的概念( Rollup 宇宙的用词并不精确,因为在他们的宇宙中不会所有子链都是 Rollup,而是会有依照 Data Availability 程度不同所区分的子链,像是 Validium、zk Porter 的设计),个人觉得能够有(针对 Data Availability 程度的)选择是会比只有一个选择(完全 Data Available) 还好的方式,但实际上的可行性就要等其团队释出更多的资讯。
在 Rollup 越趋成熟的情况下,能够提供快速跨 Rollup 服务的流动性提供者的角色会越来越重要。 zk Rollup(StarkNet、zkSync、etc…)比 Optimistic Rollup (Optimism、Arbitrum、etc…)有着短上许多的 finalize 时间,这对降低流动性提供者的风险有很大的帮助,但目前 zk Rollup 支援合约功能甚至 L1 <-> L2 互动的完成度都比 Optimistic Rollup 还低上许多。短期内快速跨 Rollup 的服务应该还是局限在 Optimitic Rollup 之间。
请给这份内容打个分~
- 5(非常有用)
- 4
- 3
- 2
- 1(完全没用)
0 投票者