Yeah, fair point. Seems wrong to move away from std::bytes so in that case perhaps we should just axe the unsigned char ctors instead?
0diff --git a/src/kernel/bitcoinkernel.cpp b/src/kernel/bitcoinkernel.cpp
1index 5a4bb7d925..b456f41a00 100644
2--- a/src/kernel/bitcoinkernel.cpp
3+++ b/src/kernel/bitcoinkernel.cpp
4@@ -1393,7 +1393,7 @@ uint32_t btck_block_header_get_nonce(const btck_BlockHeader* header)
5 int btck_block_header_to_bytes(const btck_BlockHeader* header, unsigned char output[80])
6 {
7 try {
8- SpanWriter{std::span{output, 80}} << btck_BlockHeader::get(header);
9+ SpanWriter{std::as_writable_bytes(std::span{output, 80})} << btck_BlockHeader::get(header);
10 return 0;
11 } catch (...) {
12 return -1;
13diff --git a/src/streams.h b/src/streams.h
14index b57c443287..12a2cac2c7 100644
15--- a/src/streams.h
16+++ b/src/streams.h
17@@ -129,10 +129,9 @@ private:
18 std::span<std::byte> m_dest;
19
20 public:
21- explicit SpanWriter(std::span<unsigned char> dest) : m_dest{std::as_writable_bytes(dest)} {}
22 explicit SpanWriter(std::span<std::byte> dest) : m_dest{dest} {}
23 template <typename... Args>
24- SpanWriter(std::span<unsigned char> dest, Args&&... args) : SpanWriter{dest}
25+ SpanWriter(std::span<std::byte> dest, Args&&... args) : SpanWriter{dest}
26 {
27 ::SerializeMany(*this, std::forward<Args>(args)...);
28 }
29diff --git a/src/test/streams_tests.cpp b/src/test/streams_tests.cpp
30index c5ee057d60..d881ae8d35 100644
31--- a/src/test/streams_tests.cpp
32+++ b/src/test/streams_tests.cpp
33@@ -212,28 +212,20 @@ BOOST_AUTO_TEST_CASE(streams_span_writer)
34 unsigned char a(1);
35 unsigned char b(2);
36 unsigned char bytes[] = {3, 4, 5, 6};
37- std::array<unsigned char, 8> arr{};
38+ std::array<std::byte, 8> arr{};
39
40 // Test operator<<
41 SpanWriter writer{arr};
42 writer << a << b;
43- std::array<unsigned char, 8> expected1{1, 2, 0, 0, 0, 0, 0, 0};
44- BOOST_CHECK_EQUAL_COLLECTIONS(arr.begin(), arr.end(), expected1.begin(), expected1.end());
45+ BOOST_CHECK_EQUAL(HexStr(arr), "0102000000000000");
46
47 // Use variadic constructor and write to subspan.
48 SpanWriter{std::span{arr}.subspan(2), a, bytes, b};
49- std::array<unsigned char, 8> expected2{1, 2, 1, 3, 4, 5, 6, 2};
50- BOOST_CHECK_EQUAL_COLLECTIONS(arr.begin(), arr.end(), expected2.begin(), expected2.end());
51-
52- // Test std::byte span constructor
53- std::array<std::byte, 2> byte_arr{};
54- SpanWriter{std::span{byte_arr}} << a << b;
55- std::array<std::byte, 2> expected3{std::byte{1}, std::byte{2}};
56- BOOST_CHECK_EQUAL_COLLECTIONS(byte_arr.begin(), byte_arr.end(), expected3.begin(), expected3.end());
57+ BOOST_CHECK_EQUAL(HexStr(arr), "0102010304050602");
58
59 // Writing past the end throws
60- std::array<unsigned char, 1> small{};
61- BOOST_CHECK_THROW(SpanWriter(small, a, b), std::ios_base::failure);
62+ std::array<std::byte, 1> small{};
63+ BOOST_CHECK_THROW(SpanWriter(std::span{small}, a, b), std::ios_base::failure);
64 }
65
66 BOOST_AUTO_TEST_CASE(streams_vector_reader)
(using HexStr in the tests to minimize verbosity)