Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,7 @@ src_libbitcoin_system_la_SOURCES = \
src/wallet/addresses/bitcoin_uri.cpp \
src/wallet/addresses/payment_address.cpp \
src/wallet/addresses/qr_code.cpp \
src/wallet/addresses/silent_payment.cpp \
src/wallet/addresses/stealth_address.cpp \
src/wallet/addresses/stealth_receiver.cpp \
src/wallet/addresses/stealth_sender.cpp \
Expand Down Expand Up @@ -438,6 +439,8 @@ test_libbitcoin_system_test_SOURCES = \
test/wallet/addresses/checked.cpp \
test/wallet/addresses/payment_address.cpp \
test/wallet/addresses/qr_code.cpp \
test/wallet/addresses/silent_payment.cpp \
test/wallet/addresses/silent_payment_vectors.hpp \
test/wallet/addresses/stealth_address.cpp \
test/wallet/addresses/stealth_receiver.cpp \
test/wallet/addresses/stealth_sender.cpp \
Expand Down Expand Up @@ -983,6 +986,7 @@ include_bitcoin_system_wallet_addresses_HEADERS = \
include/bitcoin/system/wallet/addresses/checked.hpp \
include/bitcoin/system/wallet/addresses/payment_address.hpp \
include/bitcoin/system/wallet/addresses/qr_code.hpp \
include/bitcoin/system/wallet/addresses/silent_payment.hpp \
include/bitcoin/system/wallet/addresses/stealth_address.hpp \
include/bitcoin/system/wallet/addresses/stealth_receiver.hpp \
include/bitcoin/system/wallet/addresses/stealth_sender.hpp \
Expand Down Expand Up @@ -1035,4 +1039,3 @@ target_examples = \
examples/libbitcoin-system-examples

examples: ${target_examples}

