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 <array>
26 #include <bitset>
27 #include <optional>
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  "MultiSign", // Unconditionally supported.
74  "TrustSetAuth", // Unconditionally supported.
75  "FeeEscalation", // Unconditionally supported.
76  "OwnerPaysFee",
77  "PayChan",
78  "Flow", // Unconditionally supported.
79  "CompareTakerFlowCross",
80  "FlowCross",
81  "CryptoConditions",
82  "TickSize",
83  "fix1368",
84  "Escrow",
85  "CryptoConditionsSuite",
86  "fix1373",
87  "EnforceInvariants",
88  "SortedDirectories",
89  "fix1201",
90  "fix1512",
91  "fix1513",
92  "fix1523",
93  "fix1528",
94  "DepositAuth",
95  "Checks",
96  "fix1571",
97  "fix1543",
98  "fix1623",
99  "DepositPreauth",
100  "fix1515",
101  "fix1578",
102  "MultiSignReserve",
103  "fixTakerDryOfferRemoval",
104  "fixMasterKeyAsRegularKey",
105  "fixCheckThreading",
106  "fixPayChanRecipientOwnerDir",
107  "DeletableAccounts",
108  // fixQualityUpperBound should be activated before FlowCross
109  "fixQualityUpperBound",
110  "RequireFullyCanonicalSig",
111  "fix1781", // XRPEndpointSteps should be included in the circular
112  // payment check
113  "HardenedValidations",
114  "fixAmendmentMajorityCalc", // Fix Amendment majority calculation
115  "NegativeUNL",
116  "TicketBatch",
117  "FlowSortStrands",
118  "fixSTAmountCanonicalize",
119  "fixRmSmallIncreasedQOffers",
120  };
121 
123  boost::container::flat_map<uint256, std::size_t> featureToIndex;
124  boost::container::flat_map<std::string, uint256> nameToFeature;
125 
126 public:
128 
129  static constexpr std::size_t
131  {
132  return sizeof(featureNames) / sizeof(featureNames[0]);
133  }
134 
136  getRegisteredFeature(std::string const& name) const;
137 
139  featureToBitsetIndex(uint256 const& f) const;
140 
141  uint256 const&
142  bitsetIndexToFeature(size_t i) const;
143 };
144 
148 
149 } // namespace detail
150 
152 getRegisteredFeature(std::string const& name);
153 
154 size_t
155 featureToBitsetIndex(uint256 const& f);
156 
157 uint256
158 bitsetIndexToFeature(size_t i);
159 
161  : private std::bitset<detail::FeatureCollections::numFeatures()>
162 {
164 
165  template <class... Fs>
166  void
167  initFromFeatures(uint256 const& f, Fs&&... fs)
168  {
169  set(f);
170  if constexpr (sizeof...(fs) > 0)
171  initFromFeatures(std::forward<Fs>(fs)...);
172  }
173 
174 public:
175  using base::bitset;
176  using base::operator==;
177  using base::operator!=;
178 
179  using base::all;
180  using base::any;
181  using base::count;
182  using base::flip;
183  using base::none;
184  using base::reset;
185  using base::set;
186  using base::size;
187  using base::test;
188  using base::operator[];
189  using base::to_string;
190  using base::to_ullong;
191  using base::to_ulong;
192 
193  FeatureBitset() = default;
194 
195  explicit FeatureBitset(base const& b) : base(b)
196  {
197  }
198 
199  template <class... Fs>
200  explicit FeatureBitset(uint256 const& f, Fs&&... fs)
201  {
202  initFromFeatures(f, std::forward<Fs>(fs)...);
203  }
204 
205  template <class Col>
206  explicit FeatureBitset(Col const& fs)
207  {
208  for (auto const& f : fs)
210  }
211 
212  auto
213  operator[](uint256 const& f)
214  {
216  }
217 
218  auto
219  operator[](uint256 const& f) const
220  {
222  }
223 
225  set(uint256 const& f, bool value = true)
226  {
227  base::set(featureToBitsetIndex(f), value);
228  return *this;
229  }
230 
232  reset(uint256 const& f)
233  {
235  return *this;
236  }
237 
239  flip(uint256 const& f)
240  {
242  return *this;
243  }
244 
247  {
248  base::operator&=(rhs);
249  return *this;
250  }
251 
254  {
255  base::operator|=(rhs);
256  return *this;
257  }
258 
260  operator~() const
261  {
262  return FeatureBitset{base::operator~()};
263  }
264 
265  friend FeatureBitset
266  operator&(FeatureBitset const& lhs, FeatureBitset const& rhs)
267  {
268  return FeatureBitset{
269  static_cast<base const&>(lhs) & static_cast<base const&>(rhs)};
270  }
271 
272  friend FeatureBitset
273  operator&(FeatureBitset const& lhs, uint256 const& rhs)
274  {
275  return lhs & FeatureBitset{rhs};
276  }
277 
278  friend FeatureBitset
279  operator&(uint256 const& lhs, FeatureBitset const& rhs)
280  {
281  return FeatureBitset{lhs} & rhs;
282  }
283 
284  friend FeatureBitset
285  operator|(FeatureBitset const& lhs, FeatureBitset const& rhs)
286  {
287  return FeatureBitset{
288  static_cast<base const&>(lhs) | static_cast<base const&>(rhs)};
289  }
290 
291  friend FeatureBitset
292  operator|(FeatureBitset const& lhs, uint256 const& rhs)
293  {
294  return lhs | FeatureBitset{rhs};
295  }
296 
297  friend FeatureBitset
298  operator|(uint256 const& lhs, FeatureBitset const& rhs)
299  {
300  return FeatureBitset{lhs} | rhs;
301  }
302 
303  friend FeatureBitset
304  operator^(FeatureBitset const& lhs, FeatureBitset const& rhs)
305  {
306  return FeatureBitset{
307  static_cast<base const&>(lhs) ^ static_cast<base const&>(rhs)};
308  }
309 
310  friend FeatureBitset
311  operator^(FeatureBitset const& lhs, uint256 const& rhs)
312  {
313  return lhs ^ FeatureBitset { rhs };
314  }
315 
316  friend FeatureBitset
317  operator^(uint256 const& lhs, FeatureBitset const& rhs)
318  {
319  return FeatureBitset{lhs} ^ rhs;
320  }
321 
322  // set difference
323  friend FeatureBitset
324  operator-(FeatureBitset const& lhs, FeatureBitset const& rhs)
325  {
326  return lhs & ~rhs;
327  }
328 
329  friend FeatureBitset
330  operator-(FeatureBitset const& lhs, uint256 const& rhs)
331  {
332  return lhs - FeatureBitset{rhs};
333  }
334 
335  friend FeatureBitset
336  operator-(uint256 const& lhs, FeatureBitset const& rhs)
337  {
338  return FeatureBitset{lhs} - rhs;
339  }
340 };
341 
342 template <class F>
343 void
345 {
346  for (size_t i = 0; i < bs.size(); ++i)
347  if (bs[i])
348  f(bitsetIndexToFeature(i));
349 }
350 
351 extern uint256 const featureOwnerPaysFee;
352 extern uint256 const featureFlow;
354 extern uint256 const featureFlowCross;
356 extern uint256 const fix1513;
357 extern uint256 const featureDepositAuth;
358 extern uint256 const featureChecks;
359 extern uint256 const fix1571;
360 extern uint256 const fix1543;
361 extern uint256 const fix1623;
362 extern uint256 const featureDepositPreauth;
363 extern uint256 const fix1515;
364 extern uint256 const fix1578;
365 extern uint256 const featureMultiSignReserve;
366 extern uint256 const fixTakerDryOfferRemoval;
367 extern uint256 const fixMasterKeyAsRegularKey;
368 extern uint256 const fixCheckThreading;
370 extern uint256 const featureDeletableAccounts;
371 extern uint256 const fixQualityUpperBound;
373 extern uint256 const fix1781;
375 extern uint256 const fixAmendmentMajorityCalc;
376 extern uint256 const featureNegativeUNL;
377 extern uint256 const featureTicketBatch;
378 extern uint256 const featureFlowSortStrands;
379 extern uint256 const fixSTAmountCanonicalize;
381 
382 } // namespace ripple
383 
384 #endif
ripple::FeatureBitset::operator|=
FeatureBitset & operator|=(FeatureBitset const &rhs)
Definition: Feature.h:253
bitset
ripple::fixQualityUpperBound
const uint256 fixQualityUpperBound
Definition: Feature.cpp:186
std::string
STL class.
std::bitset< detail::FeatureCollections::numFeatures()>::all
T all(T... args)
ripple::FeatureBitset::FeatureBitset
FeatureBitset()=default
ripple::fix1515
const uint256 fix1515
Definition: Feature.cpp:178
ripple::featureDepositPreauth
const uint256 featureDepositPreauth
Definition: Feature.cpp:177
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:200
ripple::fixSTAmountCanonicalize
const uint256 fixSTAmountCanonicalize
Definition: Feature.cpp:194
ripple::featureDepositAuth
const uint256 featureDepositAuth
Definition: Feature.cpp:172
ripple::detail::FeatureCollections::featureToIndex
boost::container::flat_map< uint256, std::size_t > featureToIndex
Definition: Feature.h:123
ripple::fix1781
const uint256 fix1781
Definition: Feature.cpp:188
ripple::featureMultiSignReserve
const uint256 featureMultiSignReserve
Definition: Feature.cpp:180
ripple::FeatureBitset::flip
FeatureBitset & flip(uint256 const &f)
Definition: Feature.h:239
ripple::detail::FeatureCollections::FeatureCollections
FeatureCollections()
Definition: Feature.cpp:32
ripple::FeatureBitset::FeatureBitset
FeatureBitset(base const &b)
Definition: Feature.h:195
ripple::detail::FeatureCollections
Definition: Feature.h:70
std::bitset< detail::FeatureCollections::numFeatures()>::to_ullong
T to_ullong(T... args)
ripple::FeatureBitset::operator^
friend FeatureBitset operator^(uint256 const &lhs, FeatureBitset const &rhs)
Definition: Feature.h:317
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:336
ripple::FeatureBitset::operator|
friend FeatureBitset operator|(uint256 const &lhs, FeatureBitset const &rhs)
Definition: Feature.h:298
ripple::uint256
base_uint< 256 > uint256
Definition: base_uint.h:526
ripple::featureDeletableAccounts
const uint256 featureDeletableAccounts
Definition: Feature.cpp:185
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:304
ripple::FeatureBitset::operator&
friend FeatureBitset operator&(uint256 const &lhs, FeatureBitset const &rhs)
Definition: Feature.h:279
ripple::base_uint< 256 >
ripple::featureRequireFullyCanonicalSig
const uint256 featureRequireFullyCanonicalSig
Definition: Feature.cpp:187
ripple::foreachFeature
void foreachFeature(FeatureBitset bs, F &&f)
Definition: Feature.h:344
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:273
ripple::detail::FeatureCollections::features
std::vector< uint256 > features
Definition: Feature.h:122
ripple::featureCompareTakerFlowCross
const uint256 featureCompareTakerFlowCross
Definition: Feature.cpp:168
ripple::fix1513
const uint256 fix1513
Definition: Feature.cpp:171
ripple::fixCheckThreading
const uint256 fixCheckThreading
Definition: Feature.cpp:183
ripple::fixAmendmentMajorityCalc
const uint256 fixAmendmentMajorityCalc
Definition: Feature.cpp:190
ripple::FeatureBitset::operator~
FeatureBitset operator~() const
Definition: Feature.h:260
ripple::FeatureBitset::operator|
friend FeatureBitset operator|(FeatureBitset const &lhs, uint256 const &rhs)
Definition: Feature.h:292
ripple::FeatureBitset::operator[]
auto operator[](uint256 const &f) const
Definition: Feature.h:219
ripple::fixTakerDryOfferRemoval
const uint256 fixTakerDryOfferRemoval
Definition: Feature.cpp:181
std::bitset< detail::FeatureCollections::numFeatures()>::to_string
T to_string(T... args)
ripple::fix1623
const uint256 fix1623
Definition: Feature.cpp:176
array
ripple::FeatureBitset::initFromFeatures
void initFromFeatures(uint256 const &f, Fs &&... fs)
Definition: Feature.h:167
ripple::featureToBitsetIndex
size_t featureToBitsetIndex(uint256 const &f)
Definition: Feature.cpp:152
ripple::fixPayChanRecipientOwnerDir
const uint256 fixPayChanRecipientOwnerDir
Definition: Feature.cpp:184
ripple::fixMasterKeyAsRegularKey
const uint256 fixMasterKeyAsRegularKey
Definition: Feature.cpp:182
ripple::featureChecks
const uint256 featureChecks
Definition: Feature.cpp:173
ripple::fixRmSmallIncreasedQOffers
const uint256 fixRmSmallIncreasedQOffers
Definition: Feature.cpp:195
ripple::featureFlowSortStrands
const uint256 featureFlowSortStrands
Definition: Feature.cpp:193
ripple::featureHardenedValidations
const uint256 featureHardenedValidations
Definition: Feature.cpp:189
ripple::fix1543
const uint256 fix1543
Definition: Feature.cpp:175
ripple::FeatureBitset::FeatureBitset
FeatureBitset(Col const &fs)
Definition: Feature.h:206
ripple::fix1578
const uint256 fix1578
Definition: Feature.cpp:179
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:170
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::detail::FeatureCollections::getRegisteredFeature
std::optional< uint256 > getRegisteredFeature(std::string const &name) const
Definition: Feature.cpp:52
ripple::featureFlow
const uint256 featureFlow
Definition: Feature.cpp:167
ripple::featureNegativeUNL
const uint256 featureNegativeUNL
Definition: Feature.cpp:191
ripple::FeatureBitset::reset
FeatureBitset & reset(uint256 const &f)
Definition: Feature.h:232
ripple::bitsetIndexToFeature
uint256 bitsetIndexToFeature(size_t i)
Definition: Feature.cpp:158
ripple::FeatureBitset::set
FeatureBitset & set(uint256 const &f, bool value=true)
Definition: Feature.h:225
ripple::FeatureBitset
Definition: Feature.h:160
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:266
ripple::featureTicketBatch
const uint256 featureTicketBatch
Definition: Feature.cpp:192
optional
ripple::FeatureBitset::operator-
friend FeatureBitset operator-(FeatureBitset const &lhs, uint256 const &rhs)
Definition: Feature.h:330
std::size_t
std::bitset< detail::FeatureCollections::numFeatures()>::flip
T flip(T... args)
ripple::FeatureBitset::operator&=
FeatureBitset & operator&=(FeatureBitset const &rhs)
Definition: Feature.h:246
ripple::featureOwnerPaysFee
const uint256 featureOwnerPaysFee
Definition: Feature.cpp:166
ripple::fix1571
const uint256 fix1571
Definition: Feature.cpp:174
ripple::getRegisteredFeature
std::optional< uint256 > getRegisteredFeature(std::string const &name)
Definition: Feature.cpp:146
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:285
ripple::featureFlowCross
const uint256 featureFlowCross
Definition: Feature.cpp:169
ripple::detail::FeatureCollections::numFeatures
static constexpr std::size_t numFeatures()
Definition: Feature.h:130
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:324
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:311
ripple::FeatureBitset::operator[]
auto operator[](uint256 const &f)
Definition: Feature.h:213
ripple::detail::FeatureCollections::nameToFeature
boost::container::flat_map< std::string, uint256 > nameToFeature
Definition: Feature.h:124
string