

捶碎玉籠飛彩鳳
掣開金鎖走蛟龍

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....
基本算法 SHA-256 这是比特币挖矿中使用的核心哈希算法,即安全哈希算法(SHA,Secure Hash Algorithm)的一种。SHA-256能生成出一个256位的哈希值,适用于工作量证明(Proof of Work,PoW)的系统中。 RIPEMD-160 比特币使用RACE Integrity Primitives Evaluation Message Digest(RIPEMD)的一个160位版本,主要用于比特币地址的创建过程中。 Base58 这是一种用于表示比特币地址的编码方式。Base58编码可以排除视觉上容易混淆的字符,如数字'0’和字母’O’。 Elliptic Curve Digital Signature Algorithm(ECDSA) 比特币使用了椭圆曲线数字签名算法(ECDSA)来实现面向公开网络的私钥签名和公钥验证。 Merkle Trees 用于验证数据是否被篡改,可以高效地组织和验证大量的信息。比特币中的交易信息被组织成Merkle树,存在于每个区块的头部信息中。 基本数据结构 区块数据结构 区块头 Block Headers 字节数 名称 数据类型 描述 4 版本 int32_t 区块版本号指示遵循哪套区块验证规则。具体请参阅下面的区块版本列表。 32 之前区块头部哈希 char[32] 是前一个区块头部的SHA256哈希,其内部字节顺序。这确保没有任何前一个区块可以在不同时改变此区块的头部的情况下被改变。 32 当前区块哈希Merkle root hash char[32] SHA256哈希,其内部字节顺序。默克尔根由此区块中包含的所有交易的哈希衍生,确保没有任何交易可以在无修改头部的情况下被修改。请参阅下方的默克尔树章节。 4 时间戳 uint32_t 区块时间是矿工开始哈希头部时的Unix时间。必须严格大于之前11个区块的时间中位数。完全节点将不接受头部时间超过其时钟未来两小时的区块。 4 难度值nBits uint32_t 目标阈值的编码版本,此区块的头部哈希必须小于或等于。注:请参阅下方描述的nBits格式。 4 工作量证明nonce uint32_t value used in proof-of-work 区块版本 Block Versions Version 1 创世区块(2009 年 1 月)推出。 Version 2 在比特币核心 0....