Original file line number Diff line number Diff line change
Expand Up @@ -398,6 +398,7 @@
<ClCompile Include="..\..\..\..\test\wallet\addresses\checked.cpp" />
<ClCompile Include="..\..\..\..\test\wallet\addresses\payment_address.cpp" />
<ClCompile Include="..\..\..\..\test\wallet\addresses\qr_code.cpp" />
<ClCompile Include="..\..\..\..\test\wallet\addresses\silent_payment.cpp" />
<ClCompile Include="..\..\..\..\test\wallet\addresses\stealth_address.cpp" />
<ClCompile Include="..\..\..\..\test\wallet\addresses\stealth_receiver.cpp" />
<ClCompile Include="..\..\..\..\test\wallet\addresses\stealth_sender.cpp" />
Expand Down Expand Up @@ -461,6 +462,7 @@
<ClInclude Include="..\..\..\..\test\hash\siphash.hpp" />
<ClInclude Include="..\..\..\..\test\mocks\blocks.hpp" />
<ClInclude Include="..\..\..\..\test\test.hpp" />
<ClInclude Include="..\..\..\..\test\wallet\addresses\silent_payment_vectors.hpp" />
<ClInclude Include="..\..\..\..\test\wallet\mnemonics\electrum.hpp" />
<ClInclude Include="..\..\..\..\test\wallet\mnemonics\electrum_v1.hpp" />
<ClInclude Include="..\..\..\..\test\wallet\mnemonics\mnemonic.hpp" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -702,6 +702,9 @@
<ClCompile Include="..\..\..\..\test\wallet\addresses\qr_code.cpp">
<Filter>src\wallet\addresses</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\test\wallet\addresses\silent_payment.cpp">
<Filter>src\wallet\addresses</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\test\wallet\addresses\stealth_address.cpp">
<Filter>src\wallet\addresses</Filter>
</ClCompile>
Expand Down Expand Up @@ -827,6 +830,9 @@
<ClInclude Include="..\..\..\..\test\test.hpp">
<Filter>src</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\test\wallet\addresses\silent_payment_vectors.hpp">
<Filter>src\wallet\addresses</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\test\wallet\mnemonics\electrum.hpp">
<Filter>src\wallet\mnemonics</Filter>
</ClInclude>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -315,6 +315,7 @@
<ClCompile Include="..\..\..\..\src\wallet\addresses\qrencode\split.c">
<ObjectFileName>$(IntDir)src_wallet_addresses_qrencode_split.c.obj</ObjectFileName>
</ClCompile>
<ClCompile Include="..\..\..\..\src\wallet\addresses\silent_payment.cpp" />
<ClCompile Include="..\..\..\..\src\wallet\addresses\stealth_address.cpp" />
<ClCompile Include="..\..\..\..\src\wallet\addresses\stealth_receiver.cpp" />
<ClCompile Include="..\..\..\..\src\wallet\addresses\stealth_sender.cpp" />
Expand Down Expand Up @@ -626,6 +627,7 @@
<ClInclude Include="..\..\..\..\include\bitcoin\system\wallet\addresses\checked.hpp" />
<ClInclude Include="..\..\..\..\include\bitcoin\system\wallet\addresses\payment_address.hpp" />
<ClInclude Include="..\..\..\..\include\bitcoin\system\wallet\addresses\qr_code.hpp" />
<ClInclude Include="..\..\..\..\include\bitcoin\system\wallet\addresses\silent_payment.hpp" />
<ClInclude Include="..\..\..\..\include\bitcoin\system\wallet\addresses\stealth_address.hpp" />
<ClInclude Include="..\..\..\..\include\bitcoin\system\wallet\addresses\stealth_receiver.hpp" />
<ClInclude Include="..\..\..\..\include\bitcoin\system\wallet\addresses\stealth_sender.hpp" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -603,6 +603,9 @@
<ClCompile Include="..\..\..\..\src\wallet\addresses\qrencode\split.c">
<Filter>src\wallet\addresses\qrencode</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\src\wallet\addresses\silent_payment.cpp">
<Filter>src\wallet\addresses</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\src\wallet\addresses\stealth_address.cpp">
<Filter>src\wallet\addresses</Filter>
</ClCompile>
Expand Down Expand Up @@ -1472,6 +1475,9 @@
<ClInclude Include="..\..\..\..\include\bitcoin\system\wallet\addresses\qr_code.hpp">
<Filter>include\bitcoin\system\wallet\addresses</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\include\bitcoin\system\wallet\addresses\silent_payment.hpp">
<Filter>include\bitcoin\system\wallet\addresses</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\include\bitcoin\system\wallet\addresses\stealth_address.hpp">
<Filter>include\bitcoin\system\wallet\addresses</Filter>
</ClInclude>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -398,6 +398,7 @@
<ClCompile Include="..\..\..\..\test\wallet\addresses\checked.cpp" />
<ClCompile Include="..\..\..\..\test\wallet\addresses\payment_address.cpp" />
<ClCompile Include="..\..\..\..\test\wallet\addresses\qr_code.cpp" />
<ClCompile Include="..\..\..\..\test\wallet\addresses\silent_payment.cpp" />
<ClCompile Include="..\..\..\..\test\wallet\addresses\stealth_address.cpp" />
<ClCompile Include="..\..\..\..\test\wallet\addresses\stealth_receiver.cpp" />
<ClCompile Include="..\..\..\..\test\wallet\addresses\stealth_sender.cpp" />
Expand Down Expand Up @@ -461,6 +462,7 @@
<ClInclude Include="..\..\..\..\test\hash\siphash.hpp" />
<ClInclude Include="..\..\..\..\test\mocks\blocks.hpp" />
<ClInclude Include="..\..\..\..\test\test.hpp" />
<ClInclude Include="..\..\..\..\test\wallet\addresses\silent_payment_vectors.hpp" />
<ClInclude Include="..\..\..\..\test\wallet\mnemonics\electrum.hpp" />
<ClInclude Include="..\..\..\..\test\wallet\mnemonics\electrum_v1.hpp" />
<ClInclude Include="..\..\..\..\test\wallet\mnemonics\mnemonic.hpp" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -702,6 +702,9 @@
<ClCompile Include="..\..\..\..\test\wallet\addresses\qr_code.cpp">
<Filter>src\wallet\addresses</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\test\wallet\addresses\silent_payment.cpp">
<Filter>src\wallet\addresses</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\test\wallet\addresses\stealth_address.cpp">
<Filter>src\wallet\addresses</Filter>
</ClCompile>
Expand Down Expand Up @@ -827,6 +830,9 @@
<ClInclude Include="..\..\..\..\test\test.hpp">
<Filter>src</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\test\wallet\addresses\silent_payment_vectors.hpp">
<Filter>src\wallet\addresses</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\test\wallet\mnemonics\electrum.hpp">
<Filter>src\wallet\mnemonics</Filter>
</ClInclude>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -315,6 +315,7 @@
<ClCompile Include="..\..\..\..\src\wallet\addresses\qrencode\split.c">
<ObjectFileName>$(IntDir)src_wallet_addresses_qrencode_split.c.obj</ObjectFileName>
</ClCompile>
<ClCompile Include="..\..\..\..\src\wallet\addresses\silent_payment.cpp" />
<ClCompile Include="..\..\..\..\src\wallet\addresses\stealth_address.cpp" />
<ClCompile Include="..\..\..\..\src\wallet\addresses\stealth_receiver.cpp" />
<ClCompile Include="..\..\..\..\src\wallet\addresses\stealth_sender.cpp" />
Expand Down Expand Up @@ -626,6 +627,7 @@
<ClInclude Include="..\..\..\..\include\bitcoin\system\wallet\addresses\checked.hpp" />
<ClInclude Include="..\..\..\..\include\bitcoin\system\wallet\addresses\payment_address.hpp" />
<ClInclude Include="..\..\..\..\include\bitcoin\system\wallet\addresses\qr_code.hpp" />
<ClInclude Include="..\..\..\..\include\bitcoin\system\wallet\addresses\silent_payment.hpp" />
<ClInclude Include="..\..\..\..\include\bitcoin\system\wallet\addresses\stealth_address.hpp" />
<ClInclude Include="..\..\..\..\include\bitcoin\system\wallet\addresses\stealth_receiver.hpp" />
<ClInclude Include="..\..\..\..\include\bitcoin\system\wallet\addresses\stealth_sender.hpp" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -603,6 +603,9 @@
<ClCompile Include="..\..\..\..\src\wallet\addresses\qrencode\split.c">
<Filter>src\wallet\addresses\qrencode</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\src\wallet\addresses\silent_payment.cpp">
<Filter>src\wallet\addresses</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\src\wallet\addresses\stealth_address.cpp">
<Filter>src\wallet\addresses</Filter>
</ClCompile>
Expand Down Expand Up @@ -1472,6 +1475,9 @@
<ClInclude Include="..\..\..\..\include\bitcoin\system\wallet\addresses\qr_code.hpp">
<Filter>include\bitcoin\system\wallet\addresses</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\include\bitcoin\system\wallet\addresses\silent_payment.hpp">
<Filter>include\bitcoin\system\wallet\addresses</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\include\bitcoin\system\wallet\addresses\stealth_address.hpp">
<Filter>include\bitcoin\system\wallet\addresses</Filter>
</ClInclude>
Expand Down
1 change: 1 addition & 0 deletions include/bitcoin/system.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -276,6 +276,7 @@
#include <bitcoin/system/wallet/addresses/checked.hpp>
#include <bitcoin/system/wallet/addresses/payment_address.hpp>
#include <bitcoin/system/wallet/addresses/qr_code.hpp>
#include <bitcoin/system/wallet/addresses/silent_payment.hpp>
#include <bitcoin/system/wallet/addresses/stealth_address.hpp>
#include <bitcoin/system/wallet/addresses/stealth_receiver.hpp>
#include <bitcoin/system/wallet/addresses/stealth_sender.hpp>
Expand Down
1 change: 1 addition & 0 deletions include/bitcoin/system/chain/script.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ class BC_API script
static constexpr bool is_sign_multisig_pattern(const operations& ops) NOEXCEPT;
static constexpr bool is_sign_public_key_pattern(const operations& ops) NOEXCEPT;
static constexpr bool is_sign_key_hash_pattern(const operations& ops) NOEXCEPT;
static constexpr bool is_sign_witness_key_hash_pattern(const operations& ops) NOEXCEPT;
static constexpr bool is_sign_script_hash_pattern(const operations& ops) NOEXCEPT;
static bool is_coinbase_pattern(const operations& ops, size_t height) NOEXCEPT;
static bool is_pay_multisig_pattern(const operations& ops) NOEXCEPT;
Expand Down
4 changes: 4 additions & 0 deletions include/bitcoin/system/crypto/secp256k1.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,10 @@ BC_API bool ec_add(ec_compressed& left, const ec_compressed& right) NOEXCEPT;
/// Compute the sum a += b.
BC_API bool ec_add(ec_compressed& left, const ec_uncompressed& right) NOEXCEPT;

