Split up ripple_SerializedObject.h

This commit is contained in:
Vinnie Falco
2013-06-07 14:39:35 -07:00
parent ef232f4359
commit 6d8ee90a8d
12 changed files with 237 additions and 139 deletions

View File

@@ -1,128 +1,139 @@
DECLARE_INSTANCE(SerializedValidation);
SOTemplate sValidationFormat;
void SVFInit()
SerializedValidation::SerializedValidation (SerializerIterator& sit, bool checkSignature)
: STObject (getFormat (), sit, sfValidation)
, mTrusted (false)
{
sValidationFormat.push_back(SOElement(sfFlags, SOE_REQUIRED));
sValidationFormat.push_back(SOElement(sfLedgerHash, SOE_REQUIRED));
sValidationFormat.push_back(SOElement(sfLedgerSequence, SOE_OPTIONAL));
sValidationFormat.push_back(SOElement(sfCloseTime, SOE_OPTIONAL));
sValidationFormat.push_back(SOElement(sfLoadFee, SOE_OPTIONAL));
sValidationFormat.push_back(SOElement(sfFeatures, SOE_OPTIONAL));
sValidationFormat.push_back(SOElement(sfBaseFee, SOE_OPTIONAL));
sValidationFormat.push_back(SOElement(sfReserveBase, SOE_OPTIONAL));
sValidationFormat.push_back(SOElement(sfReserveIncrement, SOE_OPTIONAL));
sValidationFormat.push_back(SOElement(sfSigningTime, SOE_REQUIRED));
sValidationFormat.push_back(SOElement(sfSigningPubKey, SOE_REQUIRED));
sValidationFormat.push_back(SOElement(sfSignature, SOE_OPTIONAL));
};
const uint32 SerializedValidation::sFullFlag = 0x1;
SerializedValidation::SerializedValidation(SerializerIterator& sit, bool checkSignature)
: STObject(sValidationFormat, 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");
}
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(const uint256& ledgerHash, uint32 signTime,
const RippleAddress& raPub, bool isFull)
: STObject(sValidationFormat, sfValidation), mTrusted(false)
SerializedValidation::SerializedValidation (
const uint256& ledgerHash, uint32 signTime,
const RippleAddress& raPub, bool isFull)
: STObject (getFormat (), sfValidation)
, mTrusted (false)
{ // Does not sign
setFieldH256(sfLedgerHash, ledgerHash);
setFieldU32(sfSigningTime, signTime);
setFieldH256(sfLedgerHash, ledgerHash);
setFieldU32(sfSigningTime, signTime);
setFieldVL(sfSigningPubKey, raPub.getNodePublic());
mNodeID = raPub.getNodeID();
assert(mNodeID.isNonZero());
setFieldVL(sfSigningPubKey, raPub.getNodePublic());
mNodeID = raPub.getNodeID();
assert(mNodeID.isNonZero());
if (!isFull)
setFlag(sFullFlag);
if (!isFull)
setFlag(sFullFlag);
}
void SerializedValidation::sign(const RippleAddress& raPriv)
{
uint256 signingHash;
sign(signingHash, raPriv);
uint256 signingHash;
sign(signingHash, raPriv);
}
void SerializedValidation::sign(uint256& signingHash, const RippleAddress& raPriv)
{
signingHash = getSigningHash();
std::vector<unsigned char> signature;
raPriv.signNodePrivate(signingHash, signature);
setFieldVL(sfSignature, signature);
signingHash = getSigningHash();
std::vector<unsigned char> signature;
raPriv.signNodePrivate(signingHash, signature);
setFieldVL(sfSignature, signature);
}
uint256 SerializedValidation::getSigningHash() const
{
return STObject::getSigningHash(theConfig.SIGN_VALIDATION);
return STObject::getSigningHash(theConfig.SIGN_VALIDATION);
}
uint256 SerializedValidation::getLedgerHash() const
{
return getFieldH256(sfLedgerHash);
return getFieldH256(sfLedgerHash);
}
uint32 SerializedValidation::getSignTime() const
{
return getFieldU32(sfSigningTime);
return getFieldU32(sfSigningTime);
}
uint32 SerializedValidation::getFlags() const
{
return getFieldU32(sfFlags);
return getFieldU32(sfFlags);
}
bool SerializedValidation::isValid() const
{
return isValid(getSigningHash());
return isValid(getSigningHash());
}
bool SerializedValidation::isValid(const uint256& 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;
}
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;
RippleAddress a;
a.setNodePublic(getFieldVL(sfSigningPubKey));
return a;
}
bool SerializedValidation::isFull() const
{
return (getFlags() & sFullFlag) != 0;
return (getFlags() & sFullFlag) != 0;
}
std::vector<unsigned char> SerializedValidation::getSignature() const
{
return getFieldVL(sfSignature);
return getFieldVL(sfSignature);
}
std::vector<unsigned char> SerializedValidation::getSigned() const
{
Serializer s;
add(s);
return s.peekData();
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

View File

@@ -1,21 +1,23 @@
#ifndef __VALIDATION__
#define __VALIDATION__
#ifndef RIPPLE_SERIALIZEDVALIDATION_H
#define RIPPLE_SERIALIZEDVALIDATION_H
DEFINE_INSTANCE(SerializedValidation);
DEFINE_INSTANCE (SerializedValidation);
class SerializedValidation : public STObject, private IS_INSTANCE(SerializedValidation)
class SerializedValidation
: public STObject
, private IS_INSTANCE (SerializedValidation)
{
public:
typedef boost::shared_ptr<SerializedValidation> pointer;
typedef const boost::shared_ptr<SerializedValidation>& ref;
static const uint32 sFullFlag;
static const uint32 sFullFlag = 0x1;
// These throw if the object is not valid
SerializedValidation(SerializerIterator& sit, bool checkSignature = true);
// These throw if the object is not valid
SerializedValidation (SerializerIterator& sit, bool checkSignature = true);
// Does not sign the validation
SerializedValidation(const uint256& ledgerHash, uint32 signTime, const RippleAddress& raPub, bool isFull);
SerializedValidation (const uint256& ledgerHash, uint32 signTime, const RippleAddress& raPub, bool isFull);
uint256 getLedgerHash() const;
uint32 getSignTime() const;
@@ -36,15 +38,17 @@ public:
// The validation this replaced
const uint256& getPreviousHash() { return mPreviousHash; }
bool isPreviousHash(const uint256& h) { return mPreviousHash == h; }
bool isPreviousHash(const uint256& h) const { return mPreviousHash == h; }
void setPreviousHash(const uint256& h) { mPreviousHash = h; }
private:
uint256 mPreviousHash;
static SOTemplate const& getFormat ();
void setNode ();
uint256 mPreviousHash;
uint160 mNodeID;
bool mTrusted;
void setNode();
};
#endif

View File

@@ -12,9 +12,9 @@
namespace po = boost::program_options;
// VFALCO: TODO make these singletons that initialize statically
extern void TFInit();
extern void LEFInit();
extern void SVFInit();
using namespace std;
using namespace boost::unit_test;
@@ -213,9 +213,9 @@ int main(int argc, char* argv[])
InstanceType::multiThread();
// VFALCO: TODO make these singletons that initialize statically
TFInit();
LEFInit();
SVFInit();
if (vm.count("unittest"))
{