rippled
OpenView.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/contract.h>
21 #include <ripple/ledger/OpenView.h>
22 
23 namespace ripple {
24 
26 
27 class OpenView::txs_iter_impl : public txs_type::iter_base
28 {
29 private:
30  bool metadata_;
31  txs_map::const_iterator iter_;
32 
33 public:
34  explicit txs_iter_impl(bool metadata, txs_map::const_iterator iter)
35  : metadata_(metadata), iter_(iter)
36  {
37  }
38 
40  copy() const override
41  {
42  return std::make_unique<txs_iter_impl>(metadata_, iter_);
43  }
44 
45  bool
46  equal(base_type const& impl) const override
47  {
48  auto const& other = dynamic_cast<txs_iter_impl const&>(impl);
49  return iter_ == other.iter_;
50  }
51 
52  void
53  increment() override
54  {
55  ++iter_;
56  }
57 
58  value_type
59  dereference() const override
60  {
61  value_type result;
62  {
63  SerialIter sit(iter_->second.first->slice());
64  result.first = std::make_shared<STTx const>(sit);
65  }
66  if (metadata_)
67  {
68  SerialIter sit(iter_->second.second->slice());
69  result.second = std::make_shared<STObject const>(sit, sfMetadata);
70  }
71  return result;
72  }
73 };
74 
75 //------------------------------------------------------------------------------
76 
79  ReadView const* base,
80  Rules const& rules,
82  : rules_(rules), info_(base->info()), base_(base), hold_(std::move(hold))
83 {
84  info_.validated = false;
85  info_.accepted = false;
86  info_.seq = base_->info().seq + 1;
89 }
90 
92  : rules_(base->rules())
93  , info_(base->info())
94  , base_(base)
95  , hold_(std::move(hold))
96  , open_(base->open())
97 {
98 }
99 
102 {
103  return txs_.size();
104 }
105 
106 void
108 {
109  items_.apply(to);
110  for (auto const& item : txs_)
111  to.rawTxInsert(item.first, item.second.first, item.second.second);
112 }
113 
114 //---
115 
116 LedgerInfo const&
118 {
119  return info_;
120 }
121 
122 Fees const&
124 {
125  return base_->fees();
126 }
127 
128 Rules const&
130 {
131  return rules_;
132 }
133 
134 bool
135 OpenView::exists(Keylet const& k) const
136 {
137  return items_.exists(*base_, k);
138 }
139 
140 auto
141 OpenView::succ(key_type const& key, boost::optional<key_type> const& last) const
142  -> boost::optional<key_type>
143 {
144  return items_.succ(*base_, key, last);
145 }
146 
148 OpenView::read(Keylet const& k) const
149 {
150  return items_.read(*base_, k);
151 }
152 
153 auto
154 OpenView::slesBegin() const -> std::unique_ptr<sles_type::iter_base>
155 {
156  return items_.slesBegin(*base_);
157 }
158 
159 auto
160 OpenView::slesEnd() const -> std::unique_ptr<sles_type::iter_base>
161 {
162  return items_.slesEnd(*base_);
163 }
164 
165 auto
168 {
169  return items_.slesUpperBound(*base_, key);
170 }
171 
172 auto
173 OpenView::txsBegin() const -> std::unique_ptr<txs_type::iter_base>
174 {
175  return std::make_unique<txs_iter_impl>(!open(), txs_.cbegin());
176 }
177 
178 auto
179 OpenView::txsEnd() const -> std::unique_ptr<txs_type::iter_base>
180 {
181  return std::make_unique<txs_iter_impl>(!open(), txs_.cend());
182 }
183 
184 bool
185 OpenView::txExists(key_type const& key) const
186 {
187  return txs_.find(key) != txs_.end();
188 }
189 
190 auto
191 OpenView::txRead(key_type const& key) const -> tx_type
192 {
193  auto const iter = txs_.find(key);
194  if (iter == txs_.end())
195  return base_->txRead(key);
196  auto const& item = iter->second;
197  auto stx = std::make_shared<STTx const>(SerialIter{item.first->slice()});
198  decltype(tx_type::second) sto;
199  if (item.second)
200  sto = std::make_shared<STObject const>(
201  SerialIter{item.second->slice()}, sfMetadata);
202  else
203  sto = nullptr;
204  return {std::move(stx), std::move(sto)};
205 }
206 
207 //---
208 
209 void
211 {
212  items_.erase(sle);
213 }
214 
215 void
217 {
218  items_.insert(sle);
219 }
220 
221 void
223 {
224  items_.replace(sle);
225 }
226 
227 void
229 {
230  items_.destroyXRP(fee);
231  // VFALCO Deduct from info_.totalDrops ?
232  // What about child views?
233 }
234 
235 //---
236 
237 void
239  key_type const& key,
241  std::shared_ptr<Serializer const> const& metaData)
242 {
243  auto const result = txs_.emplace(key, std::make_pair(txn, metaData));
244  if (!result.second)
245  LogicError("rawTxInsert: duplicate TX id" + to_string(key));
246 }
247 
248 } // namespace ripple
ripple::ReadView::info
virtual LedgerInfo const & info() const =0
Returns information about the ledger.
ripple::OpenView::txCount
std::size_t txCount() const
Return the number of tx inserted since creation.
Definition: OpenView.cpp:101
ripple::Keylet
A pair of SHAMap key and LedgerEntryType.
Definition: Keylet.h:38
ripple::OpenView::txs_iter_impl::equal
bool equal(base_type const &impl) const override
Definition: OpenView.cpp:46
std::shared_ptr
STL class.
ripple::LedgerInfo::parentHash
uint256 parentHash
Definition: ReadView.h:99
ripple::OpenView::info
LedgerInfo const & info() const override
Returns information about the ledger.
Definition: OpenView.cpp:117
ripple::open_ledger
const open_ledger_t open_ledger
Definition: OpenView.cpp:25
ripple::OpenView::apply
void apply(TxsRawView &to) const
Apply changes.
Definition: OpenView.cpp:107
ripple::ReadView::txs_type
Definition: ReadView.h:209
std::pair
ripple::LedgerInfo::hash
uint256 hash
Definition: ReadView.h:96
ripple::sfMetadata
const SField sfMetadata(access, STI_METADATA, 257, "Metadata")
Definition: SField.h:336
ripple::OpenView::rawErase
void rawErase(std::shared_ptr< SLE > const &sle) override
Delete an existing state item.
Definition: OpenView.cpp:210
std::map::find
T find(T... args)
std::map::size
T size(T... args)
ripple::ReadView::fees
virtual Fees const & fees() const =0
Returns the fees for the base ledger.
ripple::OpenView::exists
bool exists(Keylet const &k) const override
Determine if a state item exists.
Definition: OpenView.cpp:135
ripple::OpenView::slesUpperBound
std::unique_ptr< sles_type::iter_base > slesUpperBound(uint256 const &key) const override
Definition: OpenView.cpp:166
std::map::emplace
T emplace(T... args)
ripple::detail::RawStateTable::read
std::shared_ptr< SLE const > read(ReadView const &base, Keylet const &k) const
Definition: RawStateTable.cpp:303
ripple::OpenView::txs_iter_impl
Definition: OpenView.cpp:27
ripple::LedgerInfo::seq
LedgerIndex seq
Definition: ReadView.h:88
ripple::to_string
std::string to_string(ListDisposition disposition)
Definition: ValidatorList.cpp:42
ripple::OpenView::items_
detail::RawStateTable items_
Definition: OpenView.h:76
ripple::OpenView::info_
LedgerInfo info_
Definition: OpenView.h:74
ripple::LedgerInfo::closeTime
NetClock::time_point closeTime
Definition: ReadView.h:119
ripple::OpenView::txRead
tx_type txRead(key_type const &key) const override
Read a transaction from the tx map.
Definition: OpenView.cpp:191
ripple::base_uint< 256 >
ripple::OpenView::fees
Fees const & fees() const override
Returns the fees for the base ledger.
Definition: OpenView.cpp:123
ripple::OpenView::txsEnd
std::unique_ptr< txs_type::iter_base > txsEnd() const override
Definition: OpenView.cpp:179
ripple::OpenView::txExists
bool txExists(key_type const &key) const override
Returns true if a tx exists in the tx map.
Definition: OpenView.cpp:185
ripple::Fees
Reflects the fee settings for a particular ledger.
Definition: ReadView.h:47
ripple::TxsRawView::rawTxInsert
virtual void rawTxInsert(ReadView::key_type const &key, std::shared_ptr< Serializer const > const &txn, std::shared_ptr< Serializer const > const &metaData)=0
Add a transaction to the tx map.
ripple::OpenView::rawReplace
void rawReplace(std::shared_ptr< SLE > const &sle) override
Unconditionally replace a state item.
Definition: OpenView.cpp:222
ripple::OpenView::open
bool open() const override
Returns true if this reflects an open ledger.
Definition: OpenView.h:154
ripple::OpenView::OpenView
OpenView()=delete
ripple::OpenView::txs_iter_impl::copy
std::unique_ptr< base_type > copy() const override
Definition: OpenView.cpp:40
ripple::OpenView::txs_iter_impl::increment
void increment() override
Definition: OpenView.cpp:53
ripple::detail::RawStateTable::slesBegin
std::unique_ptr< ReadView::sles_type::iter_base > slesBegin(ReadView const &base) const
Definition: RawStateTable.cpp:325
ripple::SerialIter
Definition: Serializer.h:308
ripple::detail::RawStateTable::erase
void erase(std::shared_ptr< SLE > const &sle)
Definition: RawStateTable.cpp:230
ripple::detail::RawStateTable::exists
bool exists(ReadView const &base, Keylet const &k) const
Definition: RawStateTable.cpp:176
ripple::OpenView::rawInsert
void rawInsert(std::shared_ptr< SLE > const &sle) override
Unconditionally insert a state item.
Definition: OpenView.cpp:216
ripple::open_ledger_t
Open ledger construction tag.
Definition: OpenView.h:39
ripple::ReadView
A view into a ledger.
Definition: ReadView.h:188
ripple
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: RCLCensorshipDetector.h:29
ripple::LedgerInfo::accepted
bool accepted
Definition: ReadView.h:107
ripple::ReadView::sles_type
Definition: ReadView.h:198
ripple::OpenView::rawTxInsert
void rawTxInsert(key_type const &key, std::shared_ptr< Serializer const > const &txn, std::shared_ptr< Serializer const > const &metaData) override
Add a transaction to the tx map.
Definition: OpenView.cpp:238
ripple::detail::RawStateTable::apply
void apply(RawView &to) const
Definition: RawStateTable.cpp:154
ripple::OpenView::txsBegin
std::unique_ptr< txs_type::iter_base > txsBegin() const override
Definition: OpenView.cpp:173
ripple::OpenView::rules_
Rules rules_
Definition: OpenView.h:72
ripple::OpenView::txs_iter_impl::metadata_
bool metadata_
Definition: OpenView.cpp:30
ripple::detail::RawStateTable::destroyXRP
void destroyXRP(XRPAmount const &fee)
Definition: RawStateTable.cpp:319
std::map::cbegin
T cbegin(T... args)
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::detail::RawStateTable::insert
void insert(std::shared_ptr< SLE > const &sle)
Definition: RawStateTable.cpp:256
ripple::OpenView::txs_iter_impl::txs_iter_impl
txs_iter_impl(bool metadata, txs_map::const_iterator iter)
Definition: OpenView.cpp:34
ripple::OpenView::txs_iter_impl::dereference
value_type dereference() const override
Definition: OpenView.cpp:59
ripple::Rules
Rules controlling protocol behavior.
Definition: ReadView.h:127
ripple::OpenView::txs_
txs_map txs_
Definition: OpenView.h:73
ripple::OpenView::rawDestroyXRP
void rawDestroyXRP(XRPAmount const &fee) override
Destroy XRP.
Definition: OpenView.cpp:228
ripple::OpenView::read
std::shared_ptr< SLE const > read(Keylet const &k) const override
Return the state item associated with a key.
Definition: OpenView.cpp:148
ripple::detail::RawStateTable::replace
void replace(std::shared_ptr< SLE > const &sle)
Definition: RawStateTable.cpp:281
std::size_t
std::make_pair
T make_pair(T... args)
ripple::OpenView::slesEnd
std::unique_ptr< sles_type::iter_base > slesEnd() const override
Definition: OpenView.cpp:160
ripple::LedgerInfo
Information about the notional ledger backing the view.
Definition: ReadView.h:80
std::map::cend
T cend(T... args)
ripple::OpenView::base_
ReadView const * base_
Definition: OpenView.h:75
ripple::TxsRawView
Interface for changing ledger entries with transactions.
Definition: RawView.h:98
ripple::LedgerInfo::validated
bool validated
Definition: ReadView.h:106
ripple::detail::RawStateTable::slesEnd
std::unique_ptr< ReadView::sles_type::iter_base > slesEnd(ReadView const &base) const
Definition: RawStateTable.cpp:332
std::unique_ptr
STL class.
ripple::OpenView::slesBegin
std::unique_ptr< sles_type::iter_base > slesBegin() const override
Definition: OpenView.cpp:154
ripple::OpenView::txs_iter_impl::iter_
txs_map::const_iterator iter_
Definition: OpenView.cpp:31
ripple::OpenView::rules
Rules const & rules() const override
Returns the tx processing rules.
Definition: OpenView.cpp:129
ripple::open
void open(soci::session &s, BasicConfig const &config, std::string const &dbName)
Open a soci session.
Definition: SociDB.cpp:100
ripple::XRPAmount
Definition: XRPAmount.h:46
ripple::OpenView::succ
boost::optional< key_type > succ(key_type const &key, boost::optional< key_type > const &last=boost::none) const override
Return the key of the next state item.
Definition: OpenView.cpp:141
ripple::LedgerInfo::parentCloseTime
NetClock::time_point parentCloseTime
Definition: ReadView.h:89