mirror of
https://github.com/XRPLF/rippled.git
synced 2025-12-06 17:27:55 +00:00
1) Change return from getCurrentValidations 2) Log tiebreaker logic to aid debugging 3) Change checkLastClosedLedger to use the new tie-breaker logic 4) Log when we refuse to switch to our own previous ledger 5) Track node ID in the serialized validation object 6) Simplify getCurrentValidations ledger suppression logic
127 lines
3.5 KiB
C++
127 lines
3.5 KiB
C++
|
|
#include "SerializedValidation.h"
|
|
|
|
#include "HashPrefixes.h"
|
|
#include "Log.h"
|
|
|
|
std::vector<SOElement::ptr> sValidationFormat;
|
|
|
|
static bool SVFInit()
|
|
{
|
|
sValidationFormat.push_back(new SOElement(sfFlags, SOE_REQUIRED));
|
|
sValidationFormat.push_back(new SOElement(sfLedgerHash, SOE_REQUIRED));
|
|
sValidationFormat.push_back(new SOElement(sfLedgerSequence, SOE_OPTIONAL));
|
|
sValidationFormat.push_back(new SOElement(sfCloseTime, SOE_OPTIONAL));
|
|
sValidationFormat.push_back(new SOElement(sfLoadFee, SOE_OPTIONAL));
|
|
sValidationFormat.push_back(new SOElement(sfBaseFee, SOE_OPTIONAL));
|
|
sValidationFormat.push_back(new SOElement(sfSigningTime, SOE_REQUIRED));
|
|
sValidationFormat.push_back(new SOElement(sfSigningPubKey, SOE_REQUIRED));
|
|
sValidationFormat.push_back(new SOElement(sfSignature, SOE_OPTIONAL));
|
|
return true;
|
|
};
|
|
|
|
bool SVFinitComplete = SVFInit();
|
|
|
|
const uint32 SerializedValidation::sFullFlag = 0x1;
|
|
|
|
SerializedValidation::SerializedValidation(SerializerIterator& sit, bool checkSignature)
|
|
: STObject(sValidationFormat, sit, sfValidation), mTrusted(false)
|
|
{
|
|
mNodeID = NewcoinAddress::createNodePublic(getFieldVL(sfSigningPubKey)).getNodeID();
|
|
assert(mNodeID.isNonZero());
|
|
if (checkSignature && !isValid())
|
|
{
|
|
Log(lsTRACE) << "Invalid validation " << getJson(0);
|
|
throw std::runtime_error("Invalid validation");
|
|
}
|
|
}
|
|
|
|
SerializedValidation::SerializedValidation(const uint256& ledgerHash, uint32 signTime,
|
|
const NewcoinAddress& naSeed, bool isFull)
|
|
: STObject(sValidationFormat, sfValidation), mTrusted(false)
|
|
{
|
|
setFieldH256(sfLedgerHash, ledgerHash);
|
|
setFieldU32(sfSigningTime, signTime);
|
|
if (naSeed.isValid())
|
|
{
|
|
NewcoinAddress np = NewcoinAddress::createNodePublic(naSeed);
|
|
setFieldVL(sfSigningPubKey, np.getNodePublic());
|
|
mNodeID = np.getNodeID();
|
|
assert(mNodeID.isNonZero());
|
|
}
|
|
if (!isFull)
|
|
setFlag(sFullFlag);
|
|
|
|
std::vector<unsigned char> signature;
|
|
NewcoinAddress::createNodePrivate(naSeed).signNodePrivate(getSigningHash(), signature);
|
|
setFieldVL(sfSignature, signature);
|
|
// XXX Check if this can fail.
|
|
// if (!NewcoinAddress::createNodePrivate(naSeed).signNodePrivate(getSigningHash(), mSignature.peekValue()))
|
|
// throw std::runtime_error("Unable to sign validation");
|
|
}
|
|
|
|
uint256 SerializedValidation::getSigningHash() const
|
|
{
|
|
return STObject::getSigningHash(sHP_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(const uint256& signingHash) const
|
|
{
|
|
try
|
|
{
|
|
NewcoinAddress naPublicKey = NewcoinAddress::createNodePublic(getFieldVL(sfSigningPubKey));
|
|
return naPublicKey.isValid() && naPublicKey.verifyNodePublic(signingHash, getFieldVL(sfSignature));
|
|
}
|
|
catch (...)
|
|
{
|
|
Log(lsINFO) << "exception validating validation";
|
|
return false;
|
|
}
|
|
}
|
|
|
|
NewcoinAddress SerializedValidation::getSignerPublic() const
|
|
{
|
|
NewcoinAddress a;
|
|
a.setNodePublic(getFieldVL(sfSigningPubKey));
|
|
return a;
|
|
}
|
|
|
|
bool SerializedValidation::isFull() const
|
|
{
|
|
return (getFlags() & sFullFlag) != 0;
|
|
}
|
|
|
|
std::vector<unsigned char> SerializedValidation::getSignature() const
|
|
{
|
|
return getFieldVL(sfSignature);
|
|
}
|
|
|
|
std::vector<unsigned char> SerializedValidation::getSigned() const
|
|
{
|
|
Serializer s;
|
|
add(s);
|
|
return s.peekData();
|
|
}
|
|
|
|
// vim:ts=4
|