| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 区块链 -> 浅谈零知识证明 -> 正文阅读 |
|
[区块链]浅谈零知识证明 |
零知识证明是实现隐私保护的密码学方案。曾被称为密码学领域的一颗皇冠,用于在不泄露具体秘密情况下对问题一种正确证明方法。尤其是在金融领域实现数据隐私保护方面的创新业务场景里实现落地应用。 我们整理了相关领域的知识后,站在伟人的肩上,今天就从零知识证明的基本概念、研究进展、实现原理方面做一些简单阐述。 一、零知识证明概述 零知识证明的概念最早在20世纪80年代由美国麻省理工学院的Shafi Goldwasser、Silvio Micali和Charles Rackoff在论文《The Knowledge Complexity of Interactive Proof Systems(交互式证明系统中的知识复杂性)》这篇论文仅能证明某一类特定的问题,且需要证明者和验证者进行多轮交互才能完成,其功能和实际应用效果难以满足现实应用场景的要求。为了能够实现针对任意问题的通用证明协议,同时避免多次交互给实际应用带来的局限性,非交互式通用证明协议的研究成为了零知识证明自概念诞生以来的重要发展方向。 目前,数据安全与隐私保护成为了区块链等应用中的重要需求,零知识证明这一经典的密码学算法有了新的应用前景。在区块链应用场景中,实现多参与方的频繁交互是不现实的,且复杂多样的业务模式催生了通用证明协议的应用需求。因此,非交互式通用零知识证明协议得到了广泛的应用。 二、零知识证明技术原理 1、基本属性
2、交互式零知识证明
对于Schnorr这一具体协议而言,可通过基于随机预言机模型的Fiat-Shamir变换将其转化为非交互式零知识证明,即Schnorr签名。Fiat-Shamir变换将交互式协议中验证者的每次随机数挑战行为用证明者执行随机预言机代替,随机预言机的输入应包含之前的所有上下文信息。随机预言机可以看作是一个理想化的哈希函数,能够将输入转化为具有真随机性(满足一致性分布)的结果。在实际应用中,由于不存在理想化的随机预言机,可以使用SHA-256等常用的密码学哈希算法进行实现。 即在基于Fiat-Shamir变换的非交互式Schnorr协议证明过程中,随机挑战数c不再由B生成并发送给A,而是由A自己通过c=H(x||M)计算挑战数c,其中H(?)是哈希函数(随机预言机),M是任意消息串。最后A将(c, y)作为证明值进行发布,同时发布消息M。任何获知证明值(c, y)、消息M和公钥pk的验证者均可在与交互式协议相同的验证方式基础上进一步验证c=H(x||M)是否成立。 证明者A在没有交互的情况下得到了随机挑战数c,因此省去了交互式协议中验证者B随机选择c并发送给证明者A的交互过程。这一非交互式的Schnorr协议也被称为Schnorr签名机制,即证明者A使用自己的私钥sk=a对消息M进行了签名,其他人可通过A的公钥pk验证这一签名。 三、零知识证明典型算法分析 1、zk-SNARK 1.1、基本框架 在进行程序表达时,还需要引入一些中间变量。如下
其中,SYM_1和SYM_2是中间变量,OUT 为输出值,即18。 对于乘法门电路A1×A2=SYM_1,对应的三个向量(l, r, o)分别为:
将s、l、r、o代入s?l×s?r-s?o=0即得A1×A2-SYM_1=0,与门电路A1×A2=SYM_1等价。同理可得加法门电路A1+A3=SYM_2对应的向量为:
即1×(A1+A3)-SYM_1=0。最后一个乘法门SYM_1×SYM_2=OUT对应的向量为:
即SYM_1×SYM_2-OUT =0。通过以上过程,就将待证明计算式对应的电路编码成了R1CS向量的形式。 1.1.3、QAP 具体而言,首先在有限域上选择三个不同的值,假设为1、2、3(在实际应用中需要随机选择),然后通过拉格朗日插值公式,构造三组多项式l(x)、r(x)、o(x),使得在x的取值分别为之前选择的1、2、3时,多项式向量组(l(x), r(x), o(x))的三种取值分别对应第二步中三个门电路的向量组(l, r, o)的三种不同取值。取多项式P(x)=s?l(x)×s?r(x)-s?o(x),当x取值为1、2、3时,P(x)=0,即1、2、3为多项式P(x)的三个根,因此多项式P(x)能够被T(x)=(x-1)(x-2)(x-3)整除,即存在多项式H(x)使得P(x)=T(x)×H(x)。 上述QAP过程将证明原计算式转化成了证明存在多项式H(x)使得P(x)=T(x)×H(x)。通过拉格朗日插值公式引入了大量与原计算式无关的值将向量取值转化为多项式约束,因此多项式与原计算式在本质上并不完全等价,但根据多项式的Schwatz-Zippel定理,验证了转化后的多项式即相当于验证了原计算式。 1.1.4、引入约束
2、功能实现 除上述的(A1×A2)×(A1+A3)=18这类简单的计算式证明外,还可通过不同的电路构造方法,将更为复杂的证明需求转化为门电路的组合形式。libsnark算法库中的gadget工具库包含布尔值、位组合、析取关系(或)、合取关系(与)、大小关系、向量内积、线性组合等基本约束的实现,通过包括但不限于以上基本功能的组合,可实现更为复杂计算式的证明。除基本功能外,zk-SNARK还可实现Merkle树、SHA256哈希、模指数运算、双线性配对等复杂计算的验证。在实际场景中,只要存在对隐私数据计算的可验证性需求,理论上都可考虑尝试采用零知识证明技术解决的可行性,但在应用的必要性方面还需考虑实际可操作性和引入的效率问题。 3、开发工具 libsnark实现了zk-SNARK算法的黑盒化,提供高度抽象的编程接口,使开发者无需掌握算法细节即可直接进行工程开发。此外,libsnark还提供了实际应用中的常见基础功能库,可辅助开发者进行复杂证明的组合实现。以在匿名数字货币Zcash中的应用为开端,libsnark奠定了零知识证明技术从理论研究到大规模工程应用的基础。
zk-SNARK算法主要可分为算术化(Arithmetization)和低度测试(Low Degree Testing, LDT)两部分。算术化过程将待证明问题转化为多项式的形式,具体内容包括生成与R1CS类似的执行轨迹(Execute Trace)并构造多项式约束,然后对执行轨迹进行多项式插值,并与多项式约束进行组合变换,得到确定性的验证多项式;而LDT过程则通过二分法验证证明组合多项式和轨迹多项式小于某个固定的度,确保证明者给出的满足多项式的值是基于有效的多项式计算的,用于防止证明者伪造证明,具体基于FRI(Fast Reed-Solomen Interactive Oracle Proofs of Proximity)协议实现。 zk-STARK与zk-SNARK相比主要有以下异同点: 相同点
不同点
总的来说,与zk-SNARK相比,zk-STARK不需要通过可信第三方生成CRS,且验证耗时仅与输入大小呈对数关系,但其生成的证明更大。面对区块链等应用场景宝贵的存储资源,zk-SNARK在证明的简洁性方面更胜一筹。 四、总结 得益于近年来隐私计算等新兴技术应用的发展,零知识证明这一具有30多年历史的经典密码学技术在最近5到10年又产生了极为丰富的理论与应用成果。在实际金融领域的应用中,对于不同参与方的数据交互验证可采用零知识证明技术实现,避免敏感信息的相互泄露;在安全多方计算应用中,参与双方可在通过同态加密等方法保护的隐私计算完成后要求互相提供计算过程的零知识证明结果进行验证,防止虚假计算,同时又不会泄露计算过程中的敏感信息。 总的来说,零知识证明这一“新瓶装旧酒”的密码技术,在目前安全多方计算、金融领域、共性连金融领域等场景中都有着一定的应用潜力。 名词解释 1.Schnorr 2021年11月6日整理于深圳。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/28 18:42:09- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |