diff --git a/src/Ledger.cpp b/src/Ledger.cpp index 5ce71db748..c3f1c58adc 100644 --- a/src/Ledger.cpp +++ b/src/Ledger.cpp @@ -7,6 +7,7 @@ #include "Application.h" #include "Ledger.h" +#include "utils.h" #include "../obj/src/newcoin.pb.h" #include "PackedMessage.h" #include "Config.h" @@ -50,9 +51,7 @@ Ledger::Ledger(Ledger::pointer prevLedger) : mParentHash(prevLedger->getHash()), prevLedger->setClosed(); prevLedger->updateHash(); mAccountStateMap->setSeq(mLedgerSeq); - if (prevLedger->mTimeStamp == 0) - mTimeStamp = (theApp->getOPs().getNetworkTime() % mLedgerInterval) + mLedgerInterval; - else mTimeStamp = prevLedger->mTimeStamp + prevLedger->mLedgerInterval; + mTimeStamp = prevLedger->getNextLedgerClose(); } Ledger::Ledger(const std::vector& rawLedger) : mTotCoins(0), mTimeStamp(0), @@ -426,4 +425,22 @@ bool Ledger::isAcquiringAS(void) { return mAccountStateMap->isSynching(); } + +boost::posix_time::ptime Ledger::getCloseTime() const +{ + return ptFromSeconds(mTimeStamp); +} + +void Ledger::setCloseTime(boost::posix_time::ptime ptm) +{ + mTimeStamp = iToSeconds(ptm); +} + +uint64 Ledger::getNextLedgerClose() const +{ + if (mTimeStamp == 0) + return theApp->getOPs().getNetworkTimeNC() + 2 * mLedgerInterval - 1; + return mTimeStamp + mLedgerInterval; +} + // vim:ts=4 diff --git a/src/Ledger.h b/src/Ledger.h index 5e8f70f47d..cd561f5298 100644 --- a/src/Ledger.h +++ b/src/Ledger.h @@ -6,6 +6,7 @@ #include #include +#include #include "../json/value.h" @@ -56,7 +57,8 @@ public: private: uint256 mHash, mParentHash, mTransHash, mAccountHash; - uint64 mTotCoins, mTimeStamp; + uint64 mTotCoins; + uint64 mTimeStamp; // when this ledger closes uint32 mLedgerSeq; uint16 mLedgerInterval; bool mClosed, mValidHash, mAccepted, mImmutable; @@ -81,7 +83,7 @@ protected: public: Ledger(const NewcoinAddress& masterID, uint64 startAmount); // used for the starting bootstrap ledger Ledger(const uint256 &parentHash, const uint256 &transHash, const uint256 &accountHash, - uint64 totCoins, uint64 timeStamp, uint32 ledgerSeq); // used for received ledgers + uint64 totCoins, uint64 timeStamp, uint32 ledgerSeq); // used for database ledgers Ledger(const std::vector& rawLedger); Ledger(const std::string& rawLedger); Ledger(Ledger::pointer previous); // ledger after this one @@ -100,10 +102,15 @@ public: const uint256& getTransHash() const { return mTransHash; } const uint256& getAccountHash() const { return mAccountHash; } uint64 getTotalCoins() const { return mTotCoins; } - uint64 getTimeStamp() const { return mTimeStamp; } + uint64 getRawTimeStamp() const { return mTimeStamp; } uint32 getLedgerSeq() const { return mLedgerSeq; } uint16 getInterval() const { return mLedgerInterval; } + // close time functions + boost::posix_time::ptime getCloseTime() const; + void setCloseTime(boost::posix_time::ptime); + uint64 getNextLedgerClose() const; + // low level functions SHAMap::pointer peekTransactionMap() { return mTransactionMap; } SHAMap::pointer peekAccountStateMap() { return mAccountStateMap; } diff --git a/src/NetworkOPs.cpp b/src/NetworkOPs.cpp index bb87f4dcbc..0813d0b9d7 100644 --- a/src/NetworkOPs.cpp +++ b/src/NetworkOPs.cpp @@ -4,6 +4,7 @@ #include #include +#include "utils.h" #include "Application.h" #include "Transaction.h" @@ -24,11 +25,21 @@ NetworkOPs::NetworkOPs(boost::asio::io_service& io_service) : mMode(omDISCONNECT setStateTimer(5); } -uint64 NetworkOPs::getNetworkTime() +time_t NetworkOPs::getNetworkTimeTT() { return time(NULL); } +boost::posix_time::ptime NetworkOPs::getNetworkTimePT() +{ + return boost::posix_time::from_time_t(getNetworkTimeTT()); +} + +uint64 NetworkOPs::getNetworkTimeNC() +{ + return iToSeconds(getNetworkTimePT()); +} + uint32 NetworkOPs::getCurrentLedgerID() { return theApp->getMasterLedger().getCurrentLedger()->getLedgerSeq(); @@ -89,7 +100,7 @@ Transaction::pointer NetworkOPs::processTransaction(Transaction::pointer trans, trans->getSTransaction()->getTransaction(*s, false); tx->set_rawtransaction(&s->getData().front(), s->getLength()); tx->set_status(newcoin::tsCURRENT); - tx->set_receivetimestamp(getNetworkTime()); + tx->set_receivetimestamp(getNetworkTimeNC()); tx->set_ledgerindexpossible(trans->getLedger()); PackedMessage::pointer packet(new PackedMessage(PackedMessage::MessagePointer(tx), newcoin::mtTRANSACTION)); @@ -280,8 +291,19 @@ void NetworkOPs::checkState() void NetworkOPs::switchLastClosedLedger(Ledger::pointer newLedger) { // set the newledger as our last closed ledger - // FIXME: Must recover transactions + // FIXME: Correct logic is: + // 1) Mark this ledger closed, schedule it to be saved + // 2) Open a new subsequent ledger + // 3) Walk back the previous ledger chain from our current ledger and the new last closed ledger + // find a common previous ledger, if possible. Try to insert any transactions in our ledger + // chain into the new open ledger. Broadcast any that make it in. + Ledger::pointer openLedger = boost::make_shared(newLedger); theApp->getMasterLedger().switchLedgers(newLedger, openLedger); - // FIXME: Set close timer + +#if 0 + if (getNetworkTime() > openLedger->getCloseTime()) + { // this ledger has already closed + } +#endif } diff --git a/src/NetworkOPs.h b/src/NetworkOPs.h index bef0a4b44a..4003dce23d 100644 --- a/src/NetworkOPs.h +++ b/src/NetworkOPs.h @@ -37,7 +37,9 @@ public: NetworkOPs(boost::asio::io_service& io_service); // network information - uint64 getNetworkTime(); + uint64 getNetworkTimeNC(); + time_t getNetworkTimeTT(); + boost::posix_time::ptime getNetworkTimePT(); uint32 getCurrentLedgerID(); OperatingMode getOperatingMode() { return mMode; } diff --git a/src/Peer.cpp b/src/Peer.cpp index e257679afe..1db60cbf3c 100644 --- a/src/Peer.cpp +++ b/src/Peer.cpp @@ -774,7 +774,7 @@ void Peer::sendHello() h->set_version(theConfig.VERSION); h->set_ledgerindex(theApp->getOPs().getCurrentLedgerID()); - h->set_nettime(theApp->getOPs().getNetworkTime()); + h->set_nettime(theApp->getOPs().getNetworkTimeNC()); h->set_nodepublic(theApp->getWallet().getNodePublic().humanNodePublic()); h->set_nodeproof(&vchSig[0], vchSig.size()); h->set_ipv4port(theConfig.PEER_PORT);