ZCash 是 bitcoin 的分支,保留了 bitcoin 原有的模式,基于比特币 0.11.2 版代码修改的。 ZCash 钱包资金分 2 种:透明资金、私有资金,透明资金类似比特币资金;私有资金加强了 隐私性,涉及到私有资金的交易是保密不可查的,透明资金与透明资金的交易是公开可查的。
ZCash 被称为零币,与‘灵’同音,不好听,且有归零的感觉,统一称为 Z 币。ZCash 主链 的币叫 ZEC,等同于 BTC,测试链的币称为 TAZ。
目前 ZCash 仅支持 linux 系统(推荐 ubuntu),不支持 Windows、MAC,且只支持命令行, 没有图形界面(zcash 团队没人擅长 GUI)。
地址
ZCash 中含有 2 种地址,实现 bitcoin 和 ZCash 的兼容。
1、 透明资金地址 taddr 类 bitcoin 地址,保存在 UTXOs 中,长度为 34 位。 命令./src/zcash-cli getnewaddress 可以生成新的 taddr 地址。 例如: msFgKsVAia4aFB1qFGX7iJ3XjMZv6c26Ab
2、 私有资金地址 zaddr 保存在 notes 对象中,长度为 96 位,前 2 位为标记,主链地址前 2 位是”zc”,spendingkey 的前 2 位是”SK”,测试链的地址前 2 位是”tn”。 notes 对象是加密的,解密才能查看,用的是 chacha20-poly1305 算法。 命令./src/zcash-cli z_getnewaddress 可以生成新的 zaddr 地址。 例如: tngBSug9xvpqudziMc3QbfReHG6BeufHDbv4vEZDmnYqSpRbqu5USZqBTXENQGdUbYMkxqHbb9j3 RmEr7Lza8q7hbTQxZnM
具体生成过程看 z_getnewaddress 函数。
命令 z_listaddresses 获取节点钱包中的 zaddr 列表。
命令./src/zcash-cli zcrawkeygen 可以查看地址、key 等。
地址 taddr 实现了原有的 bitcoin 的功能,zaddr 实现了 zcash 的功能。
taddr 可以发送交易给 taddr、zaddr,zaddr 可以发送交易给 taddr、zaddr。taddr 与 taddr 的交易是透明可查的,涉及到 zddr 的交易就保密了。
零知识证明
零知识证明是在不泄漏信息的情况下,生成证明,验证者通过验证证明确定是否正确。
Zcash 使用了 SCIPR 实验室的零知识证明库 libsnark,在此基础上做了修改。
Zcash 团队 成员包含多个 libsnark 开发人员(不是全部)。修改如下:
1、 libsnark 支持 4 种语言:"R1CS"、"BACS"、"USCS"、"TBCS",zcash 使用了"R1CS"。
2、 libsnark 支持 3 种椭圆曲线:"edwards"、"bn128"、"alt_bn128",zcash 使用了"alt_bn128"。
3、 libsnark 支持 2 个库:gadgetlib1、gadgetlib2,zcash 使用了 gadgetlib1,gadgetlib1 是底层 库,支持所有的 R1CS 预处理特征。
SCIPR 实验室的 libsnark:https://github.com/scipr-lab/libsnark。
Zcash 修改后的 libsnark:https://github.com/zcash/libsnark。
当 zcash 交易涉及到私有资金时,使用零知识证明生成证明(函数 r1cs_ppzksnark_prover),保存到类 JSDescription 的 proof 中,校验交易时校验证明(函数 r1cs_ppzksnark_verifier_strong_IC)。
libsnark 看了看,知道怎么用的,但详细的也没看懂。
零知识证明白皮书:https://eprint.iacr.org/2013/507.pdf
交易
透明资金发送到透明资金地址,可以调用 bitcoin 的 RPC 命令发送交易,涉及到私有资 金、地址,只能用 zcash 的 RPC 命令了,目前是 z_sendmany 命令。
格式:
z_sendmany "fromaddress" [{"address":... ,"amount":...},...]
交易分 3 种情况:
1、 透明资金发送到透明地址
延用 bitcoin 的交易方式,仅仅打签名即可。
2、 透明资金发送到透明地址、私有地址
透明资金发送到透明地址,依然延用 bitcoin 的方式,发送到私有地址的需要构造证明, 对整个交易签名发送。
3、 私有资金发送到透明地址、私有地址
每笔交易需要生成证明,涉及到找零、矿工费的处理,最后再签名发送。 交易中的透明地址、私有地址的输入、输出是不同的结构,涉及到私有地址的 采用了新 增的结构(JSInput、JSOutput), 涉及到的私有地址的数据需要先 签名解密解析数据。
详细过程参考函数 z_sendmany: https://github.com/zcash/zcash/blob/master/src/wallet/asyncrpcoperation_sendmany.cpp#L126
生成证明参考函数 perform_joinsplit: https://github.com/zcash/zcash/blob/master/src/wallet/asyncrpcoperation_sendmany.cpp#L804
交易签名
ZCash 私有资金交易时,不仅仅依靠零知识证明,而且对交易打签名,采用了 ed25519 算法。
ZCash 交易的零知识证明、签名需要的公钥、密钥使用 ed25519 算法生成的,详细参考 函数 crypto_sign_keypair。
签名参考函数 sign_send_raw_transaction。
https://github.com/zcash/zcash/blob/master/src/wallet/asyncrpcoperation_sendmany.cpp#L660
挖矿算法
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。