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