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  "CheckCashMakesTrustLine",
121  };
122 
124  boost::container::flat_map<uint256, std::size_t> featureToIndex;
125  boost::container::flat_map<std::string, uint256> nameToFeature;
126 
127 public:
129 
130  static constexpr std::size_t
132  {
133  return sizeof(featureNames) / sizeof(featureNames[0]);
134  }
135 
137  getRegisteredFeature(std::string const& name) const;
138 
140  featureToBitsetIndex(uint256 const& f) const;
141 
142  uint256 const&
143  bitsetIndexToFeature(size_t i) const;
144 };
145 
149 
150 } // namespace detail
151 
153 getRegisteredFeature(std::string const& name);
154 
155 size_t
156 featureToBitsetIndex(uint256 const& f);
157 
158 uint256
159 bitsetIndexToFeature(size_t i);
160 
162  : private std::bitset<detail::FeatureCollections::numFeatures()>
163 {
165 
166  template <class... Fs>
167  void
168  initFromFeatures(uint256 const& f, Fs&&... fs)
169  {
170  set(f);
171  if constexpr (sizeof...(fs) > 0)
172  initFromFeatures(std::forward<Fs>(fs)...);
173  }
174 
175 public:
176  using base::bitset;
177  using base::operator==;
178  using base::operator!=;
179 
180  using base::all;
181  using base::any;
182  using base::count;
183  using base::flip;
184  using base::none;
185  using base::reset;
186  using base::set;
187  using base::size;
188  using base::test;
189  using base::operator[];
190  using base::to_string;
191  using base::to_ullong;
192  using base::to_ulong;
193 
194  FeatureBitset() = default;
195 
196  explicit FeatureBitset(base const& b) : base(b)
197  {
198  }
199 
200  template <class... Fs>
201  explicit FeatureBitset(uint256 const& f, Fs&&... fs)
202  {
203  initFromFeatures(f, std::forward<Fs>(fs)...);
204  }
205 
206  template <class Col>
207  explicit FeatureBitset(Col const& fs)
208  {
209  for (auto const& f : fs)
211  }
212 
213  auto
214  operator[](uint256 const& f)
215  {
217  }
218 
219  auto
220  operator[](uint256 const& f) const
221  {
223  }
224 
226  set(uint256 const& f, bool value = true)
227  {
228  base::set(featureToBitsetIndex(f), value);
229  return *this;
230  }
231 
233  reset(uint256 const& f)
234  {
236  return *this;
237  }
238 
240  flip(uint256 const& f)
241  {
243  return *this;
244  }
245 
248  {
249  base::operator&=(rhs);
250  return *this;
251  }
252 
255  {
256  base::operator|=(rhs);
257  return *this;
258  }
259 
261  operator~() const
262  {
263  return FeatureBitset{base::operator~()};
264  }
265 
266  friend FeatureBitset
267  operator&(FeatureBitset const& lhs, FeatureBitset const& rhs)
268  {
269  return FeatureBitset{
270  static_cast<base const&>(lhs) & static_cast<base const&>(rhs)};
271  }
272 
273  friend FeatureBitset
274  operator&(FeatureBitset const& lhs, uint256 const& rhs)
275  {
276  return lhs & FeatureBitset{rhs};
277  }
278 
279  friend FeatureBitset
280  operator&(uint256 const& lhs, FeatureBitset const& rhs)
281  {
282  return FeatureBitset{lhs} & rhs;
283  }
284 
285  friend FeatureBitset
286  operator|(FeatureBitset const& lhs, FeatureBitset const& rhs)
287  {
288  return FeatureBitset{
289  static_cast<base const&>(lhs) | static_cast<base const&>(rhs)};
290  }
291 
292  friend FeatureBitset
293  operator|(FeatureBitset const& lhs, uint256 const& rhs)
294  {
295  return lhs | FeatureBitset{rhs};
296  }
297 
298  friend FeatureBitset
299  operator|(uint256 const& lhs, FeatureBitset const& rhs)
300  {
301  return FeatureBitset{lhs} | rhs;
302  }
303 
304  friend FeatureBitset
305  operator^(FeatureBitset const& lhs, FeatureBitset const& rhs)
306  {
307  return FeatureBitset{
308  static_cast<base const&>(lhs) ^ static_cast<base const&>(rhs)};
309  }
310 
311  friend FeatureBitset
312  operator^(FeatureBitset const& lhs, uint256 const& rhs)
313  {
314  return lhs ^ FeatureBitset { rhs };
315  }
316 
317  friend FeatureBitset
318  operator^(uint256 const& lhs, FeatureBitset const& rhs)
319  {
320  return FeatureBitset{lhs} ^ rhs;
321  }
322 
323  // set difference
324  friend FeatureBitset
325  operator-(FeatureBitset const& lhs, FeatureBitset const& rhs)
326  {
327  return lhs & ~rhs;
328  }
329 
330  friend FeatureBitset
331  operator-(FeatureBitset const& lhs, uint256 const& rhs)
332  {
333  return lhs - FeatureBitset{rhs};
334  }
335 
336  friend FeatureBitset
337  operator-(uint256 const& lhs, FeatureBitset const& rhs)
338  {
339  return FeatureBitset{lhs} - rhs;
340  }
341 };
342 
343 template <class F>
344 void
346 {
347  for (size_t i = 0; i < bs.size(); ++i)
348  if (bs[i])
349  f(bitsetIndexToFeature(i));
350 }
351 
352 extern uint256 const featureOwnerPaysFee;
353 extern uint256 const featureFlow;
355 extern uint256 const featureFlowCross;
357 extern uint256 const fix1513;
358 extern uint256 const featureDepositAuth;
359 extern uint256 const featureChecks;
360 extern uint256 const fix1571;
361 extern uint256 const fix1543;
362 extern uint256 const fix1623;
363 extern uint256 const featureDepositPreauth;
364 extern uint256 const fix1515;
365 extern uint256 const fix1578;
366 extern uint256 const featureMultiSignReserve;
367 extern uint256 const fixTakerDryOfferRemoval;
368 extern uint256 const fixMasterKeyAsRegularKey;
369 extern uint256 const fixCheckThreading;
371 extern uint256 const featureDeletableAccounts;
372 extern uint256 const fixQualityUpperBound;
374 extern uint256 const fix1781;
376 extern uint256 const fixAmendmentMajorityCalc;
377 extern uint256 const featureNegativeUNL;
378 extern uint256 const featureTicketBatch;
379 extern uint256 const featureFlowSortStrands;
380 extern uint256 const fixSTAmountCanonicalize;
383 
384 } // namespace ripple
385 
386 #endif
ripple::FeatureBitset::operator|=
FeatureBitset & operator|=(FeatureBitset const &rhs)
Definition: Feature.h:254
bitset
ripple::fixQualityUpperBound
const uint256 fixQualityUpperBound
Definition: Feature.cpp:187
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:179
ripple::featureDepositPreauth
const uint256 featureDepositPreauth
Definition: Feature.cpp:178
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:201
ripple::fixSTAmountCanonicalize
const uint256 fixSTAmountCanonicalize
Definition: Feature.cpp:195
ripple::featureDepositAuth
const uint256 featureDepositAuth
Definition: Feature.cpp:173
ripple::detail::FeatureCollections::featureToIndex
boost::container::flat_map< uint256, std::size_t > featureToIndex
Definition: Feature.h:124
ripple::fix1781
const uint256 fix1781
Definition: Feature.cpp:189
ripple::featureMultiSignReserve
const uint256 featureMultiSignReserve
Definition: Feature.cpp:181
ripple::FeatureBitset::flip
FeatureBitset & flip(uint256 const &f)
Definition: Feature.h:240
ripple::detail::FeatureCollections::FeatureCollections
FeatureCollections()
Definition: Feature.cpp:32
ripple::FeatureBitset::FeatureBitset
FeatureBitset(base const &b)
Definition: Feature.h:196
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:318
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:337
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:526
ripple::featureDeletableAccounts
const uint256 featureDeletableAccounts
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:305
ripple::FeatureBitset::operator&
friend FeatureBitset operator&(uint256 const &lhs, FeatureBitset const &rhs)
Definition: Feature.h:280
ripple::base_uint< 256 >
ripple::featureRequireFullyCanonicalSig
const uint256 featureRequireFullyCanonicalSig
Definition: Feature.cpp:188
ripple::foreachFeature
void foreachFeature(FeatureBitset bs, F &&f)
Definition: Feature.h:345
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:274
ripple::detail::FeatureCollections::features
std::vector< uint256 > features
Definition: Feature.h:123
ripple::featureCompareTakerFlowCross
const uint256 featureCompareTakerFlowCross
Definition: Feature.cpp:169
ripple::fix1513
const uint256 fix1513
Definition: Feature.cpp:172
ripple::fixCheckThreading
const uint256 fixCheckThreading
Definition: Feature.cpp:184
ripple::fixAmendmentMajorityCalc
const uint256 fixAmendmentMajorityCalc
Definition: Feature.cpp:191
ripple::FeatureBitset::operator~
FeatureBitset operator~() const
Definition: Feature.h:261
ripple::FeatureBitset::operator|
friend FeatureBitset operator|(FeatureBitset const &lhs, uint256 const &rhs)
Definition: Feature.h:293
ripple::FeatureBitset::operator[]
auto operator[](uint256 const &f) const
Definition: Feature.h:220
ripple::fixTakerDryOfferRemoval
const uint256 fixTakerDryOfferRemoval
Definition: Feature.cpp:182
std::bitset< detail::FeatureCollections::numFeatures()>::to_string
T to_string(T... args)
ripple::fix1623
const uint256 fix1623
Definition: Feature.cpp:177
array
ripple::FeatureBitset::initFromFeatures
void initFromFeatures(uint256 const &f, Fs &&... fs)
Definition: Feature.h:168
ripple::featureToBitsetIndex
size_t featureToBitsetIndex(uint256 const &f)
Definition: Feature.cpp:153
ripple::fixPayChanRecipientOwnerDir
const uint256 fixPayChanRecipientOwnerDir
Definition: Feature.cpp:185
ripple::fixMasterKeyAsRegularKey
const uint256 fixMasterKeyAsRegularKey
Definition: Feature.cpp:183
ripple::featureChecks
const uint256 featureChecks
Definition: Feature.cpp:174
ripple::fixRmSmallIncreasedQOffers
const uint256 fixRmSmallIncreasedQOffers
Definition: Feature.cpp:196
ripple::featureFlowSortStrands
const uint256 featureFlowSortStrands
Definition: Feature.cpp:194
ripple::featureHardenedValidations
const uint256 featureHardenedValidations
Definition: Feature.cpp:190
ripple::fix1543
const uint256 fix1543
Definition: Feature.cpp:176
ripple::FeatureBitset::FeatureBitset
FeatureBitset(Col const &fs)
Definition: Feature.h:207
ripple::fix1578
const uint256 fix1578
Definition: Feature.cpp:180
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:171
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:168
ripple::featureNegativeUNL
const uint256 featureNegativeUNL
Definition: Feature.cpp:192
ripple::FeatureBitset::reset
FeatureBitset & reset(uint256 const &f)
Definition: Feature.h:233
ripple::bitsetIndexToFeature
uint256 bitsetIndexToFeature(size_t i)
Definition: Feature.cpp:159
ripple::FeatureBitset::set
FeatureBitset & set(uint256 const &f, bool value=true)
Definition: Feature.h:226
ripple::FeatureBitset
Definition: Feature.h:161
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:267
ripple::featureTicketBatch
const uint256 featureTicketBatch
Definition: Feature.cpp:193
optional
ripple::FeatureBitset::operator-
friend FeatureBitset operator-(FeatureBitset const &lhs, uint256 const &rhs)
Definition: Feature.h:331
std::size_t
std::bitset< detail::FeatureCollections::numFeatures()>::flip
T flip(T... args)
ripple::FeatureBitset::operator&=
FeatureBitset & operator&=(FeatureBitset const &rhs)
Definition: Feature.h:247
ripple::featureOwnerPaysFee
const uint256 featureOwnerPaysFee
Definition: Feature.cpp:167
ripple::featureCheckCashMakesTrustLine
const uint256 featureCheckCashMakesTrustLine
Definition: Feature.cpp:197
ripple::fix1571
const uint256 fix1571
Definition: Feature.cpp:175
ripple::getRegisteredFeature
std::optional< uint256 > getRegisteredFeature(std::string const &name)
Definition: Feature.cpp:147
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:286
ripple::featureFlowCross
const uint256 featureFlowCross
Definition: Feature.cpp:170
ripple::detail::FeatureCollections::numFeatures
static constexpr std::size_t numFeatures()
Definition: Feature.h:131
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:325
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:312
ripple::FeatureBitset::operator[]
auto operator[](uint256 const &f)
Definition: Feature.h:214
ripple::detail::FeatureCollections::nameToFeature
boost::container::flat_map< std::string, uint256 > nameToFeature
Definition: Feature.h:125
string