Skip to content

Commit 16d6113

Browse files
jonasschnellidongcarl
authored andcommitted
Refactor message transport packaging
1 parent 04f78b8 commit 16d6113

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
@@ -716,6 +716,19 @@ CNetMessage V1TransportDeserializer::GetMessage(const CMessageHeader::MessageSta
716716
return msg;
717717
}
718718

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

27052718
m_deserializer = MakeUnique<V1TransportDeserializer>(V1TransportDeserializer(Params().MessageStart(), SER_NETWORK, INIT_PROTO_VERSION));
2719+
m_serializer = MakeUnique<V1TransportSerializer>(V1TransportSerializer());
27062720
}
27072721

27082722
CNode::~CNode()
@@ -2718,16 +2732,12 @@ bool CConnman::NodeFullyConnected(const CNode* pnode)
27182732
void CConnman::PushMessage(CNode* pnode, CSerializedNetMsg&& msg)
27192733
{
27202734
size_t nMessageSize = msg.data.size();
2721-
size_t nTotalSize = nMessageSize + CMessageHeader::HEADER_SIZE;
27222735
LogPrint(BCLog::NET, "sending %s (%d bytes) peer=%d\n", SanitizeString(msg.command), nMessageSize, pnode->GetId());
27232736

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

27322742
size_t nBytesSent = 0;
27332743
{

src/net.h

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

702+
/** The TransportSerializer prepares messages for the network transport
703+
*/
704+
class TransportSerializer {
705+
public:
706+
// prepare message for transport (header construction, error-correction computation, payload encryption, etc.)
707+
virtual void prepareForTransport(CSerializedNetMsg& msg, std::vector<unsigned char>& header) = 0;
708+
virtual ~TransportSerializer() {}
709+
};
710+
711+
class V1TransportSerializer : public TransportSerializer {
712+
public:
713+
void prepareForTransport(CSerializedNetMsg& msg, std::vector<unsigned char>& header) override;
714+
};
715+
702716
/** Information about a peer */
703717
class CNode
704718
{
705719
friend class CConnman;
706720
public:
707721
std::unique_ptr<TransportDeserializer> m_deserializer;
722+
std::unique_ptr<TransportSerializer> m_serializer;
708723

709724
// socket
710725
std::atomic<ServiceFlags> nServices{NODE_NONE};

0 commit comments

Comments
 (0)