UltrafastSecp256k1 3.50.0
Ultra high-performance secp256k1 elliptic curve cryptography library
Loading...
Searching...
No Matches
pedersen.hpp
Go to the documentation of this file.
1#ifndef SECP256K1_PEDERSEN_HPP
2#define SECP256K1_PEDERSEN_HPP
3#pragma once
4
5// ============================================================================
6// Pedersen Commitments for secp256k1
7// ============================================================================
8// Homomorphic commitments: C = v*H + r*G
9// - v: committed value (scalar)
10// - r: blinding factor (scalar)
11// - G: generator (standard secp256k1 generator)
12// - H: alternate generator (nothing-up-my-sleeve construction)
13//
14// Properties:
15// - Hiding: C reveals nothing about v (given random r)
16// - Binding: cannot open C to a different (v', r')
17// - Homomorphic: C1 + C2 = commit(v1+v2, r1+r2)
18//
19// Used in: Confidential Transactions, Mimblewimble, Liquid, Bulletproofs
20// ============================================================================
21
22#include <array>
23#include <cstdint>
24#include <cstddef>
25#include <utility>
26#include "secp256k1/scalar.hpp"
27#include "secp256k1/point.hpp"
28
29namespace secp256k1 {
30
31// -- Pedersen Commitment ------------------------------------------------------
32
34 fast::Point point; // The commitment point C = v*H + r*G
35
36 // Serialize to 33 bytes (compressed point)
37 std::array<std::uint8_t, 33> to_compressed() const;
38
39 // Add two commitments: C1 + C2 (homomorphic addition)
41
42 // Verify that this commitment equals commit(value, blinding)
43 bool verify(const fast::Scalar& value, const fast::Scalar& blinding) const;
44};
45
46// -- Alternate Generator H ----------------------------------------------------
47
48// Get alternate generator H (nothing-up-my-sleeve: H = lift_x(SHA256("Pedersen_H")))
49// Cached after first call.
51
52// -- Commit / Open ------------------------------------------------------------
53
54// Create Pedersen commitment: C = v*H + r*G
55// value: the committed value
56// blinding: random blinding factor (must be secret)
58 const fast::Scalar& blinding);
59
60// Verify commitment opens to (value, blinding):
61// C == v*H + r*G
62bool pedersen_verify(const PedersenCommitment& commitment,
63 const fast::Scalar& value,
64 const fast::Scalar& blinding);
65
66// -- Homomorphic Operations ---------------------------------------------------
67
68// Verify that commitments sum to zero (for balance proofs):
69// sum(commitments) + excess*G == 0
70// This checks: sum(v_i)*H + sum(r_i)*G == 0
71// In practice: sum(output_v) - sum(input_v) = 0 and excess = sum(output_r) - sum(input_r)
72bool pedersen_verify_sum(const PedersenCommitment* commitments_pos,
73 std::size_t n_pos,
74 const PedersenCommitment* commitments_neg,
75 std::size_t n_neg);
76
77// Compute blinding factor that balances a set of commitments:
78// Given input blindings and output blindings (except last),
79// compute the last output blinding so the sum balances.
80// blind_out = sum(blind_in) - sum(blind_out_partial)
82 std::size_t n_in,
83 const fast::Scalar* blinds_out,
84 std::size_t n_out);
85
86// -- Switch Commitment (Mimblewimble) -----------------------------------------
87
88// Create switch commitment: C = v*H + r*G + switch_blind*J
89// J is a third generator for switch commitments
91
93 const fast::Scalar& blinding,
94 const fast::Scalar& switch_blind);
95
96} // namespace secp256k1
97
98#endif // SECP256K1_PEDERSEN_HPP
const fast::Point & pedersen_generator_J()
PedersenCommitment pedersen_switch_commit(const fast::Scalar &value, const fast::Scalar &blinding, const fast::Scalar &switch_blind)
bool pedersen_verify_sum(const PedersenCommitment *commitments_pos, std::size_t n_pos, const PedersenCommitment *commitments_neg, std::size_t n_neg)
bool pedersen_verify(const PedersenCommitment &commitment, const fast::Scalar &value, const fast::Scalar &blinding)
fast::Scalar pedersen_blind_sum(const fast::Scalar *blinds_in, std::size_t n_in, const fast::Scalar *blinds_out, std::size_t n_out)
PedersenCommitment pedersen_commit(const fast::Scalar &value, const fast::Scalar &blinding)
const fast::Point & pedersen_generator_H()
bool verify(const fast::Scalar &value, const fast::Scalar &blinding) const
std::array< std::uint8_t, 33 > to_compressed() const
PedersenCommitment operator+(const PedersenCommitment &rhs) const