mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-05-30 15:54:03 +02:00
Merge bitcoin/bitcoin#34401: kernel: add serialization method for btck_BlockHeader API
577a3e74c8test: Add check for return type in `HasToBytes` concept (yuvicc)1ad551281akernel: Add Block Header serialization method (yuvicc)86662623ecAdd `SpanWriter` class for zero-allocation stream writing (yuvicc) Pull request description: This adds serialization for `btck_BlockHeader` API. Also, updated the `CheckHandle` to compare the byte content instead of size. The changes here is done in two commits. First commit adds the `SpanWriter` class and next one moves the block header serialization to `SpanWriter`. See commit message for more details. Follow-up to #33822 . ACKs for top commit: stickies-v: re-ACK577a3e74c8alexanderwiederin: ACK577a3e74c8theStack: Code-review ACK577a3e74c8w0xlt: ACK577a3e74c8Tree-SHA512: 1eda5b204588ccb23e9357f68c5529474e7d248736a371c47d8db71ba6ca95e121869514478ad7a519d190e4c30725f64fd1ef4dd9f97d2627dc4441e51458e0
This commit is contained in:
@@ -266,7 +266,9 @@ void run_verify_test(
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
concept HasToBytes = requires(T t) { t.ToBytes(); };
|
||||
concept HasToBytes = requires(T t) {
|
||||
{ t.ToBytes() } -> std::convertible_to<std::span<const std::byte>>;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
void CheckHandle(T object, T distinct_object)
|
||||
@@ -686,6 +688,10 @@ BOOST_AUTO_TEST_CASE(btck_block_header_tests)
|
||||
auto prev_hash = header.PrevHash();
|
||||
BOOST_CHECK_EQUAL(byte_span_to_hex_string_reversed(prev_hash.ToBytes()), "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f");
|
||||
|
||||
// Test round-trip serialization of block header
|
||||
auto header_roundtrip{BlockHeader{header.ToBytes()}};
|
||||
check_equal(header_roundtrip.ToBytes(), mainnet_block_1_header);
|
||||
|
||||
auto raw_block = hex_string_to_byte_vec("010000006fe28c0ab6f1b372c1a6a246ae63f74f931e8365e15a089c68d6190000000000982051fd1e4ba744bbbe680e1fee14677ba1a3c3540bf7b1cdb606e857233e0e61bc6649ffff001d01e362990101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0704ffff001d0104ffffffff0100f2052a0100000043410496b538e853519c726a2c91e61ec11600ae1390813a627c66fb8be7947be63c52da7589379515d4e0a604f8141781e62294721166bf621e73a82cbf2342c858eeac00000000");
|
||||
Block block{raw_block};
|
||||
BlockHeader block_header{block.GetHeader()};
|
||||
@@ -694,6 +700,11 @@ BOOST_AUTO_TEST_CASE(btck_block_header_tests)
|
||||
BOOST_CHECK_EQUAL(block_header.Bits(), 0x1d00ffff);
|
||||
BOOST_CHECK_EQUAL(block_header.Nonce(), 2573394689);
|
||||
BOOST_CHECK_EQUAL(byte_span_to_hex_string_reversed(block_header.Hash().ToBytes()), "00000000839a8e6886ab5951d76f411475428afc90947ee320161bbf18eb6048");
|
||||
|
||||
// Verify header from block serializes to first 80 bytes of raw block
|
||||
auto block_header_bytes = block_header.ToBytes();
|
||||
BOOST_CHECK_EQUAL(block_header_bytes.size(), 80);
|
||||
check_equal(block_header_bytes, std::span<const std::byte>(raw_block.data(), 80));
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(btck_block)
|
||||
|
||||
@@ -208,6 +208,28 @@ BOOST_AUTO_TEST_CASE(streams_vector_writer)
|
||||
vch.clear();
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(streams_span_writer)
|
||||
{
|
||||
unsigned char a(1);
|
||||
unsigned char b(2);
|
||||
unsigned char bytes[] = {3, 4, 5, 6};
|
||||
std::array<std::byte, 8> arr{};
|
||||
|
||||
// Test operator<<
|
||||
SpanWriter writer{arr};
|
||||
writer << a << b;
|
||||
BOOST_CHECK_EQUAL(HexStr(arr), "0102000000000000");
|
||||
|
||||
// Use variadic constructor and write to subspan.
|
||||
SpanWriter{std::span{arr}.subspan(2), a, bytes, b};
|
||||
BOOST_CHECK_EQUAL(HexStr(arr), "0102010304050602");
|
||||
|
||||
// Writing past the end throws
|
||||
std::array<std::byte, 1> small{};
|
||||
BOOST_CHECK_THROW(SpanWriter(std::span{small}, a, b), std::ios_base::failure);
|
||||
BOOST_CHECK_THROW(SpanWriter(std::span{small}) << a << b, std::ios_base::failure);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(streams_vector_reader)
|
||||
{
|
||||
std::vector<unsigned char> vch = {1, 255, 3, 4, 5, 6};
|
||||
|
||||
Reference in New Issue
Block a user