Skip to content

方案实现细节思考

Agzs edited this page Dec 6, 2018 · 5 revisions

该方案主要涉及两大模块:go-ethereumlibsnark

go-ethereum模块

  1. 由于账户余额存储于MPT中,需要修改MPT的叶子结点,以支持明文余额和零知识余额;
  2. 需要额外增加五种交易:Mint,Send,Update,Deposit和Redeem,每笔交易都对应不同的零知识证明。此外,还要包含交易的产生,提交,广播,处理等操作;目前打算使用同一个交易的数据结构,使用标识符进行区分。
  3. 在每个区块需要增加由cmt_s(由Send操作产生)构成的默克尔树,用户产生merkle证明时,通过随机选取区块,将所选取的全部区块(按区块号)中的cmt_s组织成merkle树;并将区块序列放到交易中。
  4. 在整个区块链中需要维护一张表,存储已公布的序列号sn;另外,用户自身需要保存自己产生的序列号和随机数;
  5. 利用以太坊中自带的椭圆曲线加密,随机化公私钥,公钥加密,私钥签名。

libsnark模块

  1. 约束系统初始化参数,分别为五个主要的gadget产生各自的密钥(PK, VK),区块链账户均可使用该对密钥产生和验证proof
  2. SHA256_gadget修改,使其支持多个blocks。
  3. MerkleT证明

CGO模块

实现go语言对C语言的调用。go语言多线程调用时会存在bug。

1. 方案设计

VNT零知识设计方案

方案设计图

2. 方案实现

实现细节思考

2.1 libsnark模块实现

2.2 ethereum模块实现

2.3 cgo模块实现

3. 方案测试

部分问题

整体测试出的问题

3.1 libsnark模块测试

3.2 整体测试

4. 修改汇总

4.1 libsnark模块修改汇总

4.2 ethereum模块修改汇总

4.3 cgo模块修改汇总

5. 开发技巧

修改并编译web3.js文件

libsnark遇到的大“坑”

FZQA

CGO

MPT trie

transaction 部分修改

简易以太坊测试

Clone this wiki locally