28 static constexpr size_t log_n = 4;
29 static constexpr size_t n = 1UL << log_n;
35 static std::vector<Fr> materialize_shift(
const std::vector<Fr>& point)
39 for (
size_t idx = 1; idx < n; ++idx) {
49 for (
size_t idx = 0; idx < n; ++idx) {
50 result += left[idx] * right[idx];
71 input.claim_data.unshifted.multilinear_challenge = multilinear_challenge;
73 const auto shift_tensor = materialize_shift(multilinear_challenge);
75 for (
size_t idx = 0; idx < 5; ++idx) {
77 input.claim_data.unshifted.evaluations.emplace_back(
79 input.claim_data.unshifted.commitments.emplace_back(
ck.commit(polynomial));
80 input.unshifted_polynomials.emplace_back(
std::move(polynomial));
83 input.claim_data.unshifted.rho_powers =
84 ClaimData::rho_powers(this->
random_element(), input.unshifted_polynomials.size());
86 const std::vector<size_t> shifted_sources = { 1, 3 };
87 input.claim_data.shifted.rho_powers = ClaimData::rho_powers(this->
random_element(), shifted_sources.size());
88 for (
const size_t source_idx : shifted_sources) {
89 input.claim_data.shifted.commitments.emplace_back(input.claim_data.unshifted.commitments[source_idx]);
90 input.claim_data.shifted.source_unshifted_evaluations.emplace_back(
91 input.claim_data.unshifted.evaluations[source_idx]);
92 input.claim_data.shifted.shifted_evaluations.emplace_back(
94 input.shifted_polynomials.emplace_back(input.unshifted_polynomials[source_idx].share());
98 input.claim_data.univariate.opening_pair.challenge = this->
random_element();
99 input.claim_data.univariate.opening_pair.evaluation =
100 input.univariate_polynomial.evaluate(input.claim_data.univariate.opening_pair.challenge);
101 input.claim_data.univariate.commitment =
ck.commit(input.univariate_polynomial);
109 for (
const auto& commitment : native_input.claim_data.unshifted.commitments) {
110 result.claim_data.unshifted.commitments.emplace_back(
111 RecursiveCurve::Group::from_witness(&
builder, commitment));
113 for (
const auto& evaluation : native_input.claim_data.unshifted.evaluations) {
114 result.claim_data.unshifted.evaluations.emplace_back(
115 RecursiveCurve::ScalarField::from_witness(&
builder, evaluation));
117 for (
const auto& rho_power : native_input.claim_data.unshifted.rho_powers) {
118 result.claim_data.unshifted.rho_powers.emplace_back(
119 RecursiveCurve::ScalarField::from_witness(&
builder, rho_power));
121 for (
const auto& coordinate : native_input.claim_data.unshifted.multilinear_challenge) {
122 result.claim_data.unshifted.multilinear_challenge.emplace_back(
123 RecursiveCurve::ScalarField::from_witness(&
builder, coordinate));
126 for (
const auto& commitment : native_input.claim_data.shifted.commitments) {
127 result.claim_data.shifted.commitments.emplace_back(
128 RecursiveCurve::Group::from_witness(&
builder, commitment));
130 for (
const auto& evaluation : native_input.claim_data.shifted.shifted_evaluations) {
131 result.claim_data.shifted.shifted_evaluations.emplace_back(
132 RecursiveCurve::ScalarField::from_witness(&
builder, evaluation));
134 for (
const auto& rho_power : native_input.claim_data.shifted.rho_powers) {
135 result.claim_data.shifted.rho_powers.emplace_back(
136 RecursiveCurve::ScalarField::from_witness(&
builder, rho_power));
139 result.claim_data.univariate = {
140 { RecursiveCurve::ScalarField::from_witness(&
builder,
141 native_input.claim_data.univariate.opening_pair.challenge),
142 RecursiveCurve::ScalarField::from_witness(&
builder,
143 native_input.claim_data.univariate.opening_pair.evaluation) },
144 RecursiveCurve::Group::from_witness(&
builder, native_input.claim_data.univariate.commitment)
153 return prover_transcript->export_proof();
162TEST_F(TripleIPARecursiveTest, RecursiveReduceVerifyEmitsAccumulator)
164 auto input = create_triple_ipa_input();
165 auto proof = prove_triple_ipa(input);
168 auto recursive_input = to_recursive_input(
builder, input);
170 auto accumulator = RecursivePCS::reduce_verify(recursive_input.claim_data.batch(), transcript);
172 EXPECT_EQ(accumulator.u_challenges_inv.size(), log_n);
173 EXPECT_TRUE(accumulator.running_truth_value);
184TEST_F(TripleIPARecursiveTest, RecursiveReduceVerifyRejectsTamperedProof)
186 auto input = create_triple_ipa_input();
187 auto proof = prove_triple_ipa(input);
188 ASSERT_FALSE(proof.empty());
190 proof[0] += ProofElement::one();
193 auto recursive_input = to_recursive_input(
builder, input);
195 auto accumulator = RecursivePCS::reduce_verify(recursive_input.claim_data.batch(), transcript);
196 static_cast<void>(accumulator);
#define BB_ASSERT_EQ(actual, expected,...)
Common transcript class for both parties. Stores the data for the current round, as well as the manif...
std::vector< DataType > Proof
CommitmentKey object over a pairing group 𝔾₁.
CommitmentKey< Curve > CK
Polynomial random_polynomial(const size_t poly_size)
VerifierCommitmentKey< Curve > VK
std::vector< Fr > random_evaluation_point(const size_t num_variables)
static void SetUpTestSuite()
static Polynomial< FF > construct(std::span< const FF > challenges, size_t log_num_monomials)
Construct eq(X, r) coefficient table over Boolean hypercube {0,1}^d.
static bool check(const Builder &circuit)
Check the witness satisifies the circuit.
bb::TripleIpaClaimData< Curve > TripleIpaClaimData
static void compute_opening_proof(const CK &ck, const TripleIpaInput &input, const std::shared_ptr< Transcript > &transcript)
bb::TripleIpaInput< Curve > TripleIpaInput
Representation of the Grumpkin Verifier Commitment Key inside a bn254 circuit.
typename Group::affine_element AffineElement
A simple wrapper around a vector of stdlib field elements representing a proof.
static void add_default(Builder &builder)
Add default public inputs when they are not present.
void init_grumpkin_file_crs_factory(const std::filesystem::path &path)
std::filesystem::path bb_crs_path()
std::shared_ptr< factories::CrsFactory< curve::Grumpkin > > get_grumpkin_crs_factory()
Entry point for Barretenberg command-line interface.
TEST_F(IPATest, ChallengesAreZero)
BaseTranscript< stdlib::StdlibCodec< stdlib::field_t< UltraCircuitBuilder > >, stdlib::poseidon2< UltraCircuitBuilder > > UltraStdlibTranscript
UltraCircuitBuilder_< UltraExecutionTraceBlocks > UltraCircuitBuilder
CommitmentKey< Curve > ck
VerifierCommitmentKey< Curve > vk
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
static constexpr field zero()
Curve grumpkin in circuit setting.