学习区块链 - Day 2 零知识证明

Zero-Knowledge Proof,ZKP 零知识证明(Zero-Knowledge Proof,ZKP)是密码学中的一个概念,它允许一方(证明者 Prover)向另一方(验证者 Verifier)证明自己拥有某个信息,但在整个过程中,**证明者并不会暴露任何有关该信息的具体内容。**零知识证明要具备下列三种性质: 完备性(Completeness) 如果一个命题是真的,那么诚实的验证者就能被诚实的证明者说服,相信他们掌握了关于正确输入的知识。 健全性(Soundness) 如果命题是假的,那么任何不诚实的证明者都无法单方面说服诚实的验证者相信他们掌握了关于正确输入的知识。仅有极小机会能说服诚实验证者该事为真。 零知识(zero-knowledge) 若命题为真,那么验证者从证明者那里除了知道命题为真之外,就再也学不到其他东西了。 你可以通过下面的2个小故事来了解基本概念: How to explain zero-knowledge protocols to your children (wisc.edu) The Incredible Machine. How Alice Bob and Charlie used the… | by Aviv Zohar | QEDIT | Medium 零知识证明(包括知识证明)的另一种分类方法是交互性即有交互性和非交互性之分。 交互式零知识证明需要证明者和验证者之间进行轮次直接通信 非交互式零知识证明则可以在双方没有任何直接交互的情况下进行验证。 注:非零知识证明的非交互式变体有时也被称为签名方案。 下面为将用Go写一个交互式的零知识证明故事流水 package zkp import ( "fmt" "math/rand" ) var caveMap = ` xxxxxxxxxxxxxxx xxxxx xxx xxxx xx xxx 上 通 道 xx xx x xxxxxxxxxxxx xxxxxxxxxx xx xxxx xx x 洞 口 x xx──门 ──xx xxxxxxxxxxxxxxx xxxxxxxxxxx x xx x xx x──门───xxxxxxxxxxxx xxxx xx xx xxx xx xx xx xxxxxxx x xx xxxx x xxx x xxx 下 通 道 xxx xx xxxxxxxxx xxxxxxxxxxxxxx ` // 洞穴的两个出口 var exits = []string{"[上]通道", "[下]通道"} type Role struct { name string // 名字 exit int // 当前要求或者所在的出口 belief float32 // 相信指数 无限趋近100% } func NewRole(name string) *Role { return &Role{name: name, belief: 0} } func (r *Role) ReqExit() (int, string) { exit := rand....

2024-07-02 00:00:00 · 13 min · 2688 words · Me