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