diff --git a/src/llmq/quorums_signing_shares.cpp b/src/llmq/quorums_signing_shares.cpp index 63ea04ccef7a1..74286d54eb448 100644 --- a/src/llmq/quorums_signing_shares.cpp +++ b/src/llmq/quorums_signing_shares.cpp @@ -26,6 +26,12 @@ void CSigShare::UpdateKey() key.second = quorumMember; } +std::string CSigSesAnn::ToString() const +{ + return strprintf("sessionId=%d, llmqType=%d, quorumHash=%s, id=%s, msgHash=%s", + sessionId, llmqType, quorumHash.ToString(), id.ToString(), msgHash.ToString()); +} + void CSigSharesInv::Merge(const CSigSharesInv& inv2) { for (size_t i = 0; i < inv.size(); i++) { @@ -196,7 +202,11 @@ void CSigSharesManager::ProcessMessage(CNode* pfrom, const std::string& strComma return; } - if (strCommand == NetMsgType::QSIGSHARESINV) { + if (strCommand == NetMsgType::QSIGSESANN) { + CSigSesAnn ann; + vRecv >> ann; + ProcessMessageSigSesAnn(pfrom, ann, connman); + } else if (strCommand == NetMsgType::QSIGSHARESINV) { CSigSharesInv inv; vRecv >> inv; ProcessMessageSigSharesInv(pfrom, inv, connman); @@ -211,6 +221,31 @@ void CSigSharesManager::ProcessMessage(CNode* pfrom, const std::string& strComma } } +void CSigSharesManager::ProcessMessageSigSesAnn(CNode* pfrom, const CSigSesAnn& ann, CConnman& connman) +{ + auto llmqType = (Consensus::LLMQType)ann.llmqType; + if (!Params().GetConsensus().llmqs.count(llmqType)) { + BanNode(pfrom->id); + return; + } + if (ann.sessionId == (uint32_t)-1 || ann.quorumHash.IsNull() || ann.id.IsNull() || ann.msgHash.IsNull()) { + BanNode(pfrom->id); + return; + } + + LogPrint("llmq", "CSigSharesManager::%s -- ann={%s}, node=%d\n", __func__, ann.ToString(), pfrom->id); + + auto quorum = quorumManager->GetQuorum(llmqType, ann.quorumHash); + if (!quorum) { + // TODO should we ban here? + LogPrintf("CSigSharesManager::%s -- quorum %s not found, node=%d\n", __func__, + ann.quorumHash.ToString(), pfrom->id); + return; + } + + auto signHash = CLLMQUtils::BuildSignHash(llmqType, ann.quorumHash, ann.id, ann.msgHash); +} + bool CSigSharesManager::VerifySigSharesInv(NodeId from, const CSigSharesInv& inv) { Consensus::LLMQType llmqType = (Consensus::LLMQType)inv.llmqType; diff --git a/src/llmq/quorums_signing_shares.h b/src/llmq/quorums_signing_shares.h index c0b26796e367c..f8603aa5d9705 100644 --- a/src/llmq/quorums_signing_shares.h +++ b/src/llmq/quorums_signing_shares.h @@ -56,6 +56,32 @@ class CSigShare } }; +// Nodes will first announce a signing session with a sessionId to be used in all future P2P messages related to that +// session. We locally keep track of the mapping for each node. We also assign new sessionIds for outgoing sessions +// and send QSIGSESANN messages appropriately. All values except the max value for uint32_t are valid as sessionId +class CSigSesAnn +{ +public: + uint32_t sessionId{(uint32_t)-1}; + uint8_t llmqType; + uint256 quorumHash; + uint256 id; + uint256 msgHash; + + ADD_SERIALIZE_METHODS + + template + inline void SerializationOp(Stream& s, Operation ser_action) { + READWRITE(VARINT(sessionId)); + READWRITE(llmqType); + READWRITE(quorumHash); + READWRITE(id); + READWRITE(msgHash); + } + + std::string ToString() const; +}; + class CSigSharesInv { public: @@ -344,6 +370,7 @@ class CSigSharesManager : public CRecoveredSigsListener void HandleNewRecoveredSig(const CRecoveredSig& recoveredSig); private: + void ProcessMessageSigSesAnn(CNode* pfrom, const CSigSesAnn& ann, CConnman& connman); void ProcessMessageSigSharesInv(CNode* pfrom, const CSigSharesInv& inv, CConnman& connman); void ProcessMessageGetSigShares(CNode* pfrom, const CSigSharesInv& inv, CConnman& connman); void ProcessMessageBatchedSigShares(CNode* pfrom, const CBatchedSigShares& batchedSigShares, CConnman& connman); diff --git a/src/protocol.cpp b/src/protocol.cpp index 114f1958a442f..6df80cae74fa4 100644 --- a/src/protocol.cpp +++ b/src/protocol.cpp @@ -65,6 +65,7 @@ const char *QJUSTIFICATION="qjustify"; const char *QPCOMMITMENT="qpcommit"; const char *QWATCH="qwatch"; const char *QDEBUGSTATUS="qdebugstatus"; +const char *QSIGSESANN="qsigsesann"; const char *QSIGSHARESINV="qsigsinv"; const char *QGETSIGSHARES="qgetsigs"; const char *QBSIGSHARES="qbsigs"; @@ -165,6 +166,7 @@ const static std::string allNetMessageTypes[] = { NetMsgType::QPCOMMITMENT, NetMsgType::QWATCH, NetMsgType::QDEBUGSTATUS, + NetMsgType::QSIGSESANN, NetMsgType::QSIGSHARESINV, NetMsgType::QGETSIGSHARES, NetMsgType::QBSIGSHARES, diff --git a/src/protocol.h b/src/protocol.h index ae2c95b4d1b98..b4d6eab3eccaf 100644 --- a/src/protocol.h +++ b/src/protocol.h @@ -271,6 +271,7 @@ extern const char *QJUSTIFICATION; extern const char *QPCOMMITMENT; extern const char *QWATCH; extern const char *QDEBUGSTATUS; +extern const char *QSIGSESANN; extern const char *QSIGSHARESINV; extern const char *QGETSIGSHARES; extern const char *QBSIGSHARES;