www.baodada.com

Zcash 基础知识普及帖,Zcash 技术分析

Zcash 基础知识普及帖,Zcash 技术分析

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 

挖矿算法 

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。