From ad74606ab3806a6221cebb539b21984e08cef7e5 Mon Sep 17 00:00:00 2001 From: Vinnie Falco Date: Tue, 14 Jul 2015 06:37:58 -0700 Subject: [PATCH] Fix fees in Ledger construction Conflicts: src/ripple/app/ledger/Ledger.cpp src/ripple/app/ledger/Ledger.h src/ripple/app/main/Application.cpp src/ripple/ledger/impl/View.cpp src/ripple/ledger/tests/View_test.cpp src/ripple/test/jtx/impl/Env.cpp --- src/ripple/app/ledger/Ledger.cpp | 62 ++++++++++++++------ src/ripple/app/ledger/Ledger.h | 23 +++++--- src/ripple/app/ledger/impl/InboundLedger.cpp | 6 +- src/ripple/app/main/Application.cpp | 2 +- src/ripple/app/tx/impl/CreateOffer.cpp | 5 -- src/ripple/ledger/View.h | 4 -- src/ripple/ledger/impl/View.cpp | 32 ---------- 7 files changed, 63 insertions(+), 71 deletions(-) diff --git a/src/ripple/app/ledger/Ledger.cpp b/src/ripple/app/ledger/Ledger.cpp index 0b2efc217..237a933ae 100644 --- a/src/ripple/app/ledger/Ledger.cpp +++ b/src/ripple/app/ledger/Ledger.cpp @@ -33,18 +33,19 @@ #include #include #include +#include #include #include #include #include #include #include +#include #include #include #include -#include #include -#include +#include #include #include #include @@ -57,6 +58,8 @@ namespace ripple { create_genesis_t const create_genesis {}; +//------------------------------------------------------------------------------ + class Ledger::txs_iter_impl : public txs_type::iter_base { @@ -119,7 +122,6 @@ Ledger::Ledger (create_genesis_t, Config const& config) getApp().family(), deprecatedLogs().journal("SHAMap"))) , stateMap_ (std::make_shared (SHAMapType::STATE, getApp().family(), deprecatedLogs().journal("SHAMap"))) - , fees_ (getFees(*this, getConfig())) { info_.seq = 1; info_.drops = SYSTEM_CURRENCY_START; @@ -136,6 +138,7 @@ Ledger::Ledger (create_genesis_t, Config const& config) updateHash(); setClosed(); setAccepted(); + setFees(config); } Ledger::Ledger (uint256 const& parentHash, @@ -147,15 +150,14 @@ Ledger::Ledger (uint256 const& parentHash, int closeFlags, int closeResolution, std::uint32_t ledgerSeq, - bool& loaded) + bool& loaded, + Config const& config) : mImmutable (true) , txMap_ (std::make_shared ( SHAMapType::TRANSACTION, transHash, getApp().family(), deprecatedLogs().journal("SHAMap"))) , stateMap_ (std::make_shared (SHAMapType::STATE, accountHash, getApp().family(), deprecatedLogs().journal("SHAMap"))) - // VFALCO Needs audit - , fees_(getFees(*this, getConfig())) { info_.seq = ledgerSeq; info_.parentCloseTime = parentCloseTime; @@ -184,6 +186,7 @@ Ledger::Ledger (uint256 const& parentHash, txMap_->setImmutable (); stateMap_->setImmutable (); + setFees(config); } // Create a new ledger that's a snapshot of this one @@ -192,8 +195,7 @@ Ledger::Ledger (Ledger const& ledger, : mImmutable (!isMutable) , txMap_ (ledger.txMap_->snapShot (isMutable)) , stateMap_ (ledger.stateMap_->snapShot (isMutable)) - // VFALCO Needs audit - , fees_(getFees(*this, getConfig())) + , fees_ (ledger.fees_) , info_ (ledger.info_) { updateHash (); @@ -205,8 +207,7 @@ Ledger::Ledger (open_ledger_t, Ledger const& prevLedger) , txMap_ (std::make_shared (SHAMapType::TRANSACTION, getApp().family(), deprecatedLogs().journal("SHAMap"))) , stateMap_ (prevLedger.stateMap_->snapShot (true)) - // VFALCO Needs audit - , fees_(getFees(*this, getConfig())) + , fees_(prevLedger.fees_) { info_.open = true; info_.seq = prevLedger.info_.seq + 1; @@ -229,8 +230,8 @@ Ledger::Ledger (open_ledger_t, Ledger const& prevLedger) } Ledger::Ledger (void const* data, - std::size_t size, bool hasPrefix) - + std::size_t size, bool hasPrefix, + Config const& config) : mImmutable (true) , txMap_ (std::make_shared ( SHAMapType::TRANSACTION, getApp().family(), @@ -241,10 +242,11 @@ Ledger::Ledger (void const* data, { SerialIter sit (data, size); setRaw (sit, hasPrefix); - fees_ = getFees(*this, getConfig()); + setFees(config); } -Ledger::Ledger (std::uint32_t ledgerSeq, std::uint32_t closeTime) +Ledger::Ledger (std::uint32_t ledgerSeq, + std::uint32_t closeTime, Config const& config) : mImmutable (false) , txMap_ (std::make_shared ( SHAMapType::TRANSACTION, getApp().family(), @@ -252,12 +254,11 @@ Ledger::Ledger (std::uint32_t ledgerSeq, std::uint32_t closeTime) , stateMap_ (std::make_shared ( SHAMapType::STATE, getApp().family(), deprecatedLogs().journal("SHAMap"))) - // VFALCO Needs audit - , fees_(getFees(*this, getConfig())) { info_.seq = ledgerSeq; info_.closeTime = closeTime; info_.closeTimeResolution = ledgerDefaultTimeResolution; + setFees(config); } //------------------------------------------------------------------------------ @@ -635,7 +636,8 @@ loadLedgerHelper(std::string const& sqlSuffix) closeFlags.value_or(0), closeResolution.value_or(0), ledgerSeq, - loaded); + loaded, + getConfig()); if (!loaded) return std::make_tuple (Ledger::pointer (), ledgerSeq, ledgerHash); @@ -992,6 +994,32 @@ Ledger::rawTxInsert (uint256 const& key, } } +void +Ledger::setFees (Config const& config) +{ + fees_.base = config.FEE_DEFAULT; + fees_.units = config.TRANSACTION_FEE_BASE; + fees_.reserve = config.FEE_ACCOUNT_RESERVE; + fees_.increment = config.FEE_OWNER_RESERVE; + auto const sle = read(keylet::fees()); + if (sle) + { + // VFALCO NOTE Why getFieldIndex and not isFieldPresent? + + if (sle->getFieldIndex (sfBaseFee) != -1) + fees_.base = sle->getFieldU64 (sfBaseFee); + + if (sle->getFieldIndex (sfReferenceFeeUnits) != -1) + fees_.units = sle->getFieldU32 (sfReferenceFeeUnits); + + if (sle->getFieldIndex (sfReserveBase) != -1) + fees_.reserve = sle->getFieldU32 (sfReserveBase); + + if (sle->getFieldIndex (sfReserveIncrement) != -1) + fees_.increment = sle->getFieldU32 (sfReserveIncrement); + } +} + std::shared_ptr Ledger::peek (Keylet const& k) const { diff --git a/src/ripple/app/ledger/Ledger.h b/src/ripple/app/ledger/Ledger.h index 6deb5c377..130468e06 100644 --- a/src/ripple/app/ledger/Ledger.h +++ b/src/ripple/app/ledger/Ledger.h @@ -40,7 +40,7 @@ class TransactionMaster; class SqliteStatement; -struct create_genesis_t { }; +struct create_genesis_t {}; extern create_genesis_t const create_genesis; /** Holds a ledger. @@ -102,13 +102,10 @@ public: uint256 const& accountHash, std::uint64_t totDrops, std::uint32_t closeTime, std::uint32_t parentCloseTime, int closeFlags, int closeResolution, - std::uint32_t ledgerSeq, bool & loaded); + std::uint32_t ledgerSeq, bool & loaded, Config const& config); - // used for database ledgers - Ledger (std::uint32_t ledgerSeq, std::uint32_t closeTime); - - Ledger (void const* data, - std::size_t size, bool hasPrefix); + // Create a new ledger that's a snapshot of this one + Ledger (Ledger const& target, bool isMutable); /** Create a new open ledger @@ -118,8 +115,13 @@ public: */ Ledger (open_ledger_t, Ledger const& previous); - // Create a new ledger that's a snapshot of this one - Ledger (Ledger const& target, bool isMutable); + Ledger (void const* data, + std::size_t size, bool hasPrefix, + Config const& config); + + // used for database ledgers + Ledger (std::uint32_t ledgerSeq, + std::uint32_t closeTime, Config const& config); ~Ledger(); @@ -368,6 +370,9 @@ private: } bool saveValidatedLedger (bool current); + void + setFees (Config const& config); + std::shared_ptr peek (Keylet const& k) const; diff --git a/src/ripple/app/ledger/impl/InboundLedger.cpp b/src/ripple/app/ledger/impl/InboundLedger.cpp index 5ed7151f2..49bc62c3e 100644 --- a/src/ripple/app/ledger/impl/InboundLedger.cpp +++ b/src/ripple/app/ledger/impl/InboundLedger.cpp @@ -162,14 +162,14 @@ bool InboundLedger::tryLocal () if (m_journal.trace) m_journal.trace << "Ledger header found in fetch pack"; mLedger = std::make_shared ( - data.data(), data.size(), true); + data.data(), data.size(), true, getConfig()); getApp().getNodeStore ().store ( hotLEDGER, std::move (data), mHash); } else { mLedger = std::make_shared( - node->getData().data(), node->getData().size(), true); + node->getData().data(), node->getData().size(), true, getConfig()); } if (mLedger->getHash () != mHash) @@ -762,7 +762,7 @@ bool InboundLedger::takeHeader (std::string const& data) return true; mLedger = std::make_shared( - data.data(), data.size(), false); + data.data(), data.size(), false, getConfig()); if (mLedger->getHash () != mHash) { diff --git a/src/ripple/app/main/Application.cpp b/src/ripple/app/main/Application.cpp index 38e379601..be0eee952 100644 --- a/src/ripple/app/main/Application.cpp +++ b/src/ripple/app/main/Application.cpp @@ -1177,7 +1177,7 @@ bool ApplicationImp::loadOldLedger ( } else { - loadLedger = std::make_shared (seq, closeTime); + loadLedger = std::make_shared (seq, closeTime, getConfig()); loadLedger->setTotalDrops(totalDrops); for (Json::UInt index = 0; index < ledger.get().size(); ++index) diff --git a/src/ripple/app/tx/impl/CreateOffer.cpp b/src/ripple/app/tx/impl/CreateOffer.cpp index cac39a522..dd0556565 100644 --- a/src/ripple/app/tx/impl/CreateOffer.cpp +++ b/src/ripple/app/tx/impl/CreateOffer.cpp @@ -741,11 +741,6 @@ CreateOffer::applyGuts (ApplyView& view, ApplyView& view_cancel) if (mPriorBalance < getAccountReserve (sleCreator)) { - #if RIPPLE_OPEN_LEDGER - deprecatedLogs().journal("OpenLedger").error << - "mPriorBalance < getAccountReserve(sleCreator)"; - #endif - // If we are here, the signing account had an insufficient reserve // *prior* to our processing. If something actually crossed, then // we allow this; otherwise, we just claim a fee. diff --git a/src/ripple/ledger/View.h b/src/ripple/ledger/View.h index 8923e6724..1c8424875 100644 --- a/src/ripple/ledger/View.h +++ b/src/ripple/ledger/View.h @@ -55,10 +55,6 @@ enum FreezeHandling fhZERO_IF_FROZEN }; -Fees -getFees (ReadView const& view, - Config const& config); - bool isGlobalFrozen (ReadView const& view, AccountID const& issuer); diff --git a/src/ripple/ledger/impl/View.cpp b/src/ripple/ledger/impl/View.cpp index 3305053cb..89564e00f 100644 --- a/src/ripple/ledger/impl/View.cpp +++ b/src/ripple/ledger/impl/View.cpp @@ -44,38 +44,6 @@ namespace ripple { // //------------------------------------------------------------------------------ -Fees -getFees (ReadView const& view, - Config const& config) -{ - Fees f; - f.base = config.FEE_DEFAULT; - f.units = config.TRANSACTION_FEE_BASE; - f.reserve = config.FEE_ACCOUNT_RESERVE; - f.increment = config.FEE_OWNER_RESERVE; - auto const sle = - view.read(keylet::fees()); - if (sle) - { - // VFALCO NOTE Why getFieldIndex and not isFieldPresent? - - if (sle->getFieldIndex (sfBaseFee) != -1) - f.base = sle->getFieldU64 (sfBaseFee); - - if (sle->getFieldIndex (sfReferenceFeeUnits) != -1) - f.units = sle->getFieldU32 (sfReferenceFeeUnits); - - if (sle->getFieldIndex (sfReserveBase) != -1) - f.reserve = sle->getFieldU32 (sfReserveBase); - - if (sle->getFieldIndex (sfReserveIncrement) != -1) - f.increment = sle->getFieldU32 (sfReserveIncrement); - } - return f; -} - -//------------------------------------------------------------------------------ - void addRaw (LedgerInfo const& info, Serializer& s) { s.add32 (info.seq);