LOADING...
LOADING...
LOADING...
当前位置: 玩币族首页 > 区块链资产 > Zcash技术分析:zcash币挖矿教程,Zcash算法等介绍

Zcash技术分析:zcash币挖矿教程,Zcash算法等介绍

2016-10-26 龙少 来源:龙少

  Zcash挖矿系列文章:http://www.blockvalue.com/p/59423.html

  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地址。

  例如:tngBSug9xvpqudziMc3QbfReHG6BeufHDbv4vEZDmnYqSpRbqu5USZqBTXENQGdUbYMkxqHbb9j3RmE r7Lza8q7hbTQxZnM

  具体生成过程看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

  挖矿算法

  Zcash的挖矿算法是EquiHash,理论依据是广义生日悖论,目前有2个实现:BasicSolve、OptimisedSolve,BasicSolve主要用于测试用例,现在用的OptimisedSolve是优化后的,但依然存在优化空间。

  EquiHash算法需要高内存,最优算法每个挖矿线程需要1G内存,短时间内很难出现低成本的矿机。

  Zcash使用EquiHash计算解决方案,保存到区块头的nSolution,接收区块时校验。

  BasicSolve实现:

  https://github.com/zcash/zcash/blob/master/src/crypto/equihash.cpp#L323

  OptimisedSolve实现:

  https://github.com/zcash/zcash/blob/master/src/crypto/equihash.cpp#L494

  块奖励

  zcash总量是2100万个币,每隔2.5分钟出一个块,每天576个块。

  区块奖励分2个阶段:

  1、 慢慢开始挖矿阶段

  为了照顾在开始阶段不懂挖矿的,zcash采用了慢慢开始挖矿机制,前20000个块的奖励比较少,线程递增到12.5个币。

  慢慢开始挖矿阶段也分2个阶段:

  (1) 前10000个块,

  块1的奖励是0.000625币,随着高度线性递增,增加幅度是0.000625币,块9999的奖励是6.249375币。

  (2) 块10000~19999

  块10000的奖励是6.250625,随着高度线性递增,增加幅度是0.000625币,块19999的奖励是12.5币。

  前20000个块的奖励总量是125000币,相当于10000个块奖励是12.5个币的总量。产生10000个块需要的时间大约是17.3天,缓慢挖矿的时间周期(20000个块)大约是34.7天。

  2、 正常块奖励

  从块20000开始,奖励是12.5个币,奖励按照每840000个块(每4年)减半,计算块奖励时块高度减少10000,即940000块是第一次减半,每隔840000个块减半,以此类推。

  不懂挖矿的矿工也不必着急,因为即使懂了,前20000个块的奖励很少,有1个月的时间搞定挖矿。

  创始人奖励

  前4年(区块0~840000)产生的区块奖励的20%归zcash公司(总量的10%),80%归矿工。4年后的区块奖励全部归矿工。

  创建区块时,构造2个输出,分别给矿工、创始人,当广播区块后,其他节点接受区块时,检验区块有效性,当高度小于840000时,检验是否有对创始人的20%的输出。

  创始人奖励地址采用2/3多重签名FOUNDERS_REWARD_SCRIPT。

  难度调整

  每产生一个区块都需要重新计算难度,难度计算基于前17个块(42.5分钟),前17个区块的难度是固定的(powLimit),从第18个区块开始调整难度,最大值是powLimit。

  详细计算过程参考GetNextWorkRequired函数。

  Bitcoin是每隔2016个块调整难度,关于zcash的每个块都要重新调整难度,有个讨论,参考:https://github.com/zcash/zcash/issues/147

  CoinBase保护

  矿工挖矿的奖励不能直接发送给透明资金地址,只能发送给私有资金地址,然后才可以发送给透明资金地址。

  币成熟期是100。

  创建新块

  Zcash每个挖矿线程都有自己的地址、计数器,每个线程挖出来的新块的块奖励的地址是不同的,做矿池的需要注意,改成一个地址。

  参考函数BitcoinMiner(https://github.com/zcash/zcash/blob/master/src/miner.cpp#L442)。

  区块大小是2M。

  挖矿工具

  Zcash目前仅支持CPU挖矿,GPU的挖矿工具在研发中,尚未有人公开。

  zcash支持2种挖矿方式:solo、矿池。

  1、 Solo挖矿

  在zcash.conf设置gen=1,启动zcashd即可挖矿。

  2、 矿池

  Zcash开发者str4d做了个矿池和挖矿工具,矿池地址:http://zmine.io/,挖矿工具地址:https://github.com/str4d/zcash/tree/standalone-miner。

  zcash-miner是zcash的分支,主要添加了stratum协议、cpu挖矿。

  (1) stratum协议

  采用了cpp-ethereum的stratum的实现,V2版,做了些修改,移除了eth协议中的命令。

  参考commit:https://github.com/str4d/zcash/commit/c5ea2cfb190944dfa23566561d1cb37dcb116833

  (2) cpu挖矿

  把equihash算法做了些修改,接受矿池下发的难度来计算。

  参考文件standaloneminer.cpp。

  https://github.com/str4d/zcash/blob/standalone-miner/src/standaloneminer.cpp

  参数文件

  Zcash有2个参数文件,包含了证明、验证key,分别是:z9-proving.key、z9-verifying.key,在~/.zcash-params目录下。z9-proving.key大概900M,z9-verifying.key大约14K。使用./zcutil/fetch-params.sh可以下载这2个文件。

  程序启动初始化时(AppInit2),读取这2个文件中的证明、验证key,生成证明时需要证明key,验证证明时需要验证key。

  API和RPC

  Zcash保留了bitcoin的API、RPC,涉及到透明资金、地址的可以使用bitcoin的接口,涉及到私有资金、地址的只能用zcash新增的接口。

  Zcash新增的接口包括查询余额、生成地址、发送交易等,如下:

  • Accounting: z_getbalance, z_gettotalbalance

  • Addresses : z_getnewaddress, z_listaddresses

  • Keys : z_exportkey, z_importkey, z_exportwallet, z_importwallet

  • Operation: z_getoperationresult, z_getoperationstatus, z_listoperationids

  • Payment : z_listreceivedbyaddress, z_sendmany

  详细信息参考文档https://github.com/zcash/zcash/blob/master/doc/payment-api.md。

  挖矿硬件

  EquiHash白皮书讲了2点:

  1、 GPU比CPU快4倍,

  2、 ASIC是否可能实现

  详细信息参考白皮书第10页。

  https://www.internetsociety.org/sites/default/files/blogs-media/equihash-asymmetric-proof-of-work-based-generalized-birthday-problem.pdf

  加密库

  Zcash使用了开源加密库libsodium(https://github.com/jedisct1/libsodium),zcash使用了其中的chacha20-poly1305、blake2b、ed25519算法。

  chacha20-poly1305算法:https://github.com/jedisct1/libsodium/blob/master/src/libsodium/include/sodium/crypto_aead_chacha20poly1305.h

  blake2b算法:

  https://github.com/jedisct1/libsodium/blob/master/src/libsodium/include/sodium/crypto_generichash_blake2b.h

  ed25519算法:

  https://github.com/jedisct1/libsodium/blob/master/src/libsodium/include/sodium/crypto_sign.h

  保护隐私技术比较

  目前市场上有3种保护隐私的币,分别是达世币DASH、门罗币XMR、Z币Zcash。

  1、 达世币(暗黑币改名叫达世币)

  DASH采用的混币CoinJoin的方案,把一些交易混合在一起,增加追踪的难度。

  CoinJoin参考DASH币白皮书http://www.8btc.com/dash-whitepaper

  2、 门罗币XMR

  XMR采用了环签名,签名者利用自己的私钥以及环成员的公钥进行签名,验证者只能确定该签名来自环中的某个成员,但无法确定签名者的真实身份。

  参考文档http://www.doc88.com/p-1731949359328.html

  3、 Z币

  Zcash的交易采用了零知识证明,隐藏交易信息。

  这3种技术相比较来看,zcash的隐私保护性更好。

  风险

  1、 zcash目前是由公司开发的,公司具有绝对的话语权,后续公司会成立基金会,zcash的开发交给基金会推进。如果zcash社区与公司、基金会出现意见分歧,而代码是开源的,可以硬分叉。

  比如:有人对创始人奖励不满意,已经提议去掉创始人奖励。

  2、 zcash的顾问包括:前任比特币核心开发人员Gavin、eth创始人Vitalik Buterin,zcash的发展会受到这2个人的影响。

  比如:区块大小2M源于bitcoin classic。

  参考Github: https://github.com/zcash/zcash/issues/765

  注:

  zcash的有些技术点,我也一知半解,如果有不对的地方请指出来,对zcash技术有兴趣的可以加入QQ群377078828一起讨论。(http://www.blockvalue.com/xinbi/201610267797.html

  作者:龙少

  微博:007龙少

  BTC打赏地址:3Eg3A5tVK3TRyetYfkk7ASasFdbzuMHVHc

—-

编译者/作者:龙少

玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。

LOADING...
LOADING...