Files
rippled/src/xrpld/app/consensus/RCLCxPeerPos.cpp
2026-04-17 16:43:49 +00:00

73 lines
1.9 KiB
C++

#include <xrpld/app/consensus/RCLCxPeerPos.h>
#include <xrpl/basics/Slice.h>
#include <xrpl/basics/base_uint.h>
#include <xrpl/basics/chrono.h>
#include <xrpl/beast/utility/instrumentation.h>
#include <xrpl/json/json_value.h>
#include <xrpl/protocol/PublicKey.h>
#include <xrpl/protocol/Serializer.h>
#include <xrpl/protocol/jss.h>
#include <xrpl/protocol/tokens.h>
#include <cstdint>
namespace xrpl {
// Used to construct received proposals
RCLCxPeerPos::RCLCxPeerPos(
PublicKey const& publicKey,
Slice const& signature,
uint256 const& suppression,
Proposal const& proposal) // trivially copyable
: publicKey_(publicKey), suppression_(suppression), proposal_(proposal)
{
// The maximum allowed size of a signature is 72 bytes; we verify
// this elsewhere, but we want to be extra careful here:
XRPL_ASSERT(
!signature.empty() && signature.size() <= signature_.capacity(),
"xrpl::RCLCxPeerPos::RCLCxPeerPos : valid signature size");
if (!signature.empty() && signature.size() <= signature_.capacity())
signature_.assign(signature.begin(), signature.end());
}
bool
RCLCxPeerPos::checkSign() const
{
return verifyDigest(publicKey(), proposal_.signingHash(), signature(), false);
}
Json::Value
RCLCxPeerPos::getJson() const
{
auto ret = proposal().getJson();
if (publicKey().size() != 0u)
ret[jss::peer_id] = toBase58(TokenType::NodePublic, publicKey());
return ret;
}
uint256
proposalUniqueId(
uint256 const& proposeHash,
uint256 const& previousLedger,
std::uint32_t proposeSeq,
NetClock::time_point closeTime,
Slice const& publicKey,
Slice const& signature)
{
Serializer s(512);
s.addBitString(proposeHash);
s.addBitString(previousLedger);
s.add32(proposeSeq);
s.add32(closeTime.time_since_epoch().count());
s.addVL(publicKey);
s.addVL(signature);
return s.getSHA512Half();
}
} // namespace xrpl