rippled
STValidation.cpp
1 //------------------------------------------------------------------------------
2 /*
3  This file is part of rippled: https://github.com/ripple/rippled
4  Copyright (c) 2012, 2013 Ripple Labs Inc.
5 
6  Permission to use, copy, modify, and/or distribute this software for any
7  purpose with or without fee is hereby granted, provided that the above
8  copyright notice and this permission notice appear in all copies.
9 
10  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18 //==============================================================================
19 
20 #include <ripple/basics/Log.h>
21 #include <ripple/basics/contract.h>
22 #include <ripple/json/to_string.h>
23 #include <ripple/protocol/HashPrefix.h>
24 #include <ripple/protocol/STValidation.h>
25 
26 namespace ripple {
27 
29  uint256 const& ledgerHash,
30  std::uint32_t ledgerSeq,
31  uint256 const& consensusHash,
32  NetClock::time_point signTime,
33  PublicKey const& publicKey,
34  SecretKey const& secretKey,
35  NodeID const& nodeID,
36  bool isFull,
37  FeeSettings const& fees,
38  std::vector<uint256> const& amendments)
39  : STObject(getFormat(), sfValidation), mNodeID(nodeID), mSeen(signTime)
40 {
41  // This is our own public key and it should always be valid.
42  if (!publicKeyType(publicKey))
43  LogicError("Invalid validation public key");
44  assert(mNodeID.isNonZero());
45  setFieldH256(sfLedgerHash, ledgerHash);
46  setFieldH256(sfConsensusHash, consensusHash);
47  setFieldU32(sfSigningTime, signTime.time_since_epoch().count());
48 
49  setFieldVL(sfSigningPubKey, publicKey.slice());
50  if (isFull)
52 
53  setFieldU32(sfLedgerSequence, ledgerSeq);
54 
55  if (fees.loadFee)
57 
58  // IF any of the values are out of the valid range, don't send a value.
59  // They should not be an issue, though, because the voting
60  // process (FeeVoteImpl) ignores any out of range values.
61  if (fees.baseFee)
62  {
63  if (auto const v = fees.baseFee->dropsAs<std::uint64_t>())
65  }
66 
67  if (fees.reserveBase)
68  {
69  if (auto const v = fees.reserveBase->dropsAs<std::uint32_t>())
71  }
72 
73  if (fees.reserveIncrement)
74  {
75  if (auto const v = fees.reserveIncrement->dropsAs<std::uint32_t>())
77  }
78 
79  if (!amendments.empty())
81 
83 
84  auto const signingHash = getSigningHash();
85  setFieldVL(
86  sfSignature, signDigest(getSignerPublic(), secretKey, signingHash));
87 
88  setTrusted();
89 }
90 
91 uint256
93 {
95 }
96 
97 uint256
99 {
100  return getFieldH256(sfLedgerHash);
101 }
102 
103 uint256
105 {
107 }
108 
111 {
113 }
114 
117 {
118  return mSeen;
119 }
120 
121 bool
123 {
124  try
125  {
127  return false;
128 
129  return verifyDigest(
130  getSignerPublic(),
131  getSigningHash(),
134  }
135  catch (std::exception const&)
136  {
137  JLOG(debugLog().error()) << "Exception validating validation";
138  return false;
139  }
140 }
141 
142 PublicKey
144 {
146 }
147 
148 bool
150 {
151  return (getFlags() & kFullFlag) != 0;
152 }
153 
154 Blob
156 {
157  return getFieldVL(sfSignature);
158 }
159 
160 Blob
162 {
163  Serializer s;
164  add(s);
165  return s.peekData();
166 }
167 
168 SOTemplate const&
170 {
171  struct FormatHolder
172  {
173  SOTemplate format{
174  {sfFlags, soeREQUIRED},
188  };
189  };
190 
191  static const FormatHolder holder;
192 
193  return holder.format;
194 }
195 
196 } // namespace ripple
ripple::STValidation::isValid
bool isValid() const
Definition: STValidation.cpp:122
ripple::sfLoadFee
const SF_U32 sfLoadFee(access, STI_UINT32, 24, "LoadFee")
Definition: SField.h:376
ripple::makeSlice
std::enable_if_t< std::is_same< T, char >::value||std::is_same< T, unsigned char >::value, Slice > makeSlice(std::array< T, N > const &a)
Definition: Slice.h:194
ripple::STValidation::getConsensusHash
uint256 getConsensusHash() const
Definition: STValidation.cpp:104
ripple::STValidation::FeeSettings::reserveBase
boost::optional< XRPAmount > reserveBase
Definition: STValidation.h:103
std::exception
STL class.
ripple::base_uint::isNonZero
bool isNonZero() const
Definition: base_uint.h:480
ripple::publicKeyType
boost::optional< KeyType > publicKeyType(Slice const &slice)
Returns the type of public key.
Definition: PublicKey.cpp:203
ripple::STObject::setFieldV256
void setFieldV256(SField const &field, STVector256 const &v)
Definition: STObject.cpp:667
ripple::STValidation::isFull
bool isFull() const
Definition: STValidation.cpp:149
ripple::sfSigningPubKey
const SF_Blob sfSigningPubKey(access, STI_VL, 3, "SigningPubKey")
Definition: SField.h:456
std::vector
STL class.
ripple::STValidation::FeeSettings::loadFee
boost::optional< std::uint32_t > loadFee
Definition: STValidation.h:101
ripple::STValidation::getLedgerHash
uint256 getLedgerHash() const
Definition: STValidation.cpp:98
ripple::sfFlags
const SF_U32 sfFlags(access, STI_UINT32, 2, "Flags")
Definition: SField.h:353
std::chrono::duration
ripple::PublicKey::slice
Slice slice() const noexcept
Definition: PublicKey.h:123
ripple::soeREQUIRED
@ soeREQUIRED
Definition: SOTemplate.h:34
ripple::STObject::setFieldVL
void setFieldVL(SField const &field, Blob const &)
Definition: STObject.cpp:679
ripple::STObject::getFieldVL
Blob getFieldVL(SField const &field) const
Definition: STObject.cpp:579
ripple::STValidation::mNodeID
NodeID mNodeID
Definition: STValidation.h:217
ripple::sfReserveBase
const SF_U32 sfReserveBase(access, STI_UINT32, 31, "ReserveBase")
Definition: SField.h:383
ripple::STValidation::getSignature
Blob getSignature() const
Definition: STValidation.cpp:155
ripple::sfSignature
const SF_Blob sfSignature(access, STI_VL, 6, "Signature", SField::sMD_Default, SField::notSigning)
Definition: SField.h:458
ripple::debugLog
beast::Journal debugLog()
Returns a debug journal.
Definition: Log.cpp:452
ripple::base_uint< 256 >
std::chrono::time_point::time_since_epoch
T time_since_epoch(T... args)
ripple::SOTemplate
Defines the fields and their attributes within a STObject.
Definition: SOTemplate.h:75
ripple::PublicKey
A public key.
Definition: PublicKey.h:59
ripple::signDigest
Buffer signDigest(PublicKey const &pk, SecretKey const &sk, uint256 const &digest)
Generate a signature for a message digest.
Definition: SecretKey.cpp:98
ripple::STObject::setFieldH256
void setFieldH256(SField const &field, uint256 const &)
Definition: STObject.cpp:661
ripple::soeOPTIONAL
@ soeOPTIONAL
Definition: SOTemplate.h:35
ripple::sfSigningTime
const SF_U32 sfSigningTime(access, STI_UINT32, 9, "SigningTime")
Definition: SField.h:360
ripple::STValidation::getFormat
static SOTemplate const & getFormat()
Definition: STValidation.cpp:169
ripple::STValidation::getSerialized
Blob getSerialized() const
Definition: STValidation.cpp:161
ripple::STValidation::mSeen
NetClock::time_point mSeen
Definition: STValidation.h:219
ripple::sfLedgerSequence
const SF_U32 sfLedgerSequence(access, STI_UINT32, 6, "LedgerSequence")
Definition: SField.h:357
std::chrono::time_point
ripple::STObject::getFlags
std::uint32_t getFlags() const
Definition: STObject.cpp:465
ripple::HashPrefix::validation
@ validation
validation for signing
std::uint32_t
ripple::SecretKey
A secret key.
Definition: SecretKey.h:36
ripple::sfValidation
const SField sfValidation(access, STI_VALIDATION, 257, "Validation")
Definition: SField.h:335
ripple::STValidation::getSignTime
NetClock::time_point getSignTime() const
Definition: STValidation.cpp:110
ripple::verifyDigest
bool verifyDigest(PublicKey const &publicKey, uint256 const &digest, Slice const &sig, bool mustBeFullyCanonical)
Verify a secp256k1 signature on the digest of a message.
Definition: PublicKey.cpp:218
ripple::KeyType::secp256k1
@ secp256k1
ripple::STValidation::getSeenTime
NetClock::time_point getSeenTime() const
Definition: STValidation.cpp:116
ripple::Serializer
Definition: Serializer.h:43
ripple::STObject
Definition: STObject.h:51
ripple
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: RCLCensorshipDetector.h:29
ripple::STObject::getSigningHash
uint256 getSigningHash(HashPrefix prefix) const
Definition: STObject.cpp:332
ripple::STObject::add
virtual void add(Serializer &s) const override
Definition: STObject.h:353
ripple::STValidation::FeeSettings::baseFee
boost::optional< XRPAmount > baseFee
Definition: STValidation.h:102
ripple::sfReserveIncrement
const SF_U32 sfReserveIncrement(access, STI_UINT32, 32, "ReserveIncrement")
Definition: SField.h:384
ripple::LogicError
void LogicError(std::string const &how) noexcept
Called when faulty logic causes a broken invariant.
Definition: contract.cpp:48
ripple::Serializer::peekData
Blob const & peekData() const
Definition: Serializer.h:202
ripple::vfFullyCanonicalSig
const std::uint32_t vfFullyCanonicalSig
Definition: STValidation.h:35
ripple::STValidation::setTrusted
void setTrusted()
Definition: STValidation.h:190
ripple::sfCloseTime
const SF_U32 sfCloseTime(access, STI_UINT32, 7, "CloseTime")
Definition: SField.h:358
ripple::STObject::setFlag
bool setFlag(std::uint32_t)
Definition: STObject.cpp:435
ripple::STVector256
Definition: STVector256.h:29
std::vector::empty
T empty(T... args)
ripple::STValidation::getSigningHash
uint256 getSigningHash() const
Definition: STValidation.cpp:92
ripple::sfCookie
const SF_U64 sfCookie(access, STI_UINT64, 10, "Cookie")
Definition: SField.h:403
ripple::STValidation::getSignerPublic
PublicKey getSignerPublic() const
Definition: STValidation.cpp:143
ripple::sfAmendments
const SF_Vec256 sfAmendments(access, STI_VECTOR256, 3, "Amendments")
Definition: SField.h:489
ripple::STObject::getFieldU32
std::uint32_t getFieldU32(SField const &field) const
Definition: STObject.cpp:543
ripple::STValidation::kFullFlag
@ kFullFlag
Definition: STValidation.h:50
ripple::STValidation::FeeSettings::reserveIncrement
boost::optional< XRPAmount > reserveIncrement
Definition: STValidation.h:104
ripple::sfBaseFee
const SF_U64 sfBaseFee(access, STI_UINT64, 5, "BaseFee")
Definition: SField.h:398
ripple::STObject::setFieldU64
void setFieldU64(SField const &field, std::uint64_t)
Definition: STObject.cpp:649
ripple::sfConsensusHash
const SF_U256 sfConsensusHash(access, STI_HASH256, 23, "ConsensusHash")
Definition: SField.h:433
ripple::STValidation::FeeSettings
Fees to set when issuing a new validation.
Definition: STValidation.h:99
ripple::STObject::setFieldU32
void setFieldU32(SField const &field, std::uint32_t)
Definition: STObject.cpp:643
ripple::sfLedgerHash
const SF_U256 sfLedgerHash(access, STI_HASH256, 1, "LedgerHash")
Definition: SField.h:415
ripple::STObject::getFieldH256
uint256 getFieldH256(SField const &field) const
Definition: STObject.cpp:567
ripple::STValidation::STValidation
STValidation(SerialIter &sit, LookupNodeID &&lookupNodeID, bool checkSignature)
Construct a STValidation from a peer.
Definition: STValidation.h:69