Skip to content

Commit eca4d8e

Browse files
author
MarcoFalke
committed
Merge #16562: Refactor message transport packaging
16d6113 Refactor message transport packaging (Jonas Schnelli) Pull request description: This PR factors out transport packaging logic from `CConnman::PushMessage()`. It's similar to #16202 (where we refactor deserialization). This allows implementing a new message transport protocol like BIP324. ACKs for top commit: dongcarl: ACK 16d6113 FWIW ariard: Code review ACK 16d6113 elichai: semiACK 16d6113 ran functional+unit tests. MarcoFalke: ACK 16d6113 🙎 Tree-SHA512: 8c2f8ab9f52e9b94327973ae15019a08109d5d9f9247492703a842827c5b5d634fc0411759e0bb316d824c586614b0220c2006410851933613bc143e58f7e6c1
2 parents 1a51cd1 + 16d6113 commit eca4d8e

File tree

2 files changed

+32
-7
lines changed

2 files changed

+32
-7
lines changed

src/net.cpp

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -718,6 +718,19 @@ CNetMessage V1TransportDeserializer::GetMessage(const CMessageHeader::MessageSta
718718
return msg;
719719
}
720720

721+
void V1TransportSerializer::prepareForTransport(CSerializedNetMsg& msg, std::vector<unsigned char>& header) {
722+
// create dbl-sha256 checksum
723+
uint256 hash = Hash(msg.data.begin(), msg.data.end());
724+
725+
// create header
726+
CMessageHeader hdr(Params().MessageStart(), msg.command.c_str(), msg.data.size());
727+
memcpy(hdr.pchChecksum, hash.begin(), CMessageHeader::CHECKSUM_SIZE);
728+
729+
// serialize header
730+
header.reserve(CMessageHeader::HEADER_SIZE);
731+
CVectorWriter{SER_NETWORK, INIT_PROTO_VERSION, header, 0, hdr};
732+
}
733+
721734
size_t CConnman::SocketSendData(CNode *pnode) const EXCLUSIVE_LOCKS_REQUIRED(pnode->cs_vSend)
722735
{
723736
auto it = pnode->vSendMsg.begin();
@@ -2705,6 +2718,7 @@ CNode::CNode(NodeId idIn, ServiceFlags nLocalServicesIn, int nMyStartingHeightIn
27052718
}
27062719

27072720
m_deserializer = MakeUnique<V1TransportDeserializer>(V1TransportDeserializer(Params().MessageStart(), SER_NETWORK, INIT_PROTO_VERSION));
2721+
m_serializer = MakeUnique<V1TransportSerializer>(V1TransportSerializer());
27082722
}
27092723

27102724
CNode::~CNode()
@@ -2720,16 +2734,12 @@ bool CConnman::NodeFullyConnected(const CNode* pnode)
27202734
void CConnman::PushMessage(CNode* pnode, CSerializedNetMsg&& msg)
27212735
{
27222736
size_t nMessageSize = msg.data.size();
2723-
size_t nTotalSize = nMessageSize + CMessageHeader::HEADER_SIZE;
27242737
LogPrint(BCLog::NET, "sending %s (%d bytes) peer=%d\n", SanitizeString(msg.command), nMessageSize, pnode->GetId());
27252738

2739+
// make sure we use the appropriate network transport format
27262740
std::vector<unsigned char> serializedHeader;
2727-
serializedHeader.reserve(CMessageHeader::HEADER_SIZE);
2728-
uint256 hash = Hash(msg.data.data(), msg.data.data() + nMessageSize);
2729-
CMessageHeader hdr(Params().MessageStart(), msg.command.c_str(), nMessageSize);
2730-
memcpy(hdr.pchChecksum, hash.begin(), CMessageHeader::CHECKSUM_SIZE);
2731-
2732-
CVectorWriter{SER_NETWORK, INIT_PROTO_VERSION, serializedHeader, 0, hdr};
2741+
pnode->m_serializer->prepareForTransport(msg, serializedHeader);
2742+
size_t nTotalSize = nMessageSize + serializedHeader.size();
27332743

27342744
size_t nBytesSent = 0;
27352745
{

src/net.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -703,12 +703,27 @@ class V1TransportDeserializer final : public TransportDeserializer
703703
CNetMessage GetMessage(const CMessageHeader::MessageStartChars& message_start, int64_t time) override;
704704
};
705705

706+
/** The TransportSerializer prepares messages for the network transport
707+
*/
708+
class TransportSerializer {
709+
public:
710+
// prepare message for transport (header construction, error-correction computation, payload encryption, etc.)
711+
virtual void prepareForTransport(CSerializedNetMsg& msg, std::vector<unsigned char>& header) = 0;
712+
virtual ~TransportSerializer() {}
713+
};
714+
715+
class V1TransportSerializer : public TransportSerializer {
716+
public:
717+
void prepareForTransport(CSerializedNetMsg& msg, std::vector<unsigned char>& header) override;
718+
};
719+
706720
/** Information about a peer */
707721
class CNode
708722
{
709723
friend class CConnman;
710724
public:
711725
std::unique_ptr<TransportDeserializer> m_deserializer;
726+
std::unique_ptr<TransportSerializer> m_serializer;
712727

713728
// socket
714729
std::atomic<ServiceFlags> nServices{NODE_NONE};

0 commit comments

Comments
 (0)