26struct ExperimentalCircuitBackendAccess;
87inline std::vector<ScalarBytes>
scalar_bytes(
const std::vector<FieldElement>& values) {
88 std::vector<ScalarBytes> out;
89 out.reserve(values.size());
133 [[nodiscard]] virtual std::shared_ptr<const
void> find_public_data_impl(
134 const std::array<
unsigned char, 32>& key) const = 0;
135 virtual
void insert_public_data_impl(std::array<
unsigned char, 32> key,
136 std::shared_ptr<const
void> value) = 0;
145 [[nodiscard]]
static std::shared_ptr<const void> find_public_data(
147 const std::array<unsigned char, 32>& key);
149 std::array<unsigned char, 32> key,
150 std::shared_ptr<const void> value);
168 [[nodiscard]]
bool empty() const noexcept;
172 std::unique_ptr<
Impl> impl_;
174 [[nodiscard]] std::shared_ptr<const
void> find_public_data_impl(
175 const std::array<
unsigned char, 32>& key) const override;
176 void insert_public_data_impl(std::array<
unsigned char, 32> key,
177 std::shared_ptr<const
void> value) override;
196 [[nodiscard]] std::size_t size() const noexcept;
210 [[nodiscard]] std::shared_ptr<const
void> find_public_data(const std::array<
unsigned char, 32>& key) const;
212 void insert_public_data(std::array<
unsigned char, 32> key, std::shared_ptr<const
void> value);
220 std::unique_ptr<
Impl> impl_;
222 [[nodiscard]] std::shared_ptr<const
void> find_public_data_impl(
223 const std::array<
unsigned char, 32>& key) const override;
224 void insert_public_data_impl(std::array<
unsigned char, 32> key,
225 std::shared_ptr<const
void> value) override;
276 std::span<const unsigned char> statement_binding = {},
277 ExperimentalCircuitBackend* cache =
nullptr);
290 std::span<const unsigned char> statement_binding = {},
291 ExperimentalCircuitBackend* cache =
nullptr);
301Result<ExperimentalCircuitNormArgProof> prove_experimental_circuit_norm_arg_to_commitment(
302 const NativeBulletproofCircuit& circuit,
303 const BulletproofAssignmentData& assignment,
304 const PointBytes& witness_commitment,
306 std::span<const unsigned char> statement_binding = {},
307 ExperimentalCircuitBackend* cache =
nullptr);
317 const NativeBulletproofCircuit& circuit,
318 const ExperimentalCircuitNormArgProof& proof,
320 std::span<const unsigned char> statement_binding = {},
321 ExperimentalCircuitBackend* cache =
nullptr);
338 const NativeBulletproofCircuit& circuit,
339 const BulletproofAssignmentData& assignment,
340 const ScalarBytes&
nonce,
342 std::span<const unsigned char> statement_binding = {},
343 ExperimentalCircuitBackend* cache =
nullptr);
353 const NativeBulletproofCircuit& circuit,
354 const ExperimentalCircuitZkNormArgProof& proof,
356 std::span<const unsigned char> statement_binding = {},
357 ExperimentalCircuitBackend* cache =
nullptr);
367 const NativeBulletproofCircuit& circuit,
368 const BulletproofAssignmentData& assignment,
369 const ScalarBytes&
nonce,
370 std::span<const PointBytes> public_commitments,
372 std::span<const unsigned char> statement_binding = {},
373 ExperimentalCircuitBackend* cache =
nullptr);
382 const NativeBulletproofCircuit& circuit,
383 const ExperimentalCircuitZkNormArgProof& proof,
384 std::span<const PointBytes> public_commitments,
386 std::span<const unsigned char> statement_binding = {},
387 ExperimentalCircuitBackend* cache =
nullptr);
High-level Purify key generation, evaluation, witness generation, and circuit helpers.
Purify result carrier that either holds a value or an error.
Field element modulo the backend scalar field used by this implementation.
std::array< unsigned char, 32 > to_bytes_be() const
Serializes the field element in big-endian form.
Move-only packed Purify secret stored in dedicated heap memory.
Common interface for reusable experimental BPPP backend state.
ExperimentalCircuitBackend(const ExperimentalCircuitBackend &)=delete
ExperimentalCircuitBackend & operator=(const ExperimentalCircuitBackend &)=delete
ExperimentalCircuitBackend(ExperimentalCircuitBackend &&) noexcept=default
friend struct detail::ExperimentalCircuitBackendAccess
Thread-local clone of one warmed experimental BPPP backend-resource line.
ExperimentalCircuitCacheLine & operator=(const ExperimentalCircuitCacheLine &)=delete
~ExperimentalCircuitCacheLine() override
ExperimentalCircuitCacheLine(const ExperimentalCircuitCacheLine &)=delete
ExperimentalCircuitCacheLine & operator=(ExperimentalCircuitCacheLine &&other) noexcept
ExperimentalCircuitCacheLine(ExperimentalCircuitCacheLine &&other) noexcept
Caller-owned cache for reusable experimental circuit reduction and BPPP backend data.
ExperimentalCircuitCache & operator=(const ExperimentalCircuitCache &)=delete
ExperimentalCircuitCache(ExperimentalCircuitCache &&other) noexcept
ExperimentalCircuitCache & operator=(ExperimentalCircuitCache &&other) noexcept
ExperimentalCircuitCache(const ExperimentalCircuitCache &)=delete
~ExperimentalCircuitCache()
std::array< unsigned char, 32 > ScalarBytes
Big-endian 32-byte scalar encoding.
Result< PointBytes > commit_experimental_circuit_witness(const NativeBulletproofCircuit &circuit, const BulletproofAssignmentData &assignment, purify_secp_context *secp_context, std::span< const unsigned char > statement_binding={}, ExperimentalCircuitBackend *cache=nullptr)
Commits to the reduced witness coordinates used by the experimental circuit-to-BPPP reduction.
Result< PointBytes > commit_norm_arg(const NormArgInputs &inputs, purify_secp_context *secp_context)
Computes the public BPPP commitment for a standalone norm-argument input bundle.
Result< bool > verify_experimental_circuit_norm_arg(const NativeBulletproofCircuit &circuit, const ExperimentalCircuitNormArgProof &proof, purify_secp_context *secp_context, std::span< const unsigned char > statement_binding={}, ExperimentalCircuitBackend *cache=nullptr)
Verifies an experimental transparent circuit proof produced by prove_experimental_circuit_norm_arg.
GeneratorBytes base_generator(purify_secp_context *secp_context)
Returns the serialized secp256k1 base generator used as the blind generator.
Result< bool > verify_experimental_circuit_zk_norm_arg_with_public_commitments(const NativeBulletproofCircuit &circuit, const ExperimentalCircuitZkNormArgProof &proof, std::span< const PointBytes > public_commitments, purify_secp_context *secp_context, std::span< const unsigned char > statement_binding={}, ExperimentalCircuitBackend *cache=nullptr)
Verifies an experimental masked circuit proof against explicit public commitment points.
std::array< unsigned char, 33 > PointBytes
Compressed 33-byte curve-point encoding.
Result< ExperimentalCircuitZkNormArgProof > prove_experimental_circuit_zk_norm_arg_with_public_commitments(const NativeBulletproofCircuit &circuit, const BulletproofAssignmentData &assignment, const ScalarBytes &nonce, std::span< const PointBytes > public_commitments, purify_secp_context *secp_context, std::span< const unsigned char > statement_binding={}, ExperimentalCircuitBackend *cache=nullptr)
Produces an experimental masked circuit proof bound to explicit public commitment points.
GeneratorBytes value_generator_h(purify_secp_context *secp_context)
Returns the serialized alternate generator used for committed values.
Result< CommittedPurifyWitness > commit_output_witness(const Bytes &message, const SecretKey &secret, const ScalarBytes &blind, purify_secp_context *secp_context)
Evaluates Purify, derives its witness, and commits to the output using Purify's default generators.
Result< std::vector< PointBytes > > create_generators(std::size_t count, purify_secp_context *secp_context)
Expands the BPPP generator list.
Result< bool > verify_experimental_circuit_zk_norm_arg(const NativeBulletproofCircuit &circuit, const ExperimentalCircuitZkNormArgProof &proof, purify_secp_context *secp_context, std::span< const unsigned char > statement_binding={}, ExperimentalCircuitBackend *cache=nullptr)
Verifies an experimental masked circuit proof produced by prove_experimental_circuit_zk_norm_arg.
std::array< unsigned char, 33 > GeneratorBytes
Serialized generator encoding used by the BPPP bridge.
Result< PointBytes > pedersen_commit_char(const ScalarBytes &blind, const ScalarBytes &value, purify_secp_context *secp_context)
Computes a Pedersen commitment to an arbitrary 32-byte scalar value using Purify's default generators...
ScalarBytes scalar_bytes(const FieldElement &value)
Serializes a Purify field element into the scalar encoding expected by the BPPP bridge.
Result< ExperimentalCircuitZkNormArgProof > prove_experimental_circuit_zk_norm_arg(const NativeBulletproofCircuit &circuit, const BulletproofAssignmentData &assignment, const ScalarBytes &nonce, purify_secp_context *secp_context, std::span< const unsigned char > statement_binding={}, ExperimentalCircuitBackend *cache=nullptr)
Produces an experimental masked circuit proof over the reduced BPPP relation.
std::vector< unsigned char > Bytes
Dynamically sized byte string used for messages, serialized witnesses, and proofs.
std::vector< PointBytes > generators
Columnar witness assignment compatible with the native Bulletproof circuit layout.
Native in-memory representation of a Bulletproof-style arithmetic circuit.
Purify witness bundle together with a Pedersen commitment to the output.
BulletproofAssignmentData assignment
Experimental transparent circuit proof backed by the standalone BPPP norm argument.
Experimental masked circuit proof that hides the reduced witness before the final BPPP argument.
Standalone BPPP norm-argument proof bundle with all verifier-side inputs.
std::vector< PointBytes > generators
std::vector< ScalarBytes > c_vec