From 3a30c0da29ebdf217fa90409f18ffbf20e09a6a7 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Tue, 23 Apr 2013 11:48:51 -0700 Subject: [PATCH] Fee change bugfixes. --- src/cpp/ripple/Application.cpp | 4 ++-- src/cpp/ripple/ChangeTransactor.cpp | 29 +++++++++++++++++++++++------ src/cpp/ripple/FeatureTable.cpp | 7 +++---- src/cpp/ripple/LedgerConsensus.cpp | 3 ++- src/cpp/ripple/Transactor.cpp | 12 ++++++++---- src/cpp/ripple/Transactor.h | 2 ++ 6 files changed, 40 insertions(+), 17 deletions(-) diff --git a/src/cpp/ripple/Application.cpp b/src/cpp/ripple/Application.cpp index c34a958cfc..0e3a1ef77a 100644 --- a/src/cpp/ripple/Application.cpp +++ b/src/cpp/ripple/Application.cpp @@ -54,9 +54,9 @@ Application::Application() : mSNTPClient(mAuxService), mJobQueue(mIOService), mFeeTrack(), #ifdef RESERVE_BASE_100 - mFeeVote(10, 100, 25), + mFeeVote(10, 100 * SYSTEM_CURRENCY_PARTS, 25 * SYSTEM_CURRENCY_PARTS), #else - mFeeVote(10, 200, 50), + mFeeVote(10, 200 * SYSTEM_CURRENCY_PARTS, 50 * SYSTEM_CURRENCY_PARTS), #endif mRpcDB(NULL), mTxnDB(NULL), mLedgerDB(NULL), mWalletDB(NULL), mHashNodeDB(NULL), mNetNodeDB(NULL), diff --git a/src/cpp/ripple/ChangeTransactor.cpp b/src/cpp/ripple/ChangeTransactor.cpp index 0fd450ec42..30da3e1ebc 100644 --- a/src/cpp/ripple/ChangeTransactor.cpp +++ b/src/cpp/ripple/ChangeTransactor.cpp @@ -43,12 +43,6 @@ TER ChangeTransactor::checkSeq() TER ChangeTransactor::payFee() { - if (isSetBit(mParams, tapOPEN_LEDGER)) - { - cLog(lsWARNING) << "Change transaction against open ledger"; - return temINVALID; - } - if (mTxn.getTransactionFee() != STAmount()) { cLog(lsWARNING) << "Change transaction with non-zero fee"; @@ -58,6 +52,25 @@ TER ChangeTransactor::payFee() return tesSUCCESS; } +TER ChangeTransactor::preCheck() +{ + mTxnAccountID = mTxn.getSourceAccount().getAccountID(); + if (mTxnAccountID.isNonZero()) + { + cLog(lsWARNING) << "applyTransaction: bad source id"; + + return temBAD_SRC_ACCOUNT; + } + + if (isSetBit(mParams, tapOPEN_LEDGER)) + { + cLog(lsWARNING) << "Change transaction against open ledger"; + return temINVALID; + } + + return tesSUCCESS; +} + TER ChangeTransactor::applyFeature() { uint256 feature = mTxn.getFieldH256(sfFeature); @@ -84,12 +97,16 @@ TER ChangeTransactor::applyFee() if (!feeObject) feeObject = mEngine->entryCreate(ltFEE_SETTINGS, Ledger::getLedgerFeeIndex()); + cLog(lsINFO) << "Previous fee object: " << feeObject->getJson(0); + feeObject->setFieldU64(sfBaseFee, mTxn.getFieldU64(sfBaseFee)); feeObject->setFieldU32(sfReferenceFeeUnits, mTxn.getFieldU32(sfReferenceFeeUnits)); feeObject->setFieldU32(sfReserveBase, mTxn.getFieldU32(sfReserveBase)); feeObject->setFieldU32(sfReserveIncrement, mTxn.getFieldU32(sfReserveIncrement)); mEngine->entryModify(feeObject); + + cLog(lsINFO) << "New fee object: " << feeObject->getJson(0); cLog(lsWARNING) << "Fees have been changed"; return tesSUCCESS; } diff --git a/src/cpp/ripple/FeatureTable.cpp b/src/cpp/ripple/FeatureTable.cpp index 7154723cf4..781b9165b9 100644 --- a/src/cpp/ripple/FeatureTable.cpp +++ b/src/cpp/ripple/FeatureTable.cpp @@ -352,17 +352,16 @@ void FeeVote::doFeeVoting(Ledger::ref lastClosedLedger, SHAMap::ref initialPosit { cLog(lsWARNING) << "We are voting for a fee change: " << baseFee << "/" << baseReserve << "/" << incReserve; SerializedTransaction trans(ttFEE); + trans.setFieldAccount(sfAccount, uint160()); trans.setFieldU64(sfBaseFee, baseFee); trans.setFieldU32(sfReferenceFeeUnits, 10); trans.setFieldU32(sfReserveBase, baseReserve); trans.setFieldU32(sfReserveIncrement, incReserve); - + uint256 txID = trans.getTransactionID(); + cLog(lsWARNING) << "Vote: " << txID; Serializer s; - s.add32(sHP_TransactionID); trans.add(s, true); - uint256 txID = s.getSHA512Half(); - cLog(lsWARNING) << "Vote: " << txID; SHAMapItem::pointer tItem = boost::make_shared(txID, s.peekData()); if (!initialPosition->addGiveItem(tItem, true, false)) diff --git a/src/cpp/ripple/LedgerConsensus.cpp b/src/cpp/ripple/LedgerConsensus.cpp index da4b32aa07..57538b10cf 100644 --- a/src/cpp/ripple/LedgerConsensus.cpp +++ b/src/cpp/ripple/LedgerConsensus.cpp @@ -319,7 +319,8 @@ void LedgerConsensus::takeInitialPosition(Ledger& initialLedger) { SHAMap::pointer initialSet; - if (mProposing && mHaveCorrectLCL && ((mPreviousLedger->getLedgerSeq() % 256) == 0)) + if ((theConfig.RUN_STANDALONE || (mProposing && mHaveCorrectLCL)) + && ((mPreviousLedger->getLedgerSeq() % 256) == 0)) { // previous ledger was flag ledger SHAMap::pointer preSet = initialLedger.peekTransactionMap()->snapShot(true); theApp->getFeeVote().doFeeVoting(mPreviousLedger, preSet); diff --git a/src/cpp/ripple/Transactor.cpp b/src/cpp/ripple/Transactor.cpp index 7b4aad602d..710516bda1 100644 --- a/src/cpp/ripple/Transactor.cpp +++ b/src/cpp/ripple/Transactor.cpp @@ -204,10 +204,13 @@ TER Transactor::apply() if (!mTxnAccount) { - cLog(lsTRACE) << boost::str(boost::format("applyTransaction: Delay transaction: source account does not exist: %s") % - mTxn.getSourceAccount().humanAccountID()); + if (mustHaveValidAccount()) + { + cLog(lsTRACE) << boost::str(boost::format("applyTransaction: Delay transaction: source account does not exist: %s") % + mTxn.getSourceAccount().humanAccountID()); - return terNO_ACCOUNT; + return terNO_ACCOUNT; + } } else { @@ -225,7 +228,8 @@ TER Transactor::apply() terResult = checkSig(); if (terResult != tesSUCCESS) return(terResult); - mEngine->entryModify(mTxnAccount); + if (mTxnAccount) + mEngine->entryModify(mTxnAccount); return doApply(); } diff --git a/src/cpp/ripple/Transactor.h b/src/cpp/ripple/Transactor.h index d72bd4b742..4c50a47be2 100644 --- a/src/cpp/ripple/Transactor.h +++ b/src/cpp/ripple/Transactor.h @@ -36,6 +36,8 @@ protected: Transactor(const SerializedTransaction& txn, TransactionEngineParams params, TransactionEngine* engine); + virtual bool mustHaveValidAccount() { return true; } + public: typedef boost::shared_ptr pointer;