zcash

ZCASH是基于bitcoin,加入了零知识证明加密交易信息,具体理论原理不在本文范围,读者可以参考zcash白皮书


1.  术语:

zk–SNARKs: zero-knowledge succinct non-interactive arguments of knowledge

R1CS: Rank 1 Constraint System

QAP: Quadratic Arithmetic Program

secp256k1:是数字签名算法ECC中的一种,称为ECDSA曲线,参考https://zhuanlan.zhihu.com/p/33195438

SHA3:属于RSA数字签名算法中的一种,在以太坊代码中可以找到Keccak256就是SHA3的一种实现,但不是SHA3最新标准的实现,参考https://zhuanlan.zhihu.com/p/33195438


2. 使用的库:

使用SCIPR实验室的零知识证明库libsnark

https://github.com/zcash/libsnark 

https://github.com/scipr-lab/libsnark

3.  加密地址:

参考z_getnewaddress

4.  两种地址:

T-address:公开地址

Z-address:加密地址

5.  两种key

Viewing key

Spending Key

6.  交易:

生成证明:

参考r1cs_ppzksnark_prover、to_libsnark_proof

具体实现在JSDescription的构造函数中,调用了JoinSplitCircuit:: prove 最后保存到类JSDescription的proof中

加密:Commitment = HASH(recipient address, amount, rho, r)

Nullifier = HASH(spending key, rho)

7.  校验证明:

使用ProofVerifier:: check 调用库函数r1cs_ppzksnark_verifier_strong_IC

8. 四个级别:

Privacy:input output都隐蔽,z-address发往z-address

Deshielding:input 隐蔽,z-address发往t-address,

Shielding:output隐蔽,t-address发往z-address,

Public:input output都不隐蔽,t-address发往t-address

9.  交易签名:

采用了ed25519算法,zcash交易的零知识证明、签名需要的公钥、密钥使用ed25519算法生成的,详细参考函数:crypto_sign_keypair

签名参考函数sign_send_raw_transaction

https://github.com/zcash/zcash/blob/master/src/wallet/asyncrpcoperation_sendmany.cpp#L660

10. 性能

creating a shielded Zcash transaction can take up to40 seconds

verifying that a transaction is valid only takesmilliseconds

11. 调试

./configure --enable-debug

./zcutil/build.sh CXXFLAGS="-g -ggdb -O0"

12.  通信

RegisterNodeSignals 使用slot/signal的方式

enum {

    MSG_TX = 1,

    MSG_BLOCK,

    // Nodes may always request a MSG_FILTERED_BLOCK in a getdata, however,

    // MSG_FILTERED_BLOCK should not appear in any invs except as a part of getdata.

    MSG_FILTERED_BLOCK,

};

你可能感兴趣的:(zcash)