From d06df37c6cde6828f289dfee7b6998ea6a6579ea Mon Sep 17 00:00:00 2001 From: dongchangYoo Date: Fri, 1 Dec 2023 16:36:53 +0900 Subject: [PATCH] refac(zk): move `Evaluate()` func from `PermutationComitted` to its `Runner` This commit gathers the transition functions of the permutation into the `PermutationArgumentRunner` to enhance the readability of the protocol. --- tachyon/zk/plonk/permutation/BUILD.bazel | 5 ++- .../permutation/permutation_argument_runner.h | 6 ++++ .../permutation_argument_runner_impl.h | 33 +++++++++++++++++++ .../plonk/permutation/permutation_committed.h | 33 ++----------------- 4 files changed, 43 insertions(+), 34 deletions(-) diff --git a/tachyon/zk/plonk/permutation/BUILD.bazel b/tachyon/zk/plonk/permutation/BUILD.bazel index 4d74d8b1b1..5e752aae28 100644 --- a/tachyon/zk/plonk/permutation/BUILD.bazel +++ b/tachyon/zk/plonk/permutation/BUILD.bazel @@ -48,12 +48,11 @@ tachyon_cc_library( ":grand_product_argument", ":permutation_argument", ":permutation_committed", + ":permutation_evaluated", ":permutation_proving_key", ":permutation_table_store", "//tachyon/base:logging", "//tachyon/base:parallelize", - "//tachyon/zk/base:blinded_polynomial", - "//tachyon/zk/base:prover", "//tachyon/zk/base:ref", ], ) @@ -71,7 +70,7 @@ tachyon_cc_library( tachyon_cc_library( name = "permutation_committed", hdrs = ["permutation_committed.h"], - deps = [":permutation_evaluated"], + deps = ["//tachyon/zk/base:blinded_polynomial"], ) tachyon_cc_library( diff --git a/tachyon/zk/plonk/permutation/permutation_argument_runner.h b/tachyon/zk/plonk/permutation/permutation_argument_runner.h index 647c6bb7ee..24f74e42c2 100644 --- a/tachyon/zk/plonk/permutation/permutation_argument_runner.h +++ b/tachyon/zk/plonk/permutation/permutation_argument_runner.h @@ -16,6 +16,7 @@ #include "tachyon/zk/plonk/circuit/table.h" #include "tachyon/zk/plonk/permutation/permutation_argument.h" #include "tachyon/zk/plonk/permutation/permutation_committed.h" +#include "tachyon/zk/plonk/permutation/permutation_evaluated.h" #include "tachyon/zk/plonk/permutation/permutation_proving_key.h" namespace tachyon::zk { @@ -37,6 +38,11 @@ class PermutationArgumentRunner { const PermutationProvingKey& permutation_proving_key, const F& beta, const F& gamma); + template + static PermutationEvaluated EvaluateCommitted( + Prover* prover, + PermutationCommitted&& committed, const F& x); + private: template static std::function(size_t)> diff --git a/tachyon/zk/plonk/permutation/permutation_argument_runner_impl.h b/tachyon/zk/plonk/permutation/permutation_argument_runner_impl.h index 500a1cf33f..6779a68e70 100644 --- a/tachyon/zk/plonk/permutation/permutation_argument_runner_impl.h +++ b/tachyon/zk/plonk/permutation/permutation_argument_runner_impl.h @@ -74,6 +74,39 @@ PermutationArgumentRunner::CommitArgument( return PermutationCommitted(std::move(grand_product_polys)); } +template +template +PermutationEvaluated +PermutationArgumentRunner::EvaluateCommitted( + Prover* prover, + PermutationCommitted&& committed, const F& x) { + int32_t blinding_factors = + static_cast(prover->blinder().blinding_factors()); + + std::vector> product_polys = + std::move(committed).product_polys(); + + for (size_t i = 0; i < product_polys.size(); ++i) { + const Poly& poly = product_polys[i].poly(); + + prover->Evaluate(poly, x); + + F x_next = Rotation::Next().RotateOmega(prover->domain(), x); + prover->Evaluate(poly, x_next); + + // If we have any remaining sets to process, evaluate this set at ωᵘ + // so we can constrain the last value of its running product to equal the + // first value of the next set's running product, chaining them together. + if (i != product_polys.size() - 1) { + F x_last = + Rotation(-(blinding_factors + 1)).RotateOmega(prover->domain(), x); + prover->Evaluate(poly, x_last); + } + } + + return PermutationEvaluated(std::move(product_polys)); +} + template template std::function(size_t)> diff --git a/tachyon/zk/plonk/permutation/permutation_committed.h b/tachyon/zk/plonk/permutation/permutation_committed.h index 909fa0b5d0..fd37cb385a 100644 --- a/tachyon/zk/plonk/permutation/permutation_committed.h +++ b/tachyon/zk/plonk/permutation/permutation_committed.h @@ -11,8 +11,6 @@ #include #include "tachyon/zk/base/blinded_polynomial.h" -#include "tachyon/zk/base/prover.h" -#include "tachyon/zk/plonk/permutation/permutation_evaluated.h" namespace tachyon::zk { @@ -24,35 +22,8 @@ class PermutationCommitted { std::vector> product_polys) : product_polys_(std::move(product_polys)) {} - const std::vector>& product_polys() const { - return product_polys_; - } - - template - PermutationEvaluated Evaluate(Prover* prover, - const F& x) && { - int32_t blinding_factors = - static_cast(prover->blinder().blinding_factors()); - - for (size_t i = 0; i < product_polys_.size(); ++i) { - const Poly& poly = product_polys_[i].poly(); - - prover->Evaluate(poly, x); - - F x_next = Rotation::Next().RotateOmega(prover->domain(), x); - prover->Evaluate(poly, x_next); - - // If we have any remaining sets to process, evaluate this set at ωᵘ - // so we can constrain the last value of its running product to equal the - // first value of the next set's running product, chaining them together. - if (i != product_polys_.size() - 1) { - F x_last = - Rotation(-(blinding_factors + 1)).RotateOmega(prover->domain(), x); - prover->Evaluate(poly, x_last); - } - } - - return PermutationEvaluated(std::move(product_polys_)); + std::vector>&& product_polys() && { + return std::move(product_polys_); } private: