26template <
typename T,
typename =
void>
struct is_iterable : std::false_type {};
30struct is_iterable<T,
std::void_t<decltype(std::begin(std::declval<T&>())), decltype(std::end(std::declval<T&>()))>>
35#define STANDARD_TESTING_TAGS \
36 const size_t parent_id = 0; \
37 [[maybe_unused]] const auto clear_tag = OriginTag(); \
38 const auto submitted_value_origin_tag = OriginTag( \
39 parent_id, 0, true); \
40 const auto next_submitted_value_origin_tag = OriginTag( \
41 parent_id, 1, true); \
42 const auto challenge_origin_tag = OriginTag( \
43 parent_id, 0, false); \
44 const auto next_challenge_tag = OriginTag( \
45 parent_id, 1, false); \
46 const auto first_two_merged_tag = \
47 OriginTag(submitted_value_origin_tag, \
48 challenge_origin_tag);
50 const auto first_and_third_merged_tag = \
51 OriginTag(submitted_value_origin_tag, \
54 const auto first_second_third_merged_tag = OriginTag( \
55 first_two_merged_tag, next_challenge_tag);
57 const auto first_to_fourth_merged_tag = \
58 OriginTag(first_second_third_merged_tag, \
59 next_submitted_value_origin_tag);
61 const auto instant_death_tag = []() { \
62 auto some_tag = OriginTag(); \
70#ifndef AZTEC_NO_ORIGIN_TAGS
73 static constexpr size_t CONSTANT =
static_cast<size_t>(-1);
74 static constexpr size_t FREE_WITNESS =
static_cast<size_t>(-2);
112 OriginTag(
size_t transcript_idx,
size_t round_number,
bool is_submitted =
true)
139 template <
class... T>
147 for (
const auto& next_tag : { rest... }) {
176inline std::ostream&
operator<<(std::ostream& os, OriginTag
const& v)
178 return os <<
"{ transcript_idx: " << v.transcript_index <<
", round_prov: " << v.round_provenance
179 <<
", instadeath: " << v.instant_death <<
" }";
192 OriginTag(
size_t transcript_idx [[maybe_unused]],
193 size_t round_number [[maybe_unused]],
194 bool is_submitted [[maybe_unused]] =
true)
203 static bool is_empty() {
return true; };
209inline std::ostream&
operator<<(std::ostream& os, OriginTag
const&)
211 return os <<
"{ Origin Tag tracking is disabled in release builds }";
224template <
bool in_circuit,
typename T>
inline void assign_origin_tag(T& elem,
const OriginTag&
tag)
226 if constexpr (in_circuit) {
227 if constexpr (is_iterable_v<T>) {
228 for (
auto& e : elem) {
229 e.set_origin_tag(
tag);
232 elem.set_origin_tag(
tag);
245template <
bool in_circuit,
typename T>
inline void check_origin_tag(T& elem,
const OriginTag&
tag)
247 if constexpr (in_circuit) {
248 if constexpr (is_iterable_v<T>) {
249 for (
auto& e : elem) {
267 if constexpr (in_circuit) {
268 for (
auto& entry : input) {
269 entry.unset_free_witness_tag();
284template <
bool in_circuit,
typename Codec,
typename T>
287 if constexpr (in_circuit) {
288 assign_origin_tag<in_circuit>(
const_cast<T&
>(component),
tag);
291 return Codec::serialize_to_fields(component);
302template <
typename TranscriptType>
inline OriginTag
extract_transcript_tag(
const TranscriptType& transcript)
304 return OriginTag(transcript.transcript_index, transcript.round_index,
true);
#define BB_ASSERT(expression,...)
#define BB_ASSERT_LT(left, right,...)
std::ostream & operator<<(std::ostream &os, uint256_t const &a)
Entry point for Barretenberg command-line interface.
std::vector< typename Codec::DataType > tag_and_serialize(const T &component, const OriginTag &tag)
Tag a component with a given origin tag and serialize it to field elements.
void check_round_provenance(const uint256_t &provenance_a, const uint256_t &provenance_b)
Detect if two elements from the same transcript are performing a suspicious interaction.
OriginTag extract_transcript_tag(const TranscriptType &transcript)
Extract origin tag context from a transcript.
void unset_free_witness_tags(std::vector< DataType > &input)
Unsets free witness tags on all elements in a vector.
void assign_origin_tag(T &elem, const OriginTag &tag)
Assigns an origin tag to an element or all elements in an iterable container.
void check_origin_tag(T &elem, const OriginTag &tag)
Checks that an element or all elements in an iterable container have the expected origin tag.
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
constexpr bool is_iterable_v
void unset_free_witness()
static constexpr size_t CONSTANT
OriginTag & operator=(const OriginTag &other)=default
static constexpr size_t FREE_WITNESS
void clear_round_provenance()
Clear the round_provenance to address round provenance false positives.
bool is_free_witness() const
numeric::uint256_t round_provenance
bool operator==(const OriginTag &other) const