@@ -78,6 +78,62 @@ TEST(Databus, CallDataAndReturnData)
7878 EXPECT_TRUE (CircuitChecker::check (builder));
7979}
8080
81+ TEST (Databus, ConstantEntryAccess)
82+ {
83+
84+ Builder builder;
85+ databus_ct databus;
86+ fr value_0 = 13 ;
87+ fr value_1 = 12 ;
88+ auto constant_0 = witness_ct::create_constant_witness (&builder, value_0);
89+ auto constant_1 = witness_ct::create_constant_witness (&builder, value_1);
90+ databus.return_data .set_values ({ constant_0, constant_1 });
91+ field_ct idx_0 (witness_ct (&builder, 0 ));
92+ field_ct idx_1 (witness_ct (&builder, 1 ));
93+
94+ field_ct read_result_0 = databus.return_data [idx_0];
95+ field_ct read_result_1 = databus.return_data [idx_1];
96+
97+ EXPECT_EQ (value_0, read_result_0.get_value ());
98+ EXPECT_EQ (value_1, read_result_1.get_value ());
99+ EXPECT_TRUE (CircuitChecker::check (builder));
100+ }
101+
102+ TEST (Databus, ConstantAndUnnormalizedIndex)
103+ {
104+ Builder builder;
105+ databus_ct databus;
106+ std::array<fr, 3 > raw_calldata_values = { 54 , 32 , 30 };
107+ std::array<fr, 3 > raw_returndata_values = { 54 , 32 , 116 };
108+ // make the two first elements constants and the second two elements non-normalized
109+ // Populate the calldata in the databus
110+ std::vector<field_ct> calldata_values;
111+ for (auto & value : raw_calldata_values) {
112+ calldata_values.emplace_back (witness_ct (&builder, value));
113+ }
114+ databus.calldata .set_values (calldata_values);
115+
116+ // Populate the return data in the databus std::vector<field_ct> return_data_values;
117+ std::vector<field_ct> returndata_values;
118+ for (auto & value : raw_returndata_values) {
119+ returndata_values.emplace_back (witness_ct (&builder, value));
120+ }
121+ databus.return_data .set_values (returndata_values);
122+
123+ // constant first index
124+ field_ct idx_0 (witness_ct::create_constant_witness (&builder, 0 ));
125+ field_ct idx_1 (witness_ct (&builder, 1 ));
126+ // un-normalized index (with multiplicative constant 2)
127+ field_ct idx_2 = idx_1 + idx_1;
128+ field_ct sum = databus.calldata [idx_0] + databus.calldata [idx_1] + databus.calldata [idx_2];
129+
130+ databus.return_data [0 ].assert_equal (databus.calldata [0 ]);
131+ databus.return_data [1 ].assert_equal (databus.calldata [1 ]);
132+ databus.return_data [2 ].assert_equal (sum);
133+
134+ EXPECT_TRUE (CircuitChecker::check (builder));
135+ }
136+
81137/* *
82138 * @brief A failure test demonstrating that trying to prove (via a databus read) that an erroneous value is present in
83139 * the databus will result in an invalid witness.
@@ -179,4 +235,4 @@ TEST(Databus, DuplicateRead)
179235 databus.return_data [idx_1];
180236
181237 EXPECT_TRUE (CircuitChecker::check (builder));
182- }
238+ }
0 commit comments