mirror of
https://github.com/XRPLF/rippled.git
synced 2025-11-20 02:55:50 +00:00
145 lines
3.9 KiB
C++
145 lines
3.9 KiB
C++
//------------------------------------------------------------------------------
|
|
/*
|
|
Copyright (c) 2011-2013, OpenCoin, Inc.
|
|
*/
|
|
//==============================================================================
|
|
|
|
SerializedValidation::SerializedValidation (SerializerIterator& sit, bool checkSignature)
|
|
: STObject (getFormat (), sit, sfValidation)
|
|
, mTrusted (false)
|
|
{
|
|
mNodeID = RippleAddress::createNodePublic (getFieldVL (sfSigningPubKey)).getNodeID ();
|
|
assert (mNodeID.isNonZero ());
|
|
|
|
if (checkSignature && !isValid ())
|
|
{
|
|
Log (lsTRACE) << "Invalid validation " << getJson (0);
|
|
throw std::runtime_error ("Invalid validation");
|
|
}
|
|
}
|
|
|
|
SerializedValidation::SerializedValidation (
|
|
uint256 const& ledgerHash, uint32 signTime,
|
|
const RippleAddress& raPub, bool isFull)
|
|
: STObject (getFormat (), sfValidation)
|
|
, mTrusted (false)
|
|
{
|
|
// Does not sign
|
|
setFieldH256 (sfLedgerHash, ledgerHash);
|
|
setFieldU32 (sfSigningTime, signTime);
|
|
|
|
setFieldVL (sfSigningPubKey, raPub.getNodePublic ());
|
|
mNodeID = raPub.getNodeID ();
|
|
assert (mNodeID.isNonZero ());
|
|
|
|
if (!isFull)
|
|
setFlag (sFullFlag);
|
|
}
|
|
|
|
void SerializedValidation::sign (const RippleAddress& raPriv)
|
|
{
|
|
uint256 signingHash;
|
|
sign (signingHash, raPriv);
|
|
}
|
|
|
|
void SerializedValidation::sign (uint256& signingHash, const RippleAddress& raPriv)
|
|
{
|
|
signingHash = getSigningHash ();
|
|
Blob signature;
|
|
raPriv.signNodePrivate (signingHash, signature);
|
|
setFieldVL (sfSignature, signature);
|
|
}
|
|
|
|
uint256 SerializedValidation::getSigningHash () const
|
|
{
|
|
return STObject::getSigningHash (getConfig ().SIGN_VALIDATION);
|
|
}
|
|
|
|
uint256 SerializedValidation::getLedgerHash () const
|
|
{
|
|
return getFieldH256 (sfLedgerHash);
|
|
}
|
|
|
|
uint32 SerializedValidation::getSignTime () const
|
|
{
|
|
return getFieldU32 (sfSigningTime);
|
|
}
|
|
|
|
uint32 SerializedValidation::getFlags () const
|
|
{
|
|
return getFieldU32 (sfFlags);
|
|
}
|
|
|
|
bool SerializedValidation::isValid () const
|
|
{
|
|
return isValid (getSigningHash ());
|
|
}
|
|
|
|
bool SerializedValidation::isValid (uint256 const& signingHash) const
|
|
{
|
|
try
|
|
{
|
|
RippleAddress raPublicKey = RippleAddress::createNodePublic (getFieldVL (sfSigningPubKey));
|
|
return raPublicKey.isValid () && raPublicKey.verifyNodePublic (signingHash, getFieldVL (sfSignature));
|
|
}
|
|
catch (...)
|
|
{
|
|
Log (lsINFO) << "exception validating validation";
|
|
return false;
|
|
}
|
|
}
|
|
|
|
RippleAddress SerializedValidation::getSignerPublic () const
|
|
{
|
|
RippleAddress a;
|
|
a.setNodePublic (getFieldVL (sfSigningPubKey));
|
|
return a;
|
|
}
|
|
|
|
bool SerializedValidation::isFull () const
|
|
{
|
|
return (getFlags () & sFullFlag) != 0;
|
|
}
|
|
|
|
Blob SerializedValidation::getSignature () const
|
|
{
|
|
return getFieldVL (sfSignature);
|
|
}
|
|
|
|
Blob SerializedValidation::getSigned () const
|
|
{
|
|
Serializer s;
|
|
add (s);
|
|
return s.peekData ();
|
|
}
|
|
|
|
SOTemplate const& SerializedValidation::getFormat ()
|
|
{
|
|
struct FormatHolder
|
|
{
|
|
SOTemplate format;
|
|
|
|
FormatHolder ()
|
|
{
|
|
format.push_back (SOElement (sfFlags, SOE_REQUIRED));
|
|
format.push_back (SOElement (sfLedgerHash, SOE_REQUIRED));
|
|
format.push_back (SOElement (sfLedgerSequence, SOE_OPTIONAL));
|
|
format.push_back (SOElement (sfCloseTime, SOE_OPTIONAL));
|
|
format.push_back (SOElement (sfLoadFee, SOE_OPTIONAL));
|
|
format.push_back (SOElement (sfFeatures, SOE_OPTIONAL));
|
|
format.push_back (SOElement (sfBaseFee, SOE_OPTIONAL));
|
|
format.push_back (SOElement (sfReserveBase, SOE_OPTIONAL));
|
|
format.push_back (SOElement (sfReserveIncrement, SOE_OPTIONAL));
|
|
format.push_back (SOElement (sfSigningTime, SOE_REQUIRED));
|
|
format.push_back (SOElement (sfSigningPubKey, SOE_REQUIRED));
|
|
format.push_back (SOElement (sfSignature, SOE_OPTIONAL));
|
|
}
|
|
};
|
|
|
|
static FormatHolder holder;
|
|
|
|
return holder.format;
|
|
}
|
|
|
|
// vim:ts=4
|