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 
171  if (!ticketSeq)
172  // No TicketSequence specified. Return the Sequence, whatever it is.
173  return SeqProxy::sequence(seq);
174 
175  return SeqProxy{SeqProxy::ticket, *ticketSeq};
176 }
177 
178 void
179 STTx::sign(PublicKey const& publicKey, SecretKey const& secretKey)
180 {
181  auto const data = getSigningData(*this);
182 
183  auto const sig = ripple::sign(publicKey, secretKey, makeSlice(data));
184 
187 }
188 
190 STTx::checkSign(RequireFullyCanonicalSig requireCanonicalSig) const
191 {
192  try
193  {
194  // Determine whether we're single- or multi-signing by looking
195  // at the SigningPubKey. If it's empty we must be
196  // multi-signing. Otherwise we're single-signing.
197  Blob const& signingPubKey = getFieldVL(sfSigningPubKey);
198  return signingPubKey.empty() ? checkMultiSign(requireCanonicalSig)
199  : checkSingleSign(requireCanonicalSig);
200  }
201  catch (std::exception const&)
202  {
203  }
204  return Unexpected("Internal signature check failure.");
205 }
206 
208 {
210  ret[jss::hash] = to_string(getTransactionID());
211  return ret;
212 }
213 
215 STTx::getJson(JsonOptions options, bool binary) const
216 {
217  if (binary)
218  {
219  Json::Value ret;
221  ret[jss::tx] = strHex(s.peekData());
222  ret[jss::hash] = to_string(getTransactionID());
223  return ret;
224  }
225  return getJson(options);
226 }
227 
228 std::string const&
230 {
231  static std::string const sql =
232  "INSERT OR REPLACE INTO Transactions "
233  "(TransID, TransType, FromAcct, FromSeq, LedgerSeq, Status, RawTxn, "
234  "TxnMeta)"
235  " VALUES ";
236 
237  return sql;
238 }
239 
241 STTx::getMetaSQL(std::uint32_t inLedger, std::string const& escapedMetaData)
242  const
243 {
244  Serializer s;
245  add(s);
246  return getMetaSQL(s, inLedger, txnSqlValidated, escapedMetaData);
247 }
248 
249 // VFALCO This could be a free function elsewhere
252  Serializer rawTxn,
253  std::uint32_t inLedger,
254  char status,
255  std::string const& escapedMetaData) const
256 {
257  static boost::format bfTrans(
258  "('%s', '%s', '%s', '%d', '%d', '%c', %s, %s)");
259  std::string rTxn = sqlBlobLiteral(rawTxn.peekData());
260 
261  auto format = TxFormats::getInstance().findByType(tx_type_);
262  assert(format != nullptr);
263 
264  return str(
265  boost::format(bfTrans) % to_string(getTransactionID()) %
266  format->getName() % toBase58(getAccountID(sfAccount)) %
267  getFieldU32(sfSequence) % inLedger % status % rTxn % escapedMetaData);
268 }
269 
272 {
273  // We don't allow both a non-empty sfSigningPubKey and an sfSigners.
274  // That would allow the transaction to be signed two ways. So if both
275  // fields are present the signature is invalid.
277  return Unexpected("Cannot both single- and multi-sign.");
278 
279  bool validSig = false;
280  try
281  {
282  bool const fullyCanonical = (getFlags() & tfFullyCanonicalSig) ||
283  (requireCanonicalSig == RequireFullyCanonicalSig::yes);
284 
285  auto const spk = getFieldVL(sfSigningPubKey);
286 
287  if (publicKeyType(makeSlice(spk)))
288  {
289  Blob const signature = getFieldVL(sfTxnSignature);
290  Blob const data = getSigningData(*this);
291 
292  validSig = verify(
293  PublicKey(makeSlice(spk)),
294  makeSlice(data),
295  makeSlice(signature),
297  }
298  }
299  catch (std::exception const&)
300  {
301  // Assume it was a signature failure.
302  validSig = false;
303  }
304  if (validSig == false)
305  return Unexpected("Invalid signature.");
306  // Signature was verified.
307  return {};
308 }
309 
312 {
313  // Make sure the MultiSigners are present. Otherwise they are not
314  // attempting multi-signing and we just have a bad SigningPubKey.
316  return Unexpected("Empty SigningPubKey.");
317 
318  // We don't allow both an sfSigners and an sfTxnSignature. Both fields
319  // being present would indicate that the transaction is signed both ways.
321  return Unexpected("Cannot both single- and multi-sign.");
322 
323  STArray const& signers{getFieldArray(sfSigners)};
324 
325  // There are well known bounds that the number of signers must be within.
326  if (signers.size() < minMultiSigners || signers.size() > maxMultiSigners)
327  return Unexpected("Invalid Signers array size.");
328 
329  // We can ease the computational load inside the loop a bit by
330  // pre-constructing part of the data that we hash. Fill a Serializer
331  // with the stuff that stays constant from signature to signature.
332  Serializer const dataStart{startMultiSigningData(*this)};
333 
334  // We also use the sfAccount field inside the loop. Get it once.
335  auto const txnAccountID = getAccountID(sfAccount);
336 
337  // Determine whether signatures must be full canonical.
338  bool const fullyCanonical = (getFlags() & tfFullyCanonicalSig) ||
339  (requireCanonicalSig == RequireFullyCanonicalSig::yes);
340 
341  // Signers must be in sorted order by AccountID.
342  AccountID lastAccountID(beast::zero);
343 
344  for (auto const& signer : signers)
345  {
346  auto const accountID = signer.getAccountID(sfAccount);
347 
348  // The account owner may not multisign for themselves.
349  if (accountID == txnAccountID)
350  return Unexpected("Invalid multisigner.");
351 
352  // No duplicate signers allowed.
353  if (lastAccountID == accountID)
354  return Unexpected("Duplicate Signers not allowed.");
355 
356  // Accounts must be in order by account ID. No duplicates allowed.
357  if (lastAccountID > accountID)
358  return Unexpected("Unsorted Signers array.");
359 
360  // The next signature must be greater than this one.
361  lastAccountID = accountID;
362 
363  // Verify the signature.
364  bool validSig = false;
365  try
366  {
367  Serializer s = dataStart;
368  finishMultiSigningData(accountID, s);
369 
370  auto spk = signer.getFieldVL(sfSigningPubKey);
371 
372  if (publicKeyType(makeSlice(spk)))
373  {
374  Blob const signature = signer.getFieldVL(sfTxnSignature);
375 
376  validSig = verify(
377  PublicKey(makeSlice(spk)),
378  s.slice(),
379  makeSlice(signature),
381  }
382  }
383  catch (std::exception const&)
384  {
385  // We assume any problem lies with the signature.
386  validSig = false;
387  }
388  if (!validSig)
389  return Unexpected(
390  std::string("Invalid signature on account ") +
391  toBase58(accountID) + ".");
392  }
393  // All signatures verified.
394  return {};
395 }
396 
397 //------------------------------------------------------------------------------
398 
399 static bool
400 isMemoOkay(STObject const& st, std::string& reason)
401 {
402  if (!st.isFieldPresent(sfMemos))
403  return true;
404 
405  auto const& memos = st.getFieldArray(sfMemos);
406 
407  // The number 2048 is a preallocation hint, not a hard limit
408  // to avoid allocate/copy/free's
409  Serializer s(2048);
410  memos.add(s);
411 
412  // FIXME move the memo limit into a config tunable
413  if (s.getDataLength() > 1024)
414  {
415  reason = "The memo exceeds the maximum allowed size.";
416  return false;
417  }
418 
419  for (auto const& memo : memos)
420  {
421  auto memoObj = dynamic_cast<STObject const*>(&memo);
422 
423  if (!memoObj || (memoObj->getFName() != sfMemo))
424  {
425  reason = "A memo array may contain only Memo objects.";
426  return false;
427  }
428 
429  for (auto const& memoElement : *memoObj)
430  {
431  auto const& name = memoElement.getFName();
432 
433  if (name != sfMemoType && name != sfMemoData &&
434  name != sfMemoFormat)
435  {
436  reason =
437  "A memo may contain only MemoType, MemoData or "
438  "MemoFormat fields.";
439  return false;
440  }
441 
442  // The raw data is stored as hex-octets, which we want to decode.
443  auto optData = strUnHex(memoElement.getText());
444 
445  if (!optData)
446  {
447  reason =
448  "The MemoType, MemoData and MemoFormat fields may "
449  "only contain hex-encoded data.";
450  return false;
451  }
452 
453  if (name == sfMemoData)
454  continue;
455 
456  // The only allowed characters for MemoType and MemoFormat are the
457  // characters allowed in URLs per RFC 3986: alphanumerics and the
458  // following symbols: -._~:/?#[]@!$&'()*+,;=%
459  static std::array<char, 256> const allowedSymbols = [] {
461  a.fill(0);
462 
463  std::string symbols(
464  "0123456789"
465  "-._~:/?#[]@!$&'()*+,;=%"
466  "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
467  "abcdefghijklmnopqrstuvwxyz");
468 
469  for (char c : symbols)
470  a[c] = 1;
471  return a;
472  }();
473 
474  for (auto c : *optData)
475  {
476  if (!allowedSymbols[c])
477  {
478  reason =
479  "The MemoType and MemoFormat fields may only "
480  "contain characters that are allowed in URLs "
481  "under RFC 3986.";
482  return false;
483  }
484  }
485  }
486  }
487 
488  return true;
489 }
490 
491 // Ensure all account fields are 160-bits
492 static bool
494 {
495  for (int i = 0; i < st.getCount(); ++i)
496  {
497  auto t = dynamic_cast<STAccount const*>(st.peekAtPIndex(i));
498  if (t && t->isDefault())
499  return false;
500  }
501 
502  return true;
503 }
504 
505 bool
507 {
508  if (!isMemoOkay(st, reason))
509  return false;
510 
511  if (!isAccountFieldOkay(st))
512  {
513  reason = "An account field is invalid.";
514  return false;
515  }
516 
517  if (isPseudoTx(st))
518  {
519  reason = "Cannot submit pseudo transactions.";
520  return false;
521  }
522  return true;
523 }
524 
526 sterilize(STTx const& stx)
527 {
528  Serializer s;
529  stx.add(s);
530  SerialIter sit(s.slice());
531  return std::make_shared<STTx const>(std::ref(sit));
532 }
533 
534 bool
536 {
537  auto t = tx[~sfTransactionType];
538  if (!t)
539  return false;
540  auto tt = safe_cast<TxType>(*t);
541  return tt == ttAMENDMENT || tt == ttFEE || tt == ttUNL_MODIFY;
542 }
543 
544 } // namespace ripple
ripple::getTxFormat
static auto getTxFormat(TxType type)
Definition: STTx.cpp:45
ripple::isAccountFieldOkay
static bool isAccountFieldOkay(STObject const &st)
Definition: STTx.cpp:493
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:241
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
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::sfSequence
const SF_UINT32 sfSequence
ripple::txMinSizeBytes
constexpr std::size_t txMinSizeBytes
Protocol specific constants, types, and data.
Definition: Protocol.h:39
ripple::verify
bool verify(PublicKey const &publicKey, Slice const &m, Slice const &sig, bool mustBeFullyCanonical) noexcept
Verify a signature on a message.
Definition: PublicKey.cpp:268
std::vector< unsigned char >
ripple::sfSigningPubKey
const SF_VL sfSigningPubKey
ripple::Unexpected
Unexpected(E(&)[N]) -> Unexpected< E const * >
ripple::ttFEE
@ ttFEE
This system-generated transaction type is used to update the network's fee settings.
Definition: TxFormats.h:137
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::TxType
TxType
Transaction type identifiers.
Definition: TxFormats.h:56
ripple::STTx::getSigningHash
uint256 getSigningHash() const
Definition: STTx.cpp:145
ripple::STTx::getSeqProxy
SeqProxy getSeqProxy() const
Definition: STTx.cpp:164
ripple::sfTicketSequence
const SF_UINT32 sfTicketSequence
ripple::STTx::getMetaSQLInsertReplaceHeader
static std::string const & getMetaSQLInsertReplaceHeader()
Definition: STTx.cpp:229
std::function
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::ttAMENDMENT
@ ttAMENDMENT
This system-generated transaction type is used to update the status of the various amendments.
Definition: TxFormats.h:131
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:529
std::underlying_type_t
ripple::publicKeyType
std::optional< KeyType > publicKeyType(Slice const &slice)
Returns the type of public key.
Definition: PublicKey.cpp:203
ripple::Serializer::getDataLength
int getDataLength() const
Definition: Serializer.h:184
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:535
ripple::getSigningData
static Blob getSigningData(STTx const &that)
Definition: STTx.cpp:136
ripple::ttUNL_MODIFY
@ ttUNL_MODIFY
This system-generated transaction type is used to update the network's negative UNL.
Definition: TxFormats.h:143
ripple::Expected
Definition: Expected.h:129
ripple::sfMemos
const SField sfMemos
ripple::passesLocalChecks
bool passesLocalChecks(STObject const &st, std::string &reason)
Definition: STTx.cpp:506
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::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:400
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:313
array
ripple::STAmount
Definition: STAmount.h:43
ripple::Serializer::slice
Slice slice() const noexcept
Definition: Serializer.h:63
ripple::txnSqlValidated
@ txnSqlValidated
Definition: STTx.h:38
ripple::STObject::getFlags
std::uint32_t getFlags() const
Definition: STObject.cpp:454
ripple::STTx
Definition: STTx.h:43
ripple::isXRP
bool isXRP(AccountID const &c)
Definition: AccountID.h:89
ripple::SerialIter
Definition: Serializer.h:310
ripple::HashPrefix::transactionID
@ transactionID
transaction plus signature to give transaction ID
std::uint32_t
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::STTx::sign
void sign(PublicKey const &publicKey, SecretKey const &secretKey)
Definition: STTx.cpp:179
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:207
memory
ripple::STTx::getTransactionID
uint256 getTransactionID() const
Definition: STTx.h:118
ripple::Serializer
Definition: Serializer.h:39
ripple::STAccount
Definition: STAccount.h:29
ripple::sfMemoData
const SF_VL sfMemoData
ripple::sfTxnSignature
const SF_VL sfTxnSignature
ripple::STObject
Definition: STObject.h:51
ripple::STTx::checkSingleSign
Expected< void, std::string > checkSingleSign(RequireFullyCanonicalSig requireCanonicalSig) const
Definition: STTx.cpp:271
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:526
ripple::STTx::checkSign
Expected< void, std::string > checkSign(RequireFullyCanonicalSig requireCanonicalSig) const
Definition: STTx.cpp:190
ripple::STTx::maxMultiSigners
static const std::size_t maxMultiSigners
Definition: STTx.h:47
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:238
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:160
ripple::Serializer::peekData
Blob const & peekData() const
Definition: Serializer.h:168
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:46
std::optional< std::uint32_t >
ripple::STObject::getCount
int getCount() const
Definition: STObject.h:392
ripple::to_string
std::string to_string(Manifest const &m)
Format the specified manifest to a string for debugging purposes.
Definition: app/misc/impl/Manifest.cpp:38
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:173
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:980
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::strUnHex
std::optional< Blob > strUnHex(std::size_t strSize, Iterator begin, Iterator end)
Definition: StringUtilities.h:49
ripple::STObject::set
void set(const SOTemplate &)
Definition: STObject.cpp:73
ripple::STTx::RequireFullyCanonicalSig
RequireFullyCanonicalSig
Check the signature.
Definition: STTx.h:134
type_traits
ripple::KnownFormats::findByType
Item const * findByType(KeyType type) const
Retrieve a format based on its type.
Definition: KnownFormats.h:127
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
ripple::STTx::checkMultiSign
Expected< void, std::string > checkMultiSign(RequireFullyCanonicalSig requireCanonicalSig) const
Definition: STTx.cpp:311
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:161
ripple::STObject::getHash
uint256 getHash(HashPrefix prefix) const
Definition: STObject.cpp:312
ripple::sfMemoFormat
const SF_VL sfMemoFormat
ripple::sfMemoType
const SF_VL sfMemoType