/// Compute the sum a += b.
BC_API bool ec_add(ec_uncompressed& left,
const ec_uncompressed& right) NOEXCEPT;

/// Compute the sum of compressed point values.
BC_API bool ec_sum(ec_compressed& out, const compressed_list& values) NOEXCEPT;

Expand Down
23 changes: 21 additions & 2 deletions include/bitcoin/system/hash/checksum.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ BC_API data_chunk append_checksum(const data_loaf& slices) NOEXCEPT;
/// Append a four byte bitcoin checksum of data to itself.
BC_API void append_checksum(data_chunk& data) NOEXCEPT;

// bech32 checksum, used by witness_address.
// bech32 checksum, used by versioned bech32 encodings.
// ----------------------------------------------------------------------------

/// These utilities are used for witness payment addresses and other standards
Expand All @@ -72,21 +72,40 @@ BC_API void append_checksum(data_chunk& data) NOEXCEPT;
/// The implementation does not support unversioned bech32 payloads as there
/// is no use case and support requires exposure of bech32 internals.

enum class checksum_constant
{
bech32,
bech32m
};

/// Combine witness version, program and checksum.
/// The result may be passed to encode_base32 when creating a witness address.
/// For implementation details see wallet::witness_address. Version is limited
/// to 5 bits (less than 32) by bech32 design and is otherwise truncated. Non-
/// zero versions select bech32m (vs. bech32), resulting in distinct checksum.
/// zero versions select bech32m (vs. bech32), resulting in distinct checksum
/// constants.
BC_API base32_chunk bech32_build_checked(uint8_t version,
const data_chunk& program, const std::string& prefix) NOEXCEPT;

