diff --git a/src/LedgerFormats.cpp b/src/LedgerFormats.cpp index 5b031ffc99..58507b6d9d 100644 --- a/src/LedgerFormats.cpp +++ b/src/LedgerFormats.cpp @@ -10,7 +10,7 @@ LedgerEntryFormat LedgerFormats[]= { S_FIELD(Sequence), STI_UINT32, SOE_REQUIRED, 0 }, { S_FIELD(Balance), STI_AMOUNT, SOE_REQUIRED, 0 }, { S_FIELD(LastReceive), STI_UINT32, SOE_REQUIRED, 0 }, - { S_FIELD(LastTxn), STI_UINT32, SOE_REQUIRED, 0 }, + { S_FIELD(LastTxnSeq), STI_UINT32, SOE_REQUIRED, 0 }, { S_FIELD(AuthorizedKey), STI_ACCOUNT, SOE_IFFLAG, 1 }, { S_FIELD(EmailHash), STI_HASH128, SOE_IFFLAG, 2 }, { S_FIELD(WalletLocator), STI_HASH256, SOE_IFFLAG, 4 }, diff --git a/src/Peer.cpp b/src/Peer.cpp index 7ef797a98a..0a258c477e 100644 --- a/src/Peer.cpp +++ b/src/Peer.cpp @@ -572,8 +572,8 @@ void Peer::recvHello(newcoin::TMHello& packet) (void) mVerifyTimer.cancel(); uint32 ourTime = theApp->getOPs().getNetworkTimeNC(); - uint32 minTime = ourTime - 10; - uint32 maxTime = ourTime + 10; + uint32 minTime = ourTime - 20; + uint32 maxTime = ourTime + 20; #ifdef DEBUG if (packet.has_nettime()) diff --git a/src/SerializedLedger.cpp b/src/SerializedLedger.cpp index 372e9cd730..33d42d46c1 100644 --- a/src/SerializedLedger.cpp +++ b/src/SerializedLedger.cpp @@ -73,4 +73,34 @@ bool SerializedLedgerEntry::isEquivalent(const SerializedType& t) const if (mObject != v->mObject) return false; return true; } + +bool SerializedLedgerEntry::isThreadedType() +{ + return getIFieldIndex(sfLastTxnID) != -1; +} + +bool SerializedLedgerEntry::isThreaded() +{ + return getIFieldPresent(sfLastTxnID); +} + +uint256 SerializedLedgerEntry::getThreadedTransaction() +{ + return getIFieldH256(sfLastTxnID); +} + +uint32 SerializedLedgerEntry::getThreadedLedger() +{ + return getIFieldU32(sfLastTxnSeq); +} + +void SerializedLedgerEntry::thread(const uint256& txID, uint32 ledgerSeq, uint256& prevTxID, uint32& prevLedgerID) +{ + prevTxID = getIFieldH256(sfLastTxnID); + prevLedgerID = getIFieldU32(sfLastTxnID); + assert(prevTxID != txID); + setIFieldH256(sfLastTxnID, txID); + setIFieldU32(sfLastTxnSeq, ledgerSeq); +} + // vim:ts=4 diff --git a/src/SerializedLedger.h b/src/SerializedLedger.h index 6df79d7e88..c629ddbbce 100644 --- a/src/SerializedLedger.h +++ b/src/SerializedLedger.h @@ -62,6 +62,12 @@ public: STAmount getIValueFieldAmount(SOE_Field field) const { return mObject.getValueFieldAmount(field); } STVector256 getIFieldV256(SOE_Field field) { return mObject.getValueFieldV256(field); } + bool isThreadedType(); // is this a ledger entry that can be threaded + bool isThreaded(); // is this ledger entry actually threaded + uint256 getThreadedTransaction(); + uint32 getThreadedLedger(); + void thread(const uint256& txID, uint32 ledgerSeq, uint256& prevTxID, uint32& prevLedgerID); + void setIFieldU8(SOE_Field field, unsigned char v) { return mObject.setValueFieldU8(field, v); } void setIFieldU16(SOE_Field field, uint16 v) { return mObject.setValueFieldU16(field, v); } void setIFieldU32(SOE_Field field, uint32 v) { return mObject.setValueFieldU32(field, v); } diff --git a/src/SerializedObject.h b/src/SerializedObject.h index 0480266bee..e8df6729f4 100644 --- a/src/SerializedObject.h +++ b/src/SerializedObject.h @@ -64,7 +64,8 @@ enum SOE_Field sfInvoiceID, sfLastNode, sfLastReceive, - sfLastTxn, + sfLastTxnID, + sfLastTxnSeq, sfLedgerHash, sfLimitAmount, sfLowID, diff --git a/src/TransactionEngine.cpp b/src/TransactionEngine.cpp index c0c32519c5..45f1e5a113 100644 --- a/src/TransactionEngine.cpp +++ b/src/TransactionEngine.cpp @@ -813,10 +813,7 @@ SLE::pointer TransactionEngine::entryCache(LedgerEntryType letType, const uint25 { sleEntry = mLedger->getSLE(uIndex); if (sleEntry) - { mNodes.entryCache(sleEntry); - mOrigNodes.entryCache(sleEntry); // So the metadata code can compare to the original - } } else if (action == taaDELETE) assert(false); @@ -893,13 +890,6 @@ void TransactionEngine::txnWrite() } } -// This is for when a transaction fails from the issuer's point of view and the current changes need to be cleared so other -// actions can be applied to the ledger. -void TransactionEngine::entryReset() -{ - mNodes.setTo(mOrigNodes); -} - TransactionEngineResult TransactionEngine::applyTransaction(const SerializedTransaction& txn, TransactionEngineParams params) { @@ -1220,7 +1210,6 @@ TransactionEngineResult TransactionEngine::applyTransaction(const SerializedTran if (terSUCCESS == terResult) { entryModify(mTxnAccount); - mOrigNodes = mNodes.duplicate(); switch (txn.getTxnType()) { @@ -1305,7 +1294,6 @@ TransactionEngineResult TransactionEngine::applyTransaction(const SerializedTran mTxnAccount = SLE::pointer(); mNodes.clear(); - mOrigNodes.clear(); mUnfunded.clear(); return terResult; diff --git a/src/TransactionEngine.h b/src/TransactionEngine.h index f6e054e4cd..546287c03e 100644 --- a/src/TransactionEngine.h +++ b/src/TransactionEngine.h @@ -175,7 +175,7 @@ public: class TransactionEngine { private: - LedgerEntrySet mNodes, mOrigNodes; + LedgerEntrySet mNodes; TransactionEngineResult dirAdd( uint64& uNodeDir, // Node of entry. @@ -217,8 +217,6 @@ protected: void entryDelete(SLE::pointer sleEntry, bool unfunded = false); void entryModify(SLE::pointer sleEntry); - void entryReset(); - uint32 rippleTransfer(const uint160& uIssuerID); STAmount rippleBalance(const uint160& uToAccountID, const uint160& uFromAccountID, const uint160& uCurrencyID); STAmount rippleLimit(const uint160& uToAccountID, const uint160& uFromAccountID, const uint160& uCurrencyID);