http://www.admarmetal.com

DIZK源代码导读


public static <FieldT extends AbstractFieldElementExpanded<FieldT>,

DIZK是在Spark框架上,用java语言实现的漫衍式零常识证明系统。源代码的布局如下:

         final int windowSizeG1 = FixedBaseMSM.getWindowSize(scalarCountG1 / numPartitions, generatorG1);
熟悉libsnark的小同伴,对这些术语应该感想较量亲切。
main/java/zk_proof_systems/zkSNARK/DistributedSetup.java
QAPWitnessRDD界说在main/java/relations/qap/QAPWitnessRDD.java,包罗输入信息以及H多项式系数(FFT计较得到)。
final long numNonZeroBt = qap.Bt().filter(e -> !e._2.isZero()).count();
2. DistributedSetup
3. DistributedProver
// B = beta + sum_i(a_i*B_i(t)) + s*delta
DistributedProver实现了漫衍式的Prover逻辑:
 
final FieldT s = fieldFactory.random(config.seed(), config.secureSeed());
reductions - 实现r1cs到QAP的转化。
 
2.3 计较At/Bt的麋集度

                 deltaG2,

prove函数实现了证明生成逻辑。
 

final JavaPairRDD<Long, FieldT> alphaBt = qap.Bt().mapValues(b -> b.mul(alpha));


final ProvingKeyRDD<FieldT, G1T, G2T> provingKey = new ProvingKeyRDD<>(

commit 81d72a3406e2500561551cbf4d651f230146bb92
以上是G1的MSM的计较(G2雷同),留意windowSizeG1,是所有的“非零”系数的个数除以Partition的个数。
                 .reduceByKey(FieldT::add).persist(config.storageLevel());


                 betaG2,
final JavaPairRDD<Long, FieldT> gammaABC = ABC.filter(e -> e._1 < numInputs)
     CRS<FieldT, G1T, G2T, GTT> generate(
   for SIZE in `seq 15 25`; do
                 deltaG1,
       --class "profiler.Profiler" \

             G2T extends AbstractG2<G2T>,

留意:Pk利用RDD(ProvingKeyRDD)暗示。
DistributedSetup实现了漫衍式的Setup逻辑:
final QAPRelationRDD<FieldT> qap = R1CStoQAPRDD.R1CStoQAPRelation(r1cs, t, config);
final JavaPairRDD<Long, FieldT> betaAt = qap.At().mapValues(a -> a.mul(beta));
profiler - 机能测试逻辑

 ./spark-ec2/copy-dir /home/ec2-user/
bace - batch证明的相关实现。
2.2 计较deltaABC/gammaABC


      betaG1.add(evaluationBt._1).add(deltaG1.mul(s)),

     /root/spark/bin/spark-submit \
final G1T evaluationAt = VariableBaseMSM.distributedMSM(computationA);
// 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

                 r1cs);
     export CORES=1
             final R1CSRelationRDD<FieldT> r1cs,

Merge: e98dd9c 7afd0be
Author: Howard Wu <[email protected]>

    Merge pull request #6 from gnosis/profiler_error
总结:
     export NUM_EXECUTORS=$((TOTAL_CORES / CORES))

final Tuple2<G1T, G2T> B = new Tuple2<>(

DIZK的更新较量少,最后一个patch也是2018年底了:


3.2 发生随机数
要害词: 零常识证明  DIZK源代码  

 



         final List<List<G1T>> windowTableG1 = FixedBaseMSM

对DIZK感乐趣的小同伴可以看看DIZK的源代码:

https://github.com/scipr-lab/dizk
             final FieldT fieldFactory,

final JavaPairRDD<Long, FieldT> ABC = betaAt.union(alphaBt).union(qap.Ct())

DIZK源代码导读

       --conf spark.driver.memory=$MEMORY \
2.1 QAP转化
 export JAVA_HOME="/usr/lib/jvm/java-1.8.0"
   done
             PairingT extends AbstractPairing<G1T, G2T, GTT>>
             AbstractG1<G1T>, G2T extends AbstractG2<G2T>>
                 .mapValues(e -> e.mul(inverseDelta));
         final int scalarSizeG1 = generatorG1.bitSize();
main/java/profiler/Profiler.java是机能测试的进口类,提供了各类算子的机能测试本领,包罗漫衍式和单机版本。在scripts目次下也提供了Spark运行的剧本。默认,DIZK是利用Amazon的EC2呆板举办测试的。
                 queryB,
                 .mapValues(e -> e.mul(inverseGamma));
                 .getWindowTable(generatorG1, scalarSizeG1, windowSizeG1);
final long numNonZeroAt = qap.At().filter(e -> !e._2.isZero()).count();
    
                 betaG1,
final G1T A = alphaG1.add(evaluationAt).add(deltaG1.mul(r));

             GTT extends AbstractGT<GTT>,

             final Configuration config) {
                 deltaABCG1,

     export MULTIPLIER=2
                 UVWGammaG1);
// A = alpha + sum_i(a_i*A_i(t)) + r*delta
    ...

final QAPWitnessRDD<FieldT> qapWitness = R1CStoQAPRDD                 .R1CStoQAPWitness(provingKey.r1cs(), primary, oneFullAssignment, fieldFactory, config);

                 alphaG1,
final JavaPairRDD<Long, FieldT> deltaABC = ABC.filter(e -> e._1 >= numInputs)
 

                 gammaG2,

     export APP=dizk-large
final G1T C = evaluationABC.add(A.mul(s)).add(B._1.mul(r)).sub(rsDelta);
final FieldT r = fieldFactory.random(config.seed(), config.secureSeed());

      betaG2.add(evaluationBt._2).add(deltaG2.mul(s)));
                 alphaG1betaG2,
             final G1T g1Factory,
 
