diff --git a/Capybara_ZICL1st.md b/Capybara_ZICL1st.md index 4ef2d7b..cbd7c9d 100644 --- a/Capybara_ZICL1st.md +++ b/Capybara_ZICL1st.md @@ -267,4 +267,44 @@ template ForceEqualIfEnabled() { - 学习内容小结: 今天,从头到尾看了一遍这篇文章,文章主要在讲多项式的的方式来说明,验证者和证明者两者之间的证明和验证过程,且此过程保证了零知识。同时文章提到了有限域,生成元。折合我之前看视频学习到的讲某一个值映射到椭圆曲线上(也是在有限域的基础上做到的)。同时对于某一个数进行加密时更多的是有限域配合生成元和模运算来达到加密且很难反算出结果的目的。而且这些方式在现代密码学中也运用的很广泛。但是这个成立是基于当前算力的前提之下。如果一旦量子计算普及那么意味着现代密码学的很多东西都将被颠覆。不知道理解的是否对? + +### 2024.08.09 + +- 学习主题:2-Non-interactivity&Distributed-Setup +- 学习内容小结: +1、保证 prover 的证明是按照规则正确构造的 ——> KEA ( a′ =a^α * (modn)) ) +2、保证知识的零知性 ——> “无成本的” δ 变换 +3、可复用证明 ——> 非交互式 +4、非交互中如何设置安全公开且可复用的参数 ——> 参数加密,verifier 借助 airing 进行验证 +5、保证参数的生成者不泄密 ——> MPC’s Setup + + +### 2024.08.10 + +- 学习主题:3-General-Purpose-Computation +- 学习内容小结: +1、将要证明的程序转换为数学语言表达的形式(即加减乘除的计算) +2、用多项式在某处的取值来进行计算以此表示数学计算,进而进行证明 +3、用多项式在多处的取值来进行计算表示多个数学运算,进而加以证明 +4、对证明的“程序”在不同计算中使用的相同的变量进行约束 + + +### 2024.08.11 + +- 学习主题:4-Construction-Properties +- 学习内容小结: +协议中是如何增加可变系数的和如何做加减乘除运算的 +协议如何保证操作数和输出的不可替代性 +协议如何保证跨操作数的可变一致性 +协议如何处理非延展性变量和变量一致性 +协议中变量值一致性检查优化 + + +### 2024.08.12 + +- 学习主题:5-Pinocchio-Protocol +- 学习内容小结: +Pinocchio 协议是针对 GGPR 论文的改进,在3.1节中也提到了实现零知识只需要沿用 GGPR 论文的方法即可,并不是这篇论文的贡献。另外,Pinocchio 协议论文侧重工程实践,在2013年时,零知识证明还并没有得到应用。真正的应用还是自从 ZCash 起始 + +所谓 Argument——论证,区别于 Proof —— 证明。 Pinocchio 协议是 Argument 而非 Proof。这是因为 Pinocchio 的可靠性是 Computational Soundness,Statistical ZK,这一类的证明系统被称为 Argument。所谓的 Computational Soundness 暗含了这样的事实:如果 Prover 计算能力足够强大的话,可以破坏可靠性。 diff --git a/Draculabo_ZICL1st.md b/Draculabo_ZICL1st.md index a522dd1..9b141d2 100644 --- a/Draculabo_ZICL1st.md +++ b/Draculabo_ZICL1st.md @@ -149,6 +149,30 @@ timezone: Asia/Shanghai ### 2024.08.11 +- 学习主题:Plonk 核心实现 [](https://github1s.com/dusk-network/plonk) +- 学习内容小结: +1. 研究 Plonk 代码实现 + +### 2024.08.12 + +- 学习主题:Plonk 核心实现 [](https://github1s.com/dusk-network/plonk) +- 学习内容小结: +1. 研究 Plonk 代码实现 + +### 2024.08.13 + +- 学习主题:Plonk 核心实现 [](https://github1s.com/dusk-network/plonk) +- 学习内容小结: +1. 研究 Plonk 代码实现 + +### 2024.08.14 + +- 学习主题:Plonk 核心实现 [](https://github1s.com/dusk-network/plonk) +- 学习内容小结: +1. 研究 Plonk 代码实现 + +### 2024.08.15 + - 学习主题:Plonk 核心实现 [](https://github1s.com/dusk-network/plonk) - 学习内容小结: 1. 研究 Plonk 代码实现 diff --git a/HazelGong_ZICL1st.md b/HazelGong_ZICL1st.md index 4817954..57c97dc 100644 --- a/HazelGong_ZICL1st.md +++ b/HazelGong_ZICL1st.md @@ -251,4 +251,9 @@ Naive 协议: blog 2 - 5: 用 blog 1 的 proof 构建通用 zk-SNARK 的协议。没有完全理解。待梳理。 +### 2024.08.14 + +看 [ZKP Lecture 2: Overview of Modern SNARK Constructions](https://www.youtube.com/watch?v=bGEXYpt3sj0)。 + + diff --git a/Lu_ZICL1st.md b/Lu_ZICL1st.md index 86ec656..16ac7eb 100644 --- a/Lu_ZICL1st.md +++ b/Lu_ZICL1st.md @@ -212,5 +212,22 @@ GPT解释:同态加密的解谜过程固定。难度是受解密密钥和算 2.2 稳定元 = 4 = 确定一个面后,正方体能旋转4次却不改变面的位置 2.3 轨道 = 1 -> 1个单一的、连续的轨道,轨道大小 = 6 = 可被移动的面 = 互换性 & 对称性 - 3. 同构 = 结构相同而名字不同,同态 = 名字相同罢了,同构是同态的一种特殊表现形式,即映射且一一对应。 - `点了。看似不同的数学对象之间其实有深层次联系。` + `点了。看似不同的数学对象之间其实有深层次联系。` + +### 2024.08.13 +今日了解「群论」- group theory & Euler's formula 欧拉公式 +- 了解它可以改变对numbers和algebra - 代数的看法 +- group theory & the nature of symmetry 对称性 +- example: a square 正方形,不管怎么作用都具有对称性,把8种对称性作用力放在一起就是group of symmetry。正方形的这个例子是一种finite group,自然就有infinite group,如圆 +- 学习的意义是知道对称性之间如何作用影响的:作用A + 作用B = 作用C +- 从「对称性」和「对称性的复合」- composing symmetries 可以引申例子:Square materices, Molecular, Cryptography, numbers. +- Numbers as group: addditive 加法 + multiplicative 乘法 -> numebrs as actions, not just counting things. +- why numbers are actions? +- 1)加法可以看成是groups of line symmetries,aka Additive group of real number 实数加法群,甚至在直角坐标系xy轴中这个结论也成立,也就是Additive group of complex numbers +- 3) 乘法可以看成是 group of stretching/squishing actions,aka multiplicative group of positive real numbers -> multiplicative group of complex numbers + `GPT解释number的各种分类:在等式x²+1 = 0中,无real numbers解,因为实数不可能是负数,可是可以有复数解,解是个虚数imaginary unit。还有,5+0i是pure real numbers,0+2i是pure imaginary numbers,3+4i是general complex numbers` +- 剩10分钟幂函数这块明天在看。 + +### 2024.08.13 +- 幂函数对于群论的作用?Adding inputs = multiply outputs diff --git a/Oscar_ZICL1st.md b/Oscar_ZICL1st.md index 98795d3..1c56ed2 100644 --- a/Oscar_ZICL1st.md +++ b/Oscar_ZICL1st.md @@ -200,11 +200,28 @@ timezone: Asia/Shanghai - ZK 在 VC 领域的融资额远超 Al 和 Depin, 不论是在任意一年。🤔 - 投资ZK以投资先进性为主导原则,会不断有新项目新技术来冲击现有格局。除非 Zksync、Starknet 故步自封,不再送代,否则这两个项目就是 ZK 软件赛道估值的天花板。🤔 - ZK 赛道是人才密度最高的 web3 赛道,投 ZK 就是投人。🤔 - - TODO 学习 https://mp.weixin.qq.com/s/7Noxmi7tKjDMB6RYWbKaGg ### 2024.08.13 +- 学习主题:zk-SNARK vs zk-STARK +- 学习内容小结: + - zk-SNARK,通过使用复杂的数学工具,如双线性配对和算术电路,来实现高效的零知识证明。特点是证明过程简洁化、非交互式,证明者和验证者之间只需要单次通讯不需要多次交互。此外,**zk-SNARK 的证明尺寸非常短小,验证效率高,适合在资源有限的环境中使用。** + - zk-STARK,旨在克服 zk-SNARK 的某些局限性。zk-STARK不依赖于可信设置,使用更透明的数学构造系统,如多项式承诺和有限域运算、哈希碰撞等,来生成和验证证明。**zk-STARK 比 zk-SNARK更具可扩展性,适用于更大规模的计算,证明生成速度更快,但是 Proof 本身的尺寸通常较大。** + - 总体来看,**一个 ZK 证明系统通常包括 PIOP(多项式交互式预言机)和 PCS(多项式承诺方案)两大部分。**常见的 PIOP 方案包括 PLONKish、GKR 等,而常见的 PCS 方案包括 FRI,KZG,IPA 等,比如 Zcash 版本的Halo2 使用了 Plonkish + IPA 的实现方式,至于 zk-STARK 其实可以当成是一种基于 FRI 的特殊的 zk-SNARK。如果更详细的说,不同类型的证明系统会使用不同的多项式承诺方案(PCS)、算术化方案、交互式预言机证明(IOP)或概率可检查证明(PCP)。 + + +### 2024.08.14 + +- 学习主题:跳过基础电路,ZK 理论集应用方向学习为主 +- 学习内容小结: + - [构建非交互式零知识证明](https://secbit.io/blog/2020/01/08/nizk-by-crs/#back-to-top) + - CRS 的使命就是让「模拟器」与「验证者」不平等。怎么做呢?隐藏一些「秘密」进去。 + - 如果我们真的生活在一个没有秘密的世界,那会是什么样子?「环形监狱 Panopticon」是 18 世纪英国哲学家 Jeremy Bentham 提出的一个惊悚概念。囚徒们被中心全天候监控,没有任何隐私可言,而且他们对自己是否处于被监控状态也无从得知。这个无比悲观的论调让人浑身不适,但很多人认为,这可能是两百多年前对未来网络数字时代的一则精准寓言。🤔 + - TODO 学习 https://mp.weixin.qq.com/s/7Noxmi7tKjDMB6RYWbKaGg + +### 2024.08.15 + - 学习主题: - 学习内容小结: diff --git a/README.md b/README.md index a2af370..210998e 100644 --- a/README.md +++ b/README.md @@ -106,51 +106,51 @@ ZK 的原理是什么?为什么能实现隐私保护?ZK 技术为什么被 | Ache | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | Rayerleier | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | Lambert | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | -| Draculabo | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | +| Draculabo | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | Suweet | ✅ | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | -| Leo | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ⭕️ | | | | | | | +| Leo | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | Iyi | ✅ | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | cin | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | Cora | ✅ | ✅ | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | -| Tim0 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ⭕️ | ✅ | ✅ | ✅ | ✅ | ✅ | ⭕️ | ✅ | | | | | | | | +| Tim0 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ⭕️ | ✅ | ✅ | ✅ | ✅ | ✅ | ⭕️ | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | YuanboXie | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | AricRedemption | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | Derick | ✅ | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | Stone | ✅ | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | Xiongyi | ✅ | ✅ | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | -| Oscar | ✅ | ✅ | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | ✅ | ✅ | ✅ | ✅ | ✅ | ⭕️ | ✅ | ✅ | | | | | | | +| Oscar | ✅ | ✅ | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | ✅ | ✅ | ✅ | ✅ | ✅ | ⭕️ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | Alex | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | ChloeZhu | ✅ | ✅ | ⭕️ | ✅ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | Ziicu2019 | ✅ | ⭕️ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | Hansen | ✅ | ✅ | ⭕️ | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | -| xiaodongQ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | ✅ | ✅ | | | | | | | | -| Ray | ✅ | ⭕️ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | +| xiaodongQ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | +| Ray | ✅ | ⭕️ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | monnaliya | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | tom_jerry | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | barry | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | -| Dust | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | | | | | | | | +| Dust | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | Transnature | ✅ | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | Antigone4224 | ✅ | ✅ | ⭕️ | ✅ | ✅ | ⭕️ | ❌ | | | | | | | | | | | | | | | | Alvan | ✅ | ⭕️ | ✅ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | -| Yiyanwannian | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | +| Yiyanwannian | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | GINAYY | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | Coooder | ✅ | ✅ | ✅ | ⭕️ | ✅ | ⭕️ | ✅ | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | -| liujianyu2022 | ✅ | ✅ | ✅ | ⭕️ | ✅ | ⭕️ | ✅ | ✅ | ✅ | ⭕️ | ✅ | ✅ | ✅ | ⭕️ | | | | | | | | -| Capybara | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | +| liujianyu2022 | ✅ | ✅ | ✅ | ⭕️ | ✅ | ⭕️ | ✅ | ✅ | ✅ | ⭕️ | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | ✅ | ✅ | | | | | +| Capybara | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | | | | | | billchen-818 | ✅ | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | hython | ✅ | ✅ | ✅ | ⭕️ | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | -| spn | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | -| HazelGong | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | ✅ | ✅ | ⭕️ | ⭕️ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | -| Punkcan | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | -| Zemmer | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ⭕️ | ✅ | ⭕️ | ✅ | ✅ | | | | | | | | -| Lu | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ⭕️ | ✅ | ✅ | ✅ | ✅ | ✅ | ⭕️ | | | | | | | | +| spn | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ⭕️ | | | | | +| HazelGong | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | ✅ | ✅ | ⭕️ | ⭕️ | ✅ | ✅ | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | ✅ | | | | | +| Punkcan | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | | | | | +| Zemmer | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ⭕️ | ✅ | ⭕️ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | +| Lu | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ⭕️ | ✅ | ✅ | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | ✅ | | | | | | | Zedz | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | jidalii | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | 0xhardman | ✅ | ⭕️ | ✅ | ✅ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | Kero | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | Warmzhang | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | treesirop | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | -| btou | ✅ | ✅ | ✅ | ✅ | ⭕️ | ✅ | ⭕️ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | +| btou | ✅ | ✅ | ✅ | ✅ | ⭕️ | ✅ | ⭕️ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | ocean | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | maxwell | ✅ | ⭕️ | ✅ | ✅ | ✅ | ⭕️ | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | @@ -322,6 +322,35 @@ ZK 的原理是什么?为什么能实现隐私保护?ZK 技术为什么被 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Ray_ZICL1st.md b/Ray_ZICL1st.md index ebb38f9..2ef4cc3 100644 --- a/Ray_ZICL1st.md +++ b/Ray_ZICL1st.md @@ -263,7 +263,7 @@ timezone: Pacific/Auckland # 新西兰标准时间 (UTC+12) - P != NP -### 2024.8.12 +### 2024.08.12 - 学习主题:zk-SNARK 学习 - 学习内容小结: - 核心: @@ -278,6 +278,25 @@ timezone: Pacific/Auckland # 新西兰标准时间 (UTC+12) - 一个多项式只要有解,就可以分解成线性多项式,比如 x^3−3x^2+2x=(x−0)(x−1)(x−2),它的解就是 0,1,2 - 如果 prover 想要在不揭示多项式的前提下证明他的多项式确实有这两个根,那么他就需要去证明他的多项式 p(x) 是 t(x)=(x−1)(x−2) 和一些任意多项式 h(x) (例子中 x−0 )的乘积 +### 2024.08.13 +- 学习主题:zk-SNARK 学习 +- 学习内容小结: + - 多项式可以被因式分解成它的根的因式的乘积,所以如果一个多项式有某些解,那么它被因式分解之后的式子中一定包含这些解的因式 -> 利用这个性质去构造证明 + - 证明过程: + - Bob 挑选一个随机值 r,计算 t = t(r),然后就 r 发送给 Alice + - Alice 计算 h(x) = p(x)/t(x),并对 p(r) 和 h(r) 进行休止,将计算结果 p, h 提供给 Bob + - Bob 验证 p = t*h,如果多项式相等,就意味着 t(x) 是 p(x) 的因式 + - 这种校验方式要求多项式系数也是整数,对协议产生了很大的限制(这里比较难理解,需要消化一下) + +### 2024.08.14 +- 学习主题:zk-SNARK 学习 +- 学习内容小结: + - 如果 Alice 不知道真正的 p(x),那么就可以会使用一个假的 p(x),其中并不包括必须的因式,所以就会产生一个余数,导致最后算出的结果不是整数,那么 Bob 就会发现 Alice 并不真正知道这个结果,然后就会拒绝这个证明,但是这样同样也要求多项式的系数必须是证书,这样就对协议产生了很大的限制,需要让这个余数不被整除(即使这个原始值可以被整除) + - 利用因式构造证明协议的缺陷: + - 一旦 Alice 知道了 t(r),就可以反过来构造一个可以整除 t(r) 的 p(r) + - Alice 知道了点(r, t(r)*h(r)),就可以构造经过这一点的任意(高次)多项式来满足校验条件 + - 协议并没有对 prover 的多项式阶数进行约束 + - 所以关键是 r 这个值能不能隐藏起来不可见,这里可以通过模运算来解决这个问题 diff --git a/Yiyanwannian_ZICL1st.md b/Yiyanwannian_ZICL1st.md index 3e4a81a..13229c0 100644 --- a/Yiyanwannian_ZICL1st.md +++ b/Yiyanwannian_ZICL1st.md @@ -336,5 +336,23 @@ timezone: Pacific/Auckland # 新西兰标准时间 (UTC+12) - 抗碰撞 - 不同的哈希函数对不同的电路友好性不一样 - 课程PPT: https://zkshanghai.xyz/lecture/4-circom2.pdf - + +### 2024.08.13 + +- 学习主题: + - 阅读文档: + - [snarkjs resources (zkiap.com)](https://zkiap.com/snarkjs) + - [What Is Semaphore? | Semaphore](https://docs.semaphore.pse.dev/) +- 学习内容小结: + - snarkjs 代码转电路的js库 + - Semaphore 一种zk协议,可以用来构建zk应用:私人投票、举报、匿名去中心化自治组织和混合器等 + +### 2024.08.14 + +- 学习主题: + - circom本地环境搭建 +- 学习内容小结: + - circom本地环境搭建 + + diff --git a/Zemmer_ZICL1st.md b/Zemmer_ZICL1st.md index b75eef1..80fac01 100644 --- a/Zemmer_ZICL1st.md +++ b/Zemmer_ZICL1st.md @@ -1277,6 +1277,540 @@ def generate_csprng(): return secrets.randbits(256) ``` +### 2024.08.12 +进度慢了,但只能这么快 +## IZP问题:哈密尔顿环路Hamiltonian Cycle + +非常类似于三色图 + +### 1、哈密尔顿环路的游戏规则 + +1、有一个包含多个点的地图,个别点之间进行了连线,这些连线是可选路线。 + +2、证明人需要证明自己可以在G上提供一个没有回头路的路线(即不重复的路线),经过所有点的环路。 + +### 2、解决方案 + +1、证明人拥有原始地图G,注意这个G是零知识内容,验证人不知道。 + +2、证明人需要证明自己拥有最终路线x。 + +3、证明人每次证明前生成一个G的同态地图G'。 + +4、验证人每次挑战可以有两个挑战方式,只能二选一 + +5、第一种挑战方式是要求证明人提供加密全图G',验证人验证G'是否是G的同态加密版本。注意这是在验证人不掌握G的前提下验证的,原理是利用了同态加密的证明人提供给验证人的G'生成的一些关键参数,知道这些参数和G'后,验证人可以验证G = G',但无法获取G的信息。也无法获取到证明人是否有当前G’图上的路线。 + +6、第二种挑战方式是要求证明人提供基于当前G'图的1条Hamiltonian Cycle,也就是说如果证明人可以提供这个同态图上的路线,则说明他也可以提供在原图G上的路线。但这个过程中验证人既不能得出原图G上的路线,也不能获取G'图或者G图的全部信息,也不能获取是否G = G‘。 + +7、重复以上挑战即可证明。 + +#### 关键点1:哈密尔顿环路的刷新机制 + +和其它IZK问题一样,当验证者挑战一次后,证明人会进行刷新,具体刷新的是下面提到的G'。 + +#### 关键点2:转化为概率问题 + +1、由于一个完整的验证需要同时满足第一种挑战和第二种挑战。 + +2、而这种刻意的分割让确定的证明变成概率问题,同时保证了每次证明的零知识。 + +#### 关键点3:承诺commit + +1、其实有一个关键步骤没细讲,就是在3和4步之间,证明人将G'的隐藏版本交给了验证人。 + +2、这叫做承诺 + +3、这样做的目的是为了让验证者知道,我生成了G'不会随意改变。 + +4、概念上理解为:掩盖住的路线图。验证人如果选择挑战1则证明人揭开公开的R的所有路线G',如果选择挑战2则揭开G‘上的答案路线x'。 + +5、实际上操作为:椭圆曲线私钥加密后的点:R=r.G + +## CRS + +1、Common Reference String,公共参考串 + +2、证明前公开给Prover和Verifier。 + +3、随机的字符串。 + +4、存在目的:让「模拟器」与「验证者」不平等。 + +5、存在于非交互零知识证明NIZK中。 + +### 2024.08.13 +这个课程绝对让我疯掉了。 +## 半IZK问题:ZK-Ham2 + +1、同之前,已知G、G'、C、C’,G'=Perm(G),C'=Perm(C) + +2、承诺:不同于将G‘作为R,在这里以C'作为R,交给Bob + +### 前置学习:G'和C'这两个矩阵中1和0单元的意思 + +| | 0 | 1 | +| ---- | -------------------- | -------------------- | +| G' | 该点无边 | 该点有边 | +| C' | 有边,但该边不是回路 | 有边,且该边属于回路 | + +#### 关系: + +1、C’的1 + C'的部分0 = G'的1 + +2、C'的1 + C'的0 = G'的1 + G'的0,也就是C'和G‘都存在补集,他们的全集一样的。 + +#### 关系进一步分析: + + 1、C'属于G':C′ 中的 1 只会出现在 G′ 的 1 位置。 + +2、也因此得出:C'中的0的位置可能是G'中的0,也可能是G'中的1。 + +### 挑战0的情况 + +1、不同于zk-ham的prover揭示全部G'来让verifier验证是否G'=Perm(G)。zk-ham2改为验证C' 是否合规。 + +2、所谓的合规并不是验证C' = Perm(C),也不是验证是否C'是G‘的路径,而是验证C'自身是否是一个有效的环路。 + +3、其实就是揭示了所有 C'的1的部分。 + +4、所谓的揭示,可以理解为解密?可以,但通常就是展示秘密。 + +5、这么做的结果是:Alice似乎在对Bob说:你看,我有一条路线,这是一个答案,但Bob只能知道这是一条回路,但不知道这是否真是答案,因为它甚至不知道题目(G')是什么。 + +### 挑战1的情况 + +#### 验证内容 + +1、Alice需要证明的是:对于G'中所有的0,C'中对应位置也都是0。 + +2、即:如果该点无边,那么该点肯定不是环路上的路线。 + +3、即证明:Alice声称的哈密尔顿回路C'中,没有使用任何在G'中不存在的边。 + +#### 验证过程 + +1、Alice发送置换函数Perm(.)给Bob。 + +2、揭示C'中的所有特定单元。这些单元对应于G'中值为0的位置。 + +3、Bob根据这些单元位置,在C'中进行验证,如果也都为0则正确,如果有1则证明无效。 + +4、这么做的结果是:Alice似乎在对Bob说:我能告诉你一部分不是环路的部分,但不能告诉你其它信息,你去验证下这部分是否不是环路,如果是环路,则我错了。 + +#### 我的疑问 + +1、Bob为什么需要置换函数Perm(.)?Bob不知道G、G'、C、C’,在这四个都不知道的前提下,知道Perm(.)有什么用。 + +2、虽然Bob知道了G'中对应为0的元素,但难道Perm(.)可以逆向运算吗,难道可以推导G的0部分 = Perm(G'的0的部分)? + +3、关键点:为什么挑战0和挑战1加起来就是一个完整验证了?这个验证严谨性逻辑我没懂,反正不如zk-ham好理解。 + +#### 疑问回答 + +1、虽然Bob不知道G、G'、C、C’,但挑战1的时候,Bob知道了G'的0的部分和C'中0的部分。 + +2、Perm(.)分享给Bob是因为确实Perm(.)可逆(双射函数),也就是说Bob可以推导G的0部分 = Perm(G'的0的部分)。虽然这么做没必要。但可以验证:C的0的部分 = Perm(C'的0的部分)。 + +3、是的,综合挑战0验证C'是一个有效的环路以及挑战1验证C'不包含G'中不存在的边。这两个信息,就可以构成完整验证。 + +4、也就是说:zk-Ham2的Bob永远不会获得完整的G'或C',这显得更加零知识了(连同态的知识都没有)。 + +5、这两个条件就像是要证明一个人是好人,只需要证明: 挑战0:这是一个人。 挑战1:这个人没做过坏事。 + +| 掌握的信息 | zk-Ham的Alice | zk-Ham的Bob | zk-Ham2的Alice | zk-Ham2的Bob | +| ----------------------- | ------------- | ---------------------- | -------------- | ---------------------- | +| G | 是 | 否 | 是 | 否 | +| G'的0的部分,即!G | 是 | 0挑战获取 | 是 | 1挑战获取 | +| G'的1的部分 | 是 | 0挑战获取 | 是 | 否 | +| C | 是 | 否 | 是 | 否 | +| C'的0的部分,即!C | 是 | 1挑战获取 | 是 | 0挑战获取,1挑战获取 | +| C'的1的部分 | 是 | 1挑战获取 | 是 | 0挑战获取 | +| 承诺 | G' | 加密的G',包含0和1部分 | C' | 加密的C',包含0和1部分 | +| 随机同态加密函数Perm(.) | 是 | 否 | 是 | 1挑战获取 | + +### 称为半IZK的原因 + +1、可以省略掉挑战0的情况,只保留一个挑战1即可。 + +2、也不需要承诺C'了。 + +3、直接使用可信第三方提供一个字符串代替所有。 + +4、这个可信第三方提供的内容:正确的环路C'。所以不需要挑战0了。也不需要对其进行承诺了。 + +5、这个可信的共享字符串不能让Bob知道。 + +6、而且这个可信第三方需要同时得到Alice和Bob的信任。 + +### 2024.08.14 + +总结了代码、算数、电路 +# 常用电路 + +## 判断相等 + +### 等于0 isZero + +分别用python和circom写出电路,判断输入的数字为0 + +#### 1、理论基础 + +第一种方式是直接判断 + +第二种方式是费马小定理 + +##### 费马小定理: + +1、费马小定理提出,对于任意整数 a 和质数 p,如果 a 不被 p 整除,那么:a^(p-1)^ ≡ 1 (mod p) + +2、由于p是质数,因此能整除p的只能是0或者p本身或p的倍数 + +3、而有限域定义在整数域{0, p-1}上,因此该整数域上只有0能被p整除。 + +4、利用这个定理,我们可以构造一个方法来证明一个数是否等于0: + +- 如果 a ≠ 0 (mod p),那么 a^(p-1)^ - 1 ≡ 0 (mod p) +- 如果 a ≡ 0 (mod p),那么 a^(p-1)^ - 1 ≢ 0 (mod p) + +#### 2、python解答判断0 + +##### 1、直接判断 + +```python +def is_zero(a): + return (f"{a} is {'zero' if a == 0 else 'non-zero'}") + +p = 17 # A prime number +for i in range(p): + print(is_zero(i)) +``` + +##### 2、费马小定律 + +```python +def is_zero_fermat(a, p): + """ + Check if a number is zero using Fermat's Little Theorem. + + :param a: The number to check + :param p: A prime number (modulus) + :return: True if a is zero, False otherwise + """ + return pow(pow(a, p-1, p) - 1, p-1, p) == 0 + +# Example usage +p = 17 # A prime number +for a in range(p): + print(f"{a} is {'non-zero' if is_zero_fermat(a, p) else 'zero'}") +``` + +#### 3、circom电路判断0 + +用一个预先计算的提示值作为中间信号inv,来实现简单的0判断电路 + +```js +pragma circom 2.0.0; + +template IsZero() { + signal input in; + signal output out; + signal inv; + inv <-- in!=0 ? 1/in : 0; + out <== -in*inv +1; + in*out === 0; +} + +component main {public [in]}= IsZero(); +``` + +### 两数相等 isEqual + +判断两个整数是否相等,如果相等返回1,否则为0 + +? + +## 二进制Num2Bits + +功能:将十进制数字转化为二进制 + +```js +pragma circom 2.0.0; + +template Num2Bits(n) { + signal input in; + signal output out[n]; + var lc1=0; + var e2=1; + for (var i = 0; i> i) & 1; + out[i] * (out[i] -1 ) === 0; + lc1 += out[i] * e2; + e2 = e2+e2; + } + lc1 === in; +} + +component main {public [in]}= Num2Bits(3); +``` + +### + +## 比较大小 + +### GreaterThan + +判断:整数s1是否大于s2? + +#### 逻辑 + +```js +let y = s1 > s2 ? 1 : 0 +``` + +```python +y = 1 if s1 > s2 else 0 +``` + +#### 电路 + +##### 要求 + +1、输入:s1和s2两个整数 + +2、输出:判断结果如果大于则为1,如果小于则为0 + +##### 原理 + +1、无法在电路中直接比较十进制的整数大小 + +2、而需要转化为二进制。 + +3、因为二进制的加减法等算数运算都通过比较简单的门可以实现。 + +4、这里利用了二进制数的一个重要特性:较高位的 1 比任何较低位的组合都"更大" + +##### 步骤 + +1、先将十进制整数都转化为二进制。 + +2、比较依次从右向左,比较二进制的同一最高位。 + +3、如果该位一样都为1或者0,则比较下一位。 + +4、列出公式:y = s1 + 2^n^ - s2 + +``` +代码略 +``` + +### LessThan + +功能:输入两个整数的数组,判断数组中第一个数是否小于第二个数 + +```js +include "Num2bits.circom" + +// 参数n的解释:n为二进制的位数。手动限制二进制的位数的目的是减少计算量。 +template LessThan(n){ + assert(n <= 252); + signal input in[2]; + signal output out; + component n2b = Num2Bits(n+1); + + n2b.in <== in[0] + (1 << n) - in[1]; + + out <== 1-n2b.out[n]; +} +``` + +其它函数包括:LessEqThan、GreaterEqThan + +## 选择器Selecter + +### 选择器的概念 + +二选一,if else,或三元判断 s ? a : b + +### 选择器的实现 + +1、制造一个开关s, + +2、s输入为二进制0或者1,表示两种选择的一种。 + +3、该s符合s *(s -1) = 0,其中s和s-1分别为开关两种状态。 + +4、每一种情况与其中一种状态相乘,即 y = s * a + (s-1) * b + +5、这样当s输入不同的数时候,得到y = a 或者y = b。 + +### 问1: + +## 交换 + +将两个输入a和b进行交换,输出为b和a + +## 逻辑运算 + +1、逻辑自身是二进制,表示布尔值。 + +2、下面a和b理解为是条件的判断结果,比如a = 6 > 7,此时a = false。 + +3、值为1表示为真,值为0表示为假。 + +4、逻辑运算基于选择器 + +### 反门 + +两个值选任意一个都成立 + +##### 代码 + +```js +let y = !a +``` + +##### 算数 + +当a = 0时候y = 1,反之当a = 1时候y = 0 + +``` +y = 1 - a +``` + +##### 电路 + +```js +pragma circom 2.1.6; + +template Reverse() { + signal input a; + signal output y; + + 0 === a * (a - 1); + y <== 1 - a; +} + +component main = Reverse(); + +/* INPUT = { + "a": 1 +} */ +``` + +### 与门 + +a和b同时为1时候,y才能为1。 + +##### 代码 + +```js +let y = a & b +``` + +##### 算数 + +y = a * b + +##### 电路 + +```js +pragma circom 2.1.6; + +template AND() { + signal input a; + signal input b; + signal output y; + + 0 === a * (a - 1); + 0 === b * (b - 1); + y <== a * b; +} + +component main = AND(); + +/* INPUT = { + "a": 1, + "b": 1 +} */ +``` + +### 或门 + +两个值选任意一个都成立 + +##### 代码 + +```js +let y = a | b +``` + +##### 算数 + +y=1 − (1−a)*(1−b) + +##### 电路 + +```js +pragma circom 2.1.6; + +template OR() { + signal input a; + signal input b; + signal output y; + + 0 === a * (a - 1); + 0 === b * (b - 1); + y <== 1 - (1 - a) * (1 - b); +} + +component main = OR(); + +/* INPUT = { + "a": 1, + "b": 0 +} */ + +``` + +### 异或 + +##### 代码 + +```js +let y = a ^ b +``` + +##### 算数 + +y = a + b - 2 * (a * b) + +##### 电路 + +```js +pragma circom 2.1.6; + +template XOR() { + signal input a; + signal input b; + signal output y; + + 0 === a * (a - 1); + 0 === b * (b - 1); + y <== a + b - 2 * (a * b) ; +} + +component main = XOR(); + +/* INPUT = { + "a": 1, + "b": 0 +} */ + +``` + +##### + diff --git a/btou_ZICL1st.md b/btou_ZICL1st.md index 9a7e85d..4310847 100644 --- a/btou_ZICL1st.md +++ b/btou_ZICL1st.md @@ -274,5 +274,25 @@ Circom 是一个专门用来设计和编写零知识证明电路的编程语言 eg. 电路(Circuit):在 Circom 中,电路就像是一个由许多小任务组成的大任务。每个小任务是一个计算,比如加法、乘法等。这些小任务通过“电线”连接在一起,就像在真实世界的电路中那样。 Circom 代码:就像是建造这些电路的蓝图。用 Circom 编写代码,定义每个小任务(即电路的每一部分)应该做什么,以及这些任务如何相互连接。 - +### 2024.08.13 +今日申请请假一次,本周请假第一次。 +### 2024.08.14 +NP Complete场景eg.: +1. 拼图问题: +你有1000块拼图,但你不知道它们该怎么拼在一起。找到合适的方法拼好这幅图画是很难的,但如果有人告诉你该怎么拼,你马上就能看出来拼得对不对。 +2. NP问题: +“NP”就像这个拼图问题。意思是,虽然找到解决方法可能很难(就像拼好拼图),但一旦有人给了你一个方法,你可以很快检查它(就像拼好图画后你能看出是否正确)。 +3. NP Complete: +“NP Complete”问题就好比是最难的拼图问题。如果你能很快地解决这个拼图问题,你也可以很快解决所有其他拼图问题。 + +实用电路 +是指在零知识证明(ZK)和加密技术中,专门设计来执行特定计算任务的电路。通过这些电路,你可以证明某些事情是真的,而不需要透露所有细节。 +用简单的例子来说明: +想象一下,你需要做一些数学计算,比如加法、乘法,或者验证一个密码是否正确。你可以把这些计算任务看作是“电路”中的各个部分,这些部分组合在一起就形成了一个完整的实用电路。 +主要特点: +特定任务:每个实用电路都设计来执行特定的计算任务,比如验证一笔交易是否符合规则。 +安全性和隐私:这些电路可以用来创建零知识证明,这样你就可以证明某个计算是正确的,而不泄露实际的数据。 +效率:实用电路是为了在计算资源有限的情况下高效工作而设计的。它们需要在短时间内完成计算,并且占用尽量少的内存和处理能力。 +举个例子: +如果你要证明你有足够的钱购买一件商品,你可以设计一个实用电路来计算你账户里的余额是否大于商品的价格。这个电路会通过加密的方法来验证这个计算是正确的,但它不会透露你的账户余额具体是多少。 diff --git a/liujianyu2022_ZICL1st.md b/liujianyu2022_ZICL1st.md index 6b34c5a..484253d 100644 --- a/liujianyu2022_ZICL1st.md +++ b/liujianyu2022_ZICL1st.md @@ -301,5 +301,12 @@ y2 = k(x0 - x2) - y0 今天的学习内容: 复习有限域、椭圆曲线相关的内容 +### 2024.08.13 +今天学习内容: +复习承诺方案,包括kzg承诺方案的证明 + +### 2024.08.14 +今天学习内容: +复习circom代码 diff --git a/spn_ZICL1st.md b/spn_ZICL1st.md index 0d87a44..9c93853 100644 --- a/spn_ZICL1st.md +++ b/spn_ZICL1st.md @@ -113,7 +113,7 @@ XDU大四学生,ZK在学。 ### 2024.07.31 - 学习主题:将plonk的前置知识复习了一下 -- 学习内容小结:照着学长的[文章](https://snowolf0620.xyz/index.php/zkp/769.html)巩固了一下前置知识,继续写笔记 +- 学习内容小结:照着学长的[文章](https://snowolf0620.xyz/index.php/zkp/769.html)巩固了一下前置知识 ### 2024.08.01 @@ -127,7 +127,7 @@ XDU大四学生,ZK在学。 ### 2024.08.02 - 学习主题:plonk等式验证 -- 学习内容小结:将plonk遗留的几个等式照着推导验证了一下(安全规约太重要了) +- 学习内容小结:将plonk遗留的几个等式照着推导验证了一下(安全归约太重要了) ### 2024.08.03 @@ -173,4 +173,19 @@ XDU大四学生,ZK在学。 - 学习主题:snark学习 - 学习内容小结:将这部分[文章](https://learn.z2o-k7e.world/zk-snarks/toc.html)全过了一遍,将知识理了一下(感觉现在自己处于一种似懂非懂的状态?->不能提出有创造性或者精辟的问题😭😭) + +### 2024.08.12 + +- 学习主题:安全归约、安全计算、模拟器 +- 学习内容小结:看了看k2ok7e下邓燚老师的[文章](https://zhuanlan.zhihu.com/p/268305208),感觉理论层面的安全归约很难弄清楚,得多多理解。(最近还要备考雅思感觉时间有点紧,尽量跟上) + +### 2024.08.13 + +- 学习主题:整理与复习,先看看circom +- 学习内容小结:把之前的过了一遍,circom写了一些data storage之类的(但是编译好麻烦x) + +## 2024.08.14 + +- 学习主题:复建 +- 学习内容小结:熟悉cairo和circom - diff --git a/xiaodongQ_ZICL1st.md b/xiaodongQ_ZICL1st.md index ce5b1a3..3b33eb0 100644 --- a/xiaodongQ_ZICL1st.md +++ b/xiaodongQ_ZICL1st.md @@ -161,4 +161,22 @@ timezone: Asia/Shanghai - 算术电路:IsEqual、Selector、IsNegative - template 和 component 文档学习 +### 2024.08.12 + +- 学习主题:继续学习 [基础电路练习](https://github.com/wenjin1997/zkshanghai-workshop/blob/main/lecture2-homework.md) +- 学习内容小结: + - 算术电路:LessThan + +### 2024.08.13 + +- 学习主题:回头听一下 [零知识证明:一场”无知“的游戏](https://www.xiaoyuzhoufm.com/episode/6672a76bb6a8412729e0b103) +- 学习内容小结: + - 比之前能稍微听得进去一点了 + +### 2024.08.14 + +- 学习主题:回头看一下视频 [ZKP Lecture 2: Overview of Modern SNARK Constructions](https://www.youtube.com/watch?v=bGEXYpt3sj0) +- 学习内容小结: + - 只看了部分 +