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,
};