mirror of
https://github.com/EvernodeXRPL/hpcore.git
synced 2026-04-29 15:37:59 +00:00
LCL history request and response. (#59)
Detect and request missing lcl history from another random node. Sending lcl history response to a asked node. Getting lcl history response and applying it. Delete lcl that exceeds max ledger sequence.
This commit is contained in:
@@ -154,6 +154,21 @@ const p2p::nonunl_proposal create_nonunl_proposal_from_msg(const NonUnl_Proposal
|
||||
return nup;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a history response stuct from the given histrory response message.
|
||||
* @param msg Flatbuffer History response message received from the peer.
|
||||
* @return A History response struct representing the message.
|
||||
*/
|
||||
const p2p::history_response create_history_response_from_msg(const History_Response_Message &msg)
|
||||
{
|
||||
p2p::history_response hr;
|
||||
|
||||
if (msg.hist_ledgers())
|
||||
hr.hist_ledgers = flatbuf_historyledgermap_to_historyledgermap(msg.hist_ledgers());
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a proposal stuct from the given proposal message.
|
||||
* @param The Flatbuffer poporal received from the peer.
|
||||
@@ -181,6 +196,24 @@ const p2p::proposal create_proposal_from_msg(const Proposal_Message &msg, const
|
||||
return p;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a history request struct from the given history request message.
|
||||
* @param msg Flatbuffer History request message received from the peer.
|
||||
* @return A History request struct representing the message.
|
||||
*/
|
||||
const p2p::history_request create_history_request_from_msg(const History_Request_Message &msg)
|
||||
{
|
||||
p2p::history_request hr;
|
||||
|
||||
if (msg.minimum_lcl())
|
||||
hr.minimum_lcl = flatbuff_bytes_to_sv(msg.minimum_lcl());
|
||||
|
||||
if (msg.required_lcl())
|
||||
hr.required_lcl = flatbuff_bytes_to_sv(msg.required_lcl());
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
//---Message creation helpers---//
|
||||
|
||||
void create_msg_from_nonunl_proposal(flatbuffers::FlatBufferBuilder &container_builder, const p2p::nonunl_proposal &nup)
|
||||
@@ -201,7 +234,7 @@ void create_msg_from_nonunl_proposal(flatbuffers::FlatBufferBuilder &container_b
|
||||
}
|
||||
|
||||
/**
|
||||
* Ctreat proposal peer message from the given proposal struct.
|
||||
* Create proposal peer message from the given proposal struct.
|
||||
* @param container_builder Flatbuffer builder for the container message.
|
||||
* @param p The proposal struct to be placed in the container message.
|
||||
*/
|
||||
@@ -250,6 +283,51 @@ void create_msg_from_npl_output(flatbuffers::FlatBufferBuilder &container_builde
|
||||
create_containermsg_from_content(container_builder, builder, lcl, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create history request message from the given history request struct.
|
||||
* @param container_builder Flatbuffer builder for the container message.
|
||||
* @param hr The History request struct to be placed in the container message.
|
||||
*/
|
||||
void create_msg_from_history_request(flatbuffers::FlatBufferBuilder &container_builder, const p2p::history_request &hr)
|
||||
{
|
||||
flatbuffers::FlatBufferBuilder builder(1024);
|
||||
|
||||
flatbuffers::Offset<History_Request_Message> hrmsg =
|
||||
CreateHistory_Request_Message(
|
||||
builder,
|
||||
sv_to_flatbuff_bytes(builder, hr.minimum_lcl),
|
||||
sv_to_flatbuff_bytes(builder, hr.required_lcl));
|
||||
|
||||
flatbuffers::Offset<Content> message = CreateContent(builder, Message_History_Request_Message, hrmsg.Union());
|
||||
builder.Finish(message); // Finished building message content to get serialised content.
|
||||
|
||||
// Now that we have built the content message,
|
||||
// we need to sign it and place it inside a container message.
|
||||
create_containermsg_from_content(container_builder, builder, nullptr, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create history response message from the given history response struct.
|
||||
* @param container_builder Flatbuffer builder for the container message.
|
||||
* @param hr The History response struct to be placed in the container message.
|
||||
*/
|
||||
void create_msg_from_history_response(flatbuffers::FlatBufferBuilder &container_builder, const p2p::history_response &hr)
|
||||
{
|
||||
flatbuffers::FlatBufferBuilder builder(1024);
|
||||
|
||||
flatbuffers::Offset<History_Response_Message> hrmsg =
|
||||
CreateHistory_Response_Message(
|
||||
builder,
|
||||
historyledgermap_to_flatbuf_historyledgermap(builder, hr.hist_ledgers));
|
||||
|
||||
flatbuffers::Offset<Content> message = CreateContent(builder, Message_History_Response_Message, hrmsg.Union());
|
||||
builder.Finish(message); // Finished building message content to get serialised content.
|
||||
|
||||
// Now that we have built the content message,
|
||||
// we need to sign it and place it inside a container message.
|
||||
create_containermsg_from_content(container_builder, builder, nullptr, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a Flatbuffer container message from the given Content message.
|
||||
* @param container_builder The Flatbuffer builder to which the final container message should be written to.
|
||||
@@ -346,4 +424,44 @@ usermsgsmap_to_flatbuf_usermsgsmap(flatbuffers::FlatBufferBuilder &builder, cons
|
||||
return builder.CreateVector(fbvec);
|
||||
}
|
||||
|
||||
const std::map<uint64_t, const p2p::history_ledger>
|
||||
flatbuf_historyledgermap_to_historyledgermap(const flatbuffers::Vector<flatbuffers::Offset<HistoryLedgerPair>> *fbvec)
|
||||
{
|
||||
std::map<uint64_t, const p2p::history_ledger> map;
|
||||
|
||||
for (const HistoryLedgerPair *pair : *fbvec)
|
||||
{
|
||||
std::list<usr::user_submitted_message> msglist;
|
||||
|
||||
p2p::history_ledger ledger;
|
||||
|
||||
ledger.lcl = flatbuff_bytes_to_sv(pair->ledger()->lcl());
|
||||
auto raw = pair->ledger()->raw_ledger();
|
||||
ledger.raw_ledger = std::vector<uint8_t>(raw->begin(), raw->end());
|
||||
|
||||
map.emplace(pair->seq_no(), std::move(ledger));
|
||||
}
|
||||
return map;
|
||||
}
|
||||
|
||||
const flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<HistoryLedgerPair>>>
|
||||
historyledgermap_to_flatbuf_historyledgermap(flatbuffers::FlatBufferBuilder &builder, const std::map<uint64_t, const p2p::history_ledger> &map)
|
||||
{
|
||||
std::vector<flatbuffers::Offset<HistoryLedgerPair>> fbvec;
|
||||
fbvec.reserve(map.size());
|
||||
for (auto const &[seq_no, ledger] : map)
|
||||
{
|
||||
flatbuffers::Offset<HistoryLedger> history_ledger = CreateHistoryLedger(
|
||||
builder,
|
||||
sv_to_flatbuff_bytes(builder, ledger.lcl),
|
||||
builder.CreateVector(ledger.raw_ledger));
|
||||
|
||||
fbvec.push_back(CreateHistoryLedgerPair(
|
||||
builder,
|
||||
seq_no,
|
||||
history_ledger));
|
||||
}
|
||||
return builder.CreateVector(fbvec);
|
||||
}
|
||||
|
||||
} // namespace fbschema::p2pmsg
|
||||
Reference in New Issue
Block a user