main/java/zk_proof_systems/zkSNARK/DistributedProver.java
relations - 电路的暗示:r1cs以及QAP。
感乐趣的小同伴,可以本身改一下剧本,在当地情况运行DIZK。


             final PairingT pairing,

algebra - 各类计较:椭圆曲线,域/群,FFT以及多倍点(fixedMSM和VarMSM)。
通过VariableBaseMSM计较A/B/deltaABC以及H的Evaluation。
 done
       /home/ec2-user/dizk-1.0.jar $NUM_EXECUTORS $CORES $MEMORY $APP $SIZE $NUM_PARTITIONS
     export MEMORY=16G
     export NUM_PARTITIONS=$((TOTAL_CORES * MULTIPLIER))
3.3 计较Evaluation

         final long scalarCountG1 = numNonZeroAt + numNonZeroBt + numVariables;
Date:   Wed Dec 12 11:17:57 2018 -0800
留意,QAP用QAPRelationRDD类暗示。
                 deltaG2,


1. 源代码布局
     Proof<G1T, G2T> prove(
2.5 生成CRS(Pk/Vk)

 
public static <FieldT extends AbstractFieldElementExpanded<FieldT>, G1T extends

3.1 生成witness
             G1T extends AbstractG1<G1T>,
 for TOTAL_CORES in 8; do
             final G2T g2Factory,
zk_proof_systems - Groth16证明系统
3.4 生成证明

    #5 - Throw Error when profiler has wrong APP parameter.
                 queryH,
                 queryA,
4. Profiling

generate函数实现了Pk/Vk的生成。
DIZK,是在Spark大数据计较框架下的漫衍式零常识证明系统。DIZK的代码较量清晰,注释也较量完整。DistributedSetup和DistributedProver是Setup和Prover的实现。DIZK提供了完整的Profiling的代码。

2.4 计较FixedMSM(G1/G2)
 final VerificationKey<G1T, G2T, GTT> verificationKey = new VerificationKey<>(
final JavaRDD<Tuple2<FieldT, G1T>> computationA =>        .join(provingKey.queryA(), numPartitions).values();
final G1T generatorG1 = g1Factory.random(config.seed(), config.secureSeed());

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