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