rippled
STTx.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/StringUtilities.h>
22 #include <ripple/basics/contract.h>
23 #include <ripple/basics/safe_cast.h>
24 #include <ripple/json/to_string.h>
25 #include <ripple/protocol/Feature.h>
26 #include <ripple/protocol/HashPrefix.h>
27 #include <ripple/protocol/Protocol.h>
28 #include <ripple/protocol/PublicKey.h>
29 #include <ripple/protocol/STAccount.h>
30 #include <ripple/protocol/STArray.h>
31 #include <ripple/protocol/STTx.h>
32 #include <ripple/protocol/Sign.h>
33 #include <ripple/protocol/TxFlags.h>
34 #include <ripple/protocol/UintTypes.h>
35 #include <ripple/protocol/jss.h>
36 #include <boost/format.hpp>
37 #include <array>
38 #include <memory>
39 #include <type_traits>
40 #include <utility>
41 
42 namespace ripple {
43 
44 static auto
46 {
47  auto format = TxFormats::getInstance().findByType(type);
48 
49  if (format == nullptr)
50  {
51  Throw<std::runtime_error>(
52  "Invalid transaction type " +
54  }
55 
56  return format;
57 }
58 
59 STTx::STTx(STObject&& object) noexcept(false) : STObject(std::move(object))
60 {
61  tx_type_ = safe_cast<TxType>(getFieldU16(sfTransactionType));
62  applyTemplate(getTxFormat(tx_type_)->getSOTemplate()); // may throw
63  tid_ = getHash(HashPrefix::transactionID);
64 }
65 
66 STTx::STTx(SerialIter& sit) noexcept(false) : STObject(sfTransaction)
67 {
68  int length = sit.getBytesLeft();
69 
70  if ((length < txMinSizeBytes) || (length > txMaxSizeBytes))
71  Throw<std::runtime_error>("Transaction length invalid");
72 
73  if (set(sit))
74  Throw<std::runtime_error>("Transaction contains an object terminator");
75 
76  tx_type_ = safe_cast<TxType>(getFieldU16(sfTransactionType));
77 
78  applyTemplate(getTxFormat(tx_type_)->getSOTemplate()); // May throw
79  tid_ = getHash(HashPrefix::transactionID);
80 }
81 
82 STTx::STTx(TxType type, std::function<void(STObject&)> assembler)
84 {
85  auto format = getTxFormat(type);
86 
87  set(format->getSOTemplate());
88  setFieldU16(sfTransactionType, format->getType());
89 
90  assembler(*this);
91 
92  tx_type_ = safe_cast<TxType>(getFieldU16(sfTransactionType));
93 
94  if (tx_type_ != type)
95  LogicError("Transaction type was mutated during assembly");
96 
98 }
99 
102 {
103  std::string ret = "\"";
104  ret += to_string(getTransactionID());
105  ret += "\" = {";
106  ret += STObject::getFullText();
107  ret += "}";
108  return ret;
109 }
110 
111 boost::container::flat_set<AccountID>
113 {
114  boost::container::flat_set<AccountID> list;
115 
116  for (auto const& it : *this)
117  {
118  if (auto sacc = dynamic_cast<STAccount const*>(&it))
119  {
120  assert(!sacc->isDefault());
121  if (!sacc->isDefault())
122  list.insert(sacc->value());
123  }
124  else if (auto samt = dynamic_cast<STAmount const*>(&it))
125  {
126  auto const& issuer = samt->getIssuer();
127  if (!isXRP(issuer))
128  list.insert(issuer);
129  }
130  }
131 
132  return list;
133 }
134 
135 static Blob
136 getSigningData(STTx const& that)
137 {
138  Serializer s;
140  that.addWithoutSigningFields(s);
141  return s.getData();
142 }
143 
144 uint256
146 {
148 }
149 
150 Blob
152 {
153  try
154  {
155  return getFieldVL(sfTxnSignature);
156  }
157  catch (std::exception const&)
158  {
159  return Blob();
160  }
161 }
162 
163 SeqProxy
165 {
167  if (seq != 0)
168  return SeqProxy::sequence(seq);
169 
170  boost::optional<std::uint32_t> const ticketSeq{operator[](
171  ~sfTicketSequence)};
172  if (!ticketSeq)
173  // No TicketSequence specified. Return the Sequence, whatever it is.
174  return SeqProxy::sequence(seq);
175 
176  return SeqProxy{SeqProxy::ticket, *ticketSeq};
177 }
178 
179 void
180 STTx::sign(PublicKey const& publicKey, SecretKey const& secretKey)
181 {
182  auto const data = getSigningData(*this);
183 
184  auto const sig = ripple::sign(publicKey, secretKey, makeSlice(data));
185 
188 }
189 
191 STTx::checkSign(RequireFullyCanonicalSig requireCanonicalSig) const
192 {
193  std::pair<bool, std::string> ret{false, ""};
194  try
195  {
196  // Determine whether we're single- or multi-signing by looking
197  // at the SigningPubKey. If it's empty we must be
198  // multi-signing. Otherwise we're single-signing.
199  Blob const& signingPubKey = getFieldVL(sfSigningPubKey);
200  ret = signingPubKey.empty() ? checkMultiSign(requireCanonicalSig)
201  : checkSingleSign(requireCanonicalSig);
202  }
203  catch (std::exception const&)
204  {
205  ret = {false, "Internal signature check failure."};
206  }
207  return ret;
208 }
209 
211 {
213  ret[jss::hash] = to_string(getTransactionID());
214  return ret;
215 }
216 
218 STTx::getJson(JsonOptions options, bool binary) const
219 {
220  if (binary)
221  {
222  Json::Value ret;
224  ret[jss::tx] = strHex(s.peekData());
225  ret[jss::hash] = to_string(getTransactionID());
226  return ret;
227  }
228  return getJson(options);
229 }
230 
231 std::string const&
233 {
234  static std::string const sql =
235  "INSERT OR REPLACE INTO Transactions "
236  "(TransID, TransType, FromAcct, FromSeq, LedgerSeq, Status, RawTxn, "
237  "TxnMeta)"
238  " VALUES ";
239 
240  return sql;
241 }
242 
244 STTx::getMetaSQL(std::uint32_t inLedger, std::string const& escapedMetaData)
245  const
246 {
247  Serializer s;
248  add(s);
249  return getMetaSQL(s, inLedger, txnSqlValidated, escapedMetaData);
250 }
251 
252 // VFALCO This could be a free function elsewhere
255  Serializer rawTxn,
256  std::uint32_t inLedger,
257  char status,
258  std::string const& escapedMetaData) const
259 {
260  static boost::format bfTrans(
261  "('%s', '%s', '%s', '%d', '%d', '%c', %s, %s)");
262  std::string rTxn = sqlBlobLiteral(rawTxn.peekData());
263 
264  auto format = TxFormats::getInstance().findByType(tx_type_);
265  assert(format != nullptr);
266 
267  return str(
268  boost::format(bfTrans) % to_string(getTransactionID()) %
269  format->getName() % toBase58(getAccountID(sfAccount)) %
270  getFieldU32(sfSequence) % inLedger % status % rTxn % escapedMetaData);
271 }
272 
275 {
276  // We don't allow both a non-empty sfSigningPubKey and an sfSigners.
277  // That would allow the transaction to be signed two ways. So if both
278  // fields are present the signature is invalid.
280  return {false, "Cannot both single- and multi-sign."};
281 
282  bool validSig = false;
283  try
284  {
285  bool const fullyCanonical = (getFlags() & tfFullyCanonicalSig) ||
286  (requireCanonicalSig == RequireFullyCanonicalSig::yes);
287 
288  auto const spk = getFieldVL(sfSigningPubKey);
289 
290  if (publicKeyType(makeSlice(spk)))
291  {
292  Blob const signature = getFieldVL(sfTxnSignature);
293  Blob const data = getSigningData(*this);
294 
295  validSig = verify(
296  PublicKey(makeSlice(spk)),
297  makeSlice(data),
298  makeSlice(signature),
300  }
301  }
302  catch (std::exception const&)
303  {
304  // Assume it was a signature failure.
305  validSig = false;
306  }
307  if (validSig == false)
308  return {false, "Invalid signature."};
309 
310  return {true, ""};
311 }
312 
315 {
316  // Make sure the MultiSigners are present. Otherwise they are not
317  // attempting multi-signing and we just have a bad SigningPubKey.
319  return {false, "Empty SigningPubKey."};
320 
321  // We don't allow both an sfSigners and an sfTxnSignature. Both fields
322  // being present would indicate that the transaction is signed both ways.
324  return {false, "Cannot both single- and multi-sign."};
325 
326  STArray const& signers{getFieldArray(sfSigners)};
327 
328  // There are well known bounds that the number of signers must be within.
329  if (signers.size() < minMultiSigners || signers.size() > maxMultiSigners)
330  return {false, "Invalid Signers array size."};
331 
332  // We can ease the computational load inside the loop a bit by
333  // pre-constructing part of the data that we hash. Fill a Serializer
334  // with the stuff that stays constant from signature to signature.
335  Serializer const dataStart{startMultiSigningData(*this)};
336 
337  // We also use the sfAccount field inside the loop. Get it once.
338  auto const txnAccountID = getAccountID(sfAccount);
339 
340  // Determine whether signatures must be full canonical.
341  bool const fullyCanonical = (getFlags() & tfFullyCanonicalSig) ||
342  (requireCanonicalSig == RequireFullyCanonicalSig::yes);
343 
344  // Signers must be in sorted order by AccountID.
345  AccountID lastAccountID(beast::zero);
346 
347  for (auto const& signer : signers)
348  {
349  auto const accountID = signer.getAccountID(sfAccount);
350 
351  // The account owner may not multisign for themselves.
352  if (accountID == txnAccountID)
353  return {false, "Invalid multisigner."};
354 
355  // No duplicate signers allowed.
356  if (lastAccountID == accountID)
357  return {false, "Duplicate Signers not allowed."};
358 
359  // Accounts must be in order by account ID. No duplicates allowed.
360  if (lastAccountID > accountID)
361  return {false, "Unsorted Signers array."};
362 
363  // The next signature must be greater than this one.
364  lastAccountID = accountID;
365 
366  // Verify the signature.
367  bool validSig = false;
368  try
369  {
370  Serializer s = dataStart;
371  finishMultiSigningData(accountID, s);
372 
373  auto spk = signer.getFieldVL(sfSigningPubKey);
374 
375  if (publicKeyType(makeSlice(spk)))
376  {
377  Blob const signature = signer.getFieldVL(sfTxnSignature);
378 
379  validSig = verify(
380  PublicKey(makeSlice(spk)),
381  s.slice(),
382  makeSlice(signature),
384  }
385  }
386  catch (std::exception const&)
387  {
388  // We assume any problem lies with the signature.
389  validSig = false;
390  }
391  if (!validSig)
392  return {
393  false,
394  std::string("Invalid signature on account ") +
395  toBase58(accountID) + "."};
396  }
397 
398  // All signatures verified.
399  return {true, ""};
400 }
401 
402 //------------------------------------------------------------------------------
403 
404 static bool
405 isMemoOkay(STObject const& st, std::string& reason)
406 {
407  if (!st.isFieldPresent(sfMemos))
408  return true;
409 
410  auto const& memos = st.getFieldArray(sfMemos);
411 
412  // The number 2048 is a preallocation hint, not a hard limit
413  // to avoid allocate/copy/free's
414  Serializer s(2048);
415  memos.add(s);
416 
417  // FIXME move the memo limit into a config tunable
418  if (s.getDataLength() > 1024)
419  {
420  reason = "The memo exceeds the maximum allowed size.";
421  return false;
422  }
423 
424  for (auto const& memo : memos)
425  {
426  auto memoObj = dynamic_cast<STObject const*>(&memo);
427 
428  if (!memoObj || (memoObj->getFName() != sfMemo))
429  {
430  reason = "A memo array may contain only Memo objects.";
431  return false;
432  }
433 
434  for (auto const& memoElement : *memoObj)
435  {
436  auto const& name = memoElement.getFName();
437 
438  if (name != sfMemoType && name != sfMemoData &&
439  name != sfMemoFormat)
440  {
441  reason =
442  "A memo may contain only MemoType, MemoData or "
443  "MemoFormat fields.";
444  return false;
445  }
446 
447  // The raw data is stored as hex-octets, which we want to decode.
448  auto optData = strUnHex(memoElement.getText());
449 
450  if (!optData)
451  {
452  reason =
453  "The MemoType, MemoData and MemoFormat fields may "
454  "only contain hex-encoded data.";
455  return false;
456  }
457 
458  if (name == sfMemoData)
459  continue;
460 
461  // The only allowed characters for MemoType and MemoFormat are the
462  // characters allowed in URLs per RFC 3986: alphanumerics and the
463  // following symbols: -._~:/?#[]@!$&'()*+,;=%
464  static std::array<char, 256> const allowedSymbols = [] {
466  a.fill(0);
467 
468  std::string symbols(
469  "0123456789"
470  "-._~:/?#[]@!$&'()*+,;=%"
471  "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
472  "abcdefghijklmnopqrstuvwxyz");
473 
474  for (char c : symbols)
475  a[c] = 1;
476  return a;
477  }();
478 
479  for (auto c : *optData)
480  {
481  if (!allowedSymbols[c])
482  {
483  reason =
484  "The MemoType and MemoFormat fields may only "
485  "contain characters that are allowed in URLs "
486  "under RFC 3986.";
487  return false;
488  }
489  }
490  }
491  }
492 
493  return true;
494 }
495 
496 // Ensure all account fields are 160-bits
497 static bool
499 {
500  for (int i = 0; i < st.getCount(); ++i)
501  {
502  auto t = dynamic_cast<STAccount const*>(st.peekAtPIndex(i));
503  if (t && t->isDefault())
504  return false;
505  }
506 
507  return true;
508 }
509 
510 bool
512 {
513  if (!isMemoOkay(st, reason))
514  return false;
515 
516  if (!isAccountFieldOkay(st))
517  {
518  reason = "An account field is invalid.";
519  return false;
520  }
521 
522  if (isPseudoTx(st))
523  {
524  reason = "Cannot submit pseudo transactions.";
525  return false;
526  }
527  return true;
528 }
529 
531 sterilize(STTx const& stx)
532 {
533  Serializer s;
534  stx.add(s);
535  SerialIter sit(s.slice());
536  return std::make_shared<STTx const>(std::ref(sit));
537 }
538 
539 bool
541 {
542  auto t = tx[~sfTransactionType];
543  if (!t)
544  return false;
545  auto tt = safe_cast<TxType>(*t);
546  return tt == ttAMENDMENT || tt == ttFEE || tt == ttUNL_MODIFY;
547 }
548 
549 } // namespace ripple
ripple::getTxFormat
static auto getTxFormat(TxType type)
Definition: STTx.cpp:45
ripple::isAccountFieldOkay
static bool isAccountFieldOkay(STObject const &st)
Definition: STTx.cpp:498
ripple::STTx::checkMultiSign
std::pair< bool, std::string > checkMultiSign(RequireFullyCanonicalSig requireCanonicalSig) const
Definition: STTx.cpp:314
ripple::STObject::getFieldArray
const STArray & getFieldArray(SField const &field) const
Definition: STObject.cpp:597
ripple::Blob
std::vector< unsigned char > Blob
Storage for linear binary data.
Definition: Blob.h:30
ripple::STTx::getMetaSQL
std::string getMetaSQL(std::uint32_t inLedger, std::string const &escapedMetaData) const
Definition: STTx.cpp:244
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:240
std::string
STL class.
std::shared_ptr
STL class.
ripple::sfSigners
const SField sfSigners
ripple::STTx::checkSign
std::pair< bool, std::string > checkSign(RequireFullyCanonicalSig requireCanonicalSig) const
Definition: STTx.cpp:191
utility
ripple::SeqProxy::ticket
@ ticket
Definition: SeqProxy.h:58
std::exception
STL class.
ripple::STObject::setFieldU16
void setFieldU16(SField const &field, std::uint16_t)
Definition: STObject.cpp:626
ripple::JsonOptions
JsonOptions
Definition: STBase.h:34
ripple::publicKeyType
boost::optional< KeyType > publicKeyType(Slice const &slice)
Returns the type of public key.
Definition: PublicKey.cpp:203
std::pair
ripple::sfSequence
const SF_UINT32 sfSequence
ripple::txMinSizeBytes
constexpr std::size_t txMinSizeBytes
Protocol specific constants, types, and data.
Definition: Protocol.h:39
std::vector< unsigned char >
ripple::sfSigningPubKey
const SF_VL sfSigningPubKey
ripple::toBase58
std::string toBase58(AccountID const &v)
Convert AccountID to base58 checked string.
Definition: AccountID.cpp:29
ripple::STObject::getSerializer
Serializer getSerializer() const
Definition: STObject.h:367
ripple::SeqProxy::sequence
static constexpr SeqProxy sequence(std::uint32_t v)
Factory function to return a sequence-based SeqProxy.
Definition: SeqProxy.h:76
ripple::STTx::getSigningHash
uint256 getSigningHash() const
Definition: STTx.cpp:145
ripple::STTx::getSeqProxy
SeqProxy getSeqProxy() const
Definition: STTx.cpp:164
ripple::strUnHex
boost::optional< Blob > strUnHex(std::size_t strSize, Iterator begin, Iterator end)
Definition: StringUtilities.h:49
ripple::sfTicketSequence
const SF_UINT32 sfTicketSequence
ripple::STTx::getMetaSQLInsertReplaceHeader
static std::string const & getMetaSQLInsertReplaceHeader()
Definition: STTx.cpp:232
std::function
ripple::to_string
std::string to_string(ListDisposition disposition)
Definition: ValidatorList.cpp:42
ripple::STObject::setFieldVL
void setFieldVL(SField const &field, Blob const &)
Definition: STObject.cpp:668
ripple::STObject::getFieldVL
Blob getFieldVL(SField const &field) const
Definition: STObject.cpp:568
ripple::STObject::peekAtPIndex
const STBase * peekAtPIndex(int offset) const
Definition: STObject.h:419
ripple::ECDSACanonicality::fullyCanonical
@ fullyCanonical
ripple::finishMultiSigningData
void finishMultiSigningData(AccountID const &signingID, Serializer &s)
Definition: Sign.h:85
std::array::fill
T fill(T... args)
ripple::STObject::getFullText
virtual std::string getFullText() const override
Definition: STObject.cpp:227
ripple::uint256
base_uint< 256 > uint256
Definition: base_uint.h:457
std::underlying_type_t
ripple::ttFEE
@ ttFEE
Definition: TxFormats.h:62
ripple::verify
bool verify(PublicKey const &publicKey, Slice const &m, Slice const &sig, bool mustBeFullyCanonical)
Verify a signature on a message.
Definition: PublicKey.cpp:268
ripple::Serializer::getDataLength
int getDataLength() const
Definition: Serializer.h:182
ripple::base_uint< 160, detail::AccountIDTag >
ripple::sfTransactionType
const SF_UINT16 sfTransactionType
ripple::isPseudoTx
bool isPseudoTx(STObject const &tx)
Check whether a transaction is a pseudo-transaction.
Definition: STTx.cpp:540
ripple::getSigningData
static Blob getSigningData(STTx const &that)
Definition: STTx.cpp:136
ripple::sfMemos
const SField sfMemos
ripple::passesLocalChecks
bool passesLocalChecks(STObject const &st, std::string &reason)
Definition: STTx.cpp:511
ripple::TxFormats::getInstance
static TxFormats const & getInstance()
Definition: TxFormats.cpp:277
ripple::PublicKey
A public key.
Definition: PublicKey.h:59
ripple::STObject::getAccountID
AccountID getAccountID(SField const &field) const
Definition: STObject.cpp:562
ripple::JsonOptions::none
@ none
ripple::STTx::getFullText
std::string getFullText() const override
Definition: STTx.cpp:101
ripple::safe_cast
constexpr std::enable_if_t< std::is_same_v< typename Dest::unit_type, typename Src::unit_type > &&std::is_integral_v< typename Dest::value_type > &&std::is_integral_v< typename Src::value_type >, Dest > safe_cast(Src s) noexcept
Definition: FeeUnits.h:537
ripple::KnownFormats::findByType
Item const * findByType(KeyType type) const
Retrieve a format based on its type.
Definition: KnownFormats.h:125
ripple::startMultiSigningData
Serializer startMultiSigningData(STObject const &obj)
Break the multi-signing hash computation into 2 parts for optimization.
Definition: Sign.cpp:95
ripple::STArray
Definition: STArray.h:28
std::to_string
T to_string(T... args)
ripple::isMemoOkay
static bool isMemoOkay(STObject const &st, std::string &reason)
Definition: STTx.cpp:405
ripple::tfFullyCanonicalSig
const std::uint32_t tfFullyCanonicalSig
Definition: TxFlags.h:48
ripple::set
bool set(T &target, std::string const &name, Section const &section)
Set a value from a configuration Section If the named value is not found or doesn't parse as a T,...
Definition: BasicConfig.h:276
array
ripple::STAmount
Definition: STAmount.h:42
ripple::Serializer::slice
Slice slice() const noexcept
Definition: Serializer.h:63
ripple::txnSqlValidated
@ txnSqlValidated
Definition: STTx.h:37
ripple::STObject::getFlags
std::uint32_t getFlags() const
Definition: STObject.cpp:454
ripple::STTx
Definition: STTx.h:42
ripple::isXRP
bool isXRP(AccountID const &c)
Definition: AccountID.h:89
ripple::SerialIter
Definition: Serializer.h:308
ripple::HashPrefix::transactionID
@ transactionID
transaction plus signature to give transaction ID
std::uint32_t
ripple::STTx::checkSingleSign
std::pair< bool, std::string > checkSingleSign(RequireFullyCanonicalSig requireCanonicalSig) const
Definition: STTx.cpp:274
ripple::SecretKey
A secret key.
Definition: SecretKey.h:36
ripple::STObject::addWithoutSigningFields
void addWithoutSigningFields(Serializer &s) const
Definition: STObject.h:358
ripple::txMaxSizeBytes
constexpr std::size_t txMaxSizeBytes
Largest legal byte size of a transaction.
Definition: Protocol.h:42
ripple::ttAMENDMENT
@ ttAMENDMENT
Definition: TxFormats.h:61
ripple::STTx::sign
void sign(PublicKey const &publicKey, SecretKey const &secretKey)
Definition: STTx.cpp:180
ripple::STObject::getFieldU16
std::uint16_t getFieldU16(SField const &field) const
Definition: STObject.cpp:526
ripple::STTx::getJson
Json::Value getJson(JsonOptions options) const override
Definition: STTx.cpp:210
memory
ripple::STTx::getTransactionID
uint256 getTransactionID() const
Definition: STTx.h:117
ripple::Serializer
Definition: Serializer.h:39
ripple::STAccount
Definition: STAccount.h:29
ripple::sfMemoData
const SF_VL sfMemoData
ripple::TxType
TxType
Transaction type identifiers.
Definition: TxFormats.h:33
ripple::sfTxnSignature
const SF_VL sfTxnSignature
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::sterilize
std::shared_ptr< STTx const > sterilize(STTx const &stx)
Sterilize a transaction.
Definition: STTx.cpp:531
ripple::STTx::maxMultiSigners
static const std::size_t maxMultiSigners
Definition: STTx.h:46
ripple::STObject::getSigningHash
uint256 getSigningHash(HashPrefix prefix) const
Definition: STObject.cpp:321
ripple::STTx::RequireFullyCanonicalSig::yes
@ yes
ripple::STObject::add
virtual void add(Serializer &s) const override
Definition: STObject.h:352
ripple::STTx::STTx
STTx()=delete
ripple::sign
Buffer sign(PublicKey const &pk, SecretKey const &sk, Slice const &m)
Generate a signature for a message.
Definition: SecretKey.cpp:124
ripple::STTx::getSignature
Blob getSignature() const
Definition: STTx.cpp:151
std
STL namespace.
ripple::LogicError
void LogicError(std::string const &how) noexcept
Called when faulty logic causes a broken invariant.
Definition: contract.cpp:48
ripple::STObject::isFieldPresent
bool isFieldPresent(SField const &field) const
Definition: STObject.cpp:401
ripple::STTx::tid_
uint256 tid_
Definition: STTx.h:159
ripple::Serializer::peekData
Blob const & peekData() const
Definition: Serializer.h:166
ripple::STTx::getMentionedAccounts
boost::container::flat_set< AccountID > getMentionedAccounts() const
Definition: STTx.cpp:112
ripple::SeqProxy
A type that represents either a sequence value or a ticket value.
Definition: SeqProxy.h:55
std::vector::empty
T empty(T... args)
ripple::STTx::minMultiSigners
static const std::size_t minMultiSigners
Definition: STTx.h:45
ripple::ttUNL_MODIFY
@ ttUNL_MODIFY
Definition: TxFormats.h:63
ripple::STObject::getCount
int getCount() const
Definition: STObject.h:392
ripple::sfMemo
const SField sfMemo
ripple::sfAccount
const SF_ACCOUNT sfAccount
ripple::Serializer::add32
int add32(std::uint32_t i)
Definition: Serializer.cpp:38
ripple::strHex
std::string strHex(FwdIt begin, FwdIt end)
Definition: strHex.h:45
ripple::Serializer::getData
Blob getData() const
Definition: Serializer.h:171
ripple::HashPrefix::txSign
@ txSign
inner transaction to sign
ripple::STObject::operator[]
T::value_type operator[](TypedField< T > const &f) const
Get the value of a field.
Definition: STObject.h:977
ripple::STObject::getFieldU32
std::uint32_t getFieldU32(SField const &field) const
Definition: STObject.cpp:532
ripple::STObject::getJson
virtual Json::Value getJson(JsonOptions options) const override
Definition: STObject.cpp:698
ripple::STObject::set
void set(const SOTemplate &)
Definition: STObject.cpp:73
ripple::STTx::RequireFullyCanonicalSig
RequireFullyCanonicalSig
Check the signature.
Definition: STTx.h:133
type_traits
ripple::sfTransaction
const SField sfTransaction
ripple::sqlBlobLiteral
std::string sqlBlobLiteral(Blob const &blob)
Format arbitrary binary data as an SQLite "blob literal".
Definition: StringUtilities.cpp:33
std::ref
T ref(T... args)
Json::Value
Represents a JSON value.
Definition: json_value.h:145
ripple::STTx::tx_type_
TxType tx_type_
Definition: STTx.h:160
ripple::STObject::getHash
uint256 getHash(HashPrefix prefix) const
Definition: STObject.cpp:312
ripple::sfMemoFormat
const SF_VL sfMemoFormat
ripple::sfMemoType
const SF_VL sfMemoType