星想法 · 5
零知识证明 - 深入理解Zinc

零知识证明 - 深入理解Zinc

疫情在家,多看点代码。对于疫情也感慨几句,对于资深程序员,这么多年了还没有和家人在一起吃晚饭这么多天。老实讲,比平时公司附近晚上吃的好得多。上海停运了,连各种骚扰电话也少了。有空再翻了翻Zinc的设计和代码,感受一下Matter Labs对zkVM的设计和理念。Zinc提供一种可靠,简单的电路开发语言。Zinc不支持图灵完备。Zinc从2019年就开始开发,最后一个Patch是2021年9月份。commit 30d43721d98c727327bb92b6888f5903556a4261Author: Alex Z Date:   Sat Sep 25 15:21:42 2021 +0300    Update README.md1. 代码框架https://github.com/matter-labs/zinc.gitZinc项目代码包含了比较多的子项目,主要分为如下几部分:zinc-book - 系统介绍Zinc的方方面面,从变量类型的定义,表达式,智能合约的实现,vm的基本原理等等。zargo - 利用zinc实现的各种包的管理器。zinc-types - Zinc相关的基础类型的定义。zinc-compiler/zinc-lexical/zinc-syntax - Zinc编译器相关,zinc语言编译成ZincVM支持的指令集。zinc-vm - ZincVM的实现,主要实现ZincVM对应的约束系统。接下来分别介绍相关的子项目。重点介绍ZincVM的实现。2. Zinc BookZinc Book给出了Zinc语言的全貌。Zinc语言的语法类似rust语言。具体的语法和表达式,相对简单。利用Zinc语言可以开发智能合约。Zinc语言通过编译器可以编译成ZincVM可以运行的指令。ZincVM的好处是运行的程序可以描述成R1CS的约束,由此可以给出程序执行的证明。Zinc语言编译器实现在zinc-compiler/zinc-lexical/zinc-syntax,对应词法/语法分析。在深入ZincVM之前,先了解一下ZincVM对应的指令集。3. ZincVM指令集ZincVM指令集定义在zinc-types/src/instructions/mod.rs:pub enum Instruction {    /// The no-operation instruction.    NoOperation(NoOperation),    /// An evaluation stack instruction.    Push(Push),    /// An evaluation stack instruction.    Slice(Slice),    /// An evaluation stack instruction.    Copy(Copy),    /// A data stack instruction.    Load(Load),    /// A data stack instruction.    LoadByIndex(LoadByIndex),    /// A data stack instruction.   ...

1505天前Star.Li#Star Li #星想法 #零知识证明
直播视频 - 深入理解Halo2算法

直播视频 - 深入理解Halo2算法

最近疫情在家办公,把年前的直播视频整理了一下。总共分为5个视频,对Halo2算法感兴趣的小伙伴可以看看。目录:01 - Halo2入门基础介绍02 - 深入理解Permutation & Lookup算法03 - Halo2协议基础及介绍04 - Halo2电路进阶(sha256)05 - Halo2源代码导读视频详见 链接所有视频对应的PPT,可以通过百度网盘下载:链接:https://pan.baidu.com/s/1wueRNkjeu8fKPrvK_doHQg  密码:qnwl星想法技术改变世界往期精彩回顾零知识证明应用和示例:零知识证明 - zkHack挑战赛第五名Dark Forest - 采用零知识证明技术的游戏零知识证明 - 电路及证明示例(libsnark)椭圆曲线:零知识证明 - 椭圆曲线基础zk-SNARK理论知识:零知识证明 - 深入理解powersoftau零知识证明 - 从理论到实践(视频)零知识证明 - zkSNARK入门零知识证明 - 从QSP到QAP零知识证明 - 基于多项式构造零知识证明零知识证明 - Groth16算法介绍零知识证明 - Groth16计算详解零知识证明 - 理解FFT的蝶形运算零知识证明 - zkSNARK的Nullifier Hash攻击零知识证明 - 一种新型的Merkle树(Shrubs)零知识证明 - 深入理解PlonK算法直播视频 - 深入理解PlonK算法零知识证明 - Plookup算法介绍零知识证明 - KZG多项式承诺零知识证明 - Halo2 Book中文翻译零知识证明的基本库源代码分析:零知识证明 - libsnark源代码分析零知识证明 - bellman源码分析零知识证明 - ethsnarks源代码导读零知识证明 - 深入理解ZoKrates零知识证明 - DIZK介绍零知识证明 - DIZK源代码导读零知识证明 - Halo2电路构建源代码导读年度总结:2018年,我都干了些啥?2019年,变化的一年!2020,机遇!...

