虽然很早就听过零知识证明,但一直觉得是理论密码学那一套还比较停留在论文层面的东西。可能也是最早接触安全时候,科班很少,导致我一直狭隘地觉得没crash,没shell的攻击性安全研究都比较水。尽管这种偏见最初有其滤镜效果,去其糟粕的同时只会误杀一丢丢的精华。时过境迁(竟已快20载),有幸重新审视一些过时的想法。
至少在Web3领域,基本都是逻辑漏洞在闪耀。某种程度上,逻辑漏洞就更会贴近理论纸面上的讨论的内容。碍于我的眼界,Web3领域目前我认为最难理解的部分就是零知识证明的部分。一个通过数论,椭圆曲线等构建的零知识理论体系可以允许持有某个问题解的人在不公开解的情况下就能向公众证明自己确实知道这个解。生活化的例子是有这种需求,但之前觉得好像也不是很必要,或者说,即便有这种实现,木桶的短板也不在这里。
Web3显然是零知识(zk)的一块沃土,起自ZCash币的匿名交易,直到Tornado Cash的应用让zk开始真的特别不可或缺,而如今的zkrollup则又是把它推上高点,被不少人推为Web3下一代革命的核心技术。
我最初接触zk,其实就是想理解Tornado Cash的匿名转账是怎么实现的。但和传统技术领域不同,Web3的噪音非常大,鲜有人抽丝剥茧的喂你吃它每个技术细节。毕竟代码就在那里,理论上你总是可以把每个细节看懂的,但涉及到很多数学原理时候,情况就复杂了(一个用代码描述的微分方程的解题过程会让没有数学分析基础的人都读几遍就明白吗,显然不是)
尽管离开学校太久,从数论开始推到椭圆曲线的配对,再对应到代码实现,不是不行,但周期可能过长,长到可能物是人非,并且由于缺少正反馈,迷失在路中央。因此断断续续地,我尝试看一些教程,看vitalik的经典zksnark的三篇文章(能感觉出来他很努力想写清楚,可能是缺少那种学术素养丰富底蕴的,还是看的很累很迷糊),啃了几个月。迄今,依然只能说都是一些也许正确的点,而远不及一个树状结构的面,就像是整个区块链上构建出黑暗森林的缩影。
希望像是多年前开始漏洞研究一样(单纯啃,不如动手实操一下),看看代码,复现一下人家的案例,可能就渐渐开窍了。
目前的理解是(以zkrollup为例),当有合约被执行时,合约执行过程被描述为circuit,所有中间结果(witness)被转化为R1CS的矩阵。这些中间结果通过椭圆曲线上的生成点加密,再通过取特殊点的值,进一步被压缩多项式成为结果形成定长的proof。而L1的合约则是验证这个proof的合法性。目前很多prover或者operator都是中心化的,接收请求,处理合约,生成proof,提交到L1。
但如果circuit写的有纰漏,比如一个opcode指令的约束条件不严格,就意味着指令的一些参数或者中间结果是可以很容易篡改成其他符合现有约束的witness,进而篡改合约执行轨迹。其实这里是有疑问的,难道L2合约执行不是由另一个vm而不是zkevm执行的吗,那样的话,执行结果应该和这个伪造的合法zk proof没什么关系吧。
目前需要探索的包括:到底zkrollup的circuit的攻击假设是什么,prover/operator不都是中心化吗,攻击者有机会篡改witness吗(未来会去中心化?);构造样本crash掉operator/prover(利用执行batch和执行zkevm的初始条件不同)的攻击感觉更真实有效,攻击假设说得通,可以作为研究备选,也需要探索;