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 
67 namespace ripple {
68 
69 enum class VoteBehavior : int { Obsolete = -1, DefaultNo = 0, DefaultYes };
70 
71 namespace detail {
72 
73 // This value SHOULD be equal to the number of amendments registered in
74 // Feature.cpp. Because it's only used to reserve storage, and determine how
75 // large to make the FeatureBitset, it MAY be larger. It MUST NOT be less than
76 // the actual number of amendments. A LogicError on startup will verify this.
77 static constexpr std::size_t numFeatures = 58;
78 
84 
91 
98 
99 } // namespace detail
100 
102 getRegisteredFeature(std::string const& name);
103 
104 size_t
105 featureToBitsetIndex(uint256 const& f);
106 
107 uint256
108 bitsetIndexToFeature(size_t i);
109 
111 featureToName(uint256 const& f);
112 
113 class FeatureBitset : private std::bitset<detail::numFeatures>
114 {
116 
117  template <class... Fs>
118  void
119  initFromFeatures(uint256 const& f, Fs&&... fs)
120  {
121  set(f);
122  if constexpr (sizeof...(fs) > 0)
123  initFromFeatures(std::forward<Fs>(fs)...);
124  }
125 
126 public:
127  using base::bitset;
128  using base::operator==;
129 
130  using base::all;
131  using base::any;
132  using base::count;
133  using base::flip;
134  using base::none;
135  using base::reset;
136  using base::set;
137  using base::size;
138  using base::test;
139  using base::operator[];
140  using base::to_string;
141  using base::to_ullong;
142  using base::to_ulong;
143 
144  FeatureBitset() = default;
145 
146  explicit FeatureBitset(base const& b) : base(b)
147  {
148  assert(b.count() == count());
149  }
150 
151  template <class... Fs>
152  explicit FeatureBitset(uint256 const& f, Fs&&... fs)
153  {
154  initFromFeatures(f, std::forward<Fs>(fs)...);
155  assert(count() == (sizeof...(fs) + 1));
156  }
157 
158  template <class Col>
159  explicit FeatureBitset(Col const& fs)
160  {
161  for (auto const& f : fs)
163  assert(fs.size() == count());
164  }
165 
166  auto
167  operator[](uint256 const& f)
168  {
170  }
171 
172  auto
173  operator[](uint256 const& f) const
174  {
176  }
177 
179  set(uint256 const& f, bool value = true)
180  {
181  base::set(featureToBitsetIndex(f), value);
182  return *this;
183  }
184 
186  reset(uint256 const& f)
187  {
189  return *this;
190  }
191 
193  flip(uint256 const& f)
194  {
196  return *this;
197  }
198 
201  {
202  base::operator&=(rhs);
203  return *this;
204  }
205 
208  {
209  base::operator|=(rhs);
210  return *this;
211  }
212 
214  operator~() const
215  {
216  return FeatureBitset{base::operator~()};
217  }
218 
219  friend FeatureBitset
220  operator&(FeatureBitset const& lhs, FeatureBitset const& rhs)
221  {
222  return FeatureBitset{
223  static_cast<base const&>(lhs) & static_cast<base const&>(rhs)};
224  }
225 
226  friend FeatureBitset
227  operator&(FeatureBitset const& lhs, uint256 const& rhs)
228  {
229  return lhs & FeatureBitset{rhs};
230  }
231 
232  friend FeatureBitset
233  operator&(uint256 const& lhs, FeatureBitset const& rhs)
234  {
235  return FeatureBitset{lhs} & rhs;
236  }
237 
238  friend FeatureBitset
239  operator|(FeatureBitset const& lhs, FeatureBitset const& rhs)
240  {
241  return FeatureBitset{
242  static_cast<base const&>(lhs) | static_cast<base const&>(rhs)};
243  }
244 
245  friend FeatureBitset
246  operator|(FeatureBitset const& lhs, uint256 const& rhs)
247  {
248  return lhs | FeatureBitset{rhs};
249  }
250 
251  friend FeatureBitset
252  operator|(uint256 const& lhs, FeatureBitset const& rhs)
253  {
254  return FeatureBitset{lhs} | rhs;
255  }
256 
257  friend FeatureBitset
258  operator^(FeatureBitset const& lhs, FeatureBitset const& rhs)
259  {
260  return FeatureBitset{
261  static_cast<base const&>(lhs) ^ static_cast<base const&>(rhs)};
262  }
263 
264  friend FeatureBitset
265  operator^(FeatureBitset const& lhs, uint256 const& rhs)
266  {
267  return lhs ^ FeatureBitset { rhs };
268  }
269 
270  friend FeatureBitset
271  operator^(uint256 const& lhs, FeatureBitset const& rhs)
272  {
273  return FeatureBitset{lhs} ^ rhs;
274  }
275 
276  // set difference
277  friend FeatureBitset
278  operator-(FeatureBitset const& lhs, FeatureBitset const& rhs)
279  {
280  return lhs & ~rhs;
281  }
282 
283  friend FeatureBitset
284  operator-(FeatureBitset const& lhs, uint256 const& rhs)
285  {
286  return lhs - FeatureBitset{rhs};
287  }
288 
289  friend FeatureBitset
290  operator-(uint256 const& lhs, FeatureBitset const& rhs)
291  {
292  return FeatureBitset{lhs} - rhs;
293  }
294 };
295 
296 template <class F>
297 void
299 {
300  for (size_t i = 0; i < bs.size(); ++i)
301  if (bs[i])
302  f(bitsetIndexToFeature(i));
303 }
304 
305 extern uint256 const featureOwnerPaysFee;
306 extern uint256 const featureFlow;
307 extern uint256 const featureFlowCross;
309 extern uint256 const fix1513;
310 extern uint256 const featureDepositAuth;
311 extern uint256 const featureChecks;
312 extern uint256 const fix1571;
313 extern uint256 const fix1543;
314 extern uint256 const fix1623;
315 extern uint256 const featureDepositPreauth;
316 extern uint256 const fix1515;
317 extern uint256 const fix1578;
318 extern uint256 const featureMultiSignReserve;
319 extern uint256 const fixTakerDryOfferRemoval;
320 extern uint256 const fixMasterKeyAsRegularKey;
321 extern uint256 const fixCheckThreading;
323 extern uint256 const featureDeletableAccounts;
324 extern uint256 const fixQualityUpperBound;
326 extern uint256 const fix1781;
328 extern uint256 const fixAmendmentMajorityCalc;
329 extern uint256 const featureNegativeUNL;
330 extern uint256 const featureTicketBatch;
331 extern uint256 const featureFlowSortStrands;
332 extern uint256 const fixSTAmountCanonicalize;
337 extern uint256 const fixNFTokenDirV1;
338 extern uint256 const fixNFTokenNegOffer;
340 extern uint256 const fixTrustLinesToSelf;
343 extern uint256 const featureDisallowIncoming;
344 extern uint256 const featureXRPFees;
345 extern uint256 const fixUniversalNumber;
346 extern uint256 const fixNonFungibleTokensV1_2;
347 extern uint256 const fixNFTokenRemint;
348 
349 } // namespace ripple
350 
351 #endif
ripple::FeatureBitset::operator|=
FeatureBitset & operator|=(FeatureBitset const &rhs)
Definition: Feature.h:207
ripple::fixRemoveNFTokenAutoTrustLine
const uint256 fixRemoveNFTokenAutoTrustLine
bitset
ripple::fixQualityUpperBound
const uint256 fixQualityUpperBound
ripple::fixNFTokenNegOffer
const uint256 fixNFTokenNegOffer
ripple::featureXRPFees
const uint256 featureXRPFees
std::string
STL class.
std::bitset< detail::numFeatures >::all
T all(T... args)
ripple::FeatureBitset::FeatureBitset
FeatureBitset()=default
ripple::fix1515
const uint256 fix1515
ripple::detail::numFeatures
static constexpr std::size_t numFeatures
Definition: Feature.h:77
ripple::featureDepositPreauth
const uint256 featureDepositPreauth
std::bitset< detail::numFeatures >::size
T size(T... args)
ripple::FeatureBitset::FeatureBitset
FeatureBitset(uint256 const &f, Fs &&... fs)
Definition: Feature.h:152
ripple::fixSTAmountCanonicalize
const uint256 fixSTAmountCanonicalize
ripple::VoteBehavior::DefaultNo
@ DefaultNo
ripple::featureDepositAuth
const uint256 featureDepositAuth
ripple::fix1781
const uint256 fix1781
ripple::featureMultiSignReserve
const uint256 featureMultiSignReserve
ripple::FeatureBitset::flip
FeatureBitset & flip(uint256 const &f)
Definition: Feature.h:193
ripple::FeatureBitset::FeatureBitset
FeatureBitset(base const &b)
Definition: Feature.h:146
std::bitset< detail::numFeatures >::to_ullong
T to_ullong(T... args)
ripple::FeatureBitset::operator^
friend FeatureBitset operator^(uint256 const &lhs, FeatureBitset const &rhs)
Definition: Feature.h:271
std::bitset< detail::numFeatures >::reset
T reset(T... args)
ripple::FeatureBitset::operator-
friend FeatureBitset operator-(uint256 const &lhs, FeatureBitset const &rhs)
Definition: Feature.h:290
ripple::VoteBehavior::Obsolete
@ Obsolete
ripple::fixNFTokenRemint
const uint256 fixNFTokenRemint
ripple::uint256
base_uint< 256 > uint256
Definition: base_uint.h:550
ripple::FeatureBitset::operator|
friend FeatureBitset operator|(uint256 const &lhs, FeatureBitset const &rhs)
Definition: Feature.h:252
ripple::featureDeletableAccounts
const uint256 featureDeletableAccounts
std::bitset< detail::numFeatures >::to_ulong
T to_ulong(T... args)
ripple::FeatureBitset::operator^
friend FeatureBitset operator^(FeatureBitset const &lhs, FeatureBitset const &rhs)
Definition: Feature.h:258
ripple::detail::numUpVotedAmendments
std::size_t numUpVotedAmendments()
Amendments that this server will vote for by default.
Definition: Feature.cpp:334
ripple::FeatureBitset::operator&
friend FeatureBitset operator&(uint256 const &lhs, FeatureBitset const &rhs)
Definition: Feature.h:233
ripple::base_uint< 256 >
ripple::featureRequireFullyCanonicalSig
const uint256 featureRequireFullyCanonicalSig
ripple::detail::numDownVotedAmendments
std::size_t numDownVotedAmendments()
Amendments that this server won't vote for by default.
Definition: Feature.cpp:327
ripple::foreachFeature
void foreachFeature(FeatureBitset bs, F &&f)
Definition: Feature.h:298
ripple::FeatureBitset::operator&
friend FeatureBitset operator&(FeatureBitset const &lhs, uint256 const &rhs)
Definition: Feature.h:227
ripple::featureExpandedSignerList
const uint256 featureExpandedSignerList
ripple::featureDisallowIncoming
const uint256 featureDisallowIncoming
ripple::VoteBehavior
VoteBehavior
Definition: Feature.h:69
ripple::fix1513
const uint256 fix1513
ripple::fixCheckThreading
const uint256 fixCheckThreading
ripple::fixAmendmentMajorityCalc
const uint256 fixAmendmentMajorityCalc
ripple::FeatureBitset::operator~
FeatureBitset operator~() const
Definition: Feature.h:214
ripple::FeatureBitset::operator|
friend FeatureBitset operator|(FeatureBitset const &lhs, uint256 const &rhs)
Definition: Feature.h:246
ripple::FeatureBitset::operator[]
auto operator[](uint256 const &f) const
Definition: Feature.h:173
ripple::fixTakerDryOfferRemoval
const uint256 fixTakerDryOfferRemoval
std::bitset< detail::numFeatures >::to_string
T to_string(T... args)
ripple::fix1623
const uint256 fix1623
array
ripple::FeatureBitset::initFromFeatures
void initFromFeatures(uint256 const &f, Fs &&... fs)
Definition: Feature.h:119
ripple::featureToBitsetIndex
size_t featureToBitsetIndex(uint256 const &f)
Definition: Feature.cpp:369
ripple::fixPayChanRecipientOwnerDir
const uint256 fixPayChanRecipientOwnerDir
ripple::fixMasterKeyAsRegularKey
const uint256 fixMasterKeyAsRegularKey
ripple::featureChecks
const uint256 featureChecks
std::map
STL class.
ripple::fixNFTokenDirV1
const uint256 fixNFTokenDirV1
ripple::fixRmSmallIncreasedQOffers
const uint256 fixRmSmallIncreasedQOffers
ripple::featureFlowSortStrands
const uint256 featureFlowSortStrands
ripple::fixTrustLinesToSelf
const uint256 fixTrustLinesToSelf
ripple::featureHardenedValidations
const uint256 featureHardenedValidations
ripple::fix1543
const uint256 fix1543
ripple::FeatureBitset::FeatureBitset
FeatureBitset(Col const &fs)
Definition: Feature.h:159
ripple::fix1578
const uint256 fix1578
ripple
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: RCLCensorshipDetector.h:29
ripple::featureNonFungibleTokensV1
const uint256 featureNonFungibleTokensV1
ripple::featureCryptoConditionsSuite
const uint256 featureCryptoConditionsSuite
ripple::featureImmediateOfferKilled
const uint256 featureImmediateOfferKilled
ripple::featureFlow
const uint256 featureFlow
ripple::featureNegativeUNL
const uint256 featureNegativeUNL
ripple::featureNonFungibleTokensV1_1
const uint256 featureNonFungibleTokensV1_1
ripple::fixUniversalNumber
const uint256 fixUniversalNumber
ripple::FeatureBitset::reset
FeatureBitset & reset(uint256 const &f)
Definition: Feature.h:186
ripple::bitsetIndexToFeature
uint256 bitsetIndexToFeature(size_t i)
Definition: Feature.cpp:375
ripple::FeatureBitset::set
FeatureBitset & set(uint256 const &f, bool value=true)
Definition: Feature.h:179
ripple::FeatureBitset
Definition: Feature.h:113
std::bitset< detail::numFeatures >::count
T count(T... args)
std::bitset< detail::numFeatures >::operator&=
T operator&=(T... args)
ripple::FeatureBitset::operator&
friend FeatureBitset operator&(FeatureBitset const &lhs, FeatureBitset const &rhs)
Definition: Feature.h:220
ripple::featureTicketBatch
const uint256 featureTicketBatch
optional
ripple::FeatureBitset::operator-
friend FeatureBitset operator-(FeatureBitset const &lhs, uint256 const &rhs)
Definition: Feature.h:284
std::size_t
std::bitset< detail::numFeatures >::flip
T flip(T... args)
ripple::FeatureBitset::operator&=
FeatureBitset & operator&=(FeatureBitset const &rhs)
Definition: Feature.h:200
ripple::featureOwnerPaysFee
const uint256 featureOwnerPaysFee
ripple::fixNonFungibleTokensV1_2
const uint256 fixNonFungibleTokensV1_2
ripple::featureCheckCashMakesTrustLine
const uint256 featureCheckCashMakesTrustLine
ripple::fix1571
const uint256 fix1571
ripple::getRegisteredFeature
std::optional< uint256 > getRegisteredFeature(std::string const &name)
Definition: Feature.cpp:342
std::bitset< detail::numFeatures >::test
T test(T... args)
ripple::FeatureBitset::operator|
friend FeatureBitset operator|(FeatureBitset const &lhs, FeatureBitset const &rhs)
Definition: Feature.h:239
ripple::featureFlowCross
const uint256 featureFlowCross
std::bitset< detail::numFeatures >::set
T set(T... args)
ripple::detail::supportedAmendments
std::map< std::string, VoteBehavior > const & supportedAmendments()
Amendments that this server supports and the default voting behavior.
Definition: Feature.cpp:320
ripple::FeatureBitset::operator-
friend FeatureBitset operator-(FeatureBitset const &lhs, FeatureBitset const &rhs)
Definition: Feature.h:278
std::bitset< detail::numFeatures >::operator[]
T operator[](T... args)
ripple::FeatureBitset::operator^
friend FeatureBitset operator^(FeatureBitset const &lhs, uint256 const &rhs)
Definition: Feature.h:265
ripple::FeatureBitset::operator[]
auto operator[](uint256 const &f)
Definition: Feature.h:167
ripple::featureToName
std::string featureToName(uint256 const &f)
Definition: Feature.cpp:381
string
ripple::VoteBehavior::DefaultYes
@ DefaultYes