1620天前Star.Li#Star Li
Trapdoor - 零知识证明技术直播(2020)

Trapdoor - 零知识证明技术直播(2020)

年底了,一年总结的时候,也是Trapdoor团队直播时间。2020年,Trapdoor团队受邀加入Filecoin安全研究小组,发现报告了Filecoin电路的严重漏洞。2020年的以太坊越来越堵,gas费用昂贵,越来越多的开发团队关注并应用零知识证明技术在Layer2寻求扩容方案。从零知识证明技术角度看,Filecoin在存储方面实现了从0到1的突破,应用零知识证明技术解决了去中心化的存储信任。zkSync项目是一种Layer2的扩容方案,将链下的状态改变通过零知识证明技术映射到链上。零知识证明技术对通用计算提供证明,是连接现实世界和数字世界的桥梁。细数数,星想法在2020写了超过35篇的技术原创文章,包括:Filecoin底层算法分析 - PoREP(SDR),PoST(Window/Winning)算法,Gas计算方法,存储证明的原理,存储管理,电路漏洞等等。零知识证明技术 - PLONK算法以及电路原理,FFT计算详解。Layer2 (Rollup)技术 - zkRollup原理,Optimistic Rollup原理,zkSync的源代码以及电路详细分析等等。Trapdoor团队,在 2021/01/30 (周六) 直播分享零知识证明技术及其应用:Filecoin底层算法及其优化 (10:00 ~10:45)深入理解PLONK算法及其电路 (11:00 ~ 12:00)Rollup技术对比(zkRollup vs. Optimistic Rollup) (14:00 ~ 14:45)深入理解zkSync源代码和电路 (15:00 ~ 15:45)QA (16:00 ~ 16:30)

2031天前Star.Li#Filecoin #Layer2 #Trapdoor #零知识证明技术
Filecoin技术分析:深入理解存储管理

Filecoin技术分析:深入理解存储管理

Filecoin的存储单元称为扇区(Sector)。对传统硬盘结构理解的小伙伴,对这个术语应该比较亲切,传统硬盘的最小存储单元就叫Sector。为了证明Sector的存储,Filecoin进行了一系列的处理,传说中的P1/P2/C1/C2。在处理过程中,一个Sector的计算会生成若干文件,最终会生成replica。相关文件是如何组织的?Cache都是由哪些文件组成,分别是多大?本文就从存储的角度看这些过程和逻辑。Filecoin的存储管理的逻辑主要实现在sector-storage项目中。在深入理解Sector存储逻辑之前,先讲讲Worker和Manager。01 相关术语Worker - 处理P1/P2/C1/C2的服务,Worker又分为两种:local worker和remote worker。local worker处理本地服务处理,remote worker支持远程服务处理Manager - 管理多个WorkerScheduler - 调度器,调度多个Worker,一个Manager通常有一个SchedulerStore - Sector存储系统02 Sector存储Sector处理相关的文件存储在Store中。Store通过sectorstore.json进行配置:CanSeal表明Store可以用来Seal(存储Seal相关的临时文件),CanStore表面Store可以持久存储Seal的结果(replica)。Weight 是权重,在多个Store选择时使用。ID是Store的UUID编号。一个Store中存在三种存储,分别对应三种目录:unsealed (未封存的文件),cache(缓存文件),sealed(封存后的文件)。03 Worker & Storesector-storage项目的README中的这张图很好的解释了sector storage的各个模块以及相互的关系:整幅图分为上下两个部分:上部分是Manager,下部分是Remote Worker。Manager中包括一个Local Worker。stores.Index是所有Sector存储的索引。Scheduler,上部分的中间,管理所有的Worker,并且调度Sector相关的存储。worker management APIs通过/rpc/v0的jsonRPC接口实现remote worker的管理。通过/remote的HTTP API实现存储的Fetch操作,简单的说,传输文件。specs-storage.Prover/Sealer/Storage是Manager暴露出来的接口,实现Sector的证明,封存和存储。每个连接到Manager的Worker会和Manager同步它的内存/CPU以及显存的信息。Scheduler在接受到新的请求时,会针对请求(Task)的类型以及资源的需求,从当前Worker中挑选最合适的Worker进行请求的处理。如何选择Worker,感兴趣的小伙伴,可以查看selector的相关逻辑。从存储的角度,重新整理一下,这些关系:以一个Manager连接两个Worker为例。Worker只能Seal,但是不能Store。为了更清楚展示Worker之间的数据传输,第一个Worker只做Precommit1,第二个Worker做Precommit2和Commit。04 Seal Task理解Seal Task,最好对照了Sector的状态管理一起看。对Sector状态管理还不熟悉的小伙伴,可...

