Skip to content

Commit

Permalink
[EXPERIMENT] XRPFee specialized from from TaggedFee:
Browse files Browse the repository at this point in the history
* Not easily / transparently compatible with XRPAmount
  • Loading branch information
ximinez committed Sep 19, 2019
1 parent ba2f2da commit ce568a5
Show file tree
Hide file tree
Showing 79 changed files with 739 additions and 645 deletions.
10 changes: 5 additions & 5 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1708,7 +1708,6 @@ else ()
src/ripple/basics/impl/contract.cpp
src/ripple/basics/impl/CountedObject.cpp
src/ripple/basics/impl/FileUtilities.cpp
src/ripple/basics/impl/IOUAmount.cpp
src/ripple/basics/impl/Log.cpp
src/ripple/basics/impl/strHex.cpp
src/ripple/basics/impl/StringUtilities.cpp
Expand All @@ -1735,6 +1734,7 @@ else ()
src/ripple/protocol/impl/ErrorCodes.cpp
src/ripple/protocol/impl/Feature.cpp
src/ripple/protocol/impl/HashPrefix.cpp
src/ripple/protocol/impl/IOUAmount.cpp
src/ripple/protocol/impl/Indexes.cpp
src/ripple/protocol/impl/InnerObjectFormats.cpp
src/ripple/protocol/impl/Issue.cpp
Expand Down Expand Up @@ -1807,15 +1807,13 @@ install (
src/ripple/basics/Buffer.h
src/ripple/basics/CountedObject.h
src/ripple/basics/FileUtilities.h
src/ripple/basics/IOUAmount.h
src/ripple/basics/LocalValue.h
src/ripple/basics/Log.h
src/ripple/basics/safe_cast.h
src/ripple/basics/Slice.h
src/ripple/basics/StringUtilities.h
src/ripple/basics/ToString.h
src/ripple/basics/UnorderedContainers.h
src/ripple/basics/XRPAmount.h
src/ripple/basics/algorithm.h
src/ripple/basics/base_uint.h
src/ripple/basics/chrono.h
Expand Down Expand Up @@ -1862,6 +1860,7 @@ install (
src/ripple/protocol/ErrorCodes.h
src/ripple/protocol/Feature.h
src/ripple/protocol/HashPrefix.h
src/ripple/protocol/IOUAmount.h
src/ripple/protocol/Indexes.h
src/ripple/protocol/InnerObjectFormats.h
src/ripple/protocol/Issue.h
Expand Down Expand Up @@ -1898,6 +1897,7 @@ install (
src/ripple/protocol/TxFlags.h
src/ripple/protocol/TxFormats.h
src/ripple/protocol/UintTypes.h
src/ripple/protocol/XRPAmount.h
src/ripple/protocol/digest.h
src/ripple/protocol/jss.h
src/ripple/protocol/tokens.h
Expand Down Expand Up @@ -2417,14 +2417,12 @@ else ()
src/test/basics/Buffer_test.cpp
src/test/basics/DetectCrash_test.cpp
src/test/basics/FileUtilities_test.cpp
src/test/basics/IOUAmount_test.cpp
src/test/basics/KeyCache_test.cpp
src/test/basics/PerfLog_test.cpp
src/test/basics/RangeSet_test.cpp
src/test/basics/Slice_test.cpp
src/test/basics/StringUtilities_test.cpp
src/test/basics/TaggedCache_test.cpp
src/test/basics/XRPAmount_test.cpp
src/test/basics/base64_test.cpp
src/test/basics/base_uint_test.cpp
src/test/basics/contract_test.cpp
Expand Down Expand Up @@ -2580,6 +2578,7 @@ else ()
subdir: protocol
#]===============================]
src/test/protocol/BuildInfo_test.cpp
src/test/protocol/IOUAmount_test.cpp
src/test/protocol/InnerObjectFormats_test.cpp
src/test/protocol/Issue_test.cpp
src/test/protocol/PublicKey_test.cpp
Expand All @@ -2592,6 +2591,7 @@ else ()
src/test/protocol/SecretKey_test.cpp
src/test/protocol/Seed_test.cpp
src/test/protocol/TER_test.cpp
src/test/protocol/XRPAmount_test.cpp
src/test/protocol/digest_test.cpp
src/test/protocol/types_test.cpp
#[===============================[
Expand Down
2 changes: 1 addition & 1 deletion src/ripple/app/ledger/impl/LedgerToJson.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -222,7 +222,7 @@ void fillJsonQueue(Object& json, LedgerFill const& fill)
txJson[jss::fee] = to_string(
tx.consequences->fee);
auto spend = tx.consequences->potentialSpend +
tx.consequences->fee;
XRPAmount{tx.consequences->fee};
txJson[jss::max_spend_drops] = to_string(spend);
auto authChanged = tx.consequences->category ==
TxConsequences::blocker;
Expand Down
8 changes: 4 additions & 4 deletions src/ripple/app/misc/FeeVote.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,16 +40,16 @@ class FeeVote
struct Setup
{
/** The cost of a reference transaction in drops. */
XRPAmount reference_fee{ 10 };
XRPFee64 reference_fee{10};

/** The cost of a reference transaction in fee units. */
static constexpr FeeUnit32 reference_fee_units{ 10 };
static constexpr FeeUnit32 reference_fee_units{10};

/** The account reserve requirement in drops. */
XRPAmount account_reserve{ 20 * DROPS_PER_XRP };
XRPFee32 account_reserve{20 * DROPS_PER_XRP.fee<std::uint32_t>()};

/** The per-owned item reserve requirement in drops. */
XRPAmount owner_reserve{ 5 * DROPS_PER_XRP };
XRPFee32 owner_reserve{5 * DROPS_PER_XRP.fee<std::uint32_t>()};
};

virtual ~FeeVote () = default;
Expand Down
57 changes: 15 additions & 42 deletions src/ripple/app/misc/FeeVoteImpl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,11 @@ namespace ripple {

namespace detail {

template<class T>
class VotableValue
{
private:
using value_type = XRPAmount;
using value_type = T;
value_type const mCurrent; // The current setting
value_type const mTarget; // The setting we want
std::map <value_type, int> mVoteMap;
Expand Down Expand Up @@ -61,8 +62,9 @@ class VotableValue
getVotes() const;
};

template<class T>
auto
VotableValue::getVotes() const
VotableValue<T>::getVotes() const
-> value_type
{
value_type ourVote = mCurrent;
Expand Down Expand Up @@ -157,7 +159,7 @@ FeeVoteImpl::doVoting(
target_.reference_fee);

detail::VotableValue baseReserveVote(
lastClosedLedger->fees().accountReserve(0),
unsafe_cast<XRPFee32>(lastClosedLedger->fees().accountReserve(0)),
target_.account_reserve);

detail::VotableValue incReserveVote (
Expand All @@ -170,15 +172,8 @@ FeeVoteImpl::doVoting(
{
if (val->isFieldPresent (sfBaseFee))
{
auto const vote = val->getFieldU64 (sfBaseFee);
if (isLegalAmount(vote))
baseFeeVote.addVote(XRPAmount{
unsafe_cast<XRPAmount::value_type>(vote)});
else
// Invalid amounts will be treated as if they're
// not provided. Don't throw because this value is
// provided by an external entity.
baseFeeVote.noVote();
baseFeeVote.addVote(XRPFee64{
val->getFieldU64 (sfBaseFee)});
}
else
{
Expand All @@ -187,7 +182,7 @@ FeeVoteImpl::doVoting(

if (val->isFieldPresent (sfReserveBase))
{
baseReserveVote.addVote(XRPAmount{
baseReserveVote.addVote(XRPFee32{
val->getFieldU32(sfReserveBase)});
}
else
Expand All @@ -197,7 +192,7 @@ FeeVoteImpl::doVoting(

if (val->isFieldPresent (sfReserveIncrement))
{
incReserveVote.addVote (XRPAmount{
incReserveVote.addVote (XRPFee32{
val->getFieldU32 (sfReserveIncrement)});
}
else
Expand Down Expand Up @@ -229,21 +224,9 @@ FeeVoteImpl::doVoting(
{
obj[sfAccount] = AccountID();
obj[sfLedgerSequence] = seq;
// These throws are likely to terminate the app if any fire.
// They should not be possible to hit, though, because the voting
// process (FeeVoteImpl) ignores any out of range values.
if(auto const v = baseFee.dropsAs<std::uint64_t>())
obj[sfBaseFee] = *v;
else
Throw<std::runtime_error>("XRPAmount conversion out of range");
if(auto const v = baseReserve.dropsAs<std::uint32_t>())
obj[sfReserveBase] = *v;
else
Throw<std::runtime_error>("XRPAmount conversion out of range");
if(auto const v = incReserve.dropsAs<std::uint32_t>())
obj[sfReserveIncrement] = *v;
else
Throw<std::runtime_error>("XRPAmount conversion out of range");
obj[sfBaseFee] = baseFee.fee();
obj[sfReserveBase] = baseReserve.fee();
obj[sfReserveIncrement] = incReserve.fee();
obj[sfReferenceFeeUnits] = feeUnits.fee();
});

Expand Down Expand Up @@ -271,19 +254,9 @@ FeeVote::Setup
setup_FeeVote (Section const& section)
{
FeeVote::Setup setup;
{
std::uint64_t temp;
if (set(temp, "reference_fee", section) &&
isLegalAmount(temp))
setup.reference_fee = temp;
}
{
std::uint32_t temp;
if (set(temp, "account_reserve", section))
setup.account_reserve = temp;
if (set(temp, "owner_reserve", section))
setup.owner_reserve = temp;
}
set(setup.reference_fee, "reference_fee", section);
set(setup.account_reserve, "account_reserve", section);
set(setup.owner_reserve, "owner_reserve", section);
return setup;
}

Expand Down
2 changes: 1 addition & 1 deletion src/ripple/app/misc/LoadFeeTrack.h
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@ class LoadFeeTrack final
//------------------------------------------------------------------------------

// Scale using load as well as base rate
XRPAmount
XRPFee64
scaleFeeLoad(FeeUnit64 fee, LoadFeeTrack const& feeTrack,
Fees const& fees, bool bUnlimited);

Expand Down
16 changes: 9 additions & 7 deletions src/ripple/app/misc/NetworkOPs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,7 @@ class NetworkOPsImp final
{
ServerFeeSummary() = default;

ServerFeeSummary(XRPAmount fee,
ServerFeeSummary(XRPFee64 fee,
TxQ::Metrics&& escalationMetrics,
LoadFeeTrack const & loadFeeTrack);
bool
Expand All @@ -190,7 +190,7 @@ class NetworkOPsImp final

std::uint32_t loadFactorServer = 256;
std::uint32_t loadBaseServer = 256;
XRPAmount baseFee{ 10 };
XRPFee64 baseFee{10};
boost::optional<TxQ::Metrics> em = boost::none;
};

Expand Down Expand Up @@ -1608,7 +1608,7 @@ void NetworkOPsImp::pubManifest (Manifest const& mo)
}

NetworkOPsImp::ServerFeeSummary::ServerFeeSummary(
XRPAmount fee,
XRPFee64 fee,
TxQ::Metrics&& escalationMetrics,
LoadFeeTrack const & loadFeeTrack)
: loadFactorServer{loadFeeTrack.getLoadFactor()}
Expand Down Expand Up @@ -2309,7 +2309,7 @@ Json::Value NetworkOPsImp::getServerInfo (bool human, bool admin, bool counters)

if (lpClosed)
{
XRPAmount const baseFee = lpClosed->fees().base;
XRPFee64 const baseFee = lpClosed->fees().base;
Json::Value l (Json::objectValue);
l[jss::seq] = Json::UInt (lpClosed->info().seq);
l[jss::hash] = to_string (lpClosed->info().hash);
Expand All @@ -2326,11 +2326,13 @@ Json::Value NetworkOPsImp::getServerInfo (bool human, bool admin, bool counters)
else
{
l[jss::base_fee_xrp] =
baseFee.decimalXRP();
baseFee.decimalFromReference(DROPS_PER_XRP.fee());
l[jss::reserve_base_xrp] =
lpClosed->fees().accountReserve(0).decimalXRP();
lpClosed->fees().accountReserve(0).
decimalFromReference(DROPS_PER_XRP.fee());
l[jss::reserve_inc_xrp] =
lpClosed->fees().increment.decimalXRP();
lpClosed->fees().increment.
decimalFromReference(DROPS_PER_XRP.fee());

auto const nowOffset = app_.timeKeeper().nowOffset();
if (std::abs (nowOffset.count()) >= 60)
Expand Down
26 changes: 19 additions & 7 deletions src/ripple/app/misc/TxQ.h
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ class TxQ
{
public:
/// Fee level for single-signed reference transaction.
static constexpr FeeLevel64 baseLevel{ 256 };
static constexpr FeeLevel64 baseLevel{256};

/**
Structure used to customize @ref TxQ behavior.
Expand Down Expand Up @@ -168,7 +168,7 @@ class TxQ
we can make this more complicated. But avoid
bikeshedding for now.
*/
FeeLevel64 zeroBaseFeeTransactionFeeLevel{ 256000 };
FeeLevel64 zeroBaseFeeTransactionFeeLevel{256000};
/// Use standalone mode behavior.
bool standAlone = false;
};
Expand Down Expand Up @@ -741,17 +741,29 @@ std::unique_ptr<TxQ>
make_TxQ(TxQ::Setup const&, beast::Journal);

template<class T>
std::pair<bool, XRPAmount>
toDrops(FeeLevel<T> const& level, XRPAmount const& baseFee)
std::pair<bool, XRPFee64>
toDrops(FeeLevel<T> level, XRPFee64 const& baseFee,
bool roundUp = false)
{
return mulDiv(level, baseFee, TxQ::baseLevel);
if (roundUp)
--level;
auto result = mulDiv(level, baseFee, TxQ::baseLevel);
if (roundUp)
++result.second;
return result;
}

inline
std::pair<bool, FeeLevel64>
toFeeLevel(XRPAmount const& drops, XRPAmount const& baseFee)
toFeeLevel(XRPFee64 drops, XRPFee64 const& baseFee,
bool roundUp = false)
{
return mulDiv(drops, TxQ::baseLevel, baseFee);
if (roundUp)
--drops;
auto result = mulDiv(drops, TxQ::baseLevel, baseFee);
if (roundUp)
++result.second;
return result;
}

} // ripple
Expand Down
Loading

0 comments on commit ce568a5

Please sign in to comment.