xrpld
Toggle main menu visibility
Loading...
Searching...
No Matches
xrpld
app
misc
detail
Transaction.cpp
1
#include <xrpld/app/misc/Transaction.h>
2
3
#include <xrpld/app/ledger/LedgerMaster.h>
4
#include <xrpld/app/main/Application.h>
5
#include <xrpld/rpc/CTID.h>
6
7
#include <xrpl/basics/Blob.h>
8
#include <xrpl/basics/RangeSet.h>
9
#include <xrpl/basics/Slice.h>
10
#include <xrpl/basics/safe_cast.h>
11
#include <xrpl/beast/utility/instrumentation.h>
12
#include <xrpl/json/json_value.h>
13
#include <xrpl/protocol/ErrorCodes.h>
14
#include <xrpl/protocol/SField.h>
15
#include <xrpl/protocol/STBase.h>
16
#include <xrpl/protocol/STTx.h>
17
#include <xrpl/protocol/Serializer.h>
18
#include <xrpl/protocol/TxMeta.h>
19
#include <xrpl/protocol/TxSearched.h>
20
#include <xrpl/protocol/jss.h>
21
#include <xrpl/rdb/RelationalDatabase.h>
22
23
#include <boost/optional/optional.hpp>
// IWYU pragma: keep
24
25
#include <
cstdint
>
26
#include <
exception
>
27
#include <
memory
>
28
#include <
optional
>
29
#include <
string
>
30
#include <
utility
>
31
#include <
variant
>
32
33
namespace
xrpl
{
34
35
Transaction::Transaction
(
36
std::shared_ptr<STTx const>
const
& stx,
37
std::string
& reason,
38
Application
& app) noexcept
39
:
transaction_
(stx),
app_
(app),
j_
(app.getJournal(
"Ledger"
))
40
{
41
try
42
{
43
transactionID_
=
transaction_
->getTransactionID();
44
}
45
catch
(
std::exception
& e)
46
{
47
reason = e.
what
();
48
return
;
49
}
50
51
status_
=
TransStatus::NEW
;
52
}
53
54
//
55
// Misc.
56
//
57
58
void
59
Transaction::setStatus
(
60
TransStatus
ts,
61
std::uint32_t
lseq,
62
std::optional<std::uint32_t>
tseq,
63
std::optional<std::uint32_t>
netID)
64
{
65
status_
= ts;
66
ledgerIndex_
= lseq;
67
if
(tseq)
68
txnSeq_
= tseq;
69
if
(netID)
70
networkID_
= netID;
71
}
72
73
TransStatus
74
Transaction::sqlTransactionStatus
(boost::optional<std::string>
const
& status)
75
{
76
auto
const
c = status ?
safeCast<TxnSql>
((*status)[0]) :
TxnSql::Unknown
;
77
78
switch
(
static_cast<
TxnSql
>
(c))
79
{
80
case
TxnSql::New
:
81
return
TransStatus::NEW
;
82
case
TxnSql::Conflict
:
83
return
TransStatus::CONFLICTED
;
84
case
TxnSql::Held
:
85
return
TransStatus::HELD
;
86
case
TxnSql::Validated
:
87
return
TransStatus::COMMITTED
;
88
case
TxnSql::Included
:
89
return
TransStatus::INCLUDED
;
90
default
:
91
XRPL_ASSERT(
92
c ==
TxnSql::Unknown
,
93
"xrpl::Transaction::sqlTransactionStatus : unknown transaction status"
);
94
}
95
96
return
TransStatus::INVALID
;
97
}
98
99
Transaction::pointer
100
Transaction::transactionFromSQL
(
101
boost::optional<std::uint64_t>
const
& ledgerSeq,
102
boost::optional<std::string>
const
& status,
103
Blob
const
& rawTxn,
104
Application
& app)
105
{
106
auto
const
inLedger =
rangeCheckedCast<std::uint32_t>
(ledgerSeq.value_or(0));
107
108
SerialIter
it(
makeSlice
(rawTxn));
109
auto
txn =
std::make_shared<STTx const>
(it);
110
std::string
reason;
111
auto
tr =
std::make_shared<Transaction>
(txn, reason, app);
112
113
tr->setStatus(
sqlTransactionStatus
(status));
114
tr->setLedger(inLedger);
115
return
tr;
116
}
117
118
std::variant<std::pair<std::shared_ptr<Transaction>
,
std::shared_ptr<TxMeta>
>,
TxSearched
>
119
Transaction::load
(
UInt256
const
&
id
,
Application
& app,
ErrorCodeI
& ec)
120
{
121
return
load
(
id
, app, std::nullopt, ec);
122
}
123
124
std::variant<std::pair<std::shared_ptr<Transaction>
,
std::shared_ptr<TxMeta>
>,
TxSearched
>
125
Transaction::load
(
126
UInt256
const
&
id
,
127
Application
& app,
128
ClosedInterval<uint32_t>
const
&
range
,
129
ErrorCodeI
& ec)
130
{
131
using
Op =
std::optional<ClosedInterval<uint32_t>
>;
132
133
return
load
(
id
, app, Op{
range
}, ec);
134
}
135
136
std::variant<std::pair<std::shared_ptr<Transaction>
,
std::shared_ptr<TxMeta>
>,
TxSearched
>
137
Transaction::load
(
138
UInt256
const
&
id
,
139
Application
& app,
140
std::optional
<
ClosedInterval<uint32_t>
>
const
&
range
,
141
ErrorCodeI
& ec)
142
{
143
auto
& db = app.
getRelationalDatabase
();
144
145
return
db.
getTransaction
(
id
,
range
, ec);
146
}
147
148
// options 1 to include the date of the transaction
149
json::Value
150
Transaction::getJson
(
JsonOptions
options,
bool
binary)
const
151
{
152
// Note, we explicitly suppress `include_date` option here
153
json::Value
ret(
transaction_
->getJson(
154
options & ~
static_cast<
JsonOptions::UnderlyingT
>
(
JsonOptions::Values::IncludeDate
),
155
binary));
156
157
// NOTE Binary STTx::getJson output might not be a JSON object
158
if
(ret.
isObject
() && (
ledgerIndex_
!= 0u))
159
{
160
if
(!(options &
JsonOptions::Values::DisableApiPriorV2
))
161
{
162
// Behaviour before API version 2
163
ret[jss::inLedger] =
ledgerIndex_
;
164
}
165
166
// TODO: disable_API_prior_V3 to disable output of both `date` and
167
// `ledger_index` elements (taking precedence over include_date)
168
ret[jss::ledger_index] =
ledgerIndex_
;
169
170
if
(options &
JsonOptions::Values::IncludeDate
)
171
{
172
auto
ct =
app_
.getLedgerMaster().getCloseTimeBySeq(
ledgerIndex_
);
173
if
(ct)
174
ret[jss::date] = ct->time_since_epoch().count();
175
}
176
177
// compute outgoing CTID
178
// override local network id if it's explicitly in the txn
179
std::optional
netID =
networkID_
;
180
if
(
transaction_
->isFieldPresent(sfNetworkID))
181
netID =
transaction_
->getFieldU32(sfNetworkID);
182
183
if
(
txnSeq_
&& netID)
184
{
185
std::optional<std::string>
const
ctid =
rpc::encodeCTID
(
ledgerIndex_
, *
txnSeq_
, *netID);
186
if
(ctid)
187
ret[jss::ctid] = *ctid;
188
}
189
}
190
191
return
ret;
192
}
193
194
}
// namespace xrpl
std::string
json::Value
Represents a JSON value.
Definition
json_value.h:117
json::Value::isObject
bool isObject() const
Definition
json_value.cpp:1152
xrpl::Application
Definition
Application.h:94
xrpl::RelationalDatabase::getTransaction
virtual std::variant< AccountTx, TxSearched > getTransaction(UInt256 const &id, std::optional< ClosedInterval< uint32_t > > const &range, ErrorCodeI &ec)=0
getTransaction Returns the transaction with the given hash.
xrpl::SerialIter
Definition
Serializer.h:478
xrpl::ServiceRegistry::getRelationalDatabase
virtual RelationalDatabase & getRelationalDatabase()=0
xrpl::Transaction::status_
TransStatus status_
Definition
Transaction.h:393
xrpl::Transaction::getJson
json::Value getJson(JsonOptions options, bool binary=false) const
Definition
Transaction.cpp:150
xrpl::Transaction::ledgerIndex_
LedgerIndex ledgerIndex_
Definition
Transaction.h:390
xrpl::Transaction::setStatus
void setStatus(TransStatus status, std::uint32_t ledgerSeq, std::optional< uint32_t > transactionSeq=std::nullopt, std::optional< uint32_t > networkID=std::nullopt)
xrpl::Transaction::j_
beast::Journal j_
Definition
Transaction.h:424
xrpl::Transaction::transaction_
std::shared_ptr< STTx const > transaction_
Definition
Transaction.h:422
xrpl::Transaction::transactionID_
UInt256 transactionID_
Definition
Transaction.h:388
xrpl::Transaction::txnSeq_
std::optional< uint32_t > txnSeq_
Definition
Transaction.h:391
xrpl::Transaction::transactionFromSQL
static Transaction::pointer transactionFromSQL(boost::optional< std::uint64_t > const &ledgerSeq, boost::optional< std::string > const &status, Blob const &rawTxn, Application &app)
Definition
Transaction.cpp:100
xrpl::Transaction::networkID_
std::optional< uint32_t > networkID_
Definition
Transaction.h:392
xrpl::Transaction::app_
Application & app_
Definition
Transaction.h:423
xrpl::Transaction::Transaction
Transaction(std::shared_ptr< STTx const > const &, std::string &, Application &) noexcept
Definition
Transaction.cpp:35
xrpl::Transaction::pointer
std::shared_ptr< Transaction > pointer
Definition
Transaction.h:57
xrpl::Transaction::load
static std::variant< std::pair< std::shared_ptr< Transaction >, std::shared_ptr< TxMeta > >, TxSearched > load(UInt256 const &id, Application &app, ErrorCodeI &ec)
Definition
Transaction.cpp:119
xrpl::Transaction::sqlTransactionStatus
static TransStatus sqlTransactionStatus(boost::optional< std::string > const &status)
Definition
Transaction.cpp:74
cstdint
exception
std::uint32_t
std::make_shared
T make_shared(T... args)
memory
xrpl::rpc::encodeCTID
std::optional< std::string > encodeCTID(uint32_t ledgerSeq, uint32_t txnIndex, uint32_t networkID) noexcept
Encodes ledger sequence, transaction index, and network ID into a CTID string.
Definition
CTID.h:36
xrpl
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition
algorithm.h:5
xrpl::ErrorCodeI
ErrorCodeI
Definition
ErrorCodes.h:23
xrpl::TransStatus
TransStatus
Definition
Transaction.h:39
xrpl::TransStatus::COMMITTED
@ COMMITTED
Definition
Transaction.h:44
xrpl::TransStatus::INCLUDED
@ INCLUDED
Definition
Transaction.h:42
xrpl::TransStatus::NEW
@ NEW
Definition
Transaction.h:40
xrpl::TransStatus::CONFLICTED
@ CONFLICTED
Definition
Transaction.h:43
xrpl::TransStatus::HELD
@ HELD
Definition
Transaction.h:45
xrpl::TransStatus::INVALID
@ INVALID
Definition
Transaction.h:41
xrpl::range
ClosedInterval< T > range(T low, T high)
Create a closed range interval.
Definition
RangeSet.h:37
xrpl::rangeCheckedCast
T rangeCheckedCast(C c)
Definition
RelationalDatabase.h:480
xrpl::safeCast
constexpr Dest safeCast(Src s) noexcept
Definition
safe_cast.h:21
xrpl::TxnSql
TxnSql
Definition
STTx.h:33
xrpl::TxnSql::New
@ New
Definition
STTx.h:34
xrpl::TxnSql::Validated
@ Validated
Definition
STTx.h:37
xrpl::TxnSql::Unknown
@ Unknown
Definition
STTx.h:39
xrpl::TxnSql::Included
@ Included
Definition
STTx.h:38
xrpl::TxnSql::Held
@ Held
Definition
STTx.h:36
xrpl::TxnSql::Conflict
@ Conflict
Definition
STTx.h:35
xrpl::makeSlice
Slice makeSlice(std::array< T, N > const &a)
Definition
Slice.h:228
xrpl::UInt256
BaseUInt< 256 > UInt256
Definition
base_uint.h:580
xrpl::ClosedInterval
boost::icl::closed_interval< T > ClosedInterval
A closed interval over the domain T.
Definition
RangeSet.h:27
xrpl::TxSearched
TxSearched
Definition
TxSearched.h:5
xrpl::Blob
std::vector< unsigned char > Blob
Storage for linear binary data.
Definition
Blob.h:11
optional
std::shared_ptr
string
xrpl::JsonOptions
Note, should be treated as flags that can be | and &.
Definition
STBase.h:22
xrpl::JsonOptions::UnderlyingT
unsigned int UnderlyingT
Definition
STBase.h:23
xrpl::JsonOptions::Values::DisableApiPriorV2
@ DisableApiPriorV2
Definition
STBase.h:29
xrpl::JsonOptions::Values::IncludeDate
@ IncludeDate
Definition
STBase.h:28
utility
variant
std::exception::what
T what(T... args)
Generated by
1.17.0