• 北京时间:16:10:52
  • 东京时间:17:10:52
  • 伦敦时间:08:10:52
  • 纽约时间:03:10:52
  • 悉尼时间:18:10:52
  • 香港时间:16:10:52

零知识证明 - DIZK源代码导读

时间:浏览:5来源:阿牛财经网分布式源代码
零知识证明 - DIZK源代码导读
对DIZK感爱好的小同伴能够看看DIZK的源代码: https://github.com/scipr-lab/dizk DIZK的更新比力少,最初一个patch也是2018年末了: commit 81d72a3406e2500561551cbf4d651f230146bb92 Merge: e98dd9c 7afd0be Author: Howard Wu <[email protected]> Date: Wed Dec 12 11:17:57 2018 -0800 Merge pull request #6 from gnosis/profiler_error #5 - Throw Error when profiler has wrong APP parameter. 1. 源代码构造

DIZK是在Spark框架上,用java言语完成的散布式零常识证实体系。源代码的构造以下:

algebra - 各类计较:椭圆曲线,域/群,FFT以及多倍点(fixedMSM和VarMSM)。 bace - batch证实的相干完成。 relations - 电路的暗示:r1cs以及QAP。 reductions - 完成r1cs到QAP的转化。 zk_proof_systems - Groth16证实体系 profiler - 机能测试逻辑 熟习libsnark的小同伴,对这些术语该当感应比力密切。 2. DistributedSetup DistributedSetup完成了散布式的Setup逻辑: main/java/zk_proof_systems/zkSNARK/DistributedSetup.java generate函数完成了Pk/Vk的天生。 public static <FieldT extends AbstractFieldElementExpanded<FieldT>, G1T extends AbstractG1<G1T>, G2T extends AbstractG2<G2T>, GTT extends AbstractGT<GTT>, PairingT extends AbstractPairing<G1T, G2T, GTT>> CRS<FieldT, G1T, G2T, GTT> generate( final R1CSRelationRDD<FieldT> r1cs, final FieldT fieldFactory, final G1T g1Factory, final G2T g2Factory, final PairingT pairing, final Configuration config) { 2.1 QAP转化 final QAPRelationRDD<FieldT> qap = R1CStoQAPRDD.R1CStoQAPRelation(r1cs, t, config); 留意,QAP用QAPRelationRDD类暗示。 2.2 计较deltaABC/gammaABC final JavaPairRDD<Long, FieldT> betaAt = qap.At().mapValues(a -> a.mul(beta)); final JavaPairRDD<Long, FieldT> alphaBt = qap.Bt().mapValues(b -> b.mul(alpha)); final JavaPairRDD<Long, FieldT> ABC = betaAt.union(alphaBt).union(qap.Ct()) .reduceByKey(FieldT::add).persist(config.storageLevel()); final JavaPairRDD<Long, FieldT> gammaABC = ABC.filter(e -> e._1 < numInputs) .mapValues(e -> e.mul(inverseGamma)); final JavaPairRDD<Long, FieldT> deltaABC = ABC.filter(e -> e._1 >= numInputs) .mapValues(e -> e.mul(inverseDelta)); 2.3 计较At/Bt的麋集度 final long numNonZeroAt = qap.At().filter(e -> !e._2.isZero()).count(); final long numNonZeroBt = qap.Bt().filter(e -> !e._2.isZero()).count(); 2.4 计较FixedMSM(G1/G2) final G1T generatorG1 = g1Factory.random(config.seed(), config.secureSeed()); final int scalarSizeG1 = generatorG1.bitSize(); final long scalarCountG1 = numNonZeroAt + numNonZeroBt + numVariables; final int windowSizeG1 = FixedBaseMSM.getWindowSize(scalarCountG1 / numPartitions, generatorG1); final List<List<G1T>> windowTableG1 = FixedBaseMSM .getWindowTable(generatorG1, scalarSizeG1, windowSizeG1); 以上是G1的MSM的计较(G2相似),留意windowSizeG1,是一切的“非零”系数的个数除以Partition的个数。 2.5 天生CRS(Pk/Vk) final ProvingKeyRDD<FieldT, G1T, G2T> provingKey = new ProvingKeyRDD<>( alphaG1, betaG1, betaG2, deltaG1, deltaG2, deltaABCG1, queryA, queryB, queryH, r1cs); final VerificationKey<G1T, G2T, GTT> verificationKey = new VerificationKey<>( alphaG1betaG2, gammaG2, deltaG2, UVWGammaG1); 留意:Pk利用RDD(ProvingKeyRDD)暗示。 3. DistributedProver DistributedProver完成了散布式的Prover逻辑: main/java/zk_proof_systems/zkSNARK/DistributedProver.java prove函数完成了证实天生逻辑。 public static <FieldT extends AbstractFieldElementExpanded<FieldT>, G1T extends AbstractG1<G1T>, G2T extends AbstractG2<G2T>> Proof<G1T, G2T> prove( 3.1 天生witness final QAPWitnessRDD<FieldT> qapWitness = R1CStoQAPRDD .R1CStoQAPWitness(provingKey.r1cs(), primary, oneFullAssignment, fieldFactory, config); QAPWitnessRDD界说在main/java/relations/qap/QAPWitnessRDD.java,包罗输出信息以及H多项式系数(FFT计较得到)。 3.2 发生随机数 final FieldT r = fieldFactory.random(config.seed(), config.secureSeed()); final FieldT s = fieldFactory.random(config.seed(), config.secureSeed()); 3.3 计较Evaluation final JavaRDD<Tuple2<FieldT, G1T>> computationA = > .join(provingKey.queryA(), numPartitions).values(); final G1T evaluationAt = VariableBaseMSM.distributedMSM(computationA); 经由过程VariableBaseMSM计较A/B/deltaABC以及H的Evaluation。 3.4 天生证实 // A = alpha + sum_i(a_i*A_i(t)) + r*delta final G1T A = alphaG1.add(evaluationAt).add(deltaG1.mul(r)); // B = beta + sum_i(a_i*B_i(t)) + s*delta final Tuple2<G1T, G2T> B = new Tuple2<>( betaG1.add(evaluationBt._1).add(deltaG1.mul(s)), betaG2.add(evaluationBt._2).add(deltaG2.mul(s))); // C = sum_i(a_i*((beta*A_i(t) + alpha*B_i(t) + C_i(t)) + H(t)*Z(t))/delta) + A*s + r*b - r*s*delta final G1T C = evaluationABC.add(A.mul(s)).add(B._1.mul(r)).sub(rsDelta); 4. Profiling main/java/profiler/Profiler.java是机能测试的进口类,供给了各类算子的机能测试才能,包罗散布式和单机版本。在scripts目次下也供给了Spark运转的剧本。默许,DIZK是利用Amazon的EC2机械停止测试的。 ./spark-ec2/copy-dir /home/ec2-user/ export JAVA_HOME="/usr/lib/jvm/java-1.8.0" for TOTAL_CORES in 8; do for SIZE in `seq 15 25`; do export APP=dizk-large export MEMORY=16G export MULTIPLIER=2 export CORES=1 export NUM_EXECUTORS=$((TOTAL_CORES / CORES)) export NUM_PARTITIONS=$((TOTAL_CORES * MULTIPLIER)) /root/spark/bin/spark-submit \ --conf spark.driver.memory=$MEMORY \ ... --class "profiler.Profiler" \ /home/ec2-user/dizk-1.0.jar $NUM_EXECUTORS $CORES $MEMORY $APP $SIZE $NUM_PARTITIONS done done 感爱好的小同伴,能够本人改一下剧本,在当地情况运转DIZK。 总结: DIZK,是在Spark大数据计较框架下的散布式零常识证实体系。DIZK的代码比力明晰,正文也比力完好。DistributedSetup和DistributedProver是Setup和Prover的完成。DIZK供给了完好的Profiling的代码。

枢纽词: 零常识证实DIZK源代码阿牛财经aniuc.com

猜你喜欢

RenrenBit 联合慢雾区发布 RRWallet 开源代码漏洞赏金计划

RenrenBit联合慢雾区发布RRWallet开源代码漏洞赏金计划克日,倡导100%通明的区块链数字银行RenrenBit启动了“代码通明”方案,完好开源了On-Chain钱

2020-02-21

布比区块链在商业应用落地中的实践(上)—账户中心和分布式账本服务

布比区块链在商业应用落地中的实践(上)—账户中心和分布式账本服务今天的文章咱们分享了《与千余家企业交换后,布比总结出区块链在贸易使用落地中的5个枢纽成绩》:·怎样完成疾速的使用

2020-02-21

如何通过分布式密钥技术实现有效监管?

如何通过分布式密钥技术实现有效监管?一、非对称加密手艺是构建区块链使用的基石非对称加密手艺在信息化体系中一直饰演着枢纽脚色,成为构建信息化体系诸多中心功用的根底。在区块链体系中

2020-02-19

Celer Network上线状态守卫者网络(SGN)质押测试网并公布开源代码

CelerNetwork上线状态守卫者网络(SGN)质押测试网并公布开源代码据CelerNetwork官方动静,Celer胜利上线形态保卫者收集(StateGuardianNe

2020-02-17

零知识证明 - DIZK源代码导读

零知识证明-DIZK源代码导读对DIZK感爱好的小同伴能够看看DIZK的源代码:https://github.com/scipr-lab/dizkDIZK的更新比力少,最初一个

2020-02-13