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