Skip to content

Deposit实现

Agzs edited this page Dec 6, 2018 · 1 revision

文件说明

1、circuit 目录

1.1 commitment.tcc文件

基于libsnark自带的sha256的电路,重新构造sha256_two_block_gadget电路,支持两个blocks的哈希,

证明cmt_B_old == sha256(value_old, sn_old, r_old)

证明cmt_B == sha256(value, sn, r)

重新构造sha256_three_block_gadget电路,支持三个blocks的哈希,

证明cmt_S == sha256(value_s, pk_B, sn_s, r_s, sn_A)

1.2 gadget.tcc文件

整合上述子电路,构造支持deposit的电路,根据以下已知条件:

 * ************* for cmtB_old **************
 * publicData: cmtB_old, sn_old,  
 * privateData: value_old, r_old
 * ************** for cmtB_new **************
 * publicData: cmtB_new  
 * privateData: value_new, sn_new, r_new
 * ************** for cmtS **************
 * publicData: pk_B  
 * privateData: value_s, sn_s, r_s, sn_A
 * ************** for MerkleTree  **********
 * publicData: rt_cmt  
 * privateData: authPath, cmtS

证明以下等式成立:

cmtS == sha256(value_s, pk_B, sn_s, r_s, sn_A)
cmt_B_old == sha256(value_old, sn_old, r_old)
cmtB_new == sha256(value_new, sn_new, r_new)
value_new == value_old + value_s
cmtS在以rt_cmt为根的MerkleTree上
1.3 merkle.tcc文件

基于libsnark自带的sha256_two_to_one_hash_gadgetmerkle_tree_check_read_gadget,仿照zcash中的merkle_tree_gadget实现,注意witnessrootpath的初始化。

1.4 note.tcc文件

基于libsnark自带的packing_gadget的, 重新改写get_field_element_from_bits_by_order()函数,实现域上二进制到域上十进制的转化

1.5 utils.tcc文件

包含gadget辅助函数,实现类型转化等操作

2、deps 目录

该目录复制于zcash,主要是使用正常sha256函数所依赖的的库文件,需要特别说明的是libsodium,该库主要用来产生uint256类型的随机数;

libsodium库下载地址:https://download.libsodium.org/libsodium/releases/old/unsupported/libsodium-1.0.8.tar.gz

libsodium安装方法:https://download.libsodium.org/doc/installation

libsodium编译方法:在CMakeLists.txttarget_link_libraries()中添加sodium,并在相应的文件中导入#include "deps/sodium.h"

3、其他文件

3.1 main.cpp文件

简单封装,内含函数入口,支持测试

3.2 deposit_gadget.cpp文件

仿照zcash封装InitGenerateProveVerify操作

3.3 deposit_gadget.hpp文件

仿照zcash实现InitGenerateProveVerify操作

3.4 IncrementalMerkleTree.hpp文件

仿照zcash中的IncrementalMerkleTreeIncrementalWitness,实现merkleTree的组织处理,包括pathroottreewitness,该文件主要包括MerklePathEmptyMerkleRootsIncrementalWitness,和IncrementalMerkleTreeSHA256Compress的类模板及其方法。

3.5 IncrementalMerkleTree.tcc文件

仿照zcash中的IncrementalMerkleTreeIncrementalWitness,实现merkleTree的组织处理,包括pathroottreewitness,该文件主要包括MerklePathEmptyMerkleRootsIncrementalWitness,和IncrementalMerkleTreeSHA256Compress的类模板中方法的实现。

3.6 Note.h文件

含有Note结构体,用于包装valuesnr,计算cmtB的哈希值

含有NoteS结构体,用于包装value_spk_B, sn_s, r_ssn_A_old,计算cmtS的哈希值

3.7 uint256.h文件

bitcoin中导入的文件,支持uint256相关操作

3.8 util.h文件

包含辅助函数,实现vector类型的相关转换等操作

3.9 VNT.h文件

定义一些宏,比如INCREMENTAL_MERKLE_TREE_DEPTH

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