barretenberg
Loading...
Searching...
No Matches
poseidon2_internal_relation.hpp
1#pragma once
2#include "barretenberg/crypto/poseidon2/poseidon2_params.hpp"
3#include "relation_types.hpp"
4
5namespace proof_system {
6
7template <typename FF_> class Poseidon2InternalRelationImpl {
8 public:
9 using FF = FF_;
10
11 static constexpr std::array<size_t, 4> SUBRELATION_PARTIAL_LENGTHS{
12 7, // internal poseidon2 round sub-relation for first value
13 7, // internal poseidon2 round sub-relation for second value
14 7, // internal poseidon2 round sub-relation for third value
15 7, // internal poseidon2 round sub-relation for fourth value
16 };
17
37 template <typename ContainerOverSubrelations, typename AllEntities, typename Parameters>
38 void static accumulate(ContainerOverSubrelations& evals,
39 const AllEntities& in,
40 const Parameters&,
41 const FF& scaling_factor)
42 {
43 using Accumulator = std::tuple_element_t<0, ContainerOverSubrelations>;
44 using View = typename Accumulator::View;
45 auto w_l = View(in.w_l);
46 auto w_r = View(in.w_r);
47 auto w_o = View(in.w_o);
48 auto w_4 = View(in.w_4);
49 auto w_l_shift = View(in.w_l_shift);
50 auto w_r_shift = View(in.w_r_shift);
51 auto w_o_shift = View(in.w_o_shift);
52 auto w_4_shift = View(in.w_4_shift);
53 auto q_l = View(in.q_l);
54 auto q_poseidon2_internal = View(in.q_poseidon2_internal);
55
56 // add round constants
57 auto s1 = w_l + q_l;
58
59 // apply s-box round
60 auto u1 = s1 * s1;
61 u1 *= u1;
62 u1 *= s1;
63 auto u2 = w_r;
64 auto u3 = w_o;
65 auto u4 = w_4;
66
67 // matrix mul with v = M_I * u 4 muls and 7 additions
68 auto sum = u1 + u2 + u3 + u4;
69
70 auto v1 = u1 * crypto::Poseidon2Bn254ScalarFieldParams::internal_matrix_diagonal[0];
71 v1 += sum;
72 auto tmp = q_poseidon2_internal * (v1 - w_l_shift);
73 tmp *= scaling_factor;
74 std::get<0>(evals) += tmp;
75
76 auto v2 = u2 * crypto::Poseidon2Bn254ScalarFieldParams::internal_matrix_diagonal[1];
77 v2 += sum;
78 tmp = q_poseidon2_internal * (v2 - w_r_shift);
79 tmp *= scaling_factor;
80 std::get<1>(evals) += tmp;
81
82 auto v3 = u3 * crypto::Poseidon2Bn254ScalarFieldParams::internal_matrix_diagonal[2];
83 v3 += sum;
84 tmp = q_poseidon2_internal * (v3 - w_o_shift);
85 tmp *= scaling_factor;
86 std::get<2>(evals) += tmp;
87
88 auto v4 = u4 * crypto::Poseidon2Bn254ScalarFieldParams::internal_matrix_diagonal[3];
89 v4 += sum;
90 tmp = q_poseidon2_internal * (v4 - w_4_shift);
91 tmp *= scaling_factor;
92 std::get<3>(evals) += tmp;
93 };
94}; // namespace proof_system
95
96template <typename FF> using Poseidon2InternalRelation = Relation<Poseidon2InternalRelationImpl<FF>>;
97} // namespace proof_system
Definition: poseidon2_internal_relation.hpp:7
static void accumulate(ContainerOverSubrelations &evals, const AllEntities &in, const Parameters &, const FF &scaling_factor)
Expression for the poseidon2 internal round relation, based on I_i in Section 6 of https://eprint....
Definition: poseidon2_internal_relation.hpp:38