More Span simplifications

Based on suggestions by MarcoFalke <falke.marco@gmail.com>
This commit is contained in:
Pieter Wuille 2021-11-02 10:07:46 -04:00
parent 568dd2f839
commit 11daf6ceb1
14 changed files with 20 additions and 21 deletions

View File

@ -760,7 +760,7 @@ CNetMessage V1TransportDeserializer::GetMessage(const std::chrono::microseconds
if (memcmp(hash.begin(), hdr.pchChecksum, CMessageHeader::CHECKSUM_SIZE) != 0) { if (memcmp(hash.begin(), hdr.pchChecksum, CMessageHeader::CHECKSUM_SIZE) != 0) {
LogPrint(BCLog::NET, "Header error: Wrong checksum (%s, %u bytes), expected %s was %s, peer=%d\n", LogPrint(BCLog::NET, "Header error: Wrong checksum (%s, %u bytes), expected %s was %s, peer=%d\n",
SanitizeString(msg.m_command), msg.m_message_size, SanitizeString(msg.m_command), msg.m_message_size,
HexStr(Span<uint8_t>(hash.begin(), hash.begin() + CMessageHeader::CHECKSUM_SIZE)), HexStr(Span{hash}.first(CMessageHeader::CHECKSUM_SIZE)),
HexStr(hdr.pchChecksum), HexStr(hdr.pchChecksum),
m_node_id); m_node_id);
reject_message = true; reject_message = true;
@ -1582,8 +1582,9 @@ void CConnman::SocketHandlerConnected(const std::vector<CNode*>& nodes,
if (nBytes > 0) if (nBytes > 0)
{ {
bool notify = false; bool notify = false;
if (!pnode->ReceiveMsgBytes(Span<const uint8_t>(pchBuf, nBytes), notify)) if (!pnode->ReceiveMsgBytes({pchBuf, (size_t)nBytes}, notify)) {
pnode->CloseSocketDisconnect(); pnode->CloseSocketDisconnect();
}
RecordBytesRecv(nBytes); RecordBytesRecv(nBytes);
if (notify) { if (notify) {
size_t nSizeAdded = 0; size_t nSizeAdded = 0;

View File

@ -303,7 +303,7 @@ CNetAddr::CNetAddr(const struct in_addr& ipv4Addr)
CNetAddr::CNetAddr(const struct in6_addr& ipv6Addr, const uint32_t scope) CNetAddr::CNetAddr(const struct in6_addr& ipv6Addr, const uint32_t scope)
{ {
SetLegacyIPv6(Span<const uint8_t>(reinterpret_cast<const uint8_t*>(&ipv6Addr), sizeof(ipv6Addr))); SetLegacyIPv6({reinterpret_cast<const uint8_t*>(&ipv6Addr), sizeof(ipv6Addr)});
m_scope_id = scope; m_scope_id = scope;
} }

View File

@ -240,7 +240,7 @@ public:
explicit XOnlyPubKey(Span<const unsigned char> bytes); explicit XOnlyPubKey(Span<const unsigned char> bytes);
/** Construct an x-only pubkey from a normal pubkey. */ /** Construct an x-only pubkey from a normal pubkey. */
explicit XOnlyPubKey(const CPubKey& pubkey) : XOnlyPubKey(Span<const unsigned char>(pubkey.begin() + 1, pubkey.begin() + 33)) {} explicit XOnlyPubKey(const CPubKey& pubkey) : XOnlyPubKey(Span{pubkey}.subspan(1, 32)) {}
/** Verify a Schnorr signature against this public key. /** Verify a Schnorr signature against this public key.
* *

View File

@ -317,7 +317,7 @@ public:
UniValue obj(UniValue::VOBJ); UniValue obj(UniValue::VOBJ);
obj.pushKV("iswitness", true); obj.pushKV("iswitness", true);
obj.pushKV("witness_version", (int)id.version); obj.pushKV("witness_version", (int)id.version);
obj.pushKV("witness_program", HexStr(Span<const unsigned char>(id.program, id.length))); obj.pushKV("witness_program", HexStr({id.program, id.length}));
return obj; return obj;
} }
}; };

View File

@ -1252,7 +1252,7 @@ std::unique_ptr<PubkeyProvider> InferXOnlyPubkey(const XOnlyPubKey& xkey, ParseS
std::unique_ptr<DescriptorImpl> InferScript(const CScript& script, ParseScriptContext ctx, const SigningProvider& provider) std::unique_ptr<DescriptorImpl> InferScript(const CScript& script, ParseScriptContext ctx, const SigningProvider& provider)
{ {
if (ctx == ParseScriptContext::P2TR && script.size() == 34 && script[0] == 32 && script[33] == OP_CHECKSIG) { if (ctx == ParseScriptContext::P2TR && script.size() == 34 && script[0] == 32 && script[33] == OP_CHECKSIG) {
XOnlyPubKey key{Span<const unsigned char>{script.data() + 1, script.data() + 33}}; XOnlyPubKey key{Span{script}.subspan(1, 32)};
return std::make_unique<PKDescriptor>(InferXOnlyPubkey(key, ctx, provider)); return std::make_unique<PKDescriptor>(InferXOnlyPubkey(key, ctx, provider));
} }

View File

@ -1858,7 +1858,7 @@ uint256 ComputeTaprootMerkleRoot(Span<const unsigned char> control, const uint25
uint256 k = tapleaf_hash; uint256 k = tapleaf_hash;
for (int i = 0; i < path_len; ++i) { for (int i = 0; i < path_len; ++i) {
CHashWriter ss_branch{HASHER_TAPBRANCH}; CHashWriter ss_branch{HASHER_TAPBRANCH};
Span<const unsigned char> node(control.data() + TAPROOT_CONTROL_BASE_SIZE + TAPROOT_CONTROL_NODE_SIZE * i, TAPROOT_CONTROL_NODE_SIZE); Span node{Span{control}.subspan(TAPROOT_CONTROL_BASE_SIZE + TAPROOT_CONTROL_NODE_SIZE * i, TAPROOT_CONTROL_NODE_SIZE)};
if (std::lexicographical_compare(k.begin(), k.end(), node.begin(), node.end())) { if (std::lexicographical_compare(k.begin(), k.end(), node.begin(), node.end())) {
ss_branch << k << node; ss_branch << k << node;
} else { } else {
@ -1874,7 +1874,7 @@ static bool VerifyTaprootCommitment(const std::vector<unsigned char>& control, c
assert(control.size() >= TAPROOT_CONTROL_BASE_SIZE); assert(control.size() >= TAPROOT_CONTROL_BASE_SIZE);
assert(program.size() >= uint256::size()); assert(program.size() >= uint256::size());
//! The internal pubkey (x-only, so no Y coordinate parity). //! The internal pubkey (x-only, so no Y coordinate parity).
const XOnlyPubKey p{Span<const unsigned char>{control.data() + 1, control.data() + TAPROOT_CONTROL_BASE_SIZE}}; const XOnlyPubKey p{Span{control}.subspan(1, TAPROOT_CONTROL_BASE_SIZE - 1)};
//! The output pubkey (taken from the scriptPubKey). //! The output pubkey (taken from the scriptPubKey).
const XOnlyPubKey q{program}; const XOnlyPubKey q{program};
// Compute the Merkle root from the leaf and the provided path. // Compute the Merkle root from the leaf and the provided path.
@ -1886,7 +1886,7 @@ static bool VerifyTaprootCommitment(const std::vector<unsigned char>& control, c
static bool VerifyWitnessProgram(const CScriptWitness& witness, int witversion, const std::vector<unsigned char>& program, unsigned int flags, const BaseSignatureChecker& checker, ScriptError* serror, bool is_p2sh) static bool VerifyWitnessProgram(const CScriptWitness& witness, int witversion, const std::vector<unsigned char>& program, unsigned int flags, const BaseSignatureChecker& checker, ScriptError* serror, bool is_p2sh)
{ {
CScript exec_script; //!< Actually executed script (last stack item in P2WSH; implied P2PKH script in P2WPKH; leaf script in P2TR) CScript exec_script; //!< Actually executed script (last stack item in P2WSH; implied P2PKH script in P2WPKH; leaf script in P2TR)
Span<const valtype> stack{witness.stack}; Span stack{witness.stack};
ScriptExecutionData execdata; ScriptExecutionData execdata;
if (witversion == 0) { if (witversion == 0) {

View File

@ -38,7 +38,7 @@ static bool FetchAndClearCommitmentSection(const Span<const uint8_t> header, CSc
std::vector<uint8_t> pushdata; std::vector<uint8_t> pushdata;
while (witness_commitment.GetOp(pc, opcode, pushdata)) { while (witness_commitment.GetOp(pc, opcode, pushdata)) {
if (pushdata.size() > 0) { if (pushdata.size() > 0) {
if (!found_header && pushdata.size() > (size_t) header.size() && Span<const uint8_t>(pushdata.data(), header.size()) == header) { if (!found_header && pushdata.size() > (size_t)header.size() && Span{pushdata}.first(header.size()) == header) {
// pushdata only counts if it has the header _and_ some data // pushdata only counts if it has the header _and_ some data
result.insert(result.end(), pushdata.begin() + header.size(), pushdata.end()); result.insert(result.end(), pushdata.begin() + header.size(), pushdata.end());
pushdata.erase(pushdata.begin() + header.size(), pushdata.end()); pushdata.erase(pushdata.begin() + header.size(), pushdata.end());

View File

@ -258,12 +258,12 @@ Span<std::byte> AsWritableBytes(Span<T> s) noexcept
template <typename V> template <typename V>
Span<const std::byte> MakeByteSpan(V&& v) noexcept Span<const std::byte> MakeByteSpan(V&& v) noexcept
{ {
return AsBytes(MakeSpan(std::forward<V>(v))); return AsBytes(Span{std::forward<V>(v)});
} }
template <typename V> template <typename V>
Span<std::byte> MakeWritableByteSpan(V&& v) noexcept Span<std::byte> MakeWritableByteSpan(V&& v) noexcept
{ {
return AsWritableBytes(MakeSpan(std::forward<V>(v))); return AsWritableBytes(Span{std::forward<V>(v)});
} }
// Helper functions to safely cast to unsigned char pointers. // Helper functions to safely cast to unsigned char pointers.

View File

@ -49,7 +49,7 @@ FUZZ_TARGET(asmap)
CNetAddr net_addr; CNetAddr net_addr;
if (ipv6) { if (ipv6) {
assert(addr_size == ADDR_IPV6_SIZE); assert(addr_size == ADDR_IPV6_SIZE);
net_addr.SetLegacyIPv6(Span<const uint8_t>(addr_data, addr_size)); net_addr.SetLegacyIPv6({addr_data, addr_size});
} else { } else {
assert(addr_size == ADDR_IPV4_SIZE); assert(addr_size == ADDR_IPV4_SIZE);
in_addr ipv4; in_addr ipv4;

View File

@ -38,7 +38,7 @@ FUZZ_TARGET_INIT(utxo_snapshot, initialize_chain)
{ {
CAutoFile outfile{fsbridge::fopen(snapshot_path, "wb"), SER_DISK, CLIENT_VERSION}; CAutoFile outfile{fsbridge::fopen(snapshot_path, "wb"), SER_DISK, CLIENT_VERSION};
const auto file_data{ConsumeRandomLengthByteVector(fuzzed_data_provider)}; const auto file_data{ConsumeRandomLengthByteVector(fuzzed_data_provider)};
outfile << Span<const uint8_t>{file_data}; outfile << Span{file_data};
} }
const auto ActivateFuzzedSnapshot{[&] { const auto ActivateFuzzedSnapshot{[&] {

View File

@ -46,7 +46,7 @@ BOOST_AUTO_TEST_CASE(key_io_valid_parse)
privkey = DecodeSecret(exp_base58string); privkey = DecodeSecret(exp_base58string);
BOOST_CHECK_MESSAGE(privkey.IsValid(), "!IsValid:" + strTest); BOOST_CHECK_MESSAGE(privkey.IsValid(), "!IsValid:" + strTest);
BOOST_CHECK_MESSAGE(privkey.IsCompressed() == isCompressed, "compressed mismatch:" + strTest); BOOST_CHECK_MESSAGE(privkey.IsCompressed() == isCompressed, "compressed mismatch:" + strTest);
BOOST_CHECK_MESSAGE(Span<const uint8_t>{privkey} == Span<const uint8_t>{exp_payload}, "key mismatch:" + strTest); BOOST_CHECK_MESSAGE(Span{privkey} == Span{exp_payload}, "key mismatch:" + strTest);
// Private key must be invalid public key // Private key must be invalid public key
destination = DecodeDestination(exp_base58string); destination = DecodeDestination(exp_base58string);

View File

@ -142,13 +142,11 @@ BOOST_AUTO_TEST_CASE(util_HexStr)
"04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f"); "04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f");
BOOST_CHECK_EQUAL( BOOST_CHECK_EQUAL(
HexStr(Span<const unsigned char>( HexStr(Span{ParseHex_expected}.last(0)),
ParseHex_expected + sizeof(ParseHex_expected),
ParseHex_expected + sizeof(ParseHex_expected))),
""); "");
BOOST_CHECK_EQUAL( BOOST_CHECK_EQUAL(
HexStr(Span<const unsigned char>(ParseHex_expected, ParseHex_expected)), HexStr(Span{ParseHex_expected}.first(0)),
""); "");
{ {

View File

@ -35,7 +35,7 @@ std::string static EncodeDumpString(const std::string &str) {
std::stringstream ret; std::stringstream ret;
for (const unsigned char c : str) { for (const unsigned char c : str) {
if (c <= 32 || c >= 128 || c == '%') { if (c <= 32 || c >= 128 || c == '%') {
ret << '%' << HexStr(Span<const unsigned char>(&c, 1)); ret << '%' << HexStr({&c, 1});
} else { } else {
ret << c; ret << c;
} }

View File

@ -4937,5 +4937,5 @@ static const CRPCCommand commands[] =
{ "wallet", &walletprocesspsbt, }, { "wallet", &walletprocesspsbt, },
}; };
// clang-format on // clang-format on
return Span{commands}; return commands;
} }