/// Combine version, program and checksum with explicit checksum constant.
/// This supports encodings whose checksum constant is not selected by the
/// witness address version rule.
BC_API base32_chunk bech32_build_checked(uint8_t version,
const data_chunk& program, const std::string& prefix,
checksum_constant constant) NOEXCEPT;

/// Verify the bech32 checksum and extract witness version and program.
/// The data parameter may obtained from a witness address using decode_base32.
/// For implementation details see wallet::witness_address.
BC_API bool bech32_verify_checked(uint8_t& out_version,
data_chunk& out_program, const std::string& prefix,
const base32_chunk& checked) NOEXCEPT;

/// Verify the bech32 checksum constant and extract version and program.
BC_API bool bech32_verify_checked(uint8_t& out_version,
data_chunk& out_program, const std::string& prefix,
const base32_chunk& checked, checksum_constant constant) NOEXCEPT;

} // namespace system
} // namespace libbitcoin

Expand Down
13 changes: 11 additions & 2 deletions include/bitcoin/system/impl/chain/script_patterns.ipp
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,7 @@ constexpr bool script::is_pay_witness_taproot_pattern(
const operations& ops) NOEXCEPT
{
return ops.size() == 2
&& ops[0].code() == opcode::push_size_1
&& ops[0].code() == opcode::push_positive_1
&& ops[1].code() == opcode::push_size_32;
}

Expand Down Expand Up @@ -216,6 +216,15 @@ constexpr bool script::is_sign_key_hash_pattern(const operations& ops) NOEXCEPT
&& is_public_key(ops[1].data());
}

constexpr bool script::is_sign_witness_key_hash_pattern(
const operations& ops) NOEXCEPT
{
return ops.size() == 1
&& ops[0].code() == opcode::push_size_22
&& ops[0].data().size() == short_hash_size + 2u
&& ops[0].data()[0] == 0x00

@evoskuil evoskuil Jun 3, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this value (0x00) in this usage a symbol defined anywhere in system?

&& ops[0].data()[1] == short_hash_size;
}

// Ambiguous with is_sign_key_hash when second/last op is a public key.
// Ambiguous with is_sign_public_key_pattern when only op is endorsement.
Expand Down Expand Up @@ -364,7 +373,7 @@ inline operations script::to_pay_witness_taproot_pattern(
{
return
{
{ opcode::push_size_1 },
{ opcode::push_positive_1 },
{ to_chunk(hash), false }
};
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ void sha256t_writer<Tag, OStream>::do_flush() NOEXCEPT

// static
template <data_t Tag, typename OStream>
constexpr sha256::state_t sha256t_writer<Tag, OStream>::midstate() NOEXCEPT
consteval sha256::state_t sha256t_writer<Tag, OStream>::midstate() NOEXCEPT
{
// Cache midstate of tagged hash part that does not change for a given tag.
// sha256(sha256(tag) || sha256(tag) || message) [bip340].
Expand Down
2 changes: 1 addition & 1 deletion include/bitcoin/system/stream/streamers/sha256t_writer.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ class sha256t_writer
void do_flush() NOEXCEPT override;

private:
static constexpr sha256::state_t midstate() NOEXCEPT;
static consteval sha256::state_t midstate() NOEXCEPT;

void flusher() NOEXCEPT;

Expand Down
Loading
Loading