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) : STObject(std::move(object))
60 {
61  tx_type_ = safe_cast<TxType>(getFieldU16(sfTransactionType));
62  applyTemplate(getTxFormat(tx_type_)->getSOTemplate()); // may throw
64 }
65 
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
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 
100 STBase*
101 STTx::copy(std::size_t n, void* buf) const
102 {
103  return emplace(n, buf, *this);
104 }
105 
106 STBase*
107 STTx::move(std::size_t n, void* buf)
108 {
109  return emplace(n, buf, std::move(*this));
110 }
111 
112 // STObject functions.
115 {
116  return STI_TRANSACTION;
117 }
118 
121 {
122  std::string ret = "\"";
123  ret += to_string(getTransactionID());
124  ret += "\" = {";
125  ret += STObject::getFullText();
126  ret += "}";
127  return ret;
128 }
129 
130 boost::container::flat_set<AccountID>
132 {
133  boost::container::flat_set<AccountID> list;
134 
135  for (auto const& it : *this)
136  {
137  if (auto sacc = dynamic_cast<STAccount const*>(&it))
138  {
139  assert(!sacc->isDefault());
140  if (!sacc->isDefault())
141  list.insert(sacc->value());
142  }
143  else if (auto samt = dynamic_cast<STAmount const*>(&it))
144  {
145  auto const& issuer = samt->getIssuer();
146  if (!isXRP(issuer))
147  list.insert(issuer);
148  }
149  }
150 
151  return list;
152 }
153 
154 static Blob
155 getSigningData(STTx const& that)
156 {
157  Serializer s;
159  that.addWithoutSigningFields(s);
160  return s.getData();
161 }
162 
163 uint256
165 {
167 }
168 
169 Blob
171 {
172  try
173  {
174  return getFieldVL(sfTxnSignature);
175  }
176  catch (std::exception const&)
177  {
178  return Blob();
179  }
180 }
181 
182 SeqProxy
184 {
186  if (seq != 0)
187  return SeqProxy::sequence(seq);
188 
190  if (!ticketSeq)
191  // No TicketSequence specified. Return the Sequence, whatever it is.
192  return SeqProxy::sequence(seq);
193 
194  return SeqProxy{SeqProxy::ticket, *ticketSeq};
195 }
196 
197 void
198 STTx::sign(PublicKey const& publicKey, SecretKey const& secretKey)
199 {
200  auto const data = getSigningData(*this);
201 
202  auto const sig = ripple::sign(publicKey, secretKey, makeSlice(data));
203 
206 }
207 
209 STTx::checkSign(RequireFullyCanonicalSig requireCanonicalSig) const
210 {
211  try
212  {
213  // Determine whether we're single- or multi-signing by looking
214  // at the SigningPubKey. If it's empty we must be
215  // multi-signing. Otherwise we're single-signing.
216  Blob const& signingPubKey = getFieldVL(sfSigningPubKey);
217  return signingPubKey.empty() ? checkMultiSign(requireCanonicalSig)
218  : checkSingleSign(requireCanonicalSig);
219  }
220  catch (std::exception const&)
221  {
222  }
223  return Unexpected("Internal signature check failure.");
224 }
225 
227 {
229  ret[jss::hash] = to_string(getTransactionID());
230  return ret;
231 }
232 
234 STTx::getJson(JsonOptions options, bool binary) const
235 {
236  if (binary)
237  {
238  Json::Value ret;
240  ret[jss::tx] = strHex(s.peekData());
241  ret[jss::hash] = to_string(getTransactionID());
242  return ret;
243  }
244  return getJson(options);
245 }
246 
247 std::string const&
249 {
250  static std::string const sql =
251  "INSERT OR REPLACE INTO Transactions "
252  "(TransID, TransType, FromAcct, FromSeq, LedgerSeq, Status, RawTxn, "
253  "TxnMeta)"
254  " VALUES ";
255 
256  return sql;
257 }
258 
260 STTx::getMetaSQL(std::uint32_t inLedger, std::string const& escapedMetaData)
261  const
262 {
263  Serializer s;
264  add(s);
265  return getMetaSQL(s, inLedger, txnSqlValidated, escapedMetaData);
266 }
267 
268 // VFALCO This could be a free function elsewhere
271  Serializer rawTxn,
272  std::uint32_t inLedger,
273  char status,
274  std::string const& escapedMetaData) const
275 {
276  static boost::format bfTrans(
277  "('%s', '%s', '%s', '%d', '%d', '%c', %s, %s)");
278  std::string rTxn = sqlBlobLiteral(rawTxn.peekData());
279 
280  auto format = TxFormats::getInstance().findByType(tx_type_);
281  assert(format != nullptr);
282 
283  return str(
284  boost::format(bfTrans) % to_string(getTransactionID()) %
285  format->getName() % toBase58(getAccountID(sfAccount)) %
286  getFieldU32(sfSequence) % inLedger % status % rTxn % escapedMetaData);
287 }
288 
291 {
292  // We don't allow both a non-empty sfSigningPubKey and an sfSigners.
293  // That would allow the transaction to be signed two ways. So if both
294  // fields are present the signature is invalid.
296  return Unexpected("Cannot both single- and multi-sign.");
297 
298  bool validSig = false;
299  try
300  {
301  bool const fullyCanonical = (getFlags() & tfFullyCanonicalSig) ||
302  (requireCanonicalSig == RequireFullyCanonicalSig::yes);
303 
304  auto const spk = getFieldVL(sfSigningPubKey);
305 
306  if (publicKeyType(makeSlice(spk)))
307  {
308  Blob const signature = getFieldVL(sfTxnSignature);
309  Blob const data = getSigningData(*this);
310 
311  validSig = verify(
312  PublicKey(makeSlice(spk)),
313  makeSlice(data),
314  makeSlice(signature),
316  }
317  }
318  catch (std::exception const&)
319  {
320  // Assume it was a signature failure.
321  validSig = false;
322  }
323  if (validSig == false)
324  return Unexpected("Invalid signature.");
325  // Signature was verified.
326  return {};
327 }
328 
331 {
332  // Make sure the MultiSigners are present. Otherwise they are not
333  // attempting multi-signing and we just have a bad SigningPubKey.
335  return Unexpected("Empty SigningPubKey.");
336 
337  // We don't allow both an sfSigners and an sfTxnSignature. Both fields
338  // being present would indicate that the transaction is signed both ways.
340  return Unexpected("Cannot both single- and multi-sign.");
341 
342  STArray const& signers{getFieldArray(sfSigners)};
343 
344  // There are well known bounds that the number of signers must be within.
345  if (signers.size() < minMultiSigners || signers.size() > maxMultiSigners)
346  return Unexpected("Invalid Signers array size.");
347 
348  // We can ease the computational load inside the loop a bit by
349  // pre-constructing part of the data that we hash. Fill a Serializer
350  // with the stuff that stays constant from signature to signature.
351  Serializer const dataStart{startMultiSigningData(*this)};
352 
353  // We also use the sfAccount field inside the loop. Get it once.
354  auto const txnAccountID = getAccountID(sfAccount);
355 
356  // Determine whether signatures must be full canonical.
357  bool const fullyCanonical = (getFlags() & tfFullyCanonicalSig) ||
358  (requireCanonicalSig == RequireFullyCanonicalSig::yes);
359 
360  // Signers must be in sorted order by AccountID.
361  AccountID lastAccountID(beast::zero);
362 
363  for (auto const& signer : signers)
364  {
365  auto const accountID = signer.getAccountID(sfAccount);
366 
367  // The account owner may not multisign for themselves.
368  if (accountID == txnAccountID)
369  return Unexpected("Invalid multisigner.");
370 
371  // No duplicate signers allowed.
372  if (lastAccountID == accountID)
373  return Unexpected("Duplicate Signers not allowed.");
374 
375  // Accounts must be in order by account ID. No duplicates allowed.
376  if (lastAccountID > accountID)
377  return Unexpected("Unsorted Signers array.");
378 
379  // The next signature must be greater than this one.
380  lastAccountID = accountID;
381 
382  // Verify the signature.
383  bool validSig = false;
384  try
385  {
386  Serializer s = dataStart;
387  finishMultiSigningData(accountID, s);
388 
389  auto spk = signer.getFieldVL(sfSigningPubKey);
390 
391  if (publicKeyType(makeSlice(spk)))
392  {
393  Blob const signature = signer.getFieldVL(sfTxnSignature);
394 
395  validSig = verify(
396  PublicKey(makeSlice(spk)),
397  s.slice(),
398  makeSlice(signature),
400  }
401  }
402  catch (std::exception const&)
403  {
404  // We assume any problem lies with the signature.
405  validSig = false;
406  }
407  if (!validSig)
408  return Unexpected(
409  std::string("Invalid signature on account ") +
410  toBase58(accountID) + ".");
411  }
412  // All signatures verified.
413  return {};
414 }
415 
416 //------------------------------------------------------------------------------
417 
418 static bool
419 isMemoOkay(STObject const& st, std::string& reason)
420 {
421  if (!st.isFieldPresent(sfMemos))
422  return true;
423 
424  auto const& memos = st.getFieldArray(sfMemos);
425 
426  // The number 2048 is a preallocation hint, not a hard limit
427  // to avoid allocate/copy/free's
428  Serializer s(2048);
429  memos.add(s);
430 
431  // FIXME move the memo limit into a config tunable
432  if (s.getDataLength() > 1024)
433  {
434  reason = "The memo exceeds the maximum allowed size.";
435  return false;
436  }
437 
438  for (auto const& memo : memos)
439  {
440  auto memoObj = dynamic_cast<STObject const*>(&memo);
441 
442  if (!memoObj || (memoObj->getFName() != sfMemo))
443  {
444  reason = "A memo array may contain only Memo objects.";
445  return false;
446  }
447 
448  for (auto const& memoElement : *memoObj)
449  {
450  auto const& name = memoElement.getFName();
451 
452  if (name != sfMemoType && name != sfMemoData &&
453  name != sfMemoFormat)
454  {
455  reason =
456  "A memo may contain only MemoType, MemoData or "
457  "MemoFormat fields.";
458  return false;
459  }
460 
461  // The raw data is stored as hex-octets, which we want to decode.
462  auto optData = strUnHex(memoElement.getText());
463 
464  if (!optData)
465  {
466  reason =
467  "The MemoType, MemoData and MemoFormat fields may "
468  "only contain hex-encoded data.";
469  return false;
470  }
471 
472  if (name == sfMemoData)
473  continue;
474 
475  // The only allowed characters for MemoType and MemoFormat are the
476  // characters allowed in URLs per RFC 3986: alphanumerics and the
477  // following symbols: -._~:/?#[]@!$&'()*+,;=%
478  static std::array<char, 256> const allowedSymbols = [] {
480  a.fill(0);
481 
482  std::string symbols(
483  "0123456789"
484  "-._~:/?#[]@!$&'()*+,;=%"
485  "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
486  "abcdefghijklmnopqrstuvwxyz");
487 
488  for (char c : symbols)
489  a[c] = 1;
490  return a;
491  }();
492 
493  for (auto c : *optData)
494  {
495  if (!allowedSymbols[c])
496  {
497  reason =
498  "The MemoType and MemoFormat fields may only "
499  "contain characters that are allowed in URLs "
500  "under RFC 3986.";
501  return false;
502  }
503  }
504  }
505  }
506 
507  return true;
508 }
509 
510 // Ensure all account fields are 160-bits
511 static bool
513 {
514  for (int i = 0; i < st.getCount(); ++i)
515  {
516  auto t = dynamic_cast<STAccount const*>(st.peekAtPIndex(i));
517  if (t && t->isDefault())
518  return false;
519  }
520 
521  return true;
522 }
523 
524 bool
526 {
527  if (!isMemoOkay(st, reason))
528  return false;
529 
530  if (!isAccountFieldOkay(st))
531  {
532  reason = "An account field is invalid.";
533  return false;
534  }
535 
536  if (isPseudoTx(st))
537  {
538  reason = "Cannot submit pseudo transactions.";
539  return false;
540  }
541  return true;
542 }
543 
545 sterilize(STTx const& stx)
546 {
547  Serializer s;
548  stx.add(s);
549  SerialIter sit(s.slice());
550  return std::make_shared<STTx const>(std::ref(sit));
551 }
552 
553 bool
555 {
556  auto t = tx[~sfTransactionType];
557  if (!t)
558  return false;
559  auto tt = safe_cast<TxType>(*t);
560  return tt == ttAMENDMENT || tt == ttFEE || tt == ttUNL_MODIFY;
561 }
562 
563 } // namespace ripple
ripple::getTxFormat
static auto getTxFormat(TxType type)
Definition: STTx.cpp:45
ripple::isAccountFieldOkay
static bool isAccountFieldOkay(STObject const &st)
Definition: STTx.cpp:512
ripple::STObject::getFieldArray
const STArray & getFieldArray(SField const &field) const
Definition: STObject.cpp:624
ripple::STObject::applyTemplate
void applyTemplate(const SOTemplate &type)
Definition: STObject.cpp:116
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:260
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:653
ripple::JsonOptions
JsonOptions
Definition: STBase.h:34
ripple::STObject::peekAtPIndex
const STBase * peekAtPIndex(int offset) const
Definition: STObject.h:932
ripple::sfSequence
const SF_UINT32 sfSequence
ripple::txMinSizeBytes
constexpr std::size_t txMinSizeBytes
Protocol specific constants.
Definition: Protocol.h:40
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::SerializedTypeID
SerializedTypeID
Definition: SField.h:52
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:152
ripple::toBase58
std::string toBase58(AccountID const &v)
Convert AccountID to base58 checked string.
Definition: AccountID.cpp:29
ripple::tfFullyCanonicalSig
constexpr std::uint32_t tfFullyCanonicalSig
Transaction flags.
Definition: TxFlags.h:56
ripple::STObject::getSerializer
Serializer getSerializer() const
Definition: STObject.h:898
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:164
ripple::STTx::getSeqProxy
SeqProxy getSeqProxy() const
Definition: STTx.cpp:183
ripple::sfTicketSequence
const SF_UINT32 sfTicketSequence
ripple::STTx::getMetaSQLInsertReplaceHeader
static std::string const & getMetaSQLInsertReplaceHeader()
Definition: STTx.cpp:248
std::function
ripple::STObject::setFieldVL
void setFieldVL(SField const &field, Blob const &)
Definition: STObject.cpp:695
ripple::STObject::getFieldVL
Blob getFieldVL(SField const &field) const
Definition: STObject.cpp:595
ripple::ttAMENDMENT
@ ttAMENDMENT
This system-generated transaction type is used to update the status of the various amendments.
Definition: TxFormats.h:146
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
std::string getFullText() const override
Definition: STObject.cpp:254
ripple::uint256
base_uint< 256 > uint256
Definition: base_uint.h:543
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:554
ripple::getSigningData
static Blob getSigningData(STTx const &that)
Definition: STTx.cpp:155
ripple::ttUNL_MODIFY
@ ttUNL_MODIFY
This system-generated transaction type is used to update the network's negative UNL.
Definition: TxFormats.h:158
ripple::Expected
Definition: Expected.h:129
ripple::sfMemos
const SField sfMemos
ripple::passesLocalChecks
bool passesLocalChecks(STObject const &st, std::string &reason)
Definition: STTx.cpp:525
ripple::STBase::emplace
static STBase * emplace(std::size_t n, void *buf, T &&val)
Definition: STBase.h:165
ripple::TxFormats::getInstance
static TxFormats const & getInstance()
Definition: TxFormats.cpp:328
ripple::PublicKey
A public key.
Definition: PublicKey.h:59
ripple::STObject::getAccountID
AccountID getAccountID(SField const &field) const
Definition: STObject.cpp:589
ripple::JsonOptions::none
@ none
ripple::STTx::getFullText
std::string getFullText() const override
Definition: STTx.cpp:120
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:419
array
ripple::STAmount
Definition: STAmount.h:44
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:481
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:889
ripple::txMaxSizeBytes
constexpr std::size_t txMaxSizeBytes
Largest legal byte size of a transaction.
Definition: Protocol.h:43
ripple::STTx::sign
void sign(PublicKey const &publicKey, SecretKey const &secretKey)
Definition: STTx.cpp:198
ripple::STObject::getFieldU16
std::uint16_t getFieldU16(SField const &field) const
Definition: STObject.cpp:553
ripple::STTx::getJson
Json::Value getJson(JsonOptions options) const override
Definition: STTx.cpp:226
memory
ripple::STTx::getTransactionID
uint256 getTransactionID() const
Definition: STTx.h:177
ripple::Serializer
Definition: Serializer.h:39
ripple::STAccount
Definition: STAccount.h:29
ripple::sfMemoData
const SF_VL sfMemoData
ripple::STObject::add
void add(Serializer &s) const override
Definition: STObject.cpp:85
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:290
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:545
ripple::STTx::checkSign
Expected< void, std::string > checkSign(RequireFullyCanonicalSig requireCanonicalSig) const
Definition: STTx.cpp:209
ripple::STTx::maxMultiSigners
static const std::size_t maxMultiSigners
Definition: STTx.h:50
ripple::STObject::getSigningHash
uint256 getSigningHash(HashPrefix prefix) const
Definition: STObject.cpp:348
ripple::STTx::RequireFullyCanonicalSig::yes
@ yes
ripple::SerialIter::getBytesLeft
int getBytesLeft() const noexcept
Definition: Serializer.h:341
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::STBase
A type which can be exported to a well known binary format.
Definition: STBase.h:66
ripple::STTx::getSignature
Blob getSignature() const
Definition: STTx.cpp:170
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:428
ripple::STTx::tid_
uint256 tid_
Definition: STTx.h:45
ripple::Serializer::peekData
Blob const & peekData() const
Definition: Serializer.h:168
ripple::STTx::getMentionedAccounts
boost::container::flat_set< AccountID > getMentionedAccounts() const
Definition: STTx.cpp:131
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:49
std::optional< std::uint32_t >
ripple::STObject::getCount
int getCount() const
Definition: STObject.h:914
ripple::STTx::copy
STBase * copy(std::size_t n, void *buf) const override
Definition: STTx.cpp:101
std::size_t
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:41
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:945
ripple::STObject::getFieldU32
std::uint32_t getFieldU32(SField const &field) const
Definition: STObject.cpp:559
ripple::STObject::getJson
Json::Value getJson(JsonOptions options) const override
Definition: STObject.cpp:725
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:100
ripple::STTx::move
STBase * move(std::size_t n, void *buf) override
Definition: STTx.cpp:107
ripple::STTx::RequireFullyCanonicalSig
RequireFullyCanonicalSig
Check the signature.
Definition: STTx.h:109
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:330
ripple::STTx::getSType
SerializedTypeID getSType() const override
Definition: STTx.cpp:114
std::ref
T ref(T... args)
Json::Value
Represents a JSON value.
Definition: json_value.h:145
ripple::STI_TRANSACTION
@ STI_TRANSACTION
Definition: SField.h:82
ripple::STTx::tx_type_
TxType tx_type_
Definition: STTx.h:46
ripple::STObject::getHash
uint256 getHash(HashPrefix prefix) const
Definition: STObject.cpp:339
ripple::sfMemoFormat
const SF_VL sfMemoFormat
ripple::sfMemoType
const SF_VL sfMemoType