2207天前dy zhang#Filecoin #IPFS
零知识证明 - 电路及证明示例(libsnark)

零知识证明 - 电路及证明示例(libsnark)

libsnark库代码层次非常清晰。libsnark也给出了SNARK相关算法的全貌,各种Relation,Language,Proof System。为了更好的生成R1CS电路,libsnark抽象出protoboard和gadget,方便开发者快速搭建电路。在阅读该示例代码前,请仔细阅读libsnark的源代码分析:零知识证明 - libsnark源代码分析唯一有点遗憾的,libsnark没有给个完整的电路构造实例,入门者想搭建自己的电路,刚开始有点摸不着头脑。为了方便入门者编写自己的电路,同事写了个基于libsnark构造电路,并生成并验证电路的实例:https://github.com/StarLI-Trapdoor/libsnark_sample入门者,可以基于这个示例开发自己的电路。选择默克尔树作为电路的示例,因为在零知识证明的应用中,大量的使用默克尔树数据结构。1 代码结构该示例构造了一条merkle路径的验证电路,生成并验证证明。merkle树的深度为3,并且merkle树的计算采用sha256散列函数。代码结构比较清晰,merkle目录中的main.cpp是主函数。circuit目录下的merklecircuit.h是电路的实现。整个项目用cmake进行编译。2 电路实现电路名为MerkleCircuit,主要依赖两个gadget:merkle_authentication_path_variable和merkle_tree_check_read_gadget。merkle_authentication_path_variable提供了merkle树的一条路径。merkle_tree_check_read_gadget检查给定一个叶子节点,是否能计算出正确的root。实现一个电路,主要实现两个接口函数:generate_r1cs_constraints - 生成R1CS,该电路比较简单,只要让依赖的两个gadget,生成R1CS即可。generate_r1cs_witness - 给所有的变量进行赋值。该电路,需要赋值的变量有root,leaf(叶子节点),和叶子节点配套的默克尔路径,以及默克尔路径对应的地址信息(也就是每一层的节点的位置,左边还是右边)。整个电路最复杂的就是电路的构造函数,申请变量,创建gadget。其中重点讲一讲,set_input_sizes函数。libsnark的框架中,使用简单的区分public和private变量的模型。通过set_input_sizes函数,设置前几个变量为public变量。pb.set_input_sizes(root_digest->digest_size);也就是说,该电路的公开变量为root的bit个数。3 生成和验证证明确定了电路的实现,看看main函数,如何生成和验证证明。在main函数中定义了merkle树计算需要的一些类型:typedef libff::default_ec_pp ppzksnark_ppT; typedef libff::Fr<ppzksnark_ppT> FieldT; typedef sha256_two_to_one_hash_gadget<FieldT> HashT;FieldT默认是bn256椭圆曲线的的Fr,默克尔树计算采用是sha256算法。3.1 setup实现了generate_read_keypair函数,生成pk/vk。仔细看一下gen...

2365天前Star.Li#libsnark #Start.Li #星想法 #电路及证明示例 #零知识证明
没有更多了