rippled
Feature.cpp
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 #include <ripple/basics/contract.h>
21 #include <ripple/protocol/Feature.h>
22 #include <ripple/protocol/digest.h>
23 
24 #include <cstring>
25 
26 namespace ripple {
27 
28 //------------------------------------------------------------------------------
29 
30 constexpr char const* const detail::FeatureCollections::featureNames[];
31 
33 {
34  features.reserve(numFeatures());
35  featureToIndex.reserve(numFeatures());
36  nameToFeature.reserve(numFeatures());
37 
38  for (std::size_t i = 0; i < numFeatures(); ++i)
39  {
40  auto const name = featureNames[i];
42  h(name, std::strlen(name));
43  auto const f = static_cast<uint256>(h);
44 
45  features.push_back(f);
46  featureToIndex[f] = i;
47  nameToFeature[name] = f;
48  }
49 }
50 
53 {
54  auto const i = nameToFeature.find(name);
55  if (i == nameToFeature.end())
56  return std::nullopt;
57  return i->second;
58 }
59 
60 size_t
62 {
63  auto const i = featureToIndex.find(f);
64  if (i == featureToIndex.end())
65  LogicError("Invalid Feature ID");
66  return i->second;
67 }
68 
69 uint256 const&
71 {
72  if (i >= features.size())
73  LogicError("Invalid FeatureBitset index");
74  return features[i];
75 }
76 
78 
82 {
83  // Commented out amendments will be supported in a future release (and
84  // uncommented at that time).
85  //
86  // There are also unconditionally supported amendments in the list.
87  // Those are amendments that were enabled some time ago and the
88  // amendment conditional code has been removed.
89  //
90  // ** WARNING **
91  // Unconditionally supported amendments need to remain in the list.
92  // Removing them will cause servers to become amendment blocked.
93  static std::vector<std::string> const supported{
94  "MultiSign", // Unconditionally supported.
95  "TrustSetAuth", // Unconditionally supported.
96  "FeeEscalation", // Unconditionally supported.
97  // "OwnerPaysFee",
98  "PayChan",
99  "Flow",
100  "CryptoConditions",
101  "TickSize",
102  "fix1368",
103  "Escrow",
104  "CryptoConditionsSuite",
105  "fix1373",
106  "EnforceInvariants",
107  "FlowCross",
108  "SortedDirectories",
109  "fix1201",
110  "fix1512",
111  "fix1513",
112  "fix1523",
113  "fix1528",
114  "DepositAuth",
115  "Checks",
116  "fix1571",
117  "fix1543",
118  "fix1623",
119  "DepositPreauth",
120  // Use liquidity from strands that consume max offers, but mark as dry
121  "fix1515",
122  "fix1578",
123  "MultiSignReserve",
124  "fixTakerDryOfferRemoval",
125  "fixMasterKeyAsRegularKey",
126  "fixCheckThreading",
127  "fixPayChanRecipientOwnerDir",
128  "DeletableAccounts",
129  "fixQualityUpperBound",
130  "RequireFullyCanonicalSig",
131  "fix1781",
132  "HardenedValidations",
133  "fixAmendmentMajorityCalc",
134  //"NegativeUNL", // Commented out to prevent automatic enablement
135  "TicketBatch",
136  "FlowSortStrands",
137  "fixSTAmountCanonicalize",
138  "fixRmSmallIncreasedQOffers",
139  "CheckCashMakesTrustLine",
140  };
141  return supported;
142 }
143 
144 //------------------------------------------------------------------------------
145 
148 {
150 }
151 
152 size_t
154 {
156 }
157 
158 uint256
160 {
162 }
163 
164 // clang-format off
165 
166 uint256 const
182  fixTakerDryOfferRemoval = *getRegisteredFeature("fixTakerDryOfferRemoval"),
183  fixMasterKeyAsRegularKey = *getRegisteredFeature("fixMasterKeyAsRegularKey"),
184  fixCheckThreading = *getRegisteredFeature("fixCheckThreading"),
185  fixPayChanRecipientOwnerDir = *getRegisteredFeature("fixPayChanRecipientOwnerDir"),
187  fixQualityUpperBound = *getRegisteredFeature("fixQualityUpperBound"),
191  fixAmendmentMajorityCalc = *getRegisteredFeature("fixAmendmentMajorityCalc"),
195  fixSTAmountCanonicalize = *getRegisteredFeature("fixSTAmountCanonicalize"),
196  fixRmSmallIncreasedQOffers = *getRegisteredFeature("fixRmSmallIncreasedQOffers"),
198 
199 // The following amendments have been active for at least two years. Their
200 // pre-amendment code has been removed and the identifiers are deprecated.
201 [[deprecated("The referenced amendment has been retired"), maybe_unused]]
202 uint256 const
215 
216 // clang-format on
217 
218 } // namespace ripple
ripple::fixQualityUpperBound
const uint256 fixQualityUpperBound
Definition: Feature.cpp:187
std::strlen
T strlen(T... args)
std::string
STL class.
cstring
ripple::detail::basic_sha512_half_hasher
Returns the SHA512-Half digest of a message.
Definition: digest.h:166
ripple::retiredFix1528
const uint256 retiredFix1528
Definition: Feature.cpp:214
ripple::retiredSortedDirectories
const uint256 retiredSortedDirectories
Definition: Feature.cpp:210
ripple::fix1515
const uint256 fix1515
Definition: Feature.cpp:179
ripple::featureDepositPreauth
const uint256 featureDepositPreauth
Definition: Feature.cpp:178
std::vector< std::string >
ripple::fixSTAmountCanonicalize
const uint256 fixSTAmountCanonicalize
Definition: Feature.cpp:195
ripple::featureDepositAuth
const uint256 featureDepositAuth
Definition: Feature.cpp:173
ripple::detail::FeatureCollections::featureToIndex
boost::container::flat_map< uint256, std::size_t > featureToIndex
Definition: Feature.h:124
ripple::fix1781
const uint256 fix1781
Definition: Feature.cpp:189
ripple::featureMultiSignReserve
const uint256 featureMultiSignReserve
Definition: Feature.cpp:181
ripple::detail::FeatureCollections::FeatureCollections
FeatureCollections()
Definition: Feature.cpp:32
ripple::retiredPayChan
const uint256 retiredPayChan
Definition: Feature.cpp:203
ripple::retiredFix1368
const uint256 retiredFix1368
Definition: Feature.cpp:206
ripple::detail::FeatureCollections
Definition: Feature.h:70
ripple::retiredEnforceInvariants
const uint256 retiredEnforceInvariants
Definition: Feature.cpp:209
ripple::uint256
base_uint< 256 > uint256
Definition: base_uint.h:526
ripple::featureDeletableAccounts
const uint256 featureDeletableAccounts
Definition: Feature.cpp:186
ripple::retiredTickSize
const uint256 retiredTickSize
Definition: Feature.cpp:205
ripple::base_uint< 256 >
ripple::featureRequireFullyCanonicalSig
const uint256 featureRequireFullyCanonicalSig
Definition: Feature.cpp:188
ripple::detail::FeatureCollections::bitsetIndexToFeature
uint256 const & bitsetIndexToFeature(size_t i) const
Definition: Feature.cpp:70
ripple::detail::FeatureCollections::features
std::vector< uint256 > features
Definition: Feature.h:123
ripple::featureCompareTakerFlowCross
const uint256 featureCompareTakerFlowCross
Definition: Feature.cpp:169
ripple::retiredEscrow
const uint256 retiredEscrow
Definition: Feature.cpp:207
ripple::fix1513
const uint256 fix1513
Definition: Feature.cpp:172
ripple::fixCheckThreading
const uint256 fixCheckThreading
Definition: Feature.cpp:184
ripple::retiredFix1373
const uint256 retiredFix1373
Definition: Feature.cpp:208
ripple::fixAmendmentMajorityCalc
const uint256 fixAmendmentMajorityCalc
Definition: Feature.cpp:191
ripple::fixTakerDryOfferRemoval
const uint256 fixTakerDryOfferRemoval
Definition: Feature.cpp:182
ripple::featureCollections
static const detail::FeatureCollections featureCollections
Definition: Feature.cpp:77
ripple::fix1623
const uint256 fix1623
Definition: Feature.cpp:177
ripple::featureToBitsetIndex
size_t featureToBitsetIndex(uint256 const &f)
Definition: Feature.cpp:153
ripple::fixPayChanRecipientOwnerDir
const uint256 fixPayChanRecipientOwnerDir
Definition: Feature.cpp:185
ripple::fixMasterKeyAsRegularKey
const uint256 fixMasterKeyAsRegularKey
Definition: Feature.cpp:183
ripple::retiredCryptoConditions
const uint256 retiredCryptoConditions
Definition: Feature.cpp:204
ripple::featureChecks
const uint256 featureChecks
Definition: Feature.cpp:174
ripple::fixRmSmallIncreasedQOffers
const uint256 fixRmSmallIncreasedQOffers
Definition: Feature.cpp:196
ripple::featureFlowSortStrands
const uint256 featureFlowSortStrands
Definition: Feature.cpp:194
ripple::featureHardenedValidations
const uint256 featureHardenedValidations
Definition: Feature.cpp:190
ripple::fix1543
const uint256 fix1543
Definition: Feature.cpp:176
ripple::fix1578
const uint256 fix1578
Definition: Feature.cpp:180
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:171
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::detail::FeatureCollections::getRegisteredFeature
std::optional< uint256 > getRegisteredFeature(std::string const &name) const
Definition: Feature.cpp:52
ripple::featureFlow
const uint256 featureFlow
Definition: Feature.cpp:168
ripple::LogicError
void LogicError(std::string const &how) noexcept
Called when faulty logic causes a broken invariant.
Definition: contract.cpp:48
ripple::featureNegativeUNL
const uint256 featureNegativeUNL
Definition: Feature.cpp:192
ripple::bitsetIndexToFeature
uint256 bitsetIndexToFeature(size_t i)
Definition: Feature.cpp:159
ripple::featureTicketBatch
const uint256 featureTicketBatch
Definition: Feature.cpp:193
ripple::retiredFix1523
const uint256 retiredFix1523
Definition: Feature.cpp:213
ripple::retiredFix1201
const uint256 retiredFix1201
Definition: Feature.cpp:211
std::optional
std::size_t
ripple::featureOwnerPaysFee
const uint256 featureOwnerPaysFee
Definition: Feature.cpp:167
ripple::featureCheckCashMakesTrustLine
const uint256 featureCheckCashMakesTrustLine
Definition: Feature.cpp:197
ripple::retiredFix1512
const uint256 retiredFix1512
Definition: Feature.cpp:212
ripple::fix1571
const uint256 fix1571
Definition: Feature.cpp:175
ripple::getRegisteredFeature
std::optional< uint256 > getRegisteredFeature(std::string const &name)
Definition: Feature.cpp:147
ripple::featureFlowCross
const uint256 featureFlowCross
Definition: Feature.cpp:170
ripple::detail::FeatureCollections::numFeatures
static constexpr std::size_t numFeatures()
Definition: Feature.h:131
ripple::detail::FeatureCollections::nameToFeature
boost::container::flat_map< std::string, uint256 > nameToFeature
Definition: Feature.h:125