Merge branch 'master' of github.com:jedmccaleb/NewCoin

This commit is contained in:
Arthur Britto
2012-06-22 00:30:08 -07:00
10 changed files with 114 additions and 86 deletions

View File

@@ -291,11 +291,11 @@ Peer::pointer ConnectionPool::peerConnect(const std::string& strIp, int iPort)
if (ppResult) if (ppResult)
{ {
Log(lsINFO) << "Pool: Connecting: " << ADDRESS_SHARED(ppResult) << ": " << strIp << " " << iPort; //Log(lsINFO) << "Pool: Connecting: " << ADDRESS_SHARED(ppResult) << ": " << strIp << " " << iPort;
} }
else else
{ {
Log(lsINFO) << "Pool: Already connected: " << strIp << " " << iPort; //Log(lsINFO) << "Pool: Already connected: " << strIp << " " << iPort;
} }
return ppResult; return ppResult;
@@ -352,7 +352,7 @@ bool ConnectionPool::peerConnected(Peer::pointer peer, const NewcoinAddress& naP
if (itCm == mConnectedMap.end()) if (itCm == mConnectedMap.end())
{ {
// New connection. // New connection.
Log(lsINFO) << "Pool: Connected: new: " << ADDRESS_SHARED(peer) << ": " << naPeer.humanNodePublic() << " " << strIP << " " << iPort; //Log(lsINFO) << "Pool: Connected: new: " << ADDRESS_SHARED(peer) << ": " << naPeer.humanNodePublic() << " " << strIP << " " << iPort;
mConnectedMap[naPeer] = peer; mConnectedMap[naPeer] = peer;
bNew = true; bNew = true;
@@ -365,7 +365,7 @@ bool ConnectionPool::peerConnected(Peer::pointer peer, const NewcoinAddress& naP
if (itCm->second->getIP().empty()) if (itCm->second->getIP().empty())
{ {
// Old peer did not know it's IP. // Old peer did not know it's IP.
Log(lsINFO) << "Pool: Connected: redundant: outbound: " << ADDRESS_SHARED(peer) << " discovered: " << ADDRESS_SHARED(itCm->second) << ": " << strIP << " " << iPort; //Log(lsINFO) << "Pool: Connected: redundant: outbound: " << ADDRESS_SHARED(peer) << " discovered: " << ADDRESS_SHARED(itCm->second) << ": " << strIP << " " << iPort;
itCm->second->setIpPort(strIP, iPort); itCm->second->setIpPort(strIP, iPort);
@@ -375,14 +375,14 @@ bool ConnectionPool::peerConnected(Peer::pointer peer, const NewcoinAddress& naP
else else
{ {
// Old peer knew its IP. Do nothing. // Old peer knew its IP. Do nothing.
Log(lsINFO) << "Pool: Connected: redundant: outbound: rediscovered: " << ADDRESS_SHARED(peer) << " " << strIP << " " << iPort; //Log(lsINFO) << "Pool: Connected: redundant: outbound: rediscovered: " << ADDRESS_SHARED(peer) << " " << strIP << " " << iPort;
nothing(); nothing();
} }
} }
else else
{ {
Log(lsINFO) << "Pool: Connected: redundant: inbound: " << ADDRESS_SHARED(peer) << " " << strIP << " " << iPort; //Log(lsINFO) << "Pool: Connected: redundant: inbound: " << ADDRESS_SHARED(peer) << " " << strIP << " " << iPort;
nothing(); nothing();
} }
@@ -419,12 +419,12 @@ void ConnectionPool::peerDisconnected(Peer::pointer peer, const NewcoinAddress&
// Found it. Delete it. // Found it. Delete it.
mConnectedMap.erase(itCm); mConnectedMap.erase(itCm);
Log(lsINFO) << "Pool: disconnected: " << naPeer.humanNodePublic() << " " << peer->getIP() << " " << peer->getPort(); //Log(lsINFO) << "Pool: disconnected: " << naPeer.humanNodePublic() << " " << peer->getIP() << " " << peer->getPort();
} }
} }
else else
{ {
Log(lsINFO) << "Pool: disconnected: anonymous: " << peer->getIP() << " " << peer->getPort(); //Log(lsINFO) << "Pool: disconnected: anonymous: " << peer->getIP() << " " << peer->getPort();
} }
} }
@@ -450,8 +450,8 @@ bool ConnectionPool::peerScanSet(const std::string& strIp, int iPort)
boost::posix_time::ptime tpNow = boost::posix_time::second_clock::universal_time(); boost::posix_time::ptime tpNow = boost::posix_time::second_clock::universal_time();
boost::posix_time::ptime tpNext = tpNow + boost::posix_time::seconds(iInterval); boost::posix_time::ptime tpNext = tpNow + boost::posix_time::seconds(iInterval);
Log(lsINFO) << str(boost::format("Pool: Scan: schedule create: %s %s (next %s, delay=%d)") //Log(lsINFO) << str(boost::format("Pool: Scan: schedule create: %s %s (next %s, delay=%d)")
% mScanIp % mScanPort % tpNext % (tpNext-tpNow).total_seconds()); // % mScanIp % mScanPort % tpNext % (tpNext-tpNow).total_seconds());
db->executeSQL(str(boost::format("UPDATE PeerIps SET ScanNext=%d,ScanInterval=%d WHERE IpPort=%s;") db->executeSQL(str(boost::format("UPDATE PeerIps SET ScanNext=%d,ScanInterval=%d WHERE IpPort=%s;")
% iToSeconds(tpNext) % iToSeconds(tpNext)
@@ -466,13 +466,13 @@ bool ConnectionPool::peerScanSet(const std::string& strIp, int iPort)
boost::posix_time::ptime tpNow = boost::posix_time::second_clock::universal_time(); boost::posix_time::ptime tpNow = boost::posix_time::second_clock::universal_time();
boost::posix_time::ptime tpNext = ptFromSeconds(db->getInt("ScanNext")); boost::posix_time::ptime tpNext = ptFromSeconds(db->getInt("ScanNext"));
Log(lsINFO) << str(boost::format("Pool: Scan: schedule exists: %s %s (next %s, delay=%d)") //Log(lsINFO) << str(boost::format("Pool: Scan: schedule exists: %s %s (next %s, delay=%d)")
% mScanIp % mScanPort % tpNext % (tpNext-tpNow).total_seconds()); // % mScanIp % mScanPort % tpNext % (tpNext-tpNow).total_seconds());
} }
} }
else else
{ {
Log(lsWARNING) << "Pool: Scan: peer wasn't in PeerIps: " << strIp << " " << iPort; //Log(lsWARNING) << "Pool: Scan: peer wasn't in PeerIps: " << strIp << " " << iPort;
} }
return bScanDirty; return bScanDirty;
@@ -487,7 +487,7 @@ void ConnectionPool::peerClosed(Peer::pointer peer, const std::string& strIp, in
// If the connection was our scan, we are no longer scanning. // If the connection was our scan, we are no longer scanning.
if (mScanning && mScanning == peer) if (mScanning && mScanning == peer)
{ {
Log(lsINFO) << "Pool: Scan: scan fail: " << strIp << " " << iPort; //Log(lsINFO) << "Pool: Scan: scan fail: " << strIp << " " << iPort;
mScanning = Peer::pointer(); // No longer scanning. mScanning = Peer::pointer(); // No longer scanning.
bScanRefresh = true; // Look for more to scan. bScanRefresh = true; // Look for more to scan.
@@ -510,7 +510,7 @@ void ConnectionPool::peerClosed(Peer::pointer peer, const std::string& strIp, in
else if (mIpMap[ipPeer] == peer) else if (mIpMap[ipPeer] == peer)
{ {
// We were the identified connection. // We were the identified connection.
Log(lsINFO) << "Pool: Closed: identified: " << ADDRESS_SHARED(peer) << ": " << strIp << " " << iPort; //Log(lsINFO) << "Pool: Closed: identified: " << ADDRESS_SHARED(peer) << ": " << strIp << " " << iPort;
// Delete our entry. // Delete our entry.
mIpMap.erase(itIp); mIpMap.erase(itIp);
@@ -519,8 +519,8 @@ void ConnectionPool::peerClosed(Peer::pointer peer, const std::string& strIp, in
} }
else else
{ {
// Found it. But, we were redundent. // Found it. But, we were redundant.
Log(lsINFO) << "Pool: Closed: redundant: " << ADDRESS_SHARED(peer) << ": " << strIp << " " << iPort; //Log(lsINFO) << "Pool: Closed: redundant: " << ADDRESS_SHARED(peer) << ": " << strIp << " " << iPort;
} }
} }

View File

@@ -80,8 +80,6 @@ HashedObject::pointer HashedObject::retrieve(const uint256& hash)
std::string type; std::string type;
uint32 index; uint32 index;
std::vector<unsigned char> data; std::vector<unsigned char> data;
data.reserve(8192);
{ {
ScopedLock sl(theApp->getHashNodeDB()->getDBLock()); ScopedLock sl(theApp->getHashNodeDB()->getDBLock());
Database* db = theApp->getHashNodeDB()->getDB(); Database* db = theApp->getHashNodeDB()->getDB();

View File

@@ -6,7 +6,9 @@
#include <boost/bind.hpp> #include <boost/bind.hpp>
#include "Application.h" #include "Application.h"
#include "Log.h"
#define LA_DEBUG
#define LEDGER_ACQUIRE_TIMEOUT 2 #define LEDGER_ACQUIRE_TIMEOUT 2
PeerSet::PeerSet(const uint256& hash, int interval) : mHash(hash), mTimerInterval(interval), PeerSet::PeerSet(const uint256& hash, int interval) : mHash(hash), mTimerInterval(interval),
@@ -69,8 +71,8 @@ void PeerSet::TimerEntry(boost::weak_ptr<PeerSet> wptr, const boost::system::err
LedgerAcquire::LedgerAcquire(const uint256& hash) : PeerSet(hash, LEDGER_ACQUIRE_TIMEOUT), LedgerAcquire::LedgerAcquire(const uint256& hash) : PeerSet(hash, LEDGER_ACQUIRE_TIMEOUT),
mFilter(&theApp->getNodeCache()), mHaveBase(false), mHaveState(false), mHaveTransactions(false) mFilter(&theApp->getNodeCache()), mHaveBase(false), mHaveState(false), mHaveTransactions(false)
{ {
#ifdef DEBUG #ifdef LA_DEBUG
std::cerr << "Acquiring ledger " << mHash.GetHex() << std::endl; Log(lsTRACE) << "Acquiring ledger " << mHash.GetHex();
#endif #endif
} }
@@ -81,8 +83,8 @@ boost::weak_ptr<PeerSet> LedgerAcquire::pmDowncast()
void LedgerAcquire::done() void LedgerAcquire::done()
{ {
#ifdef DEBUG #ifdef LA_DEBUG
std::cerr << "Done acquiring ledger " << mHash.GetHex() << std::endl; Log(lsTRACE) << "Done acquiring ledger " << mHash.GetHex();
#endif #endif
std::vector< boost::function<void (LedgerAcquire::pointer)> > triggers; std::vector< boost::function<void (LedgerAcquire::pointer)> > triggers;
@@ -106,16 +108,17 @@ void LedgerAcquire::addOnComplete(boost::function<void (LedgerAcquire::pointer)>
void LedgerAcquire::trigger(Peer::pointer peer) void LedgerAcquire::trigger(Peer::pointer peer)
{ {
#ifdef LA_DEBUG #ifdef LA_DEBUG
std::cerr << "Trigger acquiring ledger " << mHash.GetHex() << std::endl; if(peer) Log(lsTRACE) << "Trigger acquiring ledger " << mHash.GetHex() << " from " << peer->getIP();
std::cerr << "complete=" << mComplete << " failed=" << mFailed << std::endl; else Log(lsTRACE) << "Trigger acquiring ledger " << mHash.GetHex();
std::cerr << "base=" << mHaveBase << " tx=" << mHaveTransactions << " as=" << mHaveState << std::endl; Log(lsTRACE) << "complete=" << mComplete << " failed=" << mFailed;
Log(lsTRACE) << "base=" << mHaveBase << " tx=" << mHaveTransactions << " as=" << mHaveState;
#endif #endif
if (mComplete || mFailed) if (mComplete || mFailed)
return; return;
if (!mHaveBase) if (!mHaveBase)
{ {
#ifdef LA_DEBUG #ifdef LA_DEBUG
std::cerr << "need base" << std::endl; Log(lsTRACE) << "need base";
#endif #endif
newcoin::TMGetLedger tmGL; newcoin::TMGetLedger tmGL;
tmGL.set_ledgerhash(mHash.begin(), mHash.size()); tmGL.set_ledgerhash(mHash.begin(), mHash.size());
@@ -131,7 +134,7 @@ void LedgerAcquire::trigger(Peer::pointer peer)
if (mHaveBase && !mHaveTransactions) if (mHaveBase && !mHaveTransactions)
{ {
#ifdef LA_DEBUG #ifdef LA_DEBUG
std::cerr << "need tx" << std::endl; Log(lsTRACE) << "need tx";
#endif #endif
assert(mLedger); assert(mLedger);
if (mLedger->peekTransactionMap()->getHash().isZero()) if (mLedger->peekTransactionMap()->getHash().isZero())
@@ -183,7 +186,7 @@ void LedgerAcquire::trigger(Peer::pointer peer)
if (mHaveBase && !mHaveState) if (mHaveBase && !mHaveState)
{ {
#ifdef LA_DEBUG #ifdef LA_DEBUG
std::cerr << "need as" << std::endl; Log(lsTRACE) << "need as";
#endif #endif
assert(mLedger); assert(mLedger);
if (mLedger->peekAccountStateMap()->getHash().isZero()) if (mLedger->peekAccountStateMap()->getHash().isZero())
@@ -268,15 +271,15 @@ void PeerSet::sendRequest(const newcoin::TMGetLedger& tmGL)
bool LedgerAcquire::takeBase(const std::string& data, Peer::pointer peer) bool LedgerAcquire::takeBase(const std::string& data, Peer::pointer peer)
{ // Return value: true=normal, false=bad data { // Return value: true=normal, false=bad data
#ifdef LA_DEBUG #ifdef LA_DEBUG
std::cerr << "got base acquiring ledger " << mHash.GetHex() << std::endl; Log(lsTRACE) << "got base acquiring ledger " << mHash.GetHex();
#endif #endif
boost::recursive_mutex::scoped_lock sl(mLock); boost::recursive_mutex::scoped_lock sl(mLock);
if (mHaveBase) return true; if (mHaveBase) return true;
mLedger = boost::make_shared<Ledger>(data); mLedger = boost::make_shared<Ledger>(data);
if (mLedger->getHash() != mHash) if (mLedger->getHash() != mHash)
{ {
std::cerr << "Acquire hash mismatch" << std::endl; Log(lsWARNING) << "Acquire hash mismatch";
std::cerr << mLedger->getHash().GetHex() << "!=" << mHash.GetHex() << std::endl; Log(lsWARNING) << mLedger->getHash().GetHex() << "!=" << mHash.GetHex();
mLedger = Ledger::pointer(); mLedger = Ledger::pointer();
return false; return false;
} }
@@ -319,7 +322,7 @@ bool LedgerAcquire::takeAsNode(const std::list<SHAMapNode>& nodeIDs,
const std::list< std::vector<unsigned char> >& data, Peer::pointer peer) const std::list< std::vector<unsigned char> >& data, Peer::pointer peer)
{ {
#ifdef LA_DEBUG #ifdef LA_DEBUG
std::cerr << "got ASdata acquiring ledger " << mHash.GetHex() << std::endl; Log(lsTRACE) << "got ASdata acquiring ledger " << mHash.GetHex();
#endif #endif
if (!mHaveBase) return false; if (!mHaveBase) return false;
std::list<SHAMapNode>::const_iterator nodeIDit = nodeIDs.begin(); std::list<SHAMapNode>::const_iterator nodeIDit = nodeIDs.begin();
@@ -379,7 +382,7 @@ void LedgerAcquireMaster::dropLedger(const uint256& hash)
bool LedgerAcquireMaster::gotLedgerData(newcoin::TMLedgerData& packet, Peer::pointer peer) bool LedgerAcquireMaster::gotLedgerData(newcoin::TMLedgerData& packet, Peer::pointer peer)
{ {
#ifdef LA_DEBUG #ifdef LA_DEBUG
std::cerr << "got data for acquiring ledger "; Log(lsTRACE) << "got data for acquiring ledger ";
#endif #endif
uint256 hash; uint256 hash;
if (packet.ledgerhash().size() != 32) if (packet.ledgerhash().size() != 32)
@@ -389,7 +392,7 @@ bool LedgerAcquireMaster::gotLedgerData(newcoin::TMLedgerData& packet, Peer::poi
} }
memcpy(hash.begin(), packet.ledgerhash().data(), 32); memcpy(hash.begin(), packet.ledgerhash().data(), 32);
#ifdef LA_DEBUG #ifdef LA_DEBUG
std::cerr << hash.GetHex() << std::endl; Log(lsTRACE) << hash.GetHex();
#endif #endif
LedgerAcquire::pointer ledger = find(hash); LedgerAcquire::pointer ledger = find(hash);

View File

@@ -323,20 +323,15 @@ void LedgerConsensus::statusChange(newcoin::NodeEvent event, Ledger::pointer led
{ // Send a node status change message to our peers { // Send a node status change message to our peers
newcoin::TMStatusChange s; newcoin::TMStatusChange s;
if (!mHaveCorrectLCL) if (!mHaveCorrectLCL)
{
Log(lsTRACE) << "Telling peers we have lost sync";
s.set_newevent(newcoin::neLOST_SYNC); s.set_newevent(newcoin::neLOST_SYNC);
}
else else
{
s.set_newevent(event); s.set_newevent(event);
s.set_ledgerseq(ledger->getLedgerSeq()); s.set_ledgerseq(ledger->getLedgerSeq());
s.set_networktime(theApp->getOPs().getNetworkTimeNC()); s.set_networktime(theApp->getOPs().getNetworkTimeNC());
uint256 hash = ledger->getParentHash(); uint256 hash = ledger->getParentHash();
s.set_previousledgerhash(hash.begin(), hash.size()); s.set_previousledgerhash(hash.begin(), hash.size());
hash = ledger->getHash(); hash = ledger->getHash();
s.set_ledgerhash(hash.begin(), hash.size()); s.set_ledgerhash(hash.begin(), hash.size());
}
PackedMessage::pointer packet = boost::make_shared<PackedMessage>(s, newcoin::mtSTATUS_CHANGE); PackedMessage::pointer packet = boost::make_shared<PackedMessage>(s, newcoin::mtSTATUS_CHANGE);
theApp->getConnectionPool().relayMessage(NULL, packet); theApp->getConnectionPool().relayMessage(NULL, packet);
Log(lsINFO) << "send status change to peer"; Log(lsINFO) << "send status change to peer";
@@ -418,6 +413,20 @@ int LedgerConsensus::stateAccepted(int secondsSinceClose)
int LedgerConsensus::timerEntry() int LedgerConsensus::timerEntry()
{ {
if (!mHaveCorrectLCL)
{
Ledger::pointer consensus = theApp->getMasterLedger().getLedgerByHash(mPrevLedgerHash);
if (consensus)
{
Log(lsINFO) << "We have acquired the consensus ledger";
if (theApp->getMasterLedger().getClosedLedger()->getHash() != mPrevLedgerHash)
theApp->getOPs().switchLastClosedLedger(consensus);
mPreviousLedger = consensus;
mHaveCorrectLCL = true;
// FIXME: We need some kind of idea what the consensus transaction set is
}
}
int sinceClose = theApp->getOPs().getNetworkTimeNC() - mCloseTime; int sinceClose = theApp->getOPs().getNetworkTimeNC() - mCloseTime;
switch (mState) switch (mState)
@@ -841,6 +850,7 @@ void LedgerConsensus::accept(SHAMap::pointer set)
} }
else Log(lsWARNING) << "Not validating"; else Log(lsWARNING) << "Not validating";
statusChange(newcoin::neACCEPTED_LEDGER, newLCL); statusChange(newcoin::neACCEPTED_LEDGER, newLCL);
// FIXME: If necessary, change state to TRACKING/FULL
} }
void LedgerConsensus::endConsensus() void LedgerConsensus::endConsensus()

View File

@@ -137,7 +137,7 @@ public:
int startup(); int startup();
Ledger::pointer peekPreviousLedger() { return mPreviousLedger; } Ledger::pointer peekPreviousLedger() { return mPreviousLedger; }
uint256 getLCL() { return mPreviousLedger->getHash(); } uint256 getLCL() { return mPrevLedgerHash; }
SHAMap::pointer getTransactionTree(const uint256& hash, bool doAcquire); SHAMap::pointer getTransactionTree(const uint256& hash, bool doAcquire);
TransactionAcquire::pointer getAcquiring(const uint256& hash); TransactionAcquire::pointer getAcquiring(const uint256& hash);

View File

@@ -308,11 +308,8 @@ void NetworkOPs::checkState(const boost::system::error_code& result)
// FIXME: Don't check unless last closed ledger is at least some seconds old // FIXME: Don't check unless last closed ledger is at least some seconds old
// If full or tracking, check only at wobble time! // If full or tracking, check only at wobble time!
if (checkLastClosedLedger(peerList)) uint256 networkClosed;
{ bool ledgerChange = checkLastClosedLedger(peerList, networkClosed);
setStateTimer(3);
return;
}
// WRITEME: Unless we are in omFULL and in the process of doing a consensus, // WRITEME: Unless we are in omFULL and in the process of doing a consensus,
// we must count how many nodes share our LCL, how many nodes disagree with our LCL, // we must count how many nodes share our LCL, how many nodes disagree with our LCL,
@@ -320,13 +317,13 @@ void NetworkOPs::checkState(const boost::system::error_code& result)
// there shouldn't be a newer LCL. We need this information to do the next three // there shouldn't be a newer LCL. We need this information to do the next three
// tests. // tests.
if (mMode == omCONNECTED) if ((mMode == omCONNECTED) && !ledgerChange)
{ // count number of peers that agree with us and UNL nodes whose validations we have for LCL { // count number of peers that agree with us and UNL nodes whose validations we have for LCL
// if the ledger is good enough, go to omTRACKING - TODO // if the ledger is good enough, go to omTRACKING - TODO
setMode(omTRACKING); setMode(omTRACKING);
} }
if (mMode == omTRACKING) if ((mMode == omTRACKING) && !ledgerChange)
{ {
// check if the ledger is good enough to go to omFULL // check if the ledger is good enough to go to omFULL
// Note: Do not go to omFULL if we don't have the previous ledger // Note: Do not go to omFULL if we don't have the previous ledger
@@ -346,13 +343,13 @@ void NetworkOPs::checkState(const boost::system::error_code& result)
int secondsToClose = theApp->getMasterLedger().getCurrentLedger()->getCloseTimeNC() - int secondsToClose = theApp->getMasterLedger().getCurrentLedger()->getCloseTimeNC() -
theApp->getOPs().getNetworkTimeNC(); theApp->getOPs().getNetworkTimeNC();
if ((!mConsensus) && (secondsToClose < LEDGER_WOBBLE_TIME)) // pre close wobble if ((!mConsensus) && (secondsToClose < LEDGER_WOBBLE_TIME)) // pre close wobble
beginConsensus(theApp->getMasterLedger().getCurrentLedger()); beginConsensus(networkClosed, theApp->getMasterLedger().getCurrentLedger());
if (mConsensus) if (mConsensus)
setStateTimer(mConsensus->timerEntry()); setStateTimer(mConsensus->timerEntry());
else setStateTimer(4); else setStateTimer(4);
} }
bool NetworkOPs::checkLastClosedLedger(const std::vector<Peer::pointer>& peerList) bool NetworkOPs::checkLastClosedLedger(const std::vector<Peer::pointer>& peerList, uint256& networkClosed)
{ // Returns true if there's an *abnormal* ledger issue, normal changing in TRACKING mode should return false { // Returns true if there's an *abnormal* ledger issue, normal changing in TRACKING mode should return false
// Do we have sufficient validations for our last closed ledger? Or do sufficient nodes // Do we have sufficient validations for our last closed ledger? Or do sufficient nodes
// agree? And do we have no better ledger available? // agree? And do we have no better ledger available?
@@ -360,6 +357,7 @@ bool NetworkOPs::checkLastClosedLedger(const std::vector<Peer::pointer>& peerLis
// FIXME: We may have a ledger with many recent validations but that no directly-connected // FIXME: We may have a ledger with many recent validations but that no directly-connected
// node is using. THis is kind of fundamental. // node is using. THis is kind of fundamental.
Log(lsTRACE) << "NetworkOPs::checkLastClosedLedger";
boost::unordered_map<uint256, ValidationCount> ledgers; boost::unordered_map<uint256, ValidationCount> ledgers;
@@ -369,8 +367,8 @@ bool NetworkOPs::checkLastClosedLedger(const std::vector<Peer::pointer>& peerLis
ledgers[it->first].trustedValidations += it->second; ledgers[it->first].trustedValidations += it->second;
} }
Ledger::pointer currentClosed = mLedgerMaster->getClosedLedger(); Ledger::pointer ourClosed = mLedgerMaster->getClosedLedger();
uint256 closedLedger = currentClosed->getHash(); uint256 closedLedger = ourClosed->getHash();
ValidationCount& ourVC = ledgers[closedLedger]; ValidationCount& ourVC = ledgers[closedLedger];
++ourVC.nodesUsing; ++ourVC.nodesUsing;
ourVC.highNode = theApp->getWallet().getNodePublic(); ourVC.highNode = theApp->getWallet().getNodePublic();
@@ -391,7 +389,7 @@ bool NetworkOPs::checkLastClosedLedger(const std::vector<Peer::pointer>& peerLis
vc.highNode = (*it)->getNodePublic(); vc.highNode = (*it)->getNodePublic();
++vc.nodesUsing; ++vc.nodesUsing;
} }
else Log(lsTRACE) << "Connected peer announces no LCL"; else Log(lsTRACE) << "Connected peer announces no LCL " << (*it)->getIP();
} }
} }
@@ -411,14 +409,16 @@ bool NetworkOPs::checkLastClosedLedger(const std::vector<Peer::pointer>& peerLis
switchLedgers = true; switchLedgers = true;
} }
} }
networkClosed = closedLedger;
if (!switchLedgers) if (!switchLedgers)
return false; return false;
Log(lsWARNING) << "We are not running on the consensus ledger"; Log(lsWARNING) << "We are not running on the consensus ledger";
Log(lsINFO) << "Our LCL " << currentClosed->getHash().GetHex(); Log(lsINFO) << "Our LCL " << ourClosed->getHash().GetHex();
Log(lsINFO) << "Net LCL " << closedLedger.GetHex(); Log(lsINFO) << "Net LCL " << closedLedger.GetHex();
if ((mMode == omTRACKING) || (mMode == omFULL)) setMode(omCONNECTED); if ((mMode == omTRACKING) || (mMode == omFULL)) setMode(omCONNECTED);
Ledger::pointer consensus = mLedgerMaster->getLedgerByHash(closedLedger); Ledger::pointer consensus = mLedgerMaster->getLedgerByHash(closedLedger);
if (!consensus) if (!consensus)
{ {
@@ -432,13 +432,26 @@ bool NetworkOPs::checkLastClosedLedger(const std::vector<Peer::pointer>& peerLis
} }
if (!acq->isComplete()) if (!acq->isComplete())
{ // add more peers { // add more peers
//JED: seems like you need to do something here so it knows in beginConsensus that it isn't on the the right ledger
// switch to an empty ledger so we won't keep going
//Ledger::pointer emptyLedger(new Ledger());
//switchLastClosedLedger(emptyLedger);
// JED: just ask everyone
std::vector<Peer::pointer> peers=theApp->getConnectionPool().getPeerVector();
for(int n=0; n<peers.size(); n++)
{
if(peers[n]->isConnected()) acq->peerHas(peers[n]);
}
/* JED this wasn't adding any peers. This is also an optimization so we can do this later
// FIXME: A peer may not have a ledger just because it accepts it as the network's consensus // FIXME: A peer may not have a ledger just because it accepts it as the network's consensus
for (std::vector<Peer::pointer>::const_iterator it = peerList.begin(), end = peerList.end(); for (std::vector<Peer::pointer>::const_iterator it = peerList.begin(), end = peerList.end();
it != end; ++it) it != end; ++it)
{ {
if ((*it)->getClosedLedgerHash() == closedLedger) if ((*it)->getClosedLedgerHash() == closedLedger)
acq->peerHas(*it); acq->peerHas(*it);
} }*/
return true; return true;
} }
consensus = acq->getLedger(); consensus = acq->getLedger();
@@ -474,7 +487,7 @@ void NetworkOPs::switchLastClosedLedger(Ledger::pointer newLedger)
theApp->getConnectionPool().relayMessage(NULL, packet); theApp->getConnectionPool().relayMessage(NULL, packet);
} }
int NetworkOPs::beginConsensus(Ledger::pointer closingLedger) int NetworkOPs::beginConsensus(const uint256& networkClosed, Ledger::pointer closingLedger)
{ {
Log(lsINFO) << "Ledger close time for ledger " << closingLedger->getLedgerSeq() ; Log(lsINFO) << "Ledger close time for ledger " << closingLedger->getLedgerSeq() ;
Log(lsINFO) << " LCL is " << closingLedger->getParentHash().GetHex(); Log(lsINFO) << " LCL is " << closingLedger->getParentHash().GetHex();
@@ -493,7 +506,7 @@ int NetworkOPs::beginConsensus(Ledger::pointer closingLedger)
if (!!mConsensus) mConsensus->abort(); if (!!mConsensus) mConsensus->abort();
prevLedger->setImmutable(); prevLedger->setImmutable();
mConsensus = boost::make_shared<LedgerConsensus>( mConsensus = boost::make_shared<LedgerConsensus>(
prevLedger->getHash(), // FIXME: Only do this if the previous ledger is the consensus previous ledger networkClosed,
prevLedger, theApp->getMasterLedger().getCurrentLedger()->getCloseTimeNC()); prevLedger, theApp->getMasterLedger().getCurrentLedger()->getCloseTimeNC());
Log(lsDEBUG) << "Pre-close time, initiating consensus engine"; Log(lsDEBUG) << "Pre-close time, initiating consensus engine";
@@ -504,6 +517,8 @@ int NetworkOPs::beginConsensus(Ledger::pointer closingLedger)
bool NetworkOPs::recvPropose(uint32 proposeSeq, const uint256& proposeHash, bool NetworkOPs::recvPropose(uint32 proposeSeq, const uint256& proposeHash,
const std::string& pubKey, const std::string& signature) const std::string& pubKey, const std::string& signature)
{ {
// JED: does mConsensus need to be locked?
// XXX Validate key. // XXX Validate key.
// XXX Take a vuc for pubkey. // XXX Take a vuc for pubkey.
NewcoinAddress naPeerPublic = NewcoinAddress::createNodePublic(strCopy(pubKey)); NewcoinAddress naPeerPublic = NewcoinAddress::createNodePublic(strCopy(pubKey));
@@ -520,11 +535,8 @@ bool NetworkOPs::recvPropose(uint32 proposeSeq, const uint256& proposeHash,
return false; return false;
} }
boost::shared_ptr<LedgerConsensus> consensus = mConsensus;
if (!consensus) return false;
LedgerProposal::pointer proposal = LedgerProposal::pointer proposal =
boost::make_shared<LedgerProposal>(consensus->getLCL(), proposeSeq, proposeHash, naPeerPublic); boost::make_shared<LedgerProposal>(mConsensus->getLCL(), proposeSeq, proposeHash, naPeerPublic);
if (!proposal->checkSign(signature)) if (!proposal->checkSign(signature))
{ // Note that if the LCL is different, the signature check will fail { // Note that if the LCL is different, the signature check will fail
Log(lsWARNING) << "Ledger proposal fails signature check"; Log(lsWARNING) << "Ledger proposal fails signature check";
@@ -540,7 +552,8 @@ bool NetworkOPs::recvPropose(uint32 proposeSeq, const uint256& proposeHash,
return true; return true;
} }
return consensus->peerPosition(proposal); return mConsensus->peerPosition(proposal);
} }
SHAMap::pointer NetworkOPs::getTXMap(const uint256& hash) SHAMap::pointer NetworkOPs::getTXMap(const uint256& hash)
@@ -626,6 +639,8 @@ std::vector< std::pair<uint32, uint256> >
bool NetworkOPs::recvValidation(SerializedValidation::pointer val) bool NetworkOPs::recvValidation(SerializedValidation::pointer val)
{ {
Log(lsINFO) << "recvValidation " << val->getLedgerHash().GetHex();
return theApp->getValidations().addValidation(val); return theApp->getValidations().addValidation(val);
} }

View File

@@ -124,8 +124,8 @@ public:
// network state machine // network state machine
void checkState(const boost::system::error_code& result); void checkState(const boost::system::error_code& result);
void switchLastClosedLedger(Ledger::pointer newLedger); // Used for the "jump" case void switchLastClosedLedger(Ledger::pointer newLedger); // Used for the "jump" case
bool checkLastClosedLedger(const std::vector<Peer::pointer> &); bool checkLastClosedLedger(const std::vector<Peer::pointer>&, uint256& networkClosed);
int beginConsensus(Ledger::pointer closingLedger); int beginConsensus(const uint256& networkClosed, Ledger::pointer closingLedger);
void endConsensus(); void endConsensus();
void setStateTimer(int seconds); void setStateTimer(int seconds);
Json::Value getServerInfo(); Json::Value getServerInfo();

View File

@@ -77,11 +77,12 @@ void Peer::detach(const char *rsn)
if (!mDetaching) if (!mDetaching)
{ {
mDetaching = true; // Race is ok. mDetaching = true; // Race is ok.
/*
Log(lsDEBUG) << "Peer: Detach: " Log(lsDEBUG) << "Peer: Detach: "
<< ADDRESS(this) << "> " << ADDRESS(this) << "> "
<< rsn << ": " << rsn << ": "
<< (mNodePublic.isValid() ? mNodePublic.humanNodePublic() : "-") << " " << getIP() << " " << getPort(); << (mNodePublic.isValid() ? mNodePublic.humanNodePublic() : "-") << " " << getIP() << " " << getPort();
*/
mSendQ.clear(); mSendQ.clear();
@@ -92,7 +93,7 @@ void Peer::detach(const char *rsn)
{ {
theApp->getConnectionPool().peerDisconnected(shared_from_this(), mNodePublic); theApp->getConnectionPool().peerDisconnected(shared_from_this(), mNodePublic);
mNodePublic.clear(); // Be idompotent. mNodePublic.clear(); // Be idempotent.
} }
if (!mIpPort.first.empty()) if (!mIpPort.first.empty())
@@ -101,13 +102,14 @@ void Peer::detach(const char *rsn)
// Might need to scan. Inform connection closed. // Might need to scan. Inform connection closed.
theApp->getConnectionPool().peerClosed(shared_from_this(), mIpPort.first, mIpPort.second); theApp->getConnectionPool().peerClosed(shared_from_this(), mIpPort.first, mIpPort.second);
mIpPort.first.clear(); // Be idompotent. mIpPort.first.clear(); // Be idempotent.
} }
/*
Log(lsDEBUG) << "Peer: Detach: " Log(lsDEBUG) << "Peer: Detach: "
<< ADDRESS(this) << "< " << ADDRESS(this) << "< "
<< rsn << ": " << rsn << ": "
<< (mNodePublic.isValid() ? mNodePublic.humanNodePublic() : "-") << " " << getIP() << " " << getPort(); << (mNodePublic.isValid() ? mNodePublic.humanNodePublic() : "-") << " " << getIP() << " " << getPort();
*/
} }
} }
@@ -129,7 +131,7 @@ void Peer::handleVerifyTimer(const boost::system::error_code& ecResult)
} }
else else
{ {
Log(lsINFO) << "Peer: Verify: Peer failed to verify in time."; //Log(lsINFO) << "Peer: Verify: Peer failed to verify in time.";
detach("hvt"); detach("hvt");
} }
@@ -787,7 +789,7 @@ void Peer::recvGetPeers(newcoin::TMGetPeers& packet)
addr->set_ipv4(inet_addr(strIP.c_str())); addr->set_ipv4(inet_addr(strIP.c_str()));
addr->set_ipv4port(iPort); addr->set_ipv4port(iPort);
Log(lsINFO) << "Peer: Teaching: " << ADDRESS(this) << ": " << n << ": " << strIP << " " << iPort; //Log(lsINFO) << "Peer: Teaching: " << ADDRESS(this) << ": " << n << ": " << strIP << " " << iPort;
} }
PackedMessage::pointer message = boost::make_shared<PackedMessage>(peers, newcoin::mtPEERS); PackedMessage::pointer message = boost::make_shared<PackedMessage>(peers, newcoin::mtPEERS);
@@ -809,7 +811,7 @@ void Peer::recvPeers(newcoin::TMPeers& packet)
if (strIP != "0.0.0.0" && strIP != "127.0.0.1") if (strIP != "0.0.0.0" && strIP != "127.0.0.1")
{ {
Log(lsINFO) << "Peer: Learning: " << ADDRESS(this) << ": " << i << ": " << strIP << " " << iPort; //Log(lsINFO) << "Peer: Learning: " << ADDRESS(this) << ": " << i << ": " << strIP << " " << iPort;
theApp->getConnectionPool().savePeer(strIP, iPort, UniqueNodeList::vsTold); theApp->getConnectionPool().savePeer(strIP, iPort, UniqueNodeList::vsTold);
} }
@@ -850,14 +852,14 @@ void Peer::recvAccount(newcoin::TMAccount& packet)
void Peer::recvStatus(newcoin::TMStatusChange& packet) void Peer::recvStatus(newcoin::TMStatusChange& packet)
{ {
Log(lsTRACE) << "Received status change from peer"; Log(lsTRACE) << "Received status change from peer" << getIP();
if (!packet.has_networktime()) if (!packet.has_networktime())
packet.set_networktime(theApp->getOPs().getNetworkTimeNC()); packet.set_networktime(theApp->getOPs().getNetworkTimeNC());
mLastStatus = packet; mLastStatus = packet;
if (packet.newevent() == newcoin::neLOST_SYNC) if (packet.newevent() == newcoin::neLOST_SYNC)
{ {
Log(lsTRACE) << "peer has lost sync"; Log(lsTRACE) << "peer has lost sync" << getIP();
mPreviousLedgerHash.zero(); mPreviousLedgerHash.zero();
mClosedLedgerHash.zero(); mClosedLedgerHash.zero();
return; return;
@@ -866,11 +868,11 @@ void Peer::recvStatus(newcoin::TMStatusChange& packet)
{ // a peer has changed ledgers { // a peer has changed ledgers
memcpy(mClosedLedgerHash.begin(), packet.ledgerhash().data(), 256 / 8); memcpy(mClosedLedgerHash.begin(), packet.ledgerhash().data(), 256 / 8);
mClosedLedgerTime = ptFromSeconds(packet.networktime()); mClosedLedgerTime = ptFromSeconds(packet.networktime());
Log(lsTRACE) << "peer LCL is " << mClosedLedgerHash.GetHex(); Log(lsTRACE) << "peer LCL is " << mClosedLedgerHash.GetHex() << " " << getIP();
} }
else else
{ {
Log(lsTRACE) << "peer has no ledger hash"; Log(lsTRACE) << "peer has no ledger hash" << getIP();
mClosedLedgerHash.zero(); mClosedLedgerHash.zero();
} }
@@ -889,7 +891,7 @@ void Peer::recvGetLedger(newcoin::TMGetLedger& packet)
if (packet.itype() == newcoin::liTS_CANDIDATE) if (packet.itype() == newcoin::liTS_CANDIDATE)
{ // Request is for a transaction candidate set { // Request is for a transaction candidate set
Log(lsINFO) << "Received request for TX candidate set data"; Log(lsINFO) << "Received request for TX candidate set data " << getIP();
Ledger::pointer ledger; Ledger::pointer ledger;
if ((!packet.has_ledgerhash() || packet.ledgerhash().size() != 32)) if ((!packet.has_ledgerhash() || packet.ledgerhash().size() != 32))
{ {
@@ -912,7 +914,7 @@ void Peer::recvGetLedger(newcoin::TMGetLedger& packet)
} }
else else
{ // Figure out what ledger they want { // Figure out what ledger they want
Log(lsINFO) << "Received request for ledger data"; Log(lsINFO) << "Received request for ledger data " << getIP();
Ledger::pointer ledger; Ledger::pointer ledger;
if (packet.has_ledgerhash()) if (packet.has_ledgerhash())
{ {

View File

@@ -17,7 +17,7 @@ CKey::pointer PubKeyCache::locate(const NewcoinAddress& id)
sql.append(id.humanAccountID()); sql.append(id.humanAccountID());
sql.append("';'"); sql.append("';'");
std::vector<unsigned char> data; std::vector<unsigned char> data;
data.reserve(65); // our public keys are actually 33 bytes data.resize(66); // our public keys are actually 33 bytes
int pkSize; int pkSize;
{ // is it in the database { // is it in the database
@@ -25,7 +25,7 @@ CKey::pointer PubKeyCache::locate(const NewcoinAddress& id)
Database* db=theApp->getTxnDB()->getDB(); Database* db=theApp->getTxnDB()->getDB();
if(!db->executeSQL(sql) || !db->startIterRows()) if(!db->executeSQL(sql) || !db->startIterRows())
return CKey::pointer(); return CKey::pointer();
pkSize=db->getBinary("PubKey", &(data.front()), data.size()); pkSize = db->getBinary("PubKey", &(data.front()), data.size());
db->endIterRows(); db->endIterRows();
} }
data.resize(pkSize); data.resize(pkSize);

View File

@@ -23,4 +23,4 @@
n9LQC4xFSWXNv1SU1sKtjrW6TZpBZSwp1nRWej8saGs155x42YFZ first n9LQC4xFSWXNv1SU1sKtjrW6TZpBZSwp1nRWej8saGs155x42YFZ first
n9LFzWuhKNvXStHAuemfRKFVECLApowncMAM5chSCL9R5ECHGN4V second n9LFzWuhKNvXStHAuemfRKFVECLApowncMAM5chSCL9R5ECHGN4V second
n9KXAZxiHkWuVGxDEE8boW7WmcycpZNmWei4vxVaywLZ391Nbuqx third n9KXAZxiHkWuVGxDEE8boW7WmcycpZNmWei4vxVaywLZ391Nbuqx third
n94365hzFKikgCULeJwczs3kwzpir3KVHkfhUWGT4MjmbEbC5xBy n94365hzFKikgCULeJwczs3kwzpir3KVHkfhUWGT4MjmbEbC5xBy