rippled
Feature.h
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 #ifndef RIPPLE_PROTOCOL_FEATURE_H_INCLUDED
21 #define RIPPLE_PROTOCOL_FEATURE_H_INCLUDED
22 
23 #include <ripple/basics/base_uint.h>
24 #include <boost/container/flat_map.hpp>
25 #include <boost/optional.hpp>
26 #include <array>
27 #include <bitset>
28 #include <string>
29 
45 namespace ripple {
46 
47 namespace detail {
48 
49 // *NOTE*
50 //
51 // Features, or Amendments as they are called elsewhere, are enabled on the
52 // network at some specific time based on Validator voting. Features are
53 // enabled using run-time conditionals based on the state of the amendment.
54 // There is value in retaining that conditional code for some time after
55 // the amendment is enabled to make it simple to replay old transactions.
56 // However, once an Amendment has been enabled for, say, more than two years
57 // then retaining that conditional code has less value since it is
58 // uncommon to replay such old transactions.
59 //
60 // Starting in January of 2020 Amendment conditionals from before January
61 // 2018 are being removed. So replaying any ledger from before January
62 // 2018 needs to happen on an older version of the server code. There's
63 // a log message in Application.cpp that warns about replaying old ledgers.
64 //
65 // At some point in the future someone may wish to remove Amendment
66 // conditional code for Amendments that were enabled after January 2018.
67 // When that happens then the log message in Application.cpp should be
68 // updated.
69 
71 {
72  static constexpr char const* const featureNames[] =
73  {
74  "MultiSign", // Unconditionally supported.
75  "Tickets",
76  "TrustSetAuth", // Unconditionally supported.
77  "FeeEscalation", // Unconditionally supported.
78  "OwnerPaysFee",
79  "PayChan",
80  "Flow", // Unconditionally supported.
81  "CompareTakerFlowCross",
82  "FlowCross",
83  "CryptoConditions",
84  "TickSize",
85  "fix1368",
86  "Escrow",
87  "CryptoConditionsSuite",
88  "fix1373",
89  "EnforceInvariants",
90  "SortedDirectories",
91  "fix1201",
92  "fix1512",
93  "fix1513",
94  "fix1523",
95  "fix1528",
96  "DepositAuth",
97  "Checks",
98  "fix1571",
99  "fix1543",
100  "fix1623",
101  "DepositPreauth",
102  "fix1515",
103  "fix1578",
104  "MultiSignReserve",
105  "fixTakerDryOfferRemoval",
106  "fixMasterKeyAsRegularKey",
107  "fixCheckThreading",
108  "fixPayChanRecipientOwnerDir",
109  "DeletableAccounts",
110  // fixQualityUpperBound should be activated before FlowCross
111  "fixQualityUpperBound",
112  "RequireFullyCanonicalSig",
113  "fix1781", // XRPEndpointSteps should be included in the circular payment check
114  };
115 
117  boost::container::flat_map<uint256, std::size_t> featureToIndex;
118  boost::container::flat_map<std::string, uint256> nameToFeature;
119 
120 public:
122 
123  static constexpr std::size_t numFeatures()
124  {
125  return sizeof (featureNames) / sizeof (featureNames[0]);
126  }
127 
128  boost::optional<uint256>
129  getRegisteredFeature(std::string const& name) const;
130 
132  featureToBitsetIndex(uint256 const& f) const;
133 
134  uint256 const&
135  bitsetIndexToFeature(size_t i) const;
136 };
137 
141 
142 } // detail
143 
144 boost::optional<uint256>
145 getRegisteredFeature (std::string const& name);
146 
147 size_t
148 featureToBitsetIndex(uint256 const& f);
149 
150 uint256
151 bitsetIndexToFeature(size_t i);
152 
154  : private std::bitset<detail::FeatureCollections::numFeatures()>
155 {
157 
158  template<class... Fs>
159  void initFromFeatures(uint256 const& f, Fs&&... fs)
160  {
161  set(f);
162  if constexpr (sizeof...(fs) > 0)
163  initFromFeatures(std::forward<Fs>(fs)...);
164  }
165 
166 public:
167  using base::bitset;
168  using base::operator==;
169  using base::operator!=;
170 
171  using base::test;
172  using base::all;
173  using base::any;
174  using base::none;
175  using base::count;
176  using base::size;
177  using base::set;
178  using base::reset;
179  using base::flip;
180  using base::operator[];
181  using base::to_string;
182  using base::to_ulong;
183  using base::to_ullong;
184 
185  FeatureBitset() = default;
186 
187  explicit
188  FeatureBitset(base const& b)
189  : base(b)
190  {
191  }
192 
193  template<class... Fs>
194  explicit
195  FeatureBitset(uint256 const& f, Fs&&... fs)
196  {
197  initFromFeatures(f, std::forward<Fs>(fs)...);
198  }
199 
200  template <class Col>
201  explicit
202  FeatureBitset(Col const& fs)
203  {
204  for (auto const& f : fs)
206  }
207 
208  auto operator[](uint256 const& f)
209  {
211  }
212 
213  auto operator[](uint256 const& f) const
214  {
216  }
217 
219  set(uint256 const& f, bool value = true)
220  {
221  base::set(featureToBitsetIndex(f), value);
222  return *this;
223  }
224 
226  reset(uint256 const& f)
227  {
229  return *this;
230  }
231 
233  flip(uint256 const& f)
234  {
236  return *this;
237  }
238 
240  {
241  base::operator&=(rhs);
242  return *this;
243  }
244 
246  {
247  base::operator|=(rhs);
248  return *this;
249  }
250 
252  {
253  return FeatureBitset{base::operator~()};
254  }
255 
256  friend
258  FeatureBitset const& lhs,
259  FeatureBitset const& rhs)
260  {
261  return FeatureBitset{static_cast<base const&>(lhs) &
262  static_cast<base const&>(rhs)};
263  }
264 
265  friend
267  FeatureBitset const& lhs,
268  uint256 const& rhs)
269  {
270  return lhs & FeatureBitset{rhs};
271  }
272 
273  friend
275  uint256 const& lhs,
276  FeatureBitset const& rhs)
277  {
278  return FeatureBitset{lhs} & rhs;
279  }
280 
281  friend
283  FeatureBitset const& lhs,
284  FeatureBitset const& rhs)
285  {
286  return FeatureBitset{static_cast<base const&>(lhs) |
287  static_cast<base const&>(rhs)};
288  }
289 
290  friend
292  FeatureBitset const& lhs,
293  uint256 const& rhs)
294  {
295  return lhs | FeatureBitset{rhs};
296  }
297 
298  friend
300  uint256 const& lhs,
301  FeatureBitset const& rhs)
302  {
303  return FeatureBitset{lhs} | rhs;
304  }
305 
306  friend
308  FeatureBitset const& lhs,
309  FeatureBitset const& rhs)
310  {
311  return FeatureBitset{static_cast<base const&>(lhs) ^
312  static_cast<base const&>(rhs)};
313  }
314 
315  friend
317  FeatureBitset const& lhs,
318  uint256 const& rhs)
319  {
320  return lhs ^ FeatureBitset{rhs};
321  }
322 
323  friend
325  uint256 const& lhs,
326  FeatureBitset const& rhs)
327  {
328  return FeatureBitset{lhs} ^ rhs;
329  }
330 
331  // set difference
332  friend
334  FeatureBitset const& lhs,
335  FeatureBitset const& rhs)
336  {
337  return lhs & ~rhs;
338  }
339 
340  friend
342  FeatureBitset const& lhs,
343  uint256 const& rhs)
344  {
345  return lhs - FeatureBitset{rhs};
346  }
347 
348  friend
350  uint256 const& lhs,
351  FeatureBitset const& rhs)
352  {
353  return FeatureBitset{lhs} - rhs;
354  }
355 };
356 
357 template <class F>
358 void
360 {
361  for (size_t i = 0; i < bs.size(); ++i)
362  if (bs[i])
363  f(bitsetIndexToFeature(i));
364 }
365 
366 extern uint256 const featureTickets;
367 extern uint256 const featureOwnerPaysFee;
368 extern uint256 const featureFlow;
370 extern uint256 const featureFlowCross;
372 extern uint256 const fix1513;
373 extern uint256 const featureDepositAuth;
374 extern uint256 const featureChecks;
375 extern uint256 const fix1571;
376 extern uint256 const fix1543;
377 extern uint256 const fix1623;
378 extern uint256 const featureDepositPreauth;
379 extern uint256 const fix1515;
380 extern uint256 const fix1578;
381 extern uint256 const featureMultiSignReserve;
382 extern uint256 const fixTakerDryOfferRemoval;
383 extern uint256 const fixMasterKeyAsRegularKey;
384 extern uint256 const fixCheckThreading;
386 extern uint256 const featureDeletableAccounts;
387 extern uint256 const fixQualityUpperBound;
389 extern uint256 const fix1781;
390 
391 // The following amendments have been active for at least two years.
392 // Their pre-amendment code has been removed.
393 extern uint256 const retiredPayChan;
394 extern uint256 const retiredCryptoConditions;
395 extern uint256 const retiredTickSize;
396 extern uint256 const retiredFix1368;
397 extern uint256 const retiredEscrow;
398 extern uint256 const retiredFix1373;
399 extern uint256 const retiredEnforceInvariants;
400 extern uint256 const retiredSortedDirectories;
401 extern uint256 const retiredFix1201;
402 extern uint256 const retiredFix1512;
403 extern uint256 const retiredFix1523;
404 extern uint256 const retiredFix1528;
405 
406 } // ripple
407 
408 #endif
ripple::detail::FeatureCollections::getRegisteredFeature
boost::optional< uint256 > getRegisteredFeature(std::string const &name) const
Definition: Feature.cpp:52
ripple::FeatureBitset::operator|=
FeatureBitset & operator|=(FeatureBitset const &rhs)
Definition: Feature.h:245
bitset
ripple::fixQualityUpperBound
const uint256 fixQualityUpperBound
Definition: Feature.cpp:178
std::string
STL class.
std::bitset< detail::FeatureCollections::numFeatures()>::all
T all(T... args)
ripple::retiredFix1528
const uint256 retiredFix1528
Definition: Feature.cpp:195
ripple::FeatureBitset::FeatureBitset
FeatureBitset()=default
ripple::retiredSortedDirectories
const uint256 retiredSortedDirectories
Definition: Feature.cpp:191
ripple::fix1515
const uint256 fix1515
Definition: Feature.cpp:170
ripple::featureDepositPreauth
const uint256 featureDepositPreauth
Definition: Feature.cpp:169
std::vector
STL class.
std::bitset< detail::FeatureCollections::numFeatures()>::size
T size(T... args)
ripple::FeatureBitset::FeatureBitset
FeatureBitset(uint256 const &f, Fs &&... fs)
Definition: Feature.h:195
ripple::featureDepositAuth
const uint256 featureDepositAuth
Definition: Feature.cpp:164
ripple::detail::FeatureCollections::featureToIndex
boost::container::flat_map< uint256, std::size_t > featureToIndex
Definition: Feature.h:117
ripple::fix1781
const uint256 fix1781
Definition: Feature.cpp:180
ripple::featureMultiSignReserve
const uint256 featureMultiSignReserve
Definition: Feature.cpp:172
ripple::FeatureBitset::flip
FeatureBitset & flip(uint256 const &f)
Definition: Feature.h:233
ripple::detail::FeatureCollections::FeatureCollections
FeatureCollections()
Definition: Feature.cpp:32
ripple::retiredPayChan
const uint256 retiredPayChan
Definition: Feature.cpp:184
ripple::retiredFix1368
const uint256 retiredFix1368
Definition: Feature.cpp:187
ripple::FeatureBitset::FeatureBitset
FeatureBitset(base const &b)
Definition: Feature.h:188
ripple::detail::FeatureCollections
Definition: Feature.h:70
std::bitset< detail::FeatureCollections::numFeatures()>::to_ullong
T to_ullong(T... args)
ripple::retiredEnforceInvariants
const uint256 retiredEnforceInvariants
Definition: Feature.cpp:190
ripple::FeatureBitset::operator^
friend FeatureBitset operator^(uint256 const &lhs, FeatureBitset const &rhs)
Definition: Feature.h:324
std::bitset< detail::FeatureCollections::numFeatures()>::reset
T reset(T... args)
ripple::FeatureBitset::operator-
friend FeatureBitset operator-(uint256 const &lhs, FeatureBitset const &rhs)
Definition: Feature.h:349
ripple::FeatureBitset::operator|
friend FeatureBitset operator|(uint256 const &lhs, FeatureBitset const &rhs)
Definition: Feature.h:299
ripple::uint256
base_uint< 256 > uint256
Definition: base_uint.h:436
ripple::featureDeletableAccounts
const uint256 featureDeletableAccounts
Definition: Feature.cpp:177
ripple::retiredTickSize
const uint256 retiredTickSize
Definition: Feature.cpp:186
std::bitset< detail::FeatureCollections::numFeatures()>::to_ulong
T to_ulong(T... args)
ripple::FeatureBitset::operator^
friend FeatureBitset operator^(FeatureBitset const &lhs, FeatureBitset const &rhs)
Definition: Feature.h:307
ripple::FeatureBitset::operator&
friend FeatureBitset operator&(uint256 const &lhs, FeatureBitset const &rhs)
Definition: Feature.h:274
ripple::base_uint< 256 >
ripple::featureRequireFullyCanonicalSig
const uint256 featureRequireFullyCanonicalSig
Definition: Feature.cpp:179
ripple::foreachFeature
void foreachFeature(FeatureBitset bs, F &&f)
Definition: Feature.h:359
ripple::detail::FeatureCollections::bitsetIndexToFeature
uint256 const & bitsetIndexToFeature(size_t i) const
Definition: Feature.cpp:70
ripple::FeatureBitset::operator&
friend FeatureBitset operator&(FeatureBitset const &lhs, uint256 const &rhs)
Definition: Feature.h:266
ripple::detail::FeatureCollections::features
std::vector< uint256 > features
Definition: Feature.h:116
ripple::featureCompareTakerFlowCross
const uint256 featureCompareTakerFlowCross
Definition: Feature.cpp:160
ripple::retiredEscrow
const uint256 retiredEscrow
Definition: Feature.cpp:188
ripple::fix1513
const uint256 fix1513
Definition: Feature.cpp:163
ripple::fixCheckThreading
const uint256 fixCheckThreading
Definition: Feature.cpp:175
ripple::retiredFix1373
const uint256 retiredFix1373
Definition: Feature.cpp:189
ripple::FeatureBitset::operator~
FeatureBitset operator~() const
Definition: Feature.h:251
ripple::FeatureBitset::operator|
friend FeatureBitset operator|(FeatureBitset const &lhs, uint256 const &rhs)
Definition: Feature.h:291
ripple::FeatureBitset::operator[]
auto operator[](uint256 const &f) const
Definition: Feature.h:213
ripple::fixTakerDryOfferRemoval
const uint256 fixTakerDryOfferRemoval
Definition: Feature.cpp:173
std::bitset< detail::FeatureCollections::numFeatures()>::to_string
T to_string(T... args)
ripple::fix1623
const uint256 fix1623
Definition: Feature.cpp:168
array
ripple::FeatureBitset::initFromFeatures
void initFromFeatures(uint256 const &f, Fs &&... fs)
Definition: Feature.h:159
ripple::featureToBitsetIndex
size_t featureToBitsetIndex(uint256 const &f)
Definition: Feature.cpp:146
ripple::fixPayChanRecipientOwnerDir
const uint256 fixPayChanRecipientOwnerDir
Definition: Feature.cpp:176
ripple::fixMasterKeyAsRegularKey
const uint256 fixMasterKeyAsRegularKey
Definition: Feature.cpp:174
ripple::featureTickets
const uint256 featureTickets
Definition: Feature.cpp:157
ripple::retiredCryptoConditions
const uint256 retiredCryptoConditions
Definition: Feature.cpp:185
ripple::featureChecks
const uint256 featureChecks
Definition: Feature.cpp:165
ripple::fix1543
const uint256 fix1543
Definition: Feature.cpp:167
ripple::FeatureBitset::FeatureBitset
FeatureBitset(Col const &fs)
Definition: Feature.h:202
ripple::fix1578
const uint256 fix1578
Definition: Feature.cpp:171
ripple::detail::supportedAmendments
std::vector< std::string > const & supportedAmendments()
Amendments that this server supports, but doesn't enable by default.
Definition: Feature.cpp:81
ripple
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: RCLCensorshipDetector.h:29
ripple::featureCryptoConditionsSuite
const uint256 featureCryptoConditionsSuite
Definition: Feature.cpp:162
ripple::detail::FeatureCollections::featureNames
static constexpr char const *const featureNames[]
Definition: Feature.h:72
ripple::detail::FeatureCollections::featureToBitsetIndex
std::size_t featureToBitsetIndex(uint256 const &f) const
Definition: Feature.cpp:61
ripple::featureFlow
const uint256 featureFlow
Definition: Feature.cpp:159
ripple::FeatureBitset::reset
FeatureBitset & reset(uint256 const &f)
Definition: Feature.h:226
ripple::bitsetIndexToFeature
uint256 bitsetIndexToFeature(size_t i)
Definition: Feature.cpp:151
ripple::FeatureBitset::set
FeatureBitset & set(uint256 const &f, bool value=true)
Definition: Feature.h:219
ripple::FeatureBitset
Definition: Feature.h:153
std::bitset< detail::FeatureCollections::numFeatures()>::count
T count(T... args)
std::bitset< detail::FeatureCollections::numFeatures()>::operator&=
T operator&=(T... args)
ripple::FeatureBitset::operator&
friend FeatureBitset operator&(FeatureBitset const &lhs, FeatureBitset const &rhs)
Definition: Feature.h:257
ripple::retiredFix1523
const uint256 retiredFix1523
Definition: Feature.cpp:194
ripple::retiredFix1201
const uint256 retiredFix1201
Definition: Feature.cpp:192
ripple::FeatureBitset::operator-
friend FeatureBitset operator-(FeatureBitset const &lhs, uint256 const &rhs)
Definition: Feature.h:341
std::size_t
std::bitset< detail::FeatureCollections::numFeatures()>::flip
T flip(T... args)
ripple::FeatureBitset::operator&=
FeatureBitset & operator&=(FeatureBitset const &rhs)
Definition: Feature.h:239
ripple::featureOwnerPaysFee
const uint256 featureOwnerPaysFee
Definition: Feature.cpp:158
ripple::retiredFix1512
const uint256 retiredFix1512
Definition: Feature.cpp:193
ripple::fix1571
const uint256 fix1571
Definition: Feature.cpp:166
std::bitset< detail::FeatureCollections::numFeatures()>::test
T test(T... args)
ripple::FeatureBitset::operator|
friend FeatureBitset operator|(FeatureBitset const &lhs, FeatureBitset const &rhs)
Definition: Feature.h:282
ripple::featureFlowCross
const uint256 featureFlowCross
Definition: Feature.cpp:161
ripple::detail::FeatureCollections::numFeatures
static constexpr std::size_t numFeatures()
Definition: Feature.h:123
std::bitset< detail::FeatureCollections::numFeatures()>::set
T set(T... args)
ripple::FeatureBitset::operator-
friend FeatureBitset operator-(FeatureBitset const &lhs, FeatureBitset const &rhs)
Definition: Feature.h:333
std::bitset< detail::FeatureCollections::numFeatures()>::operator[]
T operator[](T... args)
ripple::FeatureBitset::operator^
friend FeatureBitset operator^(FeatureBitset const &lhs, uint256 const &rhs)
Definition: Feature.h:316
ripple::FeatureBitset::operator[]
auto operator[](uint256 const &f)
Definition: Feature.h:208
ripple::getRegisteredFeature
boost::optional< uint256 > getRegisteredFeature(std::string const &name)
Definition: Feature.cpp:141
ripple::detail::FeatureCollections::nameToFeature
boost::container::flat_map< std::string, uint256 > nameToFeature
Definition: Feature.h:118
string