Merge pull request #3549
7d9d134
Remove redundant .c_str()s (Wladimir J. van der Laan)b77dfdc
Typesafe strprintf/error/LogPrint functions (Wladimir J. van der Laan)
This commit is contained in:
commit
6403c6c835
26 changed files with 1299 additions and 338 deletions
|
@ -189,7 +189,7 @@ case $host in
|
||||||
AC_MSG_ERROR("windres not found")
|
AC_MSG_ERROR("windres not found")
|
||||||
fi
|
fi
|
||||||
|
|
||||||
CPPFLAGS="$CPPFLAGS -D_MT -DWIN32 -D_WINDOWS -DBOOST_THREAD_USE_LIB -D__USE_MINGW_ANSI_STDIO"
|
CPPFLAGS="$CPPFLAGS -D_MT -DWIN32 -D_WINDOWS -DBOOST_THREAD_USE_LIB"
|
||||||
LEVELDB_TARGET_FLAGS="TARGET_OS=OS_WINDOWS_CROSSCOMPILE"
|
LEVELDB_TARGET_FLAGS="TARGET_OS=OS_WINDOWS_CROSSCOMPILE"
|
||||||
if test "x$CXXFLAGS_overridden" = "xno"; then
|
if test "x$CXXFLAGS_overridden" = "xno"; then
|
||||||
CXXFLAGS="$CXXFLAGS -w"
|
CXXFLAGS="$CXXFLAGS -w"
|
||||||
|
|
|
@ -60,6 +60,7 @@ BITCOIN_CORE_H = \
|
||||||
serialize.h \
|
serialize.h \
|
||||||
sync.h \
|
sync.h \
|
||||||
threadsafety.h \
|
threadsafety.h \
|
||||||
|
tinyformat.h \
|
||||||
txdb.h \
|
txdb.h \
|
||||||
txmempool.h \
|
txmempool.h \
|
||||||
ui_interface.h \
|
ui_interface.h \
|
||||||
|
|
|
@ -304,7 +304,7 @@ void CAddrMan::Good_(const CService &addr, int64_t nTime)
|
||||||
// TODO: maybe re-add the node, but for now, just bail out
|
// TODO: maybe re-add the node, but for now, just bail out
|
||||||
if (nUBucket == -1) return;
|
if (nUBucket == -1) return;
|
||||||
|
|
||||||
LogPrint("addrman", "Moving %s to tried\n", addr.ToString().c_str());
|
LogPrint("addrman", "Moving %s to tried\n", addr.ToString());
|
||||||
|
|
||||||
// move nId to the tried tables
|
// move nId to the tried tables
|
||||||
MakeTried(info, nId, nUBucket);
|
MakeTried(info, nId, nUBucket);
|
||||||
|
|
|
@ -69,18 +69,18 @@ std::string CUnsignedAlert::ToString() const
|
||||||
nExpiration,
|
nExpiration,
|
||||||
nID,
|
nID,
|
||||||
nCancel,
|
nCancel,
|
||||||
strSetCancel.c_str(),
|
strSetCancel,
|
||||||
nMinVer,
|
nMinVer,
|
||||||
nMaxVer,
|
nMaxVer,
|
||||||
strSetSubVer.c_str(),
|
strSetSubVer,
|
||||||
nPriority,
|
nPriority,
|
||||||
strComment.c_str(),
|
strComment,
|
||||||
strStatusBar.c_str());
|
strStatusBar);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CUnsignedAlert::print() const
|
void CUnsignedAlert::print() const
|
||||||
{
|
{
|
||||||
LogPrintf("%s", ToString().c_str());
|
LogPrintf("%s", ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
void CAlert::SetNull()
|
void CAlert::SetNull()
|
||||||
|
|
26
src/core.cpp
26
src/core.cpp
|
@ -9,12 +9,12 @@
|
||||||
|
|
||||||
std::string COutPoint::ToString() const
|
std::string COutPoint::ToString() const
|
||||||
{
|
{
|
||||||
return strprintf("COutPoint(%s, %u)", hash.ToString().substr(0,10).c_str(), n);
|
return strprintf("COutPoint(%s, %u)", hash.ToString().substr(0,10), n);
|
||||||
}
|
}
|
||||||
|
|
||||||
void COutPoint::print() const
|
void COutPoint::print() const
|
||||||
{
|
{
|
||||||
LogPrintf("%s\n", ToString().c_str());
|
LogPrintf("%s\n", ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
CTxIn::CTxIn(COutPoint prevoutIn, CScript scriptSigIn, unsigned int nSequenceIn)
|
CTxIn::CTxIn(COutPoint prevoutIn, CScript scriptSigIn, unsigned int nSequenceIn)
|
||||||
|
@ -37,9 +37,9 @@ std::string CTxIn::ToString() const
|
||||||
str += "CTxIn(";
|
str += "CTxIn(";
|
||||||
str += prevout.ToString();
|
str += prevout.ToString();
|
||||||
if (prevout.IsNull())
|
if (prevout.IsNull())
|
||||||
str += strprintf(", coinbase %s", HexStr(scriptSig).c_str());
|
str += strprintf(", coinbase %s", HexStr(scriptSig));
|
||||||
else
|
else
|
||||||
str += strprintf(", scriptSig=%s", scriptSig.ToString().substr(0,24).c_str());
|
str += strprintf(", scriptSig=%s", scriptSig.ToString().substr(0,24));
|
||||||
if (nSequence != std::numeric_limits<unsigned int>::max())
|
if (nSequence != std::numeric_limits<unsigned int>::max())
|
||||||
str += strprintf(", nSequence=%u", nSequence);
|
str += strprintf(", nSequence=%u", nSequence);
|
||||||
str += ")";
|
str += ")";
|
||||||
|
@ -48,7 +48,7 @@ std::string CTxIn::ToString() const
|
||||||
|
|
||||||
void CTxIn::print() const
|
void CTxIn::print() const
|
||||||
{
|
{
|
||||||
LogPrintf("%s\n", ToString().c_str());
|
LogPrintf("%s\n", ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
CTxOut::CTxOut(int64_t nValueIn, CScript scriptPubKeyIn)
|
CTxOut::CTxOut(int64_t nValueIn, CScript scriptPubKeyIn)
|
||||||
|
@ -64,12 +64,12 @@ uint256 CTxOut::GetHash() const
|
||||||
|
|
||||||
std::string CTxOut::ToString() const
|
std::string CTxOut::ToString() const
|
||||||
{
|
{
|
||||||
return strprintf("CTxOut(nValue=%"PRId64".%08"PRId64", scriptPubKey=%s)", nValue / COIN, nValue % COIN, scriptPubKey.ToString().substr(0,30).c_str());
|
return strprintf("CTxOut(nValue=%"PRId64".%08"PRId64", scriptPubKey=%s)", nValue / COIN, nValue % COIN, scriptPubKey.ToString().substr(0,30));
|
||||||
}
|
}
|
||||||
|
|
||||||
void CTxOut::print() const
|
void CTxOut::print() const
|
||||||
{
|
{
|
||||||
LogPrintf("%s\n", ToString().c_str());
|
LogPrintf("%s\n", ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
uint256 CTransaction::GetHash() const
|
uint256 CTransaction::GetHash() const
|
||||||
|
@ -141,7 +141,7 @@ std::string CTransaction::ToString() const
|
||||||
{
|
{
|
||||||
std::string str;
|
std::string str;
|
||||||
str += strprintf("CTransaction(hash=%s, ver=%d, vin.size=%"PRIszu", vout.size=%"PRIszu", nLockTime=%u)\n",
|
str += strprintf("CTransaction(hash=%s, ver=%d, vin.size=%"PRIszu", vout.size=%"PRIszu", nLockTime=%u)\n",
|
||||||
GetHash().ToString().substr(0,10).c_str(),
|
GetHash().ToString().substr(0,10),
|
||||||
nVersion,
|
nVersion,
|
||||||
vin.size(),
|
vin.size(),
|
||||||
vout.size(),
|
vout.size(),
|
||||||
|
@ -155,7 +155,7 @@ std::string CTransaction::ToString() const
|
||||||
|
|
||||||
void CTransaction::print() const
|
void CTransaction::print() const
|
||||||
{
|
{
|
||||||
LogPrintf("%s", ToString().c_str());
|
LogPrintf("%s", ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Amount compression:
|
// Amount compression:
|
||||||
|
@ -270,10 +270,10 @@ uint256 CBlock::CheckMerkleBranch(uint256 hash, const std::vector<uint256>& vMer
|
||||||
void CBlock::print() const
|
void CBlock::print() const
|
||||||
{
|
{
|
||||||
LogPrintf("CBlock(hash=%s, ver=%d, hashPrevBlock=%s, hashMerkleRoot=%s, nTime=%u, nBits=%08x, nNonce=%u, vtx=%"PRIszu")\n",
|
LogPrintf("CBlock(hash=%s, ver=%d, hashPrevBlock=%s, hashMerkleRoot=%s, nTime=%u, nBits=%08x, nNonce=%u, vtx=%"PRIszu")\n",
|
||||||
GetHash().ToString().c_str(),
|
GetHash().ToString(),
|
||||||
nVersion,
|
nVersion,
|
||||||
hashPrevBlock.ToString().c_str(),
|
hashPrevBlock.ToString(),
|
||||||
hashMerkleRoot.ToString().c_str(),
|
hashMerkleRoot.ToString(),
|
||||||
nTime, nBits, nNonce,
|
nTime, nBits, nNonce,
|
||||||
vtx.size());
|
vtx.size());
|
||||||
for (unsigned int i = 0; i < vtx.size(); i++)
|
for (unsigned int i = 0; i < vtx.size(); i++)
|
||||||
|
@ -283,6 +283,6 @@ void CBlock::print() const
|
||||||
}
|
}
|
||||||
LogPrintf(" vMerkleTree: ");
|
LogPrintf(" vMerkleTree: ");
|
||||||
for (unsigned int i = 0; i < vMerkleTree.size(); i++)
|
for (unsigned int i = 0; i < vMerkleTree.size(); i++)
|
||||||
LogPrintf("%s ", vMerkleTree[i].ToString().c_str());
|
LogPrintf("%s ", vMerkleTree[i].ToString());
|
||||||
LogPrintf("\n");
|
LogPrintf("\n");
|
||||||
}
|
}
|
||||||
|
|
16
src/db.cpp
16
src/db.cpp
|
@ -75,7 +75,7 @@ bool CDBEnv::Open(const boost::filesystem::path& pathIn)
|
||||||
filesystem::path pathLogDir = path / "database";
|
filesystem::path pathLogDir = path / "database";
|
||||||
filesystem::create_directory(pathLogDir);
|
filesystem::create_directory(pathLogDir);
|
||||||
filesystem::path pathErrorFile = path / "db.log";
|
filesystem::path pathErrorFile = path / "db.log";
|
||||||
LogPrintf("dbenv.open LogDir=%s ErrorFile=%s\n", pathLogDir.string().c_str(), pathErrorFile.string().c_str());
|
LogPrintf("dbenv.open LogDir=%s ErrorFile=%s\n", pathLogDir.string(), pathErrorFile.string());
|
||||||
|
|
||||||
unsigned int nEnvFlags = 0;
|
unsigned int nEnvFlags = 0;
|
||||||
if (GetBoolArg("-privdb", true))
|
if (GetBoolArg("-privdb", true))
|
||||||
|
@ -353,7 +353,7 @@ bool CDB::Rewrite(const string& strFile, const char* pszSkip)
|
||||||
bitdb.mapFileUseCount.erase(strFile);
|
bitdb.mapFileUseCount.erase(strFile);
|
||||||
|
|
||||||
bool fSuccess = true;
|
bool fSuccess = true;
|
||||||
LogPrintf("Rewriting %s...\n", strFile.c_str());
|
LogPrintf("Rewriting %s...\n", strFile);
|
||||||
string strFileRes = strFile + ".rewrite";
|
string strFileRes = strFile + ".rewrite";
|
||||||
{ // surround usage of db with extra {}
|
{ // surround usage of db with extra {}
|
||||||
CDB db(strFile.c_str(), "r");
|
CDB db(strFile.c_str(), "r");
|
||||||
|
@ -367,7 +367,7 @@ bool CDB::Rewrite(const string& strFile, const char* pszSkip)
|
||||||
0);
|
0);
|
||||||
if (ret > 0)
|
if (ret > 0)
|
||||||
{
|
{
|
||||||
LogPrintf("Cannot create database file %s\n", strFileRes.c_str());
|
LogPrintf("Cannot create database file %s\n", strFileRes);
|
||||||
fSuccess = false;
|
fSuccess = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -423,7 +423,7 @@ bool CDB::Rewrite(const string& strFile, const char* pszSkip)
|
||||||
fSuccess = false;
|
fSuccess = false;
|
||||||
}
|
}
|
||||||
if (!fSuccess)
|
if (!fSuccess)
|
||||||
LogPrintf("Rewriting of %s FAILED!\n", strFileRes.c_str());
|
LogPrintf("Rewriting of %s FAILED!\n", strFileRes);
|
||||||
return fSuccess;
|
return fSuccess;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -448,17 +448,17 @@ void CDBEnv::Flush(bool fShutdown)
|
||||||
{
|
{
|
||||||
string strFile = (*mi).first;
|
string strFile = (*mi).first;
|
||||||
int nRefCount = (*mi).second;
|
int nRefCount = (*mi).second;
|
||||||
LogPrint("db", "%s refcount=%d\n", strFile.c_str(), nRefCount);
|
LogPrint("db", "%s refcount=%d\n", strFile, nRefCount);
|
||||||
if (nRefCount == 0)
|
if (nRefCount == 0)
|
||||||
{
|
{
|
||||||
// Move log data to the dat file
|
// Move log data to the dat file
|
||||||
CloseDb(strFile);
|
CloseDb(strFile);
|
||||||
LogPrint("db", "%s checkpoint\n", strFile.c_str());
|
LogPrint("db", "%s checkpoint\n", strFile);
|
||||||
dbenv.txn_checkpoint(0, 0, 0);
|
dbenv.txn_checkpoint(0, 0, 0);
|
||||||
LogPrint("db", "%s detach\n", strFile.c_str());
|
LogPrint("db", "%s detach\n", strFile);
|
||||||
if (!fMockDb)
|
if (!fMockDb)
|
||||||
dbenv.lsn_reset(strFile.c_str(), 0);
|
dbenv.lsn_reset(strFile.c_str(), 0);
|
||||||
LogPrint("db", "%s closed\n", strFile.c_str());
|
LogPrint("db", "%s closed\n", strFile);
|
||||||
mapFileUseCount.erase(mi++);
|
mapFileUseCount.erase(mi++);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
44
src/init.cpp
44
src/init.cpp
|
@ -344,7 +344,7 @@ void ThreadImport(std::vector<boost::filesystem::path> vImportFiles)
|
||||||
FILE *file = fopen(path.string().c_str(), "rb");
|
FILE *file = fopen(path.string().c_str(), "rb");
|
||||||
if (file) {
|
if (file) {
|
||||||
CImportingNow imp;
|
CImportingNow imp;
|
||||||
LogPrintf("Importing %s...\n", path.string().c_str());
|
LogPrintf("Importing %s...\n", path.string());
|
||||||
LoadExternalBlockFile(file);
|
LoadExternalBlockFile(file);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -512,7 +512,7 @@ bool AppInit2(boost::thread_group& threadGroup)
|
||||||
if (ParseMoney(mapArgs["-mintxfee"], n) && n > 0)
|
if (ParseMoney(mapArgs["-mintxfee"], n) && n > 0)
|
||||||
CTransaction::nMinTxFee = n;
|
CTransaction::nMinTxFee = n;
|
||||||
else
|
else
|
||||||
return InitError(strprintf(_("Invalid amount for -mintxfee=<amount>: '%s'"), mapArgs["-mintxfee"].c_str()));
|
return InitError(strprintf(_("Invalid amount for -mintxfee=<amount>: '%s'"), mapArgs["-mintxfee"]));
|
||||||
}
|
}
|
||||||
if (mapArgs.count("-minrelaytxfee"))
|
if (mapArgs.count("-minrelaytxfee"))
|
||||||
{
|
{
|
||||||
|
@ -520,14 +520,14 @@ bool AppInit2(boost::thread_group& threadGroup)
|
||||||
if (ParseMoney(mapArgs["-minrelaytxfee"], n) && n > 0)
|
if (ParseMoney(mapArgs["-minrelaytxfee"], n) && n > 0)
|
||||||
CTransaction::nMinRelayTxFee = n;
|
CTransaction::nMinRelayTxFee = n;
|
||||||
else
|
else
|
||||||
return InitError(strprintf(_("Invalid amount for -minrelaytxfee=<amount>: '%s'"), mapArgs["-minrelaytxfee"].c_str()));
|
return InitError(strprintf(_("Invalid amount for -minrelaytxfee=<amount>: '%s'"), mapArgs["-minrelaytxfee"]));
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef ENABLE_WALLET
|
#ifdef ENABLE_WALLET
|
||||||
if (mapArgs.count("-paytxfee"))
|
if (mapArgs.count("-paytxfee"))
|
||||||
{
|
{
|
||||||
if (!ParseMoney(mapArgs["-paytxfee"], nTransactionFee))
|
if (!ParseMoney(mapArgs["-paytxfee"], nTransactionFee))
|
||||||
return InitError(strprintf(_("Invalid amount for -paytxfee=<amount>: '%s'"), mapArgs["-paytxfee"].c_str()));
|
return InitError(strprintf(_("Invalid amount for -paytxfee=<amount>: '%s'"), mapArgs["-paytxfee"]));
|
||||||
if (nTransactionFee > 0.25 * COIN)
|
if (nTransactionFee > 0.25 * COIN)
|
||||||
InitWarning(_("Warning: -paytxfee is set very high! This is the transaction fee you will pay if you send a transaction."));
|
InitWarning(_("Warning: -paytxfee is set very high! This is the transaction fee you will pay if you send a transaction."));
|
||||||
}
|
}
|
||||||
|
@ -540,7 +540,7 @@ bool AppInit2(boost::thread_group& threadGroup)
|
||||||
#ifdef ENABLE_WALLET
|
#ifdef ENABLE_WALLET
|
||||||
// Wallet file must be a plain filename without a directory
|
// Wallet file must be a plain filename without a directory
|
||||||
if (strWalletFile != boost::filesystem::basename(strWalletFile) + boost::filesystem::extension(strWalletFile))
|
if (strWalletFile != boost::filesystem::basename(strWalletFile) + boost::filesystem::extension(strWalletFile))
|
||||||
return InitError(strprintf(_("Wallet %s resides outside data directory %s"), strWalletFile.c_str(), strDataDir.c_str()));
|
return InitError(strprintf(_("Wallet %s resides outside data directory %s"), strWalletFile, strDataDir));
|
||||||
#endif
|
#endif
|
||||||
// Make sure only a single Bitcoin process is using the data directory.
|
// Make sure only a single Bitcoin process is using the data directory.
|
||||||
boost::filesystem::path pathLockFile = GetDataDir() / ".lock";
|
boost::filesystem::path pathLockFile = GetDataDir() / ".lock";
|
||||||
|
@ -548,17 +548,17 @@ bool AppInit2(boost::thread_group& threadGroup)
|
||||||
if (file) fclose(file);
|
if (file) fclose(file);
|
||||||
static boost::interprocess::file_lock lock(pathLockFile.string().c_str());
|
static boost::interprocess::file_lock lock(pathLockFile.string().c_str());
|
||||||
if (!lock.try_lock())
|
if (!lock.try_lock())
|
||||||
return InitError(strprintf(_("Cannot obtain a lock on data directory %s. Bitcoin is probably already running."), strDataDir.c_str()));
|
return InitError(strprintf(_("Cannot obtain a lock on data directory %s. Bitcoin is probably already running."), strDataDir));
|
||||||
|
|
||||||
if (GetBoolArg("-shrinkdebugfile", !fDebug))
|
if (GetBoolArg("-shrinkdebugfile", !fDebug))
|
||||||
ShrinkDebugFile();
|
ShrinkDebugFile();
|
||||||
LogPrintf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
|
LogPrintf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
|
||||||
LogPrintf("Bitcoin version %s (%s)\n", FormatFullVersion().c_str(), CLIENT_DATE.c_str());
|
LogPrintf("Bitcoin version %s (%s)\n", FormatFullVersion(), CLIENT_DATE);
|
||||||
LogPrintf("Using OpenSSL version %s\n", SSLeay_version(SSLEAY_VERSION));
|
LogPrintf("Using OpenSSL version %s\n", SSLeay_version(SSLEAY_VERSION));
|
||||||
if (!fLogTimestamps)
|
if (!fLogTimestamps)
|
||||||
LogPrintf("Startup time: %s\n", DateTimeStrFormat("%Y-%m-%d %H:%M:%S", GetTime()).c_str());
|
LogPrintf("Startup time: %s\n", DateTimeStrFormat("%Y-%m-%d %H:%M:%S", GetTime()));
|
||||||
LogPrintf("Default data directory %s\n", GetDefaultDataDir().string().c_str());
|
LogPrintf("Default data directory %s\n", GetDefaultDataDir().string());
|
||||||
LogPrintf("Using data directory %s\n", strDataDir.c_str());
|
LogPrintf("Using data directory %s\n", strDataDir);
|
||||||
LogPrintf("Using at most %i connections (%i file descriptors available)\n", nMaxConnections, nFD);
|
LogPrintf("Using at most %i connections (%i file descriptors available)\n", nMaxConnections, nFD);
|
||||||
std::ostringstream strErrors;
|
std::ostringstream strErrors;
|
||||||
|
|
||||||
|
@ -582,7 +582,7 @@ bool AppInit2(boost::thread_group& threadGroup)
|
||||||
boost::filesystem::path pathDatabaseBak = GetDataDir() / strprintf("database.%"PRId64".bak", GetTime());
|
boost::filesystem::path pathDatabaseBak = GetDataDir() / strprintf("database.%"PRId64".bak", GetTime());
|
||||||
try {
|
try {
|
||||||
boost::filesystem::rename(pathDatabase, pathDatabaseBak);
|
boost::filesystem::rename(pathDatabase, pathDatabaseBak);
|
||||||
LogPrintf("Moved old %s to %s. Retrying.\n", pathDatabase.string().c_str(), pathDatabaseBak.string().c_str());
|
LogPrintf("Moved old %s to %s. Retrying.\n", pathDatabase.string(), pathDatabaseBak.string());
|
||||||
} catch(boost::filesystem::filesystem_error &error) {
|
} catch(boost::filesystem::filesystem_error &error) {
|
||||||
// failure is ok (well, not really, but it's not worse than what we started with)
|
// failure is ok (well, not really, but it's not worse than what we started with)
|
||||||
}
|
}
|
||||||
|
@ -590,7 +590,7 @@ bool AppInit2(boost::thread_group& threadGroup)
|
||||||
// try again
|
// try again
|
||||||
if (!bitdb.Open(GetDataDir())) {
|
if (!bitdb.Open(GetDataDir())) {
|
||||||
// if it still fails, it probably means we can't even create the database env
|
// if it still fails, it probably means we can't even create the database env
|
||||||
string msg = strprintf(_("Error initializing wallet database environment %s!"), strDataDir.c_str());
|
string msg = strprintf(_("Error initializing wallet database environment %s!"), strDataDir);
|
||||||
return InitError(msg);
|
return InitError(msg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -610,7 +610,7 @@ bool AppInit2(boost::thread_group& threadGroup)
|
||||||
string msg = strprintf(_("Warning: wallet.dat corrupt, data salvaged!"
|
string msg = strprintf(_("Warning: wallet.dat corrupt, data salvaged!"
|
||||||
" Original wallet.dat saved as wallet.{timestamp}.bak in %s; if"
|
" Original wallet.dat saved as wallet.{timestamp}.bak in %s; if"
|
||||||
" your balance or transactions are incorrect you should"
|
" your balance or transactions are incorrect you should"
|
||||||
" restore from a backup."), strDataDir.c_str());
|
" restore from a backup."), strDataDir);
|
||||||
InitWarning(msg);
|
InitWarning(msg);
|
||||||
}
|
}
|
||||||
if (r == CDBEnv::RECOVER_FAIL)
|
if (r == CDBEnv::RECOVER_FAIL)
|
||||||
|
@ -631,7 +631,7 @@ bool AppInit2(boost::thread_group& threadGroup)
|
||||||
BOOST_FOREACH(std::string snet, mapMultiArgs["-onlynet"]) {
|
BOOST_FOREACH(std::string snet, mapMultiArgs["-onlynet"]) {
|
||||||
enum Network net = ParseNetwork(snet);
|
enum Network net = ParseNetwork(snet);
|
||||||
if (net == NET_UNROUTABLE)
|
if (net == NET_UNROUTABLE)
|
||||||
return InitError(strprintf(_("Unknown network specified in -onlynet: '%s'"), snet.c_str()));
|
return InitError(strprintf(_("Unknown network specified in -onlynet: '%s'"), snet));
|
||||||
nets.insert(net);
|
nets.insert(net);
|
||||||
}
|
}
|
||||||
for (int n = 0; n < NET_MAX; n++) {
|
for (int n = 0; n < NET_MAX; n++) {
|
||||||
|
@ -652,7 +652,7 @@ bool AppInit2(boost::thread_group& threadGroup)
|
||||||
if (mapArgs.count("-proxy")) {
|
if (mapArgs.count("-proxy")) {
|
||||||
addrProxy = CService(mapArgs["-proxy"], 9050);
|
addrProxy = CService(mapArgs["-proxy"], 9050);
|
||||||
if (!addrProxy.IsValid())
|
if (!addrProxy.IsValid())
|
||||||
return InitError(strprintf(_("Invalid -proxy address: '%s'"), mapArgs["-proxy"].c_str()));
|
return InitError(strprintf(_("Invalid -proxy address: '%s'"), mapArgs["-proxy"]));
|
||||||
|
|
||||||
if (!IsLimited(NET_IPV4))
|
if (!IsLimited(NET_IPV4))
|
||||||
SetProxy(NET_IPV4, addrProxy, nSocksVersion);
|
SetProxy(NET_IPV4, addrProxy, nSocksVersion);
|
||||||
|
@ -679,7 +679,7 @@ bool AppInit2(boost::thread_group& threadGroup)
|
||||||
else
|
else
|
||||||
addrOnion = mapArgs.count("-onion")?CService(mapArgs["-onion"], 9050):CService(mapArgs["-tor"], 9050);
|
addrOnion = mapArgs.count("-onion")?CService(mapArgs["-onion"], 9050):CService(mapArgs["-tor"], 9050);
|
||||||
if (!addrOnion.IsValid())
|
if (!addrOnion.IsValid())
|
||||||
return InitError(strprintf(_("Invalid -onion address: '%s'"), mapArgs.count("-onion")?mapArgs["-onion"].c_str():mapArgs["-tor"].c_str()));
|
return InitError(strprintf(_("Invalid -onion address: '%s'"), mapArgs.count("-onion")?mapArgs["-onion"]:mapArgs["-tor"]));
|
||||||
SetProxy(NET_TOR, addrOnion, 5);
|
SetProxy(NET_TOR, addrOnion, 5);
|
||||||
SetReachable(NET_TOR);
|
SetReachable(NET_TOR);
|
||||||
}
|
}
|
||||||
|
@ -695,7 +695,7 @@ bool AppInit2(boost::thread_group& threadGroup)
|
||||||
BOOST_FOREACH(std::string strBind, mapMultiArgs["-bind"]) {
|
BOOST_FOREACH(std::string strBind, mapMultiArgs["-bind"]) {
|
||||||
CService addrBind;
|
CService addrBind;
|
||||||
if (!Lookup(strBind.c_str(), addrBind, GetListenPort(), false))
|
if (!Lookup(strBind.c_str(), addrBind, GetListenPort(), false))
|
||||||
return InitError(strprintf(_("Cannot resolve -bind address: '%s'"), strBind.c_str()));
|
return InitError(strprintf(_("Cannot resolve -bind address: '%s'"), strBind));
|
||||||
fBound |= Bind(addrBind, (BF_EXPLICIT | BF_REPORT_ERROR));
|
fBound |= Bind(addrBind, (BF_EXPLICIT | BF_REPORT_ERROR));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -715,7 +715,7 @@ bool AppInit2(boost::thread_group& threadGroup)
|
||||||
BOOST_FOREACH(string strAddr, mapMultiArgs["-externalip"]) {
|
BOOST_FOREACH(string strAddr, mapMultiArgs["-externalip"]) {
|
||||||
CService addrLocal(strAddr, GetListenPort(), fNameLookup);
|
CService addrLocal(strAddr, GetListenPort(), fNameLookup);
|
||||||
if (!addrLocal.IsValid())
|
if (!addrLocal.IsValid())
|
||||||
return InitError(strprintf(_("Cannot resolve -externalip address: '%s'"), strAddr.c_str()));
|
return InitError(strprintf(_("Cannot resolve -externalip address: '%s'"), strAddr));
|
||||||
AddLocal(CService(strAddr, GetListenPort(), fNameLookup), LOCAL_MANUAL);
|
AddLocal(CService(strAddr, GetListenPort(), fNameLookup), LOCAL_MANUAL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -739,7 +739,7 @@ bool AppInit2(boost::thread_group& threadGroup)
|
||||||
filesystem::path dest = blocksDir / strprintf("blk%05u.dat", i-1);
|
filesystem::path dest = blocksDir / strprintf("blk%05u.dat", i-1);
|
||||||
try {
|
try {
|
||||||
filesystem::create_hard_link(source, dest);
|
filesystem::create_hard_link(source, dest);
|
||||||
LogPrintf("Hardlinked %s -> %s\n", source.string().c_str(), dest.string().c_str());
|
LogPrintf("Hardlinked %s -> %s\n", source.string(), dest.string());
|
||||||
linked = true;
|
linked = true;
|
||||||
} catch (filesystem::filesystem_error & e) {
|
} catch (filesystem::filesystem_error & e) {
|
||||||
// Note: hardlink creation failing is not a disaster, it just means
|
// Note: hardlink creation failing is not a disaster, it just means
|
||||||
|
@ -879,7 +879,7 @@ bool AppInit2(boost::thread_group& threadGroup)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (nFound == 0)
|
if (nFound == 0)
|
||||||
LogPrintf("No blocks matching %s were found\n", strMatch.c_str());
|
LogPrintf("No blocks matching %s were found\n", strMatch);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -910,7 +910,7 @@ bool AppInit2(boost::thread_group& threadGroup)
|
||||||
else if (nLoadWalletRet == DB_NEED_REWRITE)
|
else if (nLoadWalletRet == DB_NEED_REWRITE)
|
||||||
{
|
{
|
||||||
strErrors << _("Wallet needed to be rewritten: restart Bitcoin to complete") << "\n";
|
strErrors << _("Wallet needed to be rewritten: restart Bitcoin to complete") << "\n";
|
||||||
LogPrintf("%s", strErrors.str().c_str());
|
LogPrintf("%s", strErrors.str());
|
||||||
return InitError(strErrors.str());
|
return InitError(strErrors.str());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -948,7 +948,7 @@ bool AppInit2(boost::thread_group& threadGroup)
|
||||||
pwalletMain->SetBestChain(chainActive.GetLocator());
|
pwalletMain->SetBestChain(chainActive.GetLocator());
|
||||||
}
|
}
|
||||||
|
|
||||||
LogPrintf("%s", strErrors.str().c_str());
|
LogPrintf("%s", strErrors.str());
|
||||||
LogPrintf(" wallet %15"PRId64"ms\n", GetTimeMillis() - nStart);
|
LogPrintf(" wallet %15"PRId64"ms\n", GetTimeMillis() - nStart);
|
||||||
|
|
||||||
RegisterWallet(pwalletMain);
|
RegisterWallet(pwalletMain);
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
void HandleError(const leveldb::Status &status) throw(leveldb_error) {
|
void HandleError(const leveldb::Status &status) throw(leveldb_error) {
|
||||||
if (status.ok())
|
if (status.ok())
|
||||||
return;
|
return;
|
||||||
LogPrintf("%s\n", status.ToString().c_str());
|
LogPrintf("%s\n", status.ToString());
|
||||||
if (status.IsCorruption())
|
if (status.IsCorruption())
|
||||||
throw leveldb_error("Database corrupted");
|
throw leveldb_error("Database corrupted");
|
||||||
if (status.IsIOError())
|
if (status.IsIOError())
|
||||||
|
@ -48,11 +48,11 @@ CLevelDBWrapper::CLevelDBWrapper(const boost::filesystem::path &path, size_t nCa
|
||||||
options.env = penv;
|
options.env = penv;
|
||||||
} else {
|
} else {
|
||||||
if (fWipe) {
|
if (fWipe) {
|
||||||
LogPrintf("Wiping LevelDB in %s\n", path.string().c_str());
|
LogPrintf("Wiping LevelDB in %s\n", path.string());
|
||||||
leveldb::DestroyDB(path.string(), options);
|
leveldb::DestroyDB(path.string(), options);
|
||||||
}
|
}
|
||||||
boost::filesystem::create_directory(path);
|
boost::filesystem::create_directory(path);
|
||||||
LogPrintf("Opening LevelDB in %s\n", path.string().c_str());
|
LogPrintf("Opening LevelDB in %s\n", path.string());
|
||||||
}
|
}
|
||||||
leveldb::Status status = leveldb::DB::Open(options, path.string(), &pdb);
|
leveldb::Status status = leveldb::DB::Open(options, path.string(), &pdb);
|
||||||
HandleError(status);
|
HandleError(status);
|
||||||
|
|
150
src/main.cpp
150
src/main.cpp
|
@ -309,7 +309,7 @@ bool AddOrphanTx(const CTransaction& tx)
|
||||||
unsigned int sz = tx.GetSerializeSize(SER_NETWORK, CTransaction::CURRENT_VERSION);
|
unsigned int sz = tx.GetSerializeSize(SER_NETWORK, CTransaction::CURRENT_VERSION);
|
||||||
if (sz > 5000)
|
if (sz > 5000)
|
||||||
{
|
{
|
||||||
LogPrint("mempool", "ignoring large orphan tx (size: %u, hash: %s)\n", sz, hash.ToString().c_str());
|
LogPrint("mempool", "ignoring large orphan tx (size: %u, hash: %s)\n", sz, hash.ToString());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -317,7 +317,7 @@ bool AddOrphanTx(const CTransaction& tx)
|
||||||
BOOST_FOREACH(const CTxIn& txin, tx.vin)
|
BOOST_FOREACH(const CTxIn& txin, tx.vin)
|
||||||
mapOrphanTransactionsByPrev[txin.prevout.hash].insert(hash);
|
mapOrphanTransactionsByPrev[txin.prevout.hash].insert(hash);
|
||||||
|
|
||||||
LogPrint("mempool", "stored orphan tx %s (mapsz %"PRIszu")\n", hash.ToString().c_str(),
|
LogPrint("mempool", "stored orphan tx %s (mapsz %"PRIszu")\n", hash.ToString(),
|
||||||
mapOrphanTransactions.size());
|
mapOrphanTransactions.size());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -693,7 +693,7 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa
|
||||||
string reason;
|
string reason;
|
||||||
if (Params().NetworkID() == CChainParams::MAIN && !IsStandardTx(tx, reason))
|
if (Params().NetworkID() == CChainParams::MAIN && !IsStandardTx(tx, reason))
|
||||||
return state.DoS(0,
|
return state.DoS(0,
|
||||||
error("AcceptToMemoryPool : nonstandard transaction: %s", reason.c_str()),
|
error("AcceptToMemoryPool : nonstandard transaction: %s", reason),
|
||||||
REJECT_NONSTANDARD, reason);
|
REJECT_NONSTANDARD, reason);
|
||||||
|
|
||||||
// is it already in the memory pool?
|
// is it already in the memory pool?
|
||||||
|
@ -771,7 +771,7 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa
|
||||||
int64_t txMinFee = GetMinFee(tx, nSize, true, GMF_RELAY);
|
int64_t txMinFee = GetMinFee(tx, nSize, true, GMF_RELAY);
|
||||||
if (fLimitFree && nFees < txMinFee)
|
if (fLimitFree && nFees < txMinFee)
|
||||||
return state.DoS(0, error("AcceptToMemoryPool : not enough fees %s, %"PRId64" < %"PRId64,
|
return state.DoS(0, error("AcceptToMemoryPool : not enough fees %s, %"PRId64" < %"PRId64,
|
||||||
hash.ToString().c_str(), nFees, txMinFee),
|
hash.ToString(), nFees, txMinFee),
|
||||||
REJECT_INSUFFICIENTFEE, "insufficient fee");
|
REJECT_INSUFFICIENTFEE, "insufficient fee");
|
||||||
|
|
||||||
// Continuously rate-limit free transactions
|
// Continuously rate-limit free transactions
|
||||||
|
@ -800,14 +800,14 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa
|
||||||
|
|
||||||
if (fRejectInsaneFee && nFees > CTransaction::nMinRelayTxFee * 10000)
|
if (fRejectInsaneFee && nFees > CTransaction::nMinRelayTxFee * 10000)
|
||||||
return error("AcceptToMemoryPool: : insane fees %s, %"PRId64" > %"PRId64,
|
return error("AcceptToMemoryPool: : insane fees %s, %"PRId64" > %"PRId64,
|
||||||
hash.ToString().c_str(),
|
hash.ToString(),
|
||||||
nFees, CTransaction::nMinRelayTxFee * 10000);
|
nFees, CTransaction::nMinRelayTxFee * 10000);
|
||||||
|
|
||||||
// Check against previous transactions
|
// Check against previous transactions
|
||||||
// This is done last to help prevent CPU exhaustion denial-of-service attacks.
|
// This is done last to help prevent CPU exhaustion denial-of-service attacks.
|
||||||
if (!CheckInputs(tx, state, view, true, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_STRICTENC))
|
if (!CheckInputs(tx, state, view, true, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_STRICTENC))
|
||||||
{
|
{
|
||||||
return error("AcceptToMemoryPool: : ConnectInputs failed %s", hash.ToString().c_str());
|
return error("AcceptToMemoryPool: : ConnectInputs failed %s", hash.ToString());
|
||||||
}
|
}
|
||||||
// Store transaction in memory
|
// Store transaction in memory
|
||||||
pool.addUnchecked(hash, entry);
|
pool.addUnchecked(hash, entry);
|
||||||
|
@ -1101,8 +1101,8 @@ unsigned int GetNextWorkRequired(const CBlockIndex* pindexLast, const CBlockHead
|
||||||
/// debug print
|
/// debug print
|
||||||
LogPrintf("GetNextWorkRequired RETARGET\n");
|
LogPrintf("GetNextWorkRequired RETARGET\n");
|
||||||
LogPrintf("nTargetTimespan = %"PRId64" nActualTimespan = %"PRId64"\n", nTargetTimespan, nActualTimespan);
|
LogPrintf("nTargetTimespan = %"PRId64" nActualTimespan = %"PRId64"\n", nTargetTimespan, nActualTimespan);
|
||||||
LogPrintf("Before: %08x %s\n", pindexLast->nBits, CBigNum().SetCompact(pindexLast->nBits).getuint256().ToString().c_str());
|
LogPrintf("Before: %08x %s\n", pindexLast->nBits, CBigNum().SetCompact(pindexLast->nBits).getuint256().ToString());
|
||||||
LogPrintf("After: %08x %s\n", bnNew.GetCompact(), bnNew.getuint256().ToString().c_str());
|
LogPrintf("After: %08x %s\n", bnNew.GetCompact(), bnNew.getuint256().ToString());
|
||||||
|
|
||||||
return bnNew.GetCompact();
|
return bnNew.GetCompact();
|
||||||
}
|
}
|
||||||
|
@ -1176,8 +1176,8 @@ void CheckForkWarningConditions()
|
||||||
if (pindexBestForkTip)
|
if (pindexBestForkTip)
|
||||||
{
|
{
|
||||||
LogPrintf("CheckForkWarningConditions: Warning: Large valid fork found\n forking the chain at height %d (%s)\n lasting to height %d (%s).\nChain state database corruption likely.\n",
|
LogPrintf("CheckForkWarningConditions: Warning: Large valid fork found\n forking the chain at height %d (%s)\n lasting to height %d (%s).\nChain state database corruption likely.\n",
|
||||||
pindexBestForkBase->nHeight, pindexBestForkBase->phashBlock->ToString().c_str(),
|
pindexBestForkBase->nHeight, pindexBestForkBase->phashBlock->ToString(),
|
||||||
pindexBestForkTip->nHeight, pindexBestForkTip->phashBlock->ToString().c_str());
|
pindexBestForkTip->nHeight, pindexBestForkTip->phashBlock->ToString());
|
||||||
fLargeWorkForkFound = true;
|
fLargeWorkForkFound = true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -1237,12 +1237,12 @@ void static InvalidChainFound(CBlockIndex* pindexNew)
|
||||||
uiInterface.NotifyBlocksChanged();
|
uiInterface.NotifyBlocksChanged();
|
||||||
}
|
}
|
||||||
LogPrintf("InvalidChainFound: invalid block=%s height=%d log2_work=%.8g date=%s\n",
|
LogPrintf("InvalidChainFound: invalid block=%s height=%d log2_work=%.8g date=%s\n",
|
||||||
pindexNew->GetBlockHash().ToString().c_str(), pindexNew->nHeight,
|
pindexNew->GetBlockHash().ToString(), pindexNew->nHeight,
|
||||||
log(pindexNew->nChainWork.getdouble())/log(2.0), DateTimeStrFormat("%Y-%m-%d %H:%M:%S",
|
log(pindexNew->nChainWork.getdouble())/log(2.0), DateTimeStrFormat("%Y-%m-%d %H:%M:%S",
|
||||||
pindexNew->GetBlockTime()).c_str());
|
pindexNew->GetBlockTime()));
|
||||||
LogPrintf("InvalidChainFound: current best=%s height=%d log2_work=%.8g date=%s\n",
|
LogPrintf("InvalidChainFound: current best=%s height=%d log2_work=%.8g date=%s\n",
|
||||||
chainActive.Tip()->GetBlockHash().ToString().c_str(), chainActive.Height(), log(chainActive.Tip()->nChainWork.getdouble())/log(2.0),
|
chainActive.Tip()->GetBlockHash().ToString(), chainActive.Height(), log(chainActive.Tip()->nChainWork.getdouble())/log(2.0),
|
||||||
DateTimeStrFormat("%Y-%m-%d %H:%M:%S", chainActive.Tip()->GetBlockTime()).c_str());
|
DateTimeStrFormat("%Y-%m-%d %H:%M:%S", chainActive.Tip()->GetBlockTime()));
|
||||||
CheckForkWarningConditions();
|
CheckForkWarningConditions();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1350,7 +1350,7 @@ void UpdateCoins(const CTransaction& tx, CValidationState &state, CCoinsViewCach
|
||||||
bool CScriptCheck::operator()() const {
|
bool CScriptCheck::operator()() const {
|
||||||
const CScript &scriptSig = ptxTo->vin[nIn].scriptSig;
|
const CScript &scriptSig = ptxTo->vin[nIn].scriptSig;
|
||||||
if (!VerifyScript(scriptSig, scriptPubKey, *ptxTo, nIn, nFlags, nHashType))
|
if (!VerifyScript(scriptSig, scriptPubKey, *ptxTo, nIn, nFlags, nHashType))
|
||||||
return error("CScriptCheck() : %s VerifySignature failed", ptxTo->GetHash().ToString().c_str());
|
return error("CScriptCheck() : %s VerifySignature failed", ptxTo->GetHash().ToString());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1369,7 +1369,7 @@ bool CheckInputs(const CTransaction& tx, CValidationState &state, CCoinsViewCach
|
||||||
// This doesn't trigger the DoS code on purpose; if it did, it would make it easier
|
// This doesn't trigger the DoS code on purpose; if it did, it would make it easier
|
||||||
// for an attacker to attempt to split the network.
|
// for an attacker to attempt to split the network.
|
||||||
if (!inputs.HaveInputs(tx))
|
if (!inputs.HaveInputs(tx))
|
||||||
return state.Invalid(error("CheckInputs() : %s inputs unavailable", tx.GetHash().ToString().c_str()));
|
return state.Invalid(error("CheckInputs() : %s inputs unavailable", tx.GetHash().ToString()));
|
||||||
|
|
||||||
// While checking, GetBestBlock() refers to the parent block.
|
// While checking, GetBestBlock() refers to the parent block.
|
||||||
// This is also true for mempool checks.
|
// This is also true for mempool checks.
|
||||||
|
@ -1399,13 +1399,13 @@ bool CheckInputs(const CTransaction& tx, CValidationState &state, CCoinsViewCach
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nValueIn < tx.GetValueOut())
|
if (nValueIn < tx.GetValueOut())
|
||||||
return state.DoS(100, error("CheckInputs() : %s value in < value out", tx.GetHash().ToString().c_str()),
|
return state.DoS(100, error("CheckInputs() : %s value in < value out", tx.GetHash().ToString()),
|
||||||
REJECT_INVALID, "in < out");
|
REJECT_INVALID, "in < out");
|
||||||
|
|
||||||
// Tally transaction fees
|
// Tally transaction fees
|
||||||
int64_t nTxFee = nValueIn - tx.GetValueOut();
|
int64_t nTxFee = nValueIn - tx.GetValueOut();
|
||||||
if (nTxFee < 0)
|
if (nTxFee < 0)
|
||||||
return state.DoS(100, error("CheckInputs() : %s nTxFee < 0", tx.GetHash().ToString().c_str()),
|
return state.DoS(100, error("CheckInputs() : %s nTxFee < 0", tx.GetHash().ToString()),
|
||||||
REJECT_INVALID, "fee < 0");
|
REJECT_INVALID, "fee < 0");
|
||||||
nFees += nTxFee;
|
nFees += nTxFee;
|
||||||
if (!MoneyRange(nFees))
|
if (!MoneyRange(nFees))
|
||||||
|
@ -1766,8 +1766,8 @@ bool SetBestChain(CValidationState &state, CBlockIndex* pindexNew)
|
||||||
reverse(vConnect.begin(), vConnect.end());
|
reverse(vConnect.begin(), vConnect.end());
|
||||||
|
|
||||||
if (vDisconnect.size() > 0) {
|
if (vDisconnect.size() > 0) {
|
||||||
LogPrintf("REORGANIZE: Disconnect %"PRIszu" blocks; %s...\n", vDisconnect.size(), pfork->GetBlockHash().ToString().c_str());
|
LogPrintf("REORGANIZE: Disconnect %"PRIszu" blocks; %s...\n", vDisconnect.size(), pfork->GetBlockHash().ToString());
|
||||||
LogPrintf("REORGANIZE: Connect %"PRIszu" blocks; ...%s\n", vConnect.size(), pindexNew->GetBlockHash().ToString().c_str());
|
LogPrintf("REORGANIZE: Connect %"PRIszu" blocks; ...%s\n", vConnect.size(), pindexNew->GetBlockHash().ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Disconnect shorter branch
|
// Disconnect shorter branch
|
||||||
|
@ -1778,7 +1778,7 @@ bool SetBestChain(CValidationState &state, CBlockIndex* pindexNew)
|
||||||
return state.Abort(_("Failed to read block"));
|
return state.Abort(_("Failed to read block"));
|
||||||
int64_t nStart = GetTimeMicros();
|
int64_t nStart = GetTimeMicros();
|
||||||
if (!DisconnectBlock(block, state, pindex, view))
|
if (!DisconnectBlock(block, state, pindex, view))
|
||||||
return error("SetBestBlock() : DisconnectBlock %s failed", pindex->GetBlockHash().ToString().c_str());
|
return error("SetBestBlock() : DisconnectBlock %s failed", pindex->GetBlockHash().ToString());
|
||||||
if (fBenchmark)
|
if (fBenchmark)
|
||||||
LogPrintf("- Disconnect: %.2fms\n", (GetTimeMicros() - nStart) * 0.001);
|
LogPrintf("- Disconnect: %.2fms\n", (GetTimeMicros() - nStart) * 0.001);
|
||||||
|
|
||||||
|
@ -1802,7 +1802,7 @@ bool SetBestChain(CValidationState &state, CBlockIndex* pindexNew)
|
||||||
InvalidChainFound(pindexNew);
|
InvalidChainFound(pindexNew);
|
||||||
InvalidBlockFound(pindex);
|
InvalidBlockFound(pindex);
|
||||||
}
|
}
|
||||||
return error("SetBestBlock() : ConnectBlock %s failed", pindex->GetBlockHash().ToString().c_str());
|
return error("SetBestBlock() : ConnectBlock %s failed", pindex->GetBlockHash().ToString());
|
||||||
}
|
}
|
||||||
if (fBenchmark)
|
if (fBenchmark)
|
||||||
LogPrintf("- Connect: %.2fms\n", (GetTimeMicros() - nStart) * 0.001);
|
LogPrintf("- Connect: %.2fms\n", (GetTimeMicros() - nStart) * 0.001);
|
||||||
|
@ -1868,8 +1868,8 @@ bool SetBestChain(CValidationState &state, CBlockIndex* pindexNew)
|
||||||
nTimeBestReceived = GetTime();
|
nTimeBestReceived = GetTime();
|
||||||
mempool.AddTransactionsUpdated(1);
|
mempool.AddTransactionsUpdated(1);
|
||||||
LogPrintf("SetBestChain: new best=%s height=%d log2_work=%.8g tx=%lu date=%s progress=%f\n",
|
LogPrintf("SetBestChain: new best=%s height=%d log2_work=%.8g tx=%lu date=%s progress=%f\n",
|
||||||
chainActive.Tip()->GetBlockHash().ToString().c_str(), chainActive.Height(), log(chainActive.Tip()->nChainWork.getdouble())/log(2.0), (unsigned long)pindexNew->nChainTx,
|
chainActive.Tip()->GetBlockHash().ToString(), chainActive.Height(), log(chainActive.Tip()->nChainWork.getdouble())/log(2.0), (unsigned long)pindexNew->nChainTx,
|
||||||
DateTimeStrFormat("%Y-%m-%d %H:%M:%S", chainActive.Tip()->GetBlockTime()).c_str(),
|
DateTimeStrFormat("%Y-%m-%d %H:%M:%S", chainActive.Tip()->GetBlockTime()),
|
||||||
Checkpoints::GuessVerificationProgress(chainActive.Tip()));
|
Checkpoints::GuessVerificationProgress(chainActive.Tip()));
|
||||||
|
|
||||||
// Check the version of the last 100 blocks to see if we need to upgrade:
|
// Check the version of the last 100 blocks to see if we need to upgrade:
|
||||||
|
@ -1884,7 +1884,7 @@ bool SetBestChain(CValidationState &state, CBlockIndex* pindexNew)
|
||||||
pindex = pindex->pprev;
|
pindex = pindex->pprev;
|
||||||
}
|
}
|
||||||
if (nUpgraded > 0)
|
if (nUpgraded > 0)
|
||||||
LogPrintf("SetBestChain: %d of last 100 blocks above version %d\n", nUpgraded, CBlock::CURRENT_VERSION);
|
LogPrintf("SetBestChain: %d of last 100 blocks above version %d\n", nUpgraded, (int)CBlock::CURRENT_VERSION);
|
||||||
if (nUpgraded > 100/2)
|
if (nUpgraded > 100/2)
|
||||||
// strMiscWarning is read by GetWarnings(), called by Qt and the JSON-RPC code to warn the user:
|
// strMiscWarning is read by GetWarnings(), called by Qt and the JSON-RPC code to warn the user:
|
||||||
strMiscWarning = _("Warning: This version is obsolete, upgrade required!");
|
strMiscWarning = _("Warning: This version is obsolete, upgrade required!");
|
||||||
|
@ -1907,7 +1907,7 @@ bool AddToBlockIndex(CBlock& block, CValidationState& state, const CDiskBlockPos
|
||||||
// Check for duplicate
|
// Check for duplicate
|
||||||
uint256 hash = block.GetHash();
|
uint256 hash = block.GetHash();
|
||||||
if (mapBlockIndex.count(hash))
|
if (mapBlockIndex.count(hash))
|
||||||
return state.Invalid(error("AddToBlockIndex() : %s already exists", hash.ToString().c_str()));
|
return state.Invalid(error("AddToBlockIndex() : %s already exists", hash.ToString()));
|
||||||
|
|
||||||
// Construct new block index object
|
// Construct new block index object
|
||||||
CBlockIndex* pindexNew = new CBlockIndex(block);
|
CBlockIndex* pindexNew = new CBlockIndex(block);
|
||||||
|
@ -1970,7 +1970,7 @@ bool FindBlockPos(CValidationState &state, CDiskBlockPos &pos, unsigned int nAdd
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
while (infoLastBlockFile.nSize + nAddSize >= MAX_BLOCKFILE_SIZE) {
|
while (infoLastBlockFile.nSize + nAddSize >= MAX_BLOCKFILE_SIZE) {
|
||||||
LogPrintf("Leaving block file %i: %s\n", nLastBlockFile, infoLastBlockFile.ToString().c_str());
|
LogPrintf("Leaving block file %i: %s\n", nLastBlockFile, infoLastBlockFile.ToString());
|
||||||
FlushBlockFile(true);
|
FlushBlockFile(true);
|
||||||
nLastBlockFile++;
|
nLastBlockFile++;
|
||||||
infoLastBlockFile.SetNull();
|
infoLastBlockFile.SetNull();
|
||||||
|
@ -2252,9 +2252,9 @@ bool ProcessBlock(CValidationState &state, CNode* pfrom, CBlock* pblock, CDiskBl
|
||||||
// Check for duplicate
|
// Check for duplicate
|
||||||
uint256 hash = pblock->GetHash();
|
uint256 hash = pblock->GetHash();
|
||||||
if (mapBlockIndex.count(hash))
|
if (mapBlockIndex.count(hash))
|
||||||
return state.Invalid(error("ProcessBlock() : already have block %d %s", mapBlockIndex[hash]->nHeight, hash.ToString().c_str()));
|
return state.Invalid(error("ProcessBlock() : already have block %d %s", mapBlockIndex[hash]->nHeight, hash.ToString()));
|
||||||
if (mapOrphanBlocks.count(hash))
|
if (mapOrphanBlocks.count(hash))
|
||||||
return state.Invalid(error("ProcessBlock() : already have block (orphan) %s", hash.ToString().c_str()));
|
return state.Invalid(error("ProcessBlock() : already have block (orphan) %s", hash.ToString()));
|
||||||
|
|
||||||
// Preliminary checks
|
// Preliminary checks
|
||||||
if (!CheckBlock(*pblock, state))
|
if (!CheckBlock(*pblock, state))
|
||||||
|
@ -2285,7 +2285,7 @@ bool ProcessBlock(CValidationState &state, CNode* pfrom, CBlock* pblock, CDiskBl
|
||||||
// If we don't already have its previous block, shunt it off to holding area until we get it
|
// If we don't already have its previous block, shunt it off to holding area until we get it
|
||||||
if (pblock->hashPrevBlock != 0 && !mapBlockIndex.count(pblock->hashPrevBlock))
|
if (pblock->hashPrevBlock != 0 && !mapBlockIndex.count(pblock->hashPrevBlock))
|
||||||
{
|
{
|
||||||
LogPrintf("ProcessBlock: ORPHAN BLOCK, prev=%s\n", pblock->hashPrevBlock.ToString().c_str());
|
LogPrintf("ProcessBlock: ORPHAN BLOCK, prev=%s\n", pblock->hashPrevBlock.ToString());
|
||||||
|
|
||||||
// Accept orphans as long as there is a node to request its parents from
|
// Accept orphans as long as there is a node to request its parents from
|
||||||
if (pfrom) {
|
if (pfrom) {
|
||||||
|
@ -2502,7 +2502,7 @@ uint256 CPartialMerkleTree::ExtractMatches(std::vector<uint256> &vMatch) {
|
||||||
|
|
||||||
bool AbortNode(const std::string &strMessage) {
|
bool AbortNode(const std::string &strMessage) {
|
||||||
strMiscWarning = strMessage;
|
strMiscWarning = strMessage;
|
||||||
LogPrintf("*** %s\n", strMessage.c_str());
|
LogPrintf("*** %s\n", strMessage);
|
||||||
uiInterface.ThreadSafeMessageBox(strMessage, "", CClientUIInterface::MSG_ERROR);
|
uiInterface.ThreadSafeMessageBox(strMessage, "", CClientUIInterface::MSG_ERROR);
|
||||||
StartShutdown();
|
StartShutdown();
|
||||||
return false;
|
return false;
|
||||||
|
@ -2529,12 +2529,12 @@ FILE* OpenDiskFile(const CDiskBlockPos &pos, const char *prefix, bool fReadOnly)
|
||||||
if (!file && !fReadOnly)
|
if (!file && !fReadOnly)
|
||||||
file = fopen(path.string().c_str(), "wb+");
|
file = fopen(path.string().c_str(), "wb+");
|
||||||
if (!file) {
|
if (!file) {
|
||||||
LogPrintf("Unable to open file %s\n", path.string().c_str());
|
LogPrintf("Unable to open file %s\n", path.string());
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (pos.nPos) {
|
if (pos.nPos) {
|
||||||
if (fseek(file, pos.nPos, SEEK_SET)) {
|
if (fseek(file, pos.nPos, SEEK_SET)) {
|
||||||
LogPrintf("Unable to seek to position %u of %s\n", pos.nPos, path.string().c_str());
|
LogPrintf("Unable to seek to position %u of %s\n", pos.nPos, path.string());
|
||||||
fclose(file);
|
fclose(file);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -2601,7 +2601,7 @@ bool static LoadBlockIndexDB()
|
||||||
pblocktree->ReadLastBlockFile(nLastBlockFile);
|
pblocktree->ReadLastBlockFile(nLastBlockFile);
|
||||||
LogPrintf("LoadBlockIndexDB(): last block file = %i\n", nLastBlockFile);
|
LogPrintf("LoadBlockIndexDB(): last block file = %i\n", nLastBlockFile);
|
||||||
if (pblocktree->ReadBlockFileInfo(nLastBlockFile, infoLastBlockFile))
|
if (pblocktree->ReadBlockFileInfo(nLastBlockFile, infoLastBlockFile))
|
||||||
LogPrintf("LoadBlockIndexDB(): last block file info: %s\n", infoLastBlockFile.ToString().c_str());
|
LogPrintf("LoadBlockIndexDB(): last block file info: %s\n", infoLastBlockFile.ToString());
|
||||||
|
|
||||||
// Check whether we need to continue reindexing
|
// Check whether we need to continue reindexing
|
||||||
bool fReindexing = false;
|
bool fReindexing = false;
|
||||||
|
@ -2618,8 +2618,8 @@ bool static LoadBlockIndexDB()
|
||||||
return true;
|
return true;
|
||||||
chainActive.SetTip(it->second);
|
chainActive.SetTip(it->second);
|
||||||
LogPrintf("LoadBlockIndexDB(): hashBestChain=%s height=%d date=%s\n",
|
LogPrintf("LoadBlockIndexDB(): hashBestChain=%s height=%d date=%s\n",
|
||||||
chainActive.Tip()->GetBlockHash().ToString().c_str(), chainActive.Height(),
|
chainActive.Tip()->GetBlockHash().ToString(), chainActive.Height(),
|
||||||
DateTimeStrFormat("%Y-%m-%d %H:%M:%S", chainActive.Tip()->GetBlockTime()).c_str());
|
DateTimeStrFormat("%Y-%m-%d %H:%M:%S", chainActive.Tip()->GetBlockTime()));
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -2649,24 +2649,24 @@ bool VerifyDB(int nCheckLevel, int nCheckDepth)
|
||||||
CBlock block;
|
CBlock block;
|
||||||
// check level 0: read from disk
|
// check level 0: read from disk
|
||||||
if (!ReadBlockFromDisk(block, pindex))
|
if (!ReadBlockFromDisk(block, pindex))
|
||||||
return error("VerifyDB() : *** ReadBlockFromDisk failed at %d, hash=%s", pindex->nHeight, pindex->GetBlockHash().ToString().c_str());
|
return error("VerifyDB() : *** ReadBlockFromDisk failed at %d, hash=%s", pindex->nHeight, pindex->GetBlockHash().ToString());
|
||||||
// check level 1: verify block validity
|
// check level 1: verify block validity
|
||||||
if (nCheckLevel >= 1 && !CheckBlock(block, state))
|
if (nCheckLevel >= 1 && !CheckBlock(block, state))
|
||||||
return error("VerifyDB() : *** found bad block at %d, hash=%s\n", pindex->nHeight, pindex->GetBlockHash().ToString().c_str());
|
return error("VerifyDB() : *** found bad block at %d, hash=%s\n", pindex->nHeight, pindex->GetBlockHash().ToString());
|
||||||
// check level 2: verify undo validity
|
// check level 2: verify undo validity
|
||||||
if (nCheckLevel >= 2 && pindex) {
|
if (nCheckLevel >= 2 && pindex) {
|
||||||
CBlockUndo undo;
|
CBlockUndo undo;
|
||||||
CDiskBlockPos pos = pindex->GetUndoPos();
|
CDiskBlockPos pos = pindex->GetUndoPos();
|
||||||
if (!pos.IsNull()) {
|
if (!pos.IsNull()) {
|
||||||
if (!undo.ReadFromDisk(pos, pindex->pprev->GetBlockHash()))
|
if (!undo.ReadFromDisk(pos, pindex->pprev->GetBlockHash()))
|
||||||
return error("VerifyDB() : *** found bad undo data at %d, hash=%s\n", pindex->nHeight, pindex->GetBlockHash().ToString().c_str());
|
return error("VerifyDB() : *** found bad undo data at %d, hash=%s\n", pindex->nHeight, pindex->GetBlockHash().ToString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// check level 3: check for inconsistencies during memory-only disconnect of tip blocks
|
// check level 3: check for inconsistencies during memory-only disconnect of tip blocks
|
||||||
if (nCheckLevel >= 3 && pindex == pindexState && (coins.GetCacheSize() + pcoinsTip->GetCacheSize()) <= 2*nCoinCacheSize + 32000) {
|
if (nCheckLevel >= 3 && pindex == pindexState && (coins.GetCacheSize() + pcoinsTip->GetCacheSize()) <= 2*nCoinCacheSize + 32000) {
|
||||||
bool fClean = true;
|
bool fClean = true;
|
||||||
if (!DisconnectBlock(block, state, pindex, coins, &fClean))
|
if (!DisconnectBlock(block, state, pindex, coins, &fClean))
|
||||||
return error("VerifyDB() : *** irrecoverable inconsistency in block data at %d, hash=%s", pindex->nHeight, pindex->GetBlockHash().ToString().c_str());
|
return error("VerifyDB() : *** irrecoverable inconsistency in block data at %d, hash=%s", pindex->nHeight, pindex->GetBlockHash().ToString());
|
||||||
pindexState = pindex->pprev;
|
pindexState = pindex->pprev;
|
||||||
if (!fClean) {
|
if (!fClean) {
|
||||||
nGoodTransactions = 0;
|
nGoodTransactions = 0;
|
||||||
|
@ -2686,9 +2686,9 @@ bool VerifyDB(int nCheckLevel, int nCheckDepth)
|
||||||
pindex = chainActive.Next(pindex);
|
pindex = chainActive.Next(pindex);
|
||||||
CBlock block;
|
CBlock block;
|
||||||
if (!ReadBlockFromDisk(block, pindex))
|
if (!ReadBlockFromDisk(block, pindex))
|
||||||
return error("VerifyDB() : *** ReadBlockFromDisk failed at %d, hash=%s", pindex->nHeight, pindex->GetBlockHash().ToString().c_str());
|
return error("VerifyDB() : *** ReadBlockFromDisk failed at %d, hash=%s", pindex->nHeight, pindex->GetBlockHash().ToString());
|
||||||
if (!ConnectBlock(block, state, pindex, coins))
|
if (!ConnectBlock(block, state, pindex, coins))
|
||||||
return error("VerifyDB() : *** found unconnectable block at %d, hash=%s", pindex->nHeight, pindex->GetBlockHash().ToString().c_str());
|
return error("VerifyDB() : *** found unconnectable block at %d, hash=%s", pindex->nHeight, pindex->GetBlockHash().ToString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2796,7 +2796,7 @@ void PrintBlockTree()
|
||||||
LogPrintf("%d (blk%05u.dat:0x%x) %s tx %"PRIszu"",
|
LogPrintf("%d (blk%05u.dat:0x%x) %s tx %"PRIszu"",
|
||||||
pindex->nHeight,
|
pindex->nHeight,
|
||||||
pindex->GetBlockPos().nFile, pindex->GetBlockPos().nPos,
|
pindex->GetBlockPos().nFile, pindex->GetBlockPos().nPos,
|
||||||
DateTimeStrFormat("%Y-%m-%d %H:%M:%S", block.GetBlockTime()).c_str(),
|
DateTimeStrFormat("%Y-%m-%d %H:%M:%S", block.GetBlockTime()),
|
||||||
block.vtx.size());
|
block.vtx.size());
|
||||||
|
|
||||||
// put the main time-chain first
|
// put the main time-chain first
|
||||||
|
@ -2999,10 +2999,10 @@ void Misbehaving(NodeId pnode, int howmuch)
|
||||||
state->nMisbehavior += howmuch;
|
state->nMisbehavior += howmuch;
|
||||||
if (state->nMisbehavior >= GetArg("-banscore", 100))
|
if (state->nMisbehavior >= GetArg("-banscore", 100))
|
||||||
{
|
{
|
||||||
LogPrintf("Misbehaving: %s (%d -> %d) BAN THRESHOLD EXCEEDED\n", state->name.c_str(), state->nMisbehavior-howmuch, state->nMisbehavior);
|
LogPrintf("Misbehaving: %s (%d -> %d) BAN THRESHOLD EXCEEDED\n", state->name, state->nMisbehavior-howmuch, state->nMisbehavior);
|
||||||
state->fShouldBan = true;
|
state->fShouldBan = true;
|
||||||
} else
|
} else
|
||||||
LogPrintf("Misbehaving: %s (%d -> %d)\n", state->name.c_str(), state->nMisbehavior-howmuch, state->nMisbehavior);
|
LogPrintf("Misbehaving: %s (%d -> %d)\n", state->name, state->nMisbehavior-howmuch, state->nMisbehavior);
|
||||||
}
|
}
|
||||||
|
|
||||||
void static ProcessGetData(CNode* pfrom)
|
void static ProcessGetData(CNode* pfrom)
|
||||||
|
@ -3120,7 +3120,7 @@ void static ProcessGetData(CNode* pfrom)
|
||||||
bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
|
bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
|
||||||
{
|
{
|
||||||
RandAddSeedPerfmon();
|
RandAddSeedPerfmon();
|
||||||
LogPrint("net", "received: %s (%"PRIszu" bytes)\n", strCommand.c_str(), vRecv.size());
|
LogPrint("net", "received: %s (%"PRIszu" bytes)\n", strCommand, vRecv.size());
|
||||||
if (mapArgs.count("-dropmessagestest") && GetRand(atoi(mapArgs["-dropmessagestest"])) == 0)
|
if (mapArgs.count("-dropmessagestest") && GetRand(atoi(mapArgs["-dropmessagestest"])) == 0)
|
||||||
{
|
{
|
||||||
LogPrintf("dropmessagestest DROPPING RECV MESSAGE\n");
|
LogPrintf("dropmessagestest DROPPING RECV MESSAGE\n");
|
||||||
|
@ -3149,7 +3149,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
|
||||||
if (pfrom->nVersion < MIN_PEER_PROTO_VERSION)
|
if (pfrom->nVersion < MIN_PEER_PROTO_VERSION)
|
||||||
{
|
{
|
||||||
// disconnect from peers older than this proto version
|
// disconnect from peers older than this proto version
|
||||||
LogPrintf("partner %s using obsolete version %i; disconnecting\n", pfrom->addr.ToString().c_str(), pfrom->nVersion);
|
LogPrintf("partner %s using obsolete version %i; disconnecting\n", pfrom->addr.ToString(), pfrom->nVersion);
|
||||||
pfrom->PushMessage("reject", strCommand, REJECT_OBSOLETE,
|
pfrom->PushMessage("reject", strCommand, REJECT_OBSOLETE,
|
||||||
strprintf("Version must be %d or greater", MIN_PEER_PROTO_VERSION));
|
strprintf("Version must be %d or greater", MIN_PEER_PROTO_VERSION));
|
||||||
pfrom->fDisconnect = true;
|
pfrom->fDisconnect = true;
|
||||||
|
@ -3180,7 +3180,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
|
||||||
// Disconnect if we connected to ourself
|
// Disconnect if we connected to ourself
|
||||||
if (nNonce == nLocalHostNonce && nNonce > 1)
|
if (nNonce == nLocalHostNonce && nNonce > 1)
|
||||||
{
|
{
|
||||||
LogPrintf("connected to self at %s, disconnecting\n", pfrom->addr.ToString().c_str());
|
LogPrintf("connected to self at %s, disconnecting\n", pfrom->addr.ToString());
|
||||||
pfrom->fDisconnect = true;
|
pfrom->fDisconnect = true;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -3230,7 +3230,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
|
||||||
|
|
||||||
pfrom->fSuccessfullyConnected = true;
|
pfrom->fSuccessfullyConnected = true;
|
||||||
|
|
||||||
LogPrintf("receive version message: %s: version %d, blocks=%d, us=%s, them=%s, peer=%s\n", pfrom->cleanSubVer.c_str(), pfrom->nVersion, pfrom->nStartingHeight, addrMe.ToString().c_str(), addrFrom.ToString().c_str(), pfrom->addr.ToString().c_str());
|
LogPrintf("receive version message: %s: version %d, blocks=%d, us=%s, them=%s, peer=%s\n", pfrom->cleanSubVer, pfrom->nVersion, pfrom->nStartingHeight, addrMe.ToString(), addrFrom.ToString(), pfrom->addr.ToString());
|
||||||
|
|
||||||
AddTimeData(pfrom->addr, nTime);
|
AddTimeData(pfrom->addr, nTime);
|
||||||
|
|
||||||
|
@ -3349,7 +3349,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
|
||||||
pfrom->AddInventoryKnown(inv);
|
pfrom->AddInventoryKnown(inv);
|
||||||
|
|
||||||
bool fAlreadyHave = AlreadyHave(inv);
|
bool fAlreadyHave = AlreadyHave(inv);
|
||||||
LogPrint("net", " got inventory: %s %s\n", inv.ToString().c_str(), fAlreadyHave ? "have" : "new");
|
LogPrint("net", " got inventory: %s %s\n", inv.ToString(), fAlreadyHave ? "have" : "new");
|
||||||
|
|
||||||
if (!fAlreadyHave) {
|
if (!fAlreadyHave) {
|
||||||
if (!fImporting && !fReindex)
|
if (!fImporting && !fReindex)
|
||||||
|
@ -3362,7 +3362,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
|
||||||
// this situation and push another getblocks to continue.
|
// this situation and push another getblocks to continue.
|
||||||
PushGetBlocks(pfrom, mapBlockIndex[inv.hash], uint256(0));
|
PushGetBlocks(pfrom, mapBlockIndex[inv.hash], uint256(0));
|
||||||
if (fDebug)
|
if (fDebug)
|
||||||
LogPrintf("force request: %s\n", inv.ToString().c_str());
|
LogPrintf("force request: %s\n", inv.ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Track requests for our stuff
|
// Track requests for our stuff
|
||||||
|
@ -3385,7 +3385,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
|
||||||
LogPrint("net", "received getdata (%"PRIszu" invsz)\n", vInv.size());
|
LogPrint("net", "received getdata (%"PRIszu" invsz)\n", vInv.size());
|
||||||
|
|
||||||
if ((fDebug && vInv.size() > 0) || (vInv.size() == 1))
|
if ((fDebug && vInv.size() > 0) || (vInv.size() == 1))
|
||||||
LogPrint("net", "received getdata for: %s\n", vInv[0].ToString().c_str());
|
LogPrint("net", "received getdata for: %s\n", vInv[0].ToString());
|
||||||
|
|
||||||
pfrom->vRecvGetData.insert(pfrom->vRecvGetData.end(), vInv.begin(), vInv.end());
|
pfrom->vRecvGetData.insert(pfrom->vRecvGetData.end(), vInv.begin(), vInv.end());
|
||||||
ProcessGetData(pfrom);
|
ProcessGetData(pfrom);
|
||||||
|
@ -3407,12 +3407,12 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
|
||||||
if (pindex)
|
if (pindex)
|
||||||
pindex = chainActive.Next(pindex);
|
pindex = chainActive.Next(pindex);
|
||||||
int nLimit = 500;
|
int nLimit = 500;
|
||||||
LogPrint("net", "getblocks %d to %s limit %d\n", (pindex ? pindex->nHeight : -1), hashStop.ToString().c_str(), nLimit);
|
LogPrint("net", "getblocks %d to %s limit %d\n", (pindex ? pindex->nHeight : -1), hashStop.ToString(), nLimit);
|
||||||
for (; pindex; pindex = chainActive.Next(pindex))
|
for (; pindex; pindex = chainActive.Next(pindex))
|
||||||
{
|
{
|
||||||
if (pindex->GetBlockHash() == hashStop)
|
if (pindex->GetBlockHash() == hashStop)
|
||||||
{
|
{
|
||||||
LogPrint("net", " getblocks stopping at %d %s\n", pindex->nHeight, pindex->GetBlockHash().ToString().c_str());
|
LogPrint("net", " getblocks stopping at %d %s\n", pindex->nHeight, pindex->GetBlockHash().ToString());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
pfrom->PushInventory(CInv(MSG_BLOCK, pindex->GetBlockHash()));
|
pfrom->PushInventory(CInv(MSG_BLOCK, pindex->GetBlockHash()));
|
||||||
|
@ -3420,7 +3420,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
|
||||||
{
|
{
|
||||||
// When this block is requested, we'll send an inv that'll make them
|
// When this block is requested, we'll send an inv that'll make them
|
||||||
// getblocks the next batch of inventory.
|
// getblocks the next batch of inventory.
|
||||||
LogPrint("net", " getblocks stopping at limit %d %s\n", pindex->nHeight, pindex->GetBlockHash().ToString().c_str());
|
LogPrint("net", " getblocks stopping at limit %d %s\n", pindex->nHeight, pindex->GetBlockHash().ToString());
|
||||||
pfrom->hashContinue = pindex->GetBlockHash();
|
pfrom->hashContinue = pindex->GetBlockHash();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -3456,7 +3456,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
|
||||||
// we must use CBlocks, as CBlockHeaders won't include the 0x00 nTx count at the end
|
// we must use CBlocks, as CBlockHeaders won't include the 0x00 nTx count at the end
|
||||||
vector<CBlock> vHeaders;
|
vector<CBlock> vHeaders;
|
||||||
int nLimit = 2000;
|
int nLimit = 2000;
|
||||||
LogPrint("net", "getheaders %d to %s\n", (pindex ? pindex->nHeight : -1), hashStop.ToString().c_str());
|
LogPrint("net", "getheaders %d to %s\n", (pindex ? pindex->nHeight : -1), hashStop.ToString());
|
||||||
for (; pindex; pindex = chainActive.Next(pindex))
|
for (; pindex; pindex = chainActive.Next(pindex))
|
||||||
{
|
{
|
||||||
vHeaders.push_back(pindex->GetBlockHeader());
|
vHeaders.push_back(pindex->GetBlockHeader());
|
||||||
|
@ -3491,8 +3491,8 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
|
||||||
|
|
||||||
|
|
||||||
LogPrint("mempool", "AcceptToMemoryPool: %s %s : accepted %s (poolsz %"PRIszu")\n",
|
LogPrint("mempool", "AcceptToMemoryPool: %s %s : accepted %s (poolsz %"PRIszu")\n",
|
||||||
pfrom->addr.ToString().c_str(), pfrom->cleanSubVer.c_str(),
|
pfrom->addr.ToString(), pfrom->cleanSubVer,
|
||||||
tx.GetHash().ToString().c_str(),
|
tx.GetHash().ToString(),
|
||||||
mempool.mapTx.size());
|
mempool.mapTx.size());
|
||||||
|
|
||||||
// Recursively process any orphan transactions that depended on this one
|
// Recursively process any orphan transactions that depended on this one
|
||||||
|
@ -3513,7 +3513,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
|
||||||
|
|
||||||
if (AcceptToMemoryPool(mempool, stateDummy, orphanTx, true, &fMissingInputs2))
|
if (AcceptToMemoryPool(mempool, stateDummy, orphanTx, true, &fMissingInputs2))
|
||||||
{
|
{
|
||||||
LogPrint("mempool", " accepted orphan tx %s\n", orphanHash.ToString().c_str());
|
LogPrint("mempool", " accepted orphan tx %s\n", orphanHash.ToString());
|
||||||
RelayTransaction(orphanTx, orphanHash);
|
RelayTransaction(orphanTx, orphanHash);
|
||||||
mapAlreadyAskedFor.erase(CInv(MSG_TX, orphanHash));
|
mapAlreadyAskedFor.erase(CInv(MSG_TX, orphanHash));
|
||||||
vWorkQueue.push_back(orphanHash);
|
vWorkQueue.push_back(orphanHash);
|
||||||
|
@ -3523,7 +3523,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
|
||||||
{
|
{
|
||||||
// invalid or too-little-fee orphan
|
// invalid or too-little-fee orphan
|
||||||
vEraseQueue.push_back(orphanHash);
|
vEraseQueue.push_back(orphanHash);
|
||||||
LogPrint("mempool", " removed orphan tx %s\n", orphanHash.ToString().c_str());
|
LogPrint("mempool", " removed orphan tx %s\n", orphanHash.ToString());
|
||||||
}
|
}
|
||||||
mempool.check(pcoinsTip);
|
mempool.check(pcoinsTip);
|
||||||
}
|
}
|
||||||
|
@ -3544,9 +3544,9 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
|
||||||
int nDoS = 0;
|
int nDoS = 0;
|
||||||
if (state.IsInvalid(nDoS))
|
if (state.IsInvalid(nDoS))
|
||||||
{
|
{
|
||||||
LogPrint("mempool", "%s from %s %s was not accepted into the memory pool: %s\n", tx.GetHash().ToString().c_str(),
|
LogPrint("mempool", "%s from %s %s was not accepted into the memory pool: %s\n", tx.GetHash().ToString(),
|
||||||
pfrom->addr.ToString().c_str(), pfrom->cleanSubVer.c_str(),
|
pfrom->addr.ToString(), pfrom->cleanSubVer,
|
||||||
state.GetRejectReason().c_str());
|
state.GetRejectReason());
|
||||||
pfrom->PushMessage("reject", strCommand, state.GetRejectCode(),
|
pfrom->PushMessage("reject", strCommand, state.GetRejectCode(),
|
||||||
state.GetRejectReason(), inv.hash);
|
state.GetRejectReason(), inv.hash);
|
||||||
if (nDoS > 0)
|
if (nDoS > 0)
|
||||||
|
@ -3560,7 +3560,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
|
||||||
CBlock block;
|
CBlock block;
|
||||||
vRecv >> block;
|
vRecv >> block;
|
||||||
|
|
||||||
LogPrint("net", "received block %s\n", block.GetHash().ToString().c_str());
|
LogPrint("net", "received block %s\n", block.GetHash().ToString());
|
||||||
// block.print();
|
// block.print();
|
||||||
|
|
||||||
CInv inv(MSG_BLOCK, block.GetHash());
|
CInv inv(MSG_BLOCK, block.GetHash());
|
||||||
|
@ -3682,9 +3682,9 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
|
||||||
|
|
||||||
if (!(sProblem.empty())) {
|
if (!(sProblem.empty())) {
|
||||||
LogPrint("net", "pong %s %s: %s, %"PRIx64" expected, %"PRIx64" received, %"PRIszu" bytes\n",
|
LogPrint("net", "pong %s %s: %s, %"PRIx64" expected, %"PRIx64" received, %"PRIszu" bytes\n",
|
||||||
pfrom->addr.ToString().c_str(),
|
pfrom->addr.ToString(),
|
||||||
pfrom->cleanSubVer.c_str(),
|
pfrom->cleanSubVer,
|
||||||
sProblem.c_str(),
|
sProblem,
|
||||||
pfrom->nPingNonceSent,
|
pfrom->nPingNonceSent,
|
||||||
nonce,
|
nonce,
|
||||||
nAvail);
|
nAvail);
|
||||||
|
@ -3793,7 +3793,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
|
||||||
// Truncate to reasonable length and sanitize before printing:
|
// Truncate to reasonable length and sanitize before printing:
|
||||||
string s = ss.str();
|
string s = ss.str();
|
||||||
if (s.size() > 111) s.erase(111, string::npos);
|
if (s.size() > 111) s.erase(111, string::npos);
|
||||||
LogPrint("net", "Reject %s\n", SanitizeString(s).c_str());
|
LogPrint("net", "Reject %s\n", SanitizeString(s));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3866,7 +3866,7 @@ bool ProcessMessages(CNode* pfrom)
|
||||||
CMessageHeader& hdr = msg.hdr;
|
CMessageHeader& hdr = msg.hdr;
|
||||||
if (!hdr.IsValid())
|
if (!hdr.IsValid())
|
||||||
{
|
{
|
||||||
LogPrintf("\n\nPROCESSMESSAGE: ERRORS IN HEADER %s\n\n\n", hdr.GetCommand().c_str());
|
LogPrintf("\n\nPROCESSMESSAGE: ERRORS IN HEADER %s\n\n\n", hdr.GetCommand());
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
string strCommand = hdr.GetCommand();
|
string strCommand = hdr.GetCommand();
|
||||||
|
@ -3882,7 +3882,7 @@ bool ProcessMessages(CNode* pfrom)
|
||||||
if (nChecksum != hdr.nChecksum)
|
if (nChecksum != hdr.nChecksum)
|
||||||
{
|
{
|
||||||
LogPrintf("ProcessMessages(%s, %u bytes) : CHECKSUM ERROR nChecksum=%08x hdr.nChecksum=%08x\n",
|
LogPrintf("ProcessMessages(%s, %u bytes) : CHECKSUM ERROR nChecksum=%08x hdr.nChecksum=%08x\n",
|
||||||
strCommand.c_str(), nMessageSize, nChecksum, hdr.nChecksum);
|
strCommand, nMessageSize, nChecksum, hdr.nChecksum);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3899,12 +3899,12 @@ bool ProcessMessages(CNode* pfrom)
|
||||||
if (strstr(e.what(), "end of data"))
|
if (strstr(e.what(), "end of data"))
|
||||||
{
|
{
|
||||||
// Allow exceptions from under-length message on vRecv
|
// Allow exceptions from under-length message on vRecv
|
||||||
LogPrintf("ProcessMessages(%s, %u bytes) : Exception '%s' caught, normally caused by a message being shorter than its stated length\n", strCommand.c_str(), nMessageSize, e.what());
|
LogPrintf("ProcessMessages(%s, %u bytes) : Exception '%s' caught, normally caused by a message being shorter than its stated length\n", strCommand, nMessageSize, e.what());
|
||||||
}
|
}
|
||||||
else if (strstr(e.what(), "size too large"))
|
else if (strstr(e.what(), "size too large"))
|
||||||
{
|
{
|
||||||
// Allow exceptions from over-long size
|
// Allow exceptions from over-long size
|
||||||
LogPrintf("ProcessMessages(%s, %u bytes) : Exception '%s' caught\n", strCommand.c_str(), nMessageSize, e.what());
|
LogPrintf("ProcessMessages(%s, %u bytes) : Exception '%s' caught\n", strCommand, nMessageSize, e.what());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -3921,7 +3921,7 @@ bool ProcessMessages(CNode* pfrom)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!fRet)
|
if (!fRet)
|
||||||
LogPrintf("ProcessMessage(%s, %u bytes) FAILED\n", strCommand.c_str(), nMessageSize);
|
LogPrintf("ProcessMessage(%s, %u bytes) FAILED\n", strCommand, nMessageSize);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -4027,7 +4027,7 @@ bool SendMessages(CNode* pto, bool fSendTrickle)
|
||||||
|
|
||||||
if (State(pto->GetId())->fShouldBan) {
|
if (State(pto->GetId())->fShouldBan) {
|
||||||
if (pto->addr.IsLocal())
|
if (pto->addr.IsLocal())
|
||||||
LogPrintf("Warning: not banning local node %s!\n", pto->addr.ToString().c_str());
|
LogPrintf("Warning: not banning local node %s!\n", pto->addr.ToString());
|
||||||
else {
|
else {
|
||||||
pto->fDisconnect = true;
|
pto->fDisconnect = true;
|
||||||
CNode::Ban(pto->addr);
|
CNode::Ban(pto->addr);
|
||||||
|
@ -4109,7 +4109,7 @@ bool SendMessages(CNode* pto, bool fSendTrickle)
|
||||||
if (!AlreadyHave(inv))
|
if (!AlreadyHave(inv))
|
||||||
{
|
{
|
||||||
if (fDebug)
|
if (fDebug)
|
||||||
LogPrint("net", "sending getdata: %s\n", inv.ToString().c_str());
|
LogPrint("net", "sending getdata: %s\n", inv.ToString());
|
||||||
vGetData.push_back(inv);
|
vGetData.push_back(inv);
|
||||||
if (vGetData.size() >= 1000)
|
if (vGetData.size() >= 1000)
|
||||||
{
|
{
|
||||||
|
|
|
@ -70,9 +70,9 @@ public:
|
||||||
void print() const
|
void print() const
|
||||||
{
|
{
|
||||||
LogPrintf("COrphan(hash=%s, dPriority=%.1f, dFeePerKb=%.1f)\n",
|
LogPrintf("COrphan(hash=%s, dPriority=%.1f, dFeePerKb=%.1f)\n",
|
||||||
ptx->GetHash().ToString().c_str(), dPriority, dFeePerKb);
|
ptx->GetHash().ToString(), dPriority, dFeePerKb);
|
||||||
BOOST_FOREACH(uint256 hash, setDependsOn)
|
BOOST_FOREACH(uint256 hash, setDependsOn)
|
||||||
LogPrintf(" setDependsOn %s\n", hash.ToString().c_str());
|
LogPrintf(" setDependsOn %s\n", hash.ToString());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -296,7 +296,7 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn)
|
||||||
if (fPrintPriority)
|
if (fPrintPriority)
|
||||||
{
|
{
|
||||||
LogPrintf("priority %.1f feeperkb %.1f txid %s\n",
|
LogPrintf("priority %.1f feeperkb %.1f txid %s\n",
|
||||||
dPriority, dFeePerKb, tx.GetHash().ToString().c_str());
|
dPriority, dFeePerKb, tx.GetHash().ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add transactions that depend on this one to the priority queue
|
// Add transactions that depend on this one to the priority queue
|
||||||
|
@ -470,9 +470,9 @@ bool CheckWork(CBlock* pblock, CWallet& wallet, CReserveKey& reservekey)
|
||||||
|
|
||||||
//// debug print
|
//// debug print
|
||||||
LogPrintf("BitcoinMiner:\n");
|
LogPrintf("BitcoinMiner:\n");
|
||||||
LogPrintf("proof-of-work found \n hash: %s \ntarget: %s\n", hash.GetHex().c_str(), hashTarget.GetHex().c_str());
|
LogPrintf("proof-of-work found \n hash: %s \ntarget: %s\n", hash.GetHex(), hashTarget.GetHex());
|
||||||
pblock->print();
|
pblock->print();
|
||||||
LogPrintf("generated %s\n", FormatMoney(pblock->vtx[0].vout[0].nValue).c_str());
|
LogPrintf("generated %s\n", FormatMoney(pblock->vtx[0].vout[0].nValue));
|
||||||
|
|
||||||
// Found a solution
|
// Found a solution
|
||||||
{
|
{
|
||||||
|
|
44
src/net.cpp
44
src/net.cpp
|
@ -227,7 +227,7 @@ bool AddLocal(const CService& addr, int nScore)
|
||||||
if (IsLimited(addr))
|
if (IsLimited(addr))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
LogPrintf("AddLocal(%s,%i)\n", addr.ToString().c_str(), nScore);
|
LogPrintf("AddLocal(%s,%i)\n", addr.ToString(), nScore);
|
||||||
|
|
||||||
{
|
{
|
||||||
LOCK(cs_mapLocalHost);
|
LOCK(cs_mapLocalHost);
|
||||||
|
@ -304,7 +304,7 @@ bool GetMyExternalIP2(const CService& addrConnect, const char* pszGet, const cha
|
||||||
{
|
{
|
||||||
SOCKET hSocket;
|
SOCKET hSocket;
|
||||||
if (!ConnectSocket(addrConnect, hSocket))
|
if (!ConnectSocket(addrConnect, hSocket))
|
||||||
return error("GetMyExternalIP() : connection to %s failed", addrConnect.ToString().c_str());
|
return error("GetMyExternalIP() : connection to %s failed", addrConnect.ToString());
|
||||||
|
|
||||||
send(hSocket, pszGet, strlen(pszGet), MSG_NOSIGNAL);
|
send(hSocket, pszGet, strlen(pszGet), MSG_NOSIGNAL);
|
||||||
|
|
||||||
|
@ -335,7 +335,7 @@ bool GetMyExternalIP2(const CService& addrConnect, const char* pszGet, const cha
|
||||||
while (strLine.size() > 0 && isspace(strLine[strLine.size()-1]))
|
while (strLine.size() > 0 && isspace(strLine[strLine.size()-1]))
|
||||||
strLine.resize(strLine.size()-1);
|
strLine.resize(strLine.size()-1);
|
||||||
CService addr(strLine,0,true);
|
CService addr(strLine,0,true);
|
||||||
LogPrintf("GetMyExternalIP() received [%s] %s\n", strLine.c_str(), addr.ToString().c_str());
|
LogPrintf("GetMyExternalIP() received [%s] %s\n", strLine, addr.ToString());
|
||||||
if (!addr.IsValid() || !addr.IsRoutable())
|
if (!addr.IsValid() || !addr.IsRoutable())
|
||||||
return false;
|
return false;
|
||||||
ipRet.SetIP(addr);
|
ipRet.SetIP(addr);
|
||||||
|
@ -410,7 +410,7 @@ void ThreadGetMyExternalIP()
|
||||||
CNetAddr addrLocalHost;
|
CNetAddr addrLocalHost;
|
||||||
if (GetMyExternalIP(addrLocalHost))
|
if (GetMyExternalIP(addrLocalHost))
|
||||||
{
|
{
|
||||||
LogPrintf("GetMyExternalIP() returned %s\n", addrLocalHost.ToStringIP().c_str());
|
LogPrintf("GetMyExternalIP() returned %s\n", addrLocalHost.ToStringIP());
|
||||||
AddLocal(addrLocalHost, LOCAL_HTTP);
|
AddLocal(addrLocalHost, LOCAL_HTTP);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -477,7 +477,7 @@ CNode* ConnectNode(CAddress addrConnect, const char *pszDest)
|
||||||
|
|
||||||
/// debug print
|
/// debug print
|
||||||
LogPrint("net", "trying connection %s lastseen=%.1fhrs\n",
|
LogPrint("net", "trying connection %s lastseen=%.1fhrs\n",
|
||||||
pszDest ? pszDest : addrConnect.ToString().c_str(),
|
pszDest ? pszDest : addrConnect.ToString(),
|
||||||
pszDest ? 0 : (double)(GetAdjustedTime() - addrConnect.nTime)/3600.0);
|
pszDest ? 0 : (double)(GetAdjustedTime() - addrConnect.nTime)/3600.0);
|
||||||
|
|
||||||
// Connect
|
// Connect
|
||||||
|
@ -486,7 +486,7 @@ CNode* ConnectNode(CAddress addrConnect, const char *pszDest)
|
||||||
{
|
{
|
||||||
addrman.Attempt(addrConnect);
|
addrman.Attempt(addrConnect);
|
||||||
|
|
||||||
LogPrint("net", "connected %s\n", pszDest ? pszDest : addrConnect.ToString().c_str());
|
LogPrint("net", "connected %s\n", pszDest ? pszDest : addrConnect.ToString());
|
||||||
|
|
||||||
// Set to non-blocking
|
// Set to non-blocking
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
|
@ -521,7 +521,7 @@ void CNode::CloseSocketDisconnect()
|
||||||
fDisconnect = true;
|
fDisconnect = true;
|
||||||
if (hSocket != INVALID_SOCKET)
|
if (hSocket != INVALID_SOCKET)
|
||||||
{
|
{
|
||||||
LogPrint("net", "disconnecting node %s\n", addrName.c_str());
|
LogPrint("net", "disconnecting node %s\n", addrName);
|
||||||
closesocket(hSocket);
|
closesocket(hSocket);
|
||||||
hSocket = INVALID_SOCKET;
|
hSocket = INVALID_SOCKET;
|
||||||
}
|
}
|
||||||
|
@ -550,7 +550,7 @@ void CNode::PushVersion()
|
||||||
CAddress addrYou = (addr.IsRoutable() && !IsProxy(addr) ? addr : CAddress(CService("0.0.0.0",0)));
|
CAddress addrYou = (addr.IsRoutable() && !IsProxy(addr) ? addr : CAddress(CService("0.0.0.0",0)));
|
||||||
CAddress addrMe = GetLocalAddress(&addr);
|
CAddress addrMe = GetLocalAddress(&addr);
|
||||||
RAND_bytes((unsigned char*)&nLocalHostNonce, sizeof(nLocalHostNonce));
|
RAND_bytes((unsigned char*)&nLocalHostNonce, sizeof(nLocalHostNonce));
|
||||||
LogPrint("net", "send version message: version %d, blocks=%d, us=%s, them=%s, peer=%s\n", PROTOCOL_VERSION, nBestHeight, addrMe.ToString().c_str(), addrYou.ToString().c_str(), addr.ToString().c_str());
|
LogPrint("net", "send version message: version %d, blocks=%d, us=%s, them=%s, peer=%s\n", PROTOCOL_VERSION, nBestHeight, addrMe.ToString(), addrYou.ToString(), addr.ToString());
|
||||||
PushMessage("version", PROTOCOL_VERSION, nLocalServices, nTime, addrYou, addrMe,
|
PushMessage("version", PROTOCOL_VERSION, nLocalServices, nTime, addrYou, addrMe,
|
||||||
nLocalHostNonce, FormatSubVersion(CLIENT_NAME, CLIENT_VERSION, std::vector<string>()), nBestHeight, true);
|
nLocalHostNonce, FormatSubVersion(CLIENT_NAME, CLIENT_VERSION, std::vector<string>()), nBestHeight, true);
|
||||||
}
|
}
|
||||||
|
@ -952,12 +952,12 @@ void ThreadSocketHandler()
|
||||||
}
|
}
|
||||||
else if (CNode::IsBanned(addr))
|
else if (CNode::IsBanned(addr))
|
||||||
{
|
{
|
||||||
LogPrintf("connection from %s dropped (banned)\n", addr.ToString().c_str());
|
LogPrintf("connection from %s dropped (banned)\n", addr.ToString());
|
||||||
closesocket(hSocket);
|
closesocket(hSocket);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
LogPrint("net", "accepted connection %s\n", addr.ToString().c_str());
|
LogPrint("net", "accepted connection %s\n", addr.ToString());
|
||||||
CNode* pnode = new CNode(hSocket, addr, "", true);
|
CNode* pnode = new CNode(hSocket, addr, "", true);
|
||||||
pnode->AddRef();
|
pnode->AddRef();
|
||||||
{
|
{
|
||||||
|
@ -1138,7 +1138,7 @@ void ThreadMapPort()
|
||||||
|
|
||||||
if(r!=UPNPCOMMAND_SUCCESS)
|
if(r!=UPNPCOMMAND_SUCCESS)
|
||||||
LogPrintf("AddPortMapping(%s, %s, %s) failed with code %d (%s)\n",
|
LogPrintf("AddPortMapping(%s, %s, %s) failed with code %d (%s)\n",
|
||||||
port.c_str(), port.c_str(), lanaddr, r, strupnperror(r));
|
port, port, lanaddr, r, strupnperror(r));
|
||||||
else
|
else
|
||||||
LogPrintf("UPnP Port Mapping successful.\n");;
|
LogPrintf("UPnP Port Mapping successful.\n");;
|
||||||
|
|
||||||
|
@ -1592,8 +1592,8 @@ bool BindListenPort(const CService &addrBind, string& strError)
|
||||||
socklen_t len = sizeof(sockaddr);
|
socklen_t len = sizeof(sockaddr);
|
||||||
if (!addrBind.GetSockAddr((struct sockaddr*)&sockaddr, &len))
|
if (!addrBind.GetSockAddr((struct sockaddr*)&sockaddr, &len))
|
||||||
{
|
{
|
||||||
strError = strprintf("Error: bind address family for %s not supported", addrBind.ToString().c_str());
|
strError = strprintf("Error: bind address family for %s not supported", addrBind.ToString());
|
||||||
LogPrintf("%s\n", strError.c_str());
|
LogPrintf("%s\n", strError);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1601,7 +1601,7 @@ bool BindListenPort(const CService &addrBind, string& strError)
|
||||||
if (hListenSocket == INVALID_SOCKET)
|
if (hListenSocket == INVALID_SOCKET)
|
||||||
{
|
{
|
||||||
strError = strprintf("Error: Couldn't open socket for incoming connections (socket returned error %d)", WSAGetLastError());
|
strError = strprintf("Error: Couldn't open socket for incoming connections (socket returned error %d)", WSAGetLastError());
|
||||||
LogPrintf("%s\n", strError.c_str());
|
LogPrintf("%s\n", strError);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1625,7 +1625,7 @@ bool BindListenPort(const CService &addrBind, string& strError)
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
strError = strprintf("Error: Couldn't set properties on socket for incoming connections (error %d)", WSAGetLastError());
|
strError = strprintf("Error: Couldn't set properties on socket for incoming connections (error %d)", WSAGetLastError());
|
||||||
LogPrintf("%s\n", strError.c_str());
|
LogPrintf("%s\n", strError);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1653,19 +1653,19 @@ bool BindListenPort(const CService &addrBind, string& strError)
|
||||||
{
|
{
|
||||||
int nErr = WSAGetLastError();
|
int nErr = WSAGetLastError();
|
||||||
if (nErr == WSAEADDRINUSE)
|
if (nErr == WSAEADDRINUSE)
|
||||||
strError = strprintf(_("Unable to bind to %s on this computer. Bitcoin is probably already running."), addrBind.ToString().c_str());
|
strError = strprintf(_("Unable to bind to %s on this computer. Bitcoin is probably already running."), addrBind.ToString());
|
||||||
else
|
else
|
||||||
strError = strprintf(_("Unable to bind to %s on this computer (bind returned error %d, %s)"), addrBind.ToString().c_str(), nErr, strerror(nErr));
|
strError = strprintf(_("Unable to bind to %s on this computer (bind returned error %d, %s)"), addrBind.ToString(), nErr, strerror(nErr));
|
||||||
LogPrintf("%s\n", strError.c_str());
|
LogPrintf("%s\n", strError);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
LogPrintf("Bound to %s\n", addrBind.ToString().c_str());
|
LogPrintf("Bound to %s\n", addrBind.ToString());
|
||||||
|
|
||||||
// Listen for incoming connections
|
// Listen for incoming connections
|
||||||
if (listen(hListenSocket, SOMAXCONN) == SOCKET_ERROR)
|
if (listen(hListenSocket, SOMAXCONN) == SOCKET_ERROR)
|
||||||
{
|
{
|
||||||
strError = strprintf("Error: Listening for incoming connections failed (listen returned error %d)", WSAGetLastError());
|
strError = strprintf("Error: Listening for incoming connections failed (listen returned error %d)", WSAGetLastError());
|
||||||
LogPrintf("%s\n", strError.c_str());
|
LogPrintf("%s\n", strError);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1712,7 +1712,7 @@ void static Discover(boost::thread_group& threadGroup)
|
||||||
struct sockaddr_in* s4 = (struct sockaddr_in*)(ifa->ifa_addr);
|
struct sockaddr_in* s4 = (struct sockaddr_in*)(ifa->ifa_addr);
|
||||||
CNetAddr addr(s4->sin_addr);
|
CNetAddr addr(s4->sin_addr);
|
||||||
if (AddLocal(addr, LOCAL_IF))
|
if (AddLocal(addr, LOCAL_IF))
|
||||||
LogPrintf("IPv4 %s: %s\n", ifa->ifa_name, addr.ToString().c_str());
|
LogPrintf("IPv4 %s: %s\n", ifa->ifa_name, addr.ToString());
|
||||||
}
|
}
|
||||||
#ifdef USE_IPV6
|
#ifdef USE_IPV6
|
||||||
else if (ifa->ifa_addr->sa_family == AF_INET6)
|
else if (ifa->ifa_addr->sa_family == AF_INET6)
|
||||||
|
@ -1720,7 +1720,7 @@ void static Discover(boost::thread_group& threadGroup)
|
||||||
struct sockaddr_in6* s6 = (struct sockaddr_in6*)(ifa->ifa_addr);
|
struct sockaddr_in6* s6 = (struct sockaddr_in6*)(ifa->ifa_addr);
|
||||||
CNetAddr addr(s6->sin6_addr);
|
CNetAddr addr(s6->sin6_addr);
|
||||||
if (AddLocal(addr, LOCAL_IF))
|
if (AddLocal(addr, LOCAL_IF))
|
||||||
LogPrintf("IPv6 %s: %s\n", ifa->ifa_name, addr.ToString().c_str());
|
LogPrintf("IPv6 %s: %s\n", ifa->ifa_name, addr.ToString());
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
|
@ -171,7 +171,7 @@ bool LookupNumeric(const char *pszName, CService& addr, int portDefault)
|
||||||
|
|
||||||
bool static Socks4(const CService &addrDest, SOCKET& hSocket)
|
bool static Socks4(const CService &addrDest, SOCKET& hSocket)
|
||||||
{
|
{
|
||||||
LogPrintf("SOCKS4 connecting %s\n", addrDest.ToString().c_str());
|
LogPrintf("SOCKS4 connecting %s\n", addrDest.ToString());
|
||||||
if (!addrDest.IsIPv4())
|
if (!addrDest.IsIPv4())
|
||||||
{
|
{
|
||||||
closesocket(hSocket);
|
closesocket(hSocket);
|
||||||
|
@ -209,13 +209,13 @@ bool static Socks4(const CService &addrDest, SOCKET& hSocket)
|
||||||
LogPrintf("ERROR: Proxy returned error %d\n", pchRet[1]);
|
LogPrintf("ERROR: Proxy returned error %d\n", pchRet[1]);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
LogPrintf("SOCKS4 connected %s\n", addrDest.ToString().c_str());
|
LogPrintf("SOCKS4 connected %s\n", addrDest.ToString());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool static Socks5(string strDest, int port, SOCKET& hSocket)
|
bool static Socks5(string strDest, int port, SOCKET& hSocket)
|
||||||
{
|
{
|
||||||
LogPrintf("SOCKS5 connecting %s\n", strDest.c_str());
|
LogPrintf("SOCKS5 connecting %s\n", strDest);
|
||||||
if (strDest.size() > 255)
|
if (strDest.size() > 255)
|
||||||
{
|
{
|
||||||
closesocket(hSocket);
|
closesocket(hSocket);
|
||||||
|
@ -311,7 +311,7 @@ bool static Socks5(string strDest, int port, SOCKET& hSocket)
|
||||||
closesocket(hSocket);
|
closesocket(hSocket);
|
||||||
return error("Error reading from proxy");
|
return error("Error reading from proxy");
|
||||||
}
|
}
|
||||||
LogPrintf("SOCKS5 connected %s\n", strDest.c_str());
|
LogPrintf("SOCKS5 connected %s\n", strDest);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -326,7 +326,7 @@ bool static ConnectSocketDirectly(const CService &addrConnect, SOCKET& hSocketRe
|
||||||
#endif
|
#endif
|
||||||
socklen_t len = sizeof(sockaddr);
|
socklen_t len = sizeof(sockaddr);
|
||||||
if (!addrConnect.GetSockAddr((struct sockaddr*)&sockaddr, &len)) {
|
if (!addrConnect.GetSockAddr((struct sockaddr*)&sockaddr, &len)) {
|
||||||
LogPrintf("Cannot connect to %s: unsupported network\n", addrConnect.ToString().c_str());
|
LogPrintf("Cannot connect to %s: unsupported network\n", addrConnect.ToString());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -365,13 +365,13 @@ bool static ConnectSocketDirectly(const CService &addrConnect, SOCKET& hSocketRe
|
||||||
int nRet = select(hSocket + 1, NULL, &fdset, NULL, &timeout);
|
int nRet = select(hSocket + 1, NULL, &fdset, NULL, &timeout);
|
||||||
if (nRet == 0)
|
if (nRet == 0)
|
||||||
{
|
{
|
||||||
LogPrint("net", "connection to %s timeout\n", addrConnect.ToString().c_str());
|
LogPrint("net", "connection to %s timeout\n", addrConnect.ToString());
|
||||||
closesocket(hSocket);
|
closesocket(hSocket);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (nRet == SOCKET_ERROR)
|
if (nRet == SOCKET_ERROR)
|
||||||
{
|
{
|
||||||
LogPrintf("select() for %s failed: %i\n", addrConnect.ToString().c_str(), WSAGetLastError());
|
LogPrintf("select() for %s failed: %i\n", addrConnect.ToString(), WSAGetLastError());
|
||||||
closesocket(hSocket);
|
closesocket(hSocket);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -382,13 +382,13 @@ bool static ConnectSocketDirectly(const CService &addrConnect, SOCKET& hSocketRe
|
||||||
if (getsockopt(hSocket, SOL_SOCKET, SO_ERROR, &nRet, &nRetSize) == SOCKET_ERROR)
|
if (getsockopt(hSocket, SOL_SOCKET, SO_ERROR, &nRet, &nRetSize) == SOCKET_ERROR)
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
LogPrintf("getsockopt() for %s failed: %i\n", addrConnect.ToString().c_str(), WSAGetLastError());
|
LogPrintf("getsockopt() for %s failed: %i\n", addrConnect.ToString(), WSAGetLastError());
|
||||||
closesocket(hSocket);
|
closesocket(hSocket);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (nRet != 0)
|
if (nRet != 0)
|
||||||
{
|
{
|
||||||
LogPrintf("connect() to %s failed after select(): %s\n", addrConnect.ToString().c_str(), strerror(nRet));
|
LogPrintf("connect() to %s failed after select(): %s\n", addrConnect.ToString(), strerror(nRet));
|
||||||
closesocket(hSocket);
|
closesocket(hSocket);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -399,7 +399,7 @@ bool static ConnectSocketDirectly(const CService &addrConnect, SOCKET& hSocketRe
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
LogPrintf("connect() to %s failed: %i\n", addrConnect.ToString().c_str(), WSAGetLastError());
|
LogPrintf("connect() to %s failed: %i\n", addrConnect.ToString(), WSAGetLastError());
|
||||||
closesocket(hSocket);
|
closesocket(hSocket);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -895,7 +895,7 @@ uint64_t CNetAddr::GetHash() const
|
||||||
|
|
||||||
void CNetAddr::print() const
|
void CNetAddr::print() const
|
||||||
{
|
{
|
||||||
LogPrintf("CNetAddr(%s)\n", ToString().c_str());
|
LogPrintf("CNetAddr(%s)\n", ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
// private extensions to enum Network, only returned by GetExtNetwork,
|
// private extensions to enum Network, only returned by GetExtNetwork,
|
||||||
|
@ -1136,7 +1136,7 @@ std::string CService::ToString() const
|
||||||
|
|
||||||
void CService::print() const
|
void CService::print() const
|
||||||
{
|
{
|
||||||
LogPrintf("CService(%s)\n", ToString().c_str());
|
LogPrintf("CService(%s)\n", ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
void CService::SetPort(unsigned short portIn)
|
void CService::SetPort(unsigned short portIn)
|
||||||
|
|
|
@ -29,14 +29,14 @@ static bool noui_ThreadSafeMessageBox(const std::string& message, const std::str
|
||||||
strCaption += caption; // Use supplied caption (can be empty)
|
strCaption += caption; // Use supplied caption (can be empty)
|
||||||
}
|
}
|
||||||
|
|
||||||
LogPrintf("%s: %s\n", strCaption.c_str(), message.c_str());
|
LogPrintf("%s: %s\n", strCaption, message);
|
||||||
fprintf(stderr, "%s: %s\n", strCaption.c_str(), message.c_str());
|
fprintf(stderr, "%s: %s\n", strCaption.c_str(), message.c_str());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void noui_InitMessage(const std::string &message)
|
static void noui_InitMessage(const std::string &message)
|
||||||
{
|
{
|
||||||
LogPrintf("init message: %s\n", message.c_str());
|
LogPrintf("init message: %s\n", message);
|
||||||
}
|
}
|
||||||
|
|
||||||
void noui_connect()
|
void noui_connect()
|
||||||
|
|
|
@ -67,7 +67,7 @@ bool CMessageHeader::IsValid() const
|
||||||
// Message size
|
// Message size
|
||||||
if (nMessageSize > MAX_SIZE)
|
if (nMessageSize > MAX_SIZE)
|
||||||
{
|
{
|
||||||
LogPrintf("CMessageHeader::IsValid() : (%s, %u bytes) nMessageSize > MAX_SIZE\n", GetCommand().c_str(), nMessageSize);
|
LogPrintf("CMessageHeader::IsValid() : (%s, %u bytes) nMessageSize > MAX_SIZE\n", GetCommand(), nMessageSize);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -118,7 +118,7 @@ CInv::CInv(const std::string& strType, const uint256& hashIn)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (i == ARRAYLEN(ppszTypeName))
|
if (i == ARRAYLEN(ppszTypeName))
|
||||||
throw std::out_of_range(strprintf("CInv::CInv(string, uint256) : unknown type '%s'", strType.c_str()));
|
throw std::out_of_range(strprintf("CInv::CInv(string, uint256) : unknown type '%s'", strType));
|
||||||
hash = hashIn;
|
hash = hashIn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -141,11 +141,11 @@ const char* CInv::GetCommand() const
|
||||||
|
|
||||||
std::string CInv::ToString() const
|
std::string CInv::ToString() const
|
||||||
{
|
{
|
||||||
return strprintf("%s %s", GetCommand(), hash.ToString().c_str());
|
return strprintf("%s %s", GetCommand(), hash.ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
void CInv::print() const
|
void CInv::print() const
|
||||||
{
|
{
|
||||||
LogPrintf("CInv(%s)\n", ToString().c_str());
|
LogPrintf("CInv(%s)\n", ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -62,7 +62,7 @@ Q_DECLARE_METATYPE(bool*)
|
||||||
|
|
||||||
static void InitMessage(const std::string &message)
|
static void InitMessage(const std::string &message)
|
||||||
{
|
{
|
||||||
LogPrintf("init message: %s\n", message.c_str());
|
LogPrintf("init message: %s\n", message);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -178,7 +178,7 @@ Value importwallet(const Array& params, bool fHelp)
|
||||||
CPubKey pubkey = key.GetPubKey();
|
CPubKey pubkey = key.GetPubKey();
|
||||||
CKeyID keyid = pubkey.GetID();
|
CKeyID keyid = pubkey.GetID();
|
||||||
if (pwalletMain->HaveKey(keyid)) {
|
if (pwalletMain->HaveKey(keyid)) {
|
||||||
LogPrintf("Skipping import of %s (key already present)\n", CBitcoinAddress(keyid).ToString().c_str());
|
LogPrintf("Skipping import of %s (key already present)\n", CBitcoinAddress(keyid).ToString());
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
int64_t nTime = DecodeDumpTime(vstr[1]);
|
int64_t nTime = DecodeDumpTime(vstr[1]);
|
||||||
|
@ -196,7 +196,7 @@ Value importwallet(const Array& params, bool fHelp)
|
||||||
fLabel = true;
|
fLabel = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
LogPrintf("Importing %s...\n", CBitcoinAddress(keyid).ToString().c_str());
|
LogPrintf("Importing %s...\n", CBitcoinAddress(keyid).ToString());
|
||||||
if (!pwalletMain->AddKeyPubKey(key, pubkey)) {
|
if (!pwalletMain->AddKeyPubKey(key, pubkey)) {
|
||||||
fGood = false;
|
fGood = false;
|
||||||
continue;
|
continue;
|
||||||
|
@ -290,10 +290,10 @@ Value dumpwallet(const Array& params, bool fHelp)
|
||||||
std::sort(vKeyBirth.begin(), vKeyBirth.end());
|
std::sort(vKeyBirth.begin(), vKeyBirth.end());
|
||||||
|
|
||||||
// produce output
|
// produce output
|
||||||
file << strprintf("# Wallet dump created by Bitcoin %s (%s)\n", CLIENT_BUILD.c_str(), CLIENT_DATE.c_str());
|
file << strprintf("# Wallet dump created by Bitcoin %s (%s)\n", CLIENT_BUILD, CLIENT_DATE);
|
||||||
file << strprintf("# * Created on %s\n", EncodeDumpTime(GetTime()).c_str());
|
file << strprintf("# * Created on %s\n", EncodeDumpTime(GetTime()));
|
||||||
file << strprintf("# * Best block at time of backup was %i (%s),\n", chainActive.Height(), chainActive.Tip()->GetBlockHash().ToString().c_str());
|
file << strprintf("# * Best block at time of backup was %i (%s),\n", chainActive.Height(), chainActive.Tip()->GetBlockHash().ToString());
|
||||||
file << strprintf("# mined on %s\n", EncodeDumpTime(chainActive.Tip()->nTime).c_str());
|
file << strprintf("# mined on %s\n", EncodeDumpTime(chainActive.Tip()->nTime));
|
||||||
file << "\n";
|
file << "\n";
|
||||||
for (std::vector<std::pair<int64_t, CKeyID> >::const_iterator it = vKeyBirth.begin(); it != vKeyBirth.end(); it++) {
|
for (std::vector<std::pair<int64_t, CKeyID> >::const_iterator it = vKeyBirth.begin(); it != vKeyBirth.end(); it++) {
|
||||||
const CKeyID &keyid = it->second;
|
const CKeyID &keyid = it->second;
|
||||||
|
@ -302,11 +302,11 @@ Value dumpwallet(const Array& params, bool fHelp)
|
||||||
CKey key;
|
CKey key;
|
||||||
if (pwalletMain->GetKey(keyid, key)) {
|
if (pwalletMain->GetKey(keyid, key)) {
|
||||||
if (pwalletMain->mapAddressBook.count(keyid)) {
|
if (pwalletMain->mapAddressBook.count(keyid)) {
|
||||||
file << strprintf("%s %s label=%s # addr=%s\n", CBitcoinSecret(key).ToString().c_str(), strTime.c_str(), EncodeDumpString(pwalletMain->mapAddressBook[keyid].name).c_str(), strAddr.c_str());
|
file << strprintf("%s %s label=%s # addr=%s\n", CBitcoinSecret(key).ToString(), strTime, EncodeDumpString(pwalletMain->mapAddressBook[keyid].name), strAddr);
|
||||||
} else if (setKeyPool.count(keyid)) {
|
} else if (setKeyPool.count(keyid)) {
|
||||||
file << strprintf("%s %s reserve=1 # addr=%s\n", CBitcoinSecret(key).ToString().c_str(), strTime.c_str(), strAddr.c_str());
|
file << strprintf("%s %s reserve=1 # addr=%s\n", CBitcoinSecret(key).ToString(), strTime, strAddr);
|
||||||
} else {
|
} else {
|
||||||
file << strprintf("%s %s change=1 # addr=%s\n", CBitcoinSecret(key).ToString().c_str(), strTime.c_str(), strAddr.c_str());
|
file << strprintf("%s %s change=1 # addr=%s\n", CBitcoinSecret(key).ToString(), strTime, strAddr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -199,11 +199,11 @@ CScript _createmultisig(const Array& params)
|
||||||
CKeyID keyID;
|
CKeyID keyID;
|
||||||
if (!address.GetKeyID(keyID))
|
if (!address.GetKeyID(keyID))
|
||||||
throw runtime_error(
|
throw runtime_error(
|
||||||
strprintf("%s does not refer to a key",ks.c_str()));
|
strprintf("%s does not refer to a key",ks));
|
||||||
CPubKey vchPubKey;
|
CPubKey vchPubKey;
|
||||||
if (!pwalletMain->GetPubKey(keyID, vchPubKey))
|
if (!pwalletMain->GetPubKey(keyID, vchPubKey))
|
||||||
throw runtime_error(
|
throw runtime_error(
|
||||||
strprintf("no full public key for address %s",ks.c_str()));
|
strprintf("no full public key for address %s",ks));
|
||||||
if (!vchPubKey.IsFullyValid())
|
if (!vchPubKey.IsFullyValid())
|
||||||
throw runtime_error(" Invalid public key: "+ks);
|
throw runtime_error(" Invalid public key: "+ks);
|
||||||
pubkeys[i] = vchPubKey;
|
pubkeys[i] = vchPubKey;
|
||||||
|
|
|
@ -81,7 +81,7 @@ string HTTPReply(int nStatus, const string& strMsg, bool keepalive)
|
||||||
"<META HTTP-EQUIV='Content-Type' CONTENT='text/html; charset=ISO-8859-1'>\r\n"
|
"<META HTTP-EQUIV='Content-Type' CONTENT='text/html; charset=ISO-8859-1'>\r\n"
|
||||||
"</HEAD>\r\n"
|
"</HEAD>\r\n"
|
||||||
"<BODY><H1>401 Unauthorized.</H1></BODY>\r\n"
|
"<BODY><H1>401 Unauthorized.</H1></BODY>\r\n"
|
||||||
"</HTML>\r\n", rfc1123Time().c_str(), FormatFullVersion().c_str());
|
"</HTML>\r\n", rfc1123Time(), FormatFullVersion());
|
||||||
const char *cStatus;
|
const char *cStatus;
|
||||||
if (nStatus == HTTP_OK) cStatus = "OK";
|
if (nStatus == HTTP_OK) cStatus = "OK";
|
||||||
else if (nStatus == HTTP_BAD_REQUEST) cStatus = "Bad Request";
|
else if (nStatus == HTTP_BAD_REQUEST) cStatus = "Bad Request";
|
||||||
|
@ -100,11 +100,11 @@ string HTTPReply(int nStatus, const string& strMsg, bool keepalive)
|
||||||
"%s",
|
"%s",
|
||||||
nStatus,
|
nStatus,
|
||||||
cStatus,
|
cStatus,
|
||||||
rfc1123Time().c_str(),
|
rfc1123Time(),
|
||||||
keepalive ? "keep-alive" : "close",
|
keepalive ? "keep-alive" : "close",
|
||||||
strMsg.size(),
|
strMsg.size(),
|
||||||
FormatFullVersion().c_str(),
|
FormatFullVersion(),
|
||||||
strMsg.c_str());
|
strMsg);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ReadHTTPRequestLine(std::basic_istream<char>& stream, int &proto,
|
bool ReadHTTPRequestLine(std::basic_istream<char>& stream, int &proto,
|
||||||
|
|
|
@ -69,12 +69,12 @@ void RPCTypeCheck(const Object& o,
|
||||||
{
|
{
|
||||||
const Value& v = find_value(o, t.first);
|
const Value& v = find_value(o, t.first);
|
||||||
if (!fAllowNull && v.type() == null_type)
|
if (!fAllowNull && v.type() == null_type)
|
||||||
throw JSONRPCError(RPC_TYPE_ERROR, strprintf("Missing %s", t.first.c_str()));
|
throw JSONRPCError(RPC_TYPE_ERROR, strprintf("Missing %s", t.first));
|
||||||
|
|
||||||
if (!((v.type() == t.second) || (fAllowNull && (v.type() == null_type))))
|
if (!((v.type() == t.second) || (fAllowNull && (v.type() == null_type))))
|
||||||
{
|
{
|
||||||
string err = strprintf("Expected type %s for %s, got %s",
|
string err = strprintf("Expected type %s for %s, got %s",
|
||||||
Value_type_name[t.second], t.first.c_str(), Value_type_name[v.type()]);
|
Value_type_name[t.second], t.first, Value_type_name[v.type()]);
|
||||||
throw JSONRPCError(RPC_TYPE_ERROR, err);
|
throw JSONRPCError(RPC_TYPE_ERROR, err);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -176,7 +176,7 @@ string CRPCTable::help(string strCommand) const
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (strRet == "")
|
if (strRet == "")
|
||||||
strRet = strprintf("help: unknown command: %s\n", strCommand.c_str());
|
strRet = strprintf("help: unknown command: %s\n", strCommand);
|
||||||
strRet = strRet.substr(0,strRet.size()-1);
|
strRet = strRet.substr(0,strRet.size()-1);
|
||||||
return strRet;
|
return strRet;
|
||||||
}
|
}
|
||||||
|
@ -513,9 +513,9 @@ void StartRPCThreads()
|
||||||
"If the file does not exist, create it with owner-readable-only file permissions.\n"
|
"If the file does not exist, create it with owner-readable-only file permissions.\n"
|
||||||
"It is also recommended to set alertnotify so you are notified of problems;\n"
|
"It is also recommended to set alertnotify so you are notified of problems;\n"
|
||||||
"for example: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@foo.com\n"),
|
"for example: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@foo.com\n"),
|
||||||
strWhatAmI.c_str(),
|
strWhatAmI,
|
||||||
GetConfigFile().string().c_str(),
|
GetConfigFile().string(),
|
||||||
EncodeBase58(&rand_pwd[0],&rand_pwd[0]+32).c_str()),
|
EncodeBase58(&rand_pwd[0],&rand_pwd[0]+32)),
|
||||||
"", CClientUIInterface::MSG_ERROR);
|
"", CClientUIInterface::MSG_ERROR);
|
||||||
StartShutdown();
|
StartShutdown();
|
||||||
return;
|
return;
|
||||||
|
@ -534,12 +534,12 @@ void StartRPCThreads()
|
||||||
filesystem::path pathCertFile(GetArg("-rpcsslcertificatechainfile", "server.cert"));
|
filesystem::path pathCertFile(GetArg("-rpcsslcertificatechainfile", "server.cert"));
|
||||||
if (!pathCertFile.is_complete()) pathCertFile = filesystem::path(GetDataDir()) / pathCertFile;
|
if (!pathCertFile.is_complete()) pathCertFile = filesystem::path(GetDataDir()) / pathCertFile;
|
||||||
if (filesystem::exists(pathCertFile)) rpc_ssl_context->use_certificate_chain_file(pathCertFile.string());
|
if (filesystem::exists(pathCertFile)) rpc_ssl_context->use_certificate_chain_file(pathCertFile.string());
|
||||||
else LogPrintf("ThreadRPCServer ERROR: missing server certificate file %s\n", pathCertFile.string().c_str());
|
else LogPrintf("ThreadRPCServer ERROR: missing server certificate file %s\n", pathCertFile.string());
|
||||||
|
|
||||||
filesystem::path pathPKFile(GetArg("-rpcsslprivatekeyfile", "server.pem"));
|
filesystem::path pathPKFile(GetArg("-rpcsslprivatekeyfile", "server.pem"));
|
||||||
if (!pathPKFile.is_complete()) pathPKFile = filesystem::path(GetDataDir()) / pathPKFile;
|
if (!pathPKFile.is_complete()) pathPKFile = filesystem::path(GetDataDir()) / pathPKFile;
|
||||||
if (filesystem::exists(pathPKFile)) rpc_ssl_context->use_private_key_file(pathPKFile.string(), ssl::context::pem);
|
if (filesystem::exists(pathPKFile)) rpc_ssl_context->use_private_key_file(pathPKFile.string(), ssl::context::pem);
|
||||||
else LogPrintf("ThreadRPCServer ERROR: missing server private key file %s\n", pathPKFile.string().c_str());
|
else LogPrintf("ThreadRPCServer ERROR: missing server private key file %s\n", pathPKFile.string());
|
||||||
|
|
||||||
string strCiphers = GetArg("-rpcsslciphers", "TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH");
|
string strCiphers = GetArg("-rpcsslciphers", "TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH");
|
||||||
SSL_CTX_set_cipher_list(rpc_ssl_context->impl(), strCiphers.c_str());
|
SSL_CTX_set_cipher_list(rpc_ssl_context->impl(), strCiphers.c_str());
|
||||||
|
@ -683,7 +683,7 @@ void JSONRequest::parse(const Value& valRequest)
|
||||||
throw JSONRPCError(RPC_INVALID_REQUEST, "Method must be a string");
|
throw JSONRPCError(RPC_INVALID_REQUEST, "Method must be a string");
|
||||||
strMethod = valMethod.get_str();
|
strMethod = valMethod.get_str();
|
||||||
if (strMethod != "getwork" && strMethod != "getblocktemplate")
|
if (strMethod != "getwork" && strMethod != "getblocktemplate")
|
||||||
LogPrint("rpc", "ThreadRPCServer method=%s\n", strMethod.c_str());
|
LogPrint("rpc", "ThreadRPCServer method=%s\n", strMethod);
|
||||||
|
|
||||||
// Parse params
|
// Parse params
|
||||||
Value valParams = find_value(request, "params");
|
Value valParams = find_value(request, "params");
|
||||||
|
@ -758,7 +758,7 @@ void ServiceConnection(AcceptedConnection *conn)
|
||||||
}
|
}
|
||||||
if (!HTTPAuthorized(mapHeaders))
|
if (!HTTPAuthorized(mapHeaders))
|
||||||
{
|
{
|
||||||
LogPrintf("ThreadRPCServer incorrect password attempt from %s\n", conn->peer_address_to_string().c_str());
|
LogPrintf("ThreadRPCServer incorrect password attempt from %s\n", conn->peer_address_to_string());
|
||||||
/* Deter brute-forcing short passwords.
|
/* Deter brute-forcing short passwords.
|
||||||
If this results in a DoS the user really
|
If this results in a DoS the user really
|
||||||
shouldn't have their RPC port exposed. */
|
shouldn't have their RPC port exposed. */
|
||||||
|
|
10
src/sync.cpp
10
src/sync.cpp
|
@ -65,14 +65,14 @@ static void potential_deadlock_detected(const std::pair<void*, void*>& mismatch,
|
||||||
{
|
{
|
||||||
if (i.first == mismatch.first) LogPrintf(" (1)");
|
if (i.first == mismatch.first) LogPrintf(" (1)");
|
||||||
if (i.first == mismatch.second) LogPrintf(" (2)");
|
if (i.first == mismatch.second) LogPrintf(" (2)");
|
||||||
LogPrintf(" %s\n", i.second.ToString().c_str());
|
LogPrintf(" %s\n", i.second.ToString());
|
||||||
}
|
}
|
||||||
LogPrintf("Current lock order is:\n");
|
LogPrintf("Current lock order is:\n");
|
||||||
BOOST_FOREACH(const PAIRTYPE(void*, CLockLocation)& i, s1)
|
BOOST_FOREACH(const PAIRTYPE(void*, CLockLocation)& i, s1)
|
||||||
{
|
{
|
||||||
if (i.first == mismatch.first) LogPrintf(" (1)");
|
if (i.first == mismatch.first) LogPrintf(" (1)");
|
||||||
if (i.first == mismatch.second) LogPrintf(" (2)");
|
if (i.first == mismatch.second) LogPrintf(" (2)");
|
||||||
LogPrintf(" %s\n", i.second.ToString().c_str());
|
LogPrintf(" %s\n", i.second.ToString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -81,7 +81,7 @@ static void push_lock(void* c, const CLockLocation& locklocation, bool fTry)
|
||||||
if (lockstack.get() == NULL)
|
if (lockstack.get() == NULL)
|
||||||
lockstack.reset(new LockStack);
|
lockstack.reset(new LockStack);
|
||||||
|
|
||||||
LogPrint("lock", "Locking: %s\n", locklocation.ToString().c_str());
|
LogPrint("lock", "Locking: %s\n", locklocation.ToString());
|
||||||
dd_mutex.lock();
|
dd_mutex.lock();
|
||||||
|
|
||||||
(*lockstack).push_back(std::make_pair(c, locklocation));
|
(*lockstack).push_back(std::make_pair(c, locklocation));
|
||||||
|
@ -111,7 +111,7 @@ static void pop_lock()
|
||||||
if (fDebug)
|
if (fDebug)
|
||||||
{
|
{
|
||||||
const CLockLocation& locklocation = (*lockstack).rbegin()->second;
|
const CLockLocation& locklocation = (*lockstack).rbegin()->second;
|
||||||
LogPrint("lock", "Unlocked: %s\n", locklocation.ToString().c_str());
|
LogPrint("lock", "Unlocked: %s\n", locklocation.ToString());
|
||||||
}
|
}
|
||||||
dd_mutex.lock();
|
dd_mutex.lock();
|
||||||
(*lockstack).pop_back();
|
(*lockstack).pop_back();
|
||||||
|
@ -140,7 +140,7 @@ void AssertLockHeldInternal(const char *pszName, const char* pszFile, int nLine,
|
||||||
{
|
{
|
||||||
BOOST_FOREACH(const PAIRTYPE(void*, CLockLocation)&i, *lockstack)
|
BOOST_FOREACH(const PAIRTYPE(void*, CLockLocation)&i, *lockstack)
|
||||||
if (i.first == cs) return;
|
if (i.first == cs) return;
|
||||||
LogPrintf("Lock %s not held in %s:%i; locks held:\n%s", pszName, pszFile, nLine, LocksHeld().c_str());
|
LogPrintf("Lock %s not held in %s:%i; locks held:\n%s", pszName, pszFile, nLine, LocksHeld());
|
||||||
assert(0);
|
assert(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
1010
src/tinyformat.h
Normal file
1010
src/tinyformat.h
Normal file
File diff suppressed because it is too large
Load diff
|
@ -219,7 +219,7 @@ bool CBlockTreeDB::LoadBlockIndexGuts()
|
||||||
pindexNew->nTx = diskindex.nTx;
|
pindexNew->nTx = diskindex.nTx;
|
||||||
|
|
||||||
if (!pindexNew->CheckIndex())
|
if (!pindexNew->CheckIndex())
|
||||||
return error("LoadBlockIndex() : CheckIndex failed: %s", pindexNew->ToString().c_str());
|
return error("LoadBlockIndex() : CheckIndex failed: %s", pindexNew->ToString());
|
||||||
|
|
||||||
pcursor->Next();
|
pcursor->Next();
|
||||||
} else {
|
} else {
|
||||||
|
|
88
src/util.cpp
88
src/util.cpp
|
@ -235,12 +235,12 @@ static void DebugPrintInit()
|
||||||
mutexDebugLog = new boost::mutex();
|
mutexDebugLog = new boost::mutex();
|
||||||
}
|
}
|
||||||
|
|
||||||
int LogPrint(const char* category, const char* pszFormat, ...)
|
bool LogAcceptCategory(const char* category)
|
||||||
{
|
{
|
||||||
if (category != NULL)
|
if (category != NULL)
|
||||||
{
|
{
|
||||||
if (!fDebug)
|
if (!fDebug)
|
||||||
return 0;
|
return false;
|
||||||
|
|
||||||
// Give each thread quick access to -debug settings.
|
// Give each thread quick access to -debug settings.
|
||||||
// This helps prevent issues debugging global destructors,
|
// This helps prevent issues debugging global destructors,
|
||||||
|
@ -258,17 +258,18 @@ int LogPrint(const char* category, const char* pszFormat, ...)
|
||||||
// if not debugging everything and not debugging specific category, LogPrint does nothing.
|
// if not debugging everything and not debugging specific category, LogPrint does nothing.
|
||||||
if (setCategories.count(string("")) == 0 &&
|
if (setCategories.count(string("")) == 0 &&
|
||||||
setCategories.count(string(category)) == 0)
|
setCategories.count(string(category)) == 0)
|
||||||
return 0;
|
return false;
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
int LogPrintStr(const std::string &str)
|
||||||
|
{
|
||||||
int ret = 0; // Returns total number of characters written
|
int ret = 0; // Returns total number of characters written
|
||||||
if (fPrintToConsole)
|
if (fPrintToConsole)
|
||||||
{
|
{
|
||||||
// print to console
|
// print to console
|
||||||
va_list arg_ptr;
|
ret = fwrite(str.data(), 1, str.size(), stdout);
|
||||||
va_start(arg_ptr, pszFormat);
|
|
||||||
ret += vprintf(pszFormat, arg_ptr);
|
|
||||||
va_end(arg_ptr);
|
|
||||||
}
|
}
|
||||||
else if (fPrintToDebugLog)
|
else if (fPrintToDebugLog)
|
||||||
{
|
{
|
||||||
|
@ -291,76 +292,17 @@ int LogPrint(const char* category, const char* pszFormat, ...)
|
||||||
// Debug print useful for profiling
|
// Debug print useful for profiling
|
||||||
if (fLogTimestamps && fStartedNewLine)
|
if (fLogTimestamps && fStartedNewLine)
|
||||||
ret += fprintf(fileout, "%s ", DateTimeStrFormat("%Y-%m-%d %H:%M:%S", GetTime()).c_str());
|
ret += fprintf(fileout, "%s ", DateTimeStrFormat("%Y-%m-%d %H:%M:%S", GetTime()).c_str());
|
||||||
if (pszFormat[strlen(pszFormat) - 1] == '\n')
|
if (!str.empty() && str[str.size()-1] == '\n')
|
||||||
fStartedNewLine = true;
|
fStartedNewLine = true;
|
||||||
else
|
else
|
||||||
fStartedNewLine = false;
|
fStartedNewLine = false;
|
||||||
|
|
||||||
va_list arg_ptr;
|
ret = fwrite(str.data(), 1, str.size(), fileout);
|
||||||
va_start(arg_ptr, pszFormat);
|
|
||||||
ret += vfprintf(fileout, pszFormat, arg_ptr);
|
|
||||||
va_end(arg_ptr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
string vstrprintf(const char *format, va_list ap)
|
|
||||||
{
|
|
||||||
char buffer[50000];
|
|
||||||
char* p = buffer;
|
|
||||||
int limit = sizeof(buffer);
|
|
||||||
int ret;
|
|
||||||
while (true)
|
|
||||||
{
|
|
||||||
va_list arg_ptr;
|
|
||||||
va_copy(arg_ptr, ap);
|
|
||||||
ret = vsnprintf(p, limit, format, arg_ptr);
|
|
||||||
va_end(arg_ptr);
|
|
||||||
if (ret >= 0 && ret < limit)
|
|
||||||
break;
|
|
||||||
if (p != buffer)
|
|
||||||
delete[] p;
|
|
||||||
limit *= 2;
|
|
||||||
p = new char[limit];
|
|
||||||
if (p == NULL)
|
|
||||||
throw std::bad_alloc();
|
|
||||||
}
|
|
||||||
string str(p, p+ret);
|
|
||||||
if (p != buffer)
|
|
||||||
delete[] p;
|
|
||||||
return str;
|
|
||||||
}
|
|
||||||
|
|
||||||
string real_strprintf(const char *format, int dummy, ...)
|
|
||||||
{
|
|
||||||
va_list arg_ptr;
|
|
||||||
va_start(arg_ptr, dummy);
|
|
||||||
string str = vstrprintf(format, arg_ptr);
|
|
||||||
va_end(arg_ptr);
|
|
||||||
return str;
|
|
||||||
}
|
|
||||||
|
|
||||||
string real_strprintf(const std::string &format, int dummy, ...)
|
|
||||||
{
|
|
||||||
va_list arg_ptr;
|
|
||||||
va_start(arg_ptr, dummy);
|
|
||||||
string str = vstrprintf(format.c_str(), arg_ptr);
|
|
||||||
va_end(arg_ptr);
|
|
||||||
return str;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool error(const char *format, ...)
|
|
||||||
{
|
|
||||||
va_list arg_ptr;
|
|
||||||
va_start(arg_ptr, format);
|
|
||||||
std::string str = vstrprintf(format, arg_ptr);
|
|
||||||
va_end(arg_ptr);
|
|
||||||
LogPrintf("ERROR: %s\n", str.c_str());
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void ParseString(const string& str, char c, vector<string>& v)
|
void ParseString(const string& str, char c, vector<string>& v)
|
||||||
{
|
{
|
||||||
if (str.empty())
|
if (str.empty())
|
||||||
|
@ -1003,13 +945,13 @@ static std::string FormatException(std::exception* pex, const char* pszThread)
|
||||||
void LogException(std::exception* pex, const char* pszThread)
|
void LogException(std::exception* pex, const char* pszThread)
|
||||||
{
|
{
|
||||||
std::string message = FormatException(pex, pszThread);
|
std::string message = FormatException(pex, pszThread);
|
||||||
LogPrintf("\n%s", message.c_str());
|
LogPrintf("\n%s", message);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PrintException(std::exception* pex, const char* pszThread)
|
void PrintException(std::exception* pex, const char* pszThread)
|
||||||
{
|
{
|
||||||
std::string message = FormatException(pex, pszThread);
|
std::string message = FormatException(pex, pszThread);
|
||||||
LogPrintf("\n\n************************\n%s\n", message.c_str());
|
LogPrintf("\n\n************************\n%s\n", message);
|
||||||
fprintf(stderr, "\n\n************************\n%s\n", message.c_str());
|
fprintf(stderr, "\n\n************************\n%s\n", message.c_str());
|
||||||
strMiscWarning = message;
|
strMiscWarning = message;
|
||||||
throw;
|
throw;
|
||||||
|
@ -1018,7 +960,7 @@ void PrintException(std::exception* pex, const char* pszThread)
|
||||||
void PrintExceptionContinue(std::exception* pex, const char* pszThread)
|
void PrintExceptionContinue(std::exception* pex, const char* pszThread)
|
||||||
{
|
{
|
||||||
std::string message = FormatException(pex, pszThread);
|
std::string message = FormatException(pex, pszThread);
|
||||||
LogPrintf("\n\n************************\n%s\n", message.c_str());
|
LogPrintf("\n\n************************\n%s\n", message);
|
||||||
fprintf(stderr, "\n\n************************\n%s\n", message.c_str());
|
fprintf(stderr, "\n\n************************\n%s\n", message.c_str());
|
||||||
strMiscWarning = message;
|
strMiscWarning = message;
|
||||||
}
|
}
|
||||||
|
@ -1363,7 +1305,7 @@ void AddTimeData(const CNetAddr& ip, int64_t nTime)
|
||||||
fDone = true;
|
fDone = true;
|
||||||
string strMessage = _("Warning: Please check that your computer's date and time are correct! If your clock is wrong Bitcoin will not work properly.");
|
string strMessage = _("Warning: Please check that your computer's date and time are correct! If your clock is wrong Bitcoin will not work properly.");
|
||||||
strMiscWarning = strMessage;
|
strMiscWarning = strMessage;
|
||||||
LogPrintf("*** %s\n", strMessage.c_str());
|
LogPrintf("*** %s\n", strMessage);
|
||||||
uiInterface.ThreadSafeMessageBox(strMessage, "", CClientUIInterface::MSG_WARNING);
|
uiInterface.ThreadSafeMessageBox(strMessage, "", CClientUIInterface::MSG_WARNING);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1466,7 +1408,7 @@ void runCommand(std::string strCommand)
|
||||||
{
|
{
|
||||||
int nErr = ::system(strCommand.c_str());
|
int nErr = ::system(strCommand.c_str());
|
||||||
if (nErr)
|
if (nErr)
|
||||||
LogPrintf("runCommand error: system(%s) returned %d\n", strCommand.c_str(), nErr);
|
LogPrintf("runCommand error: system(%s) returned %d\n", strCommand, nErr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RenameThread(const char* name)
|
void RenameThread(const char* name)
|
||||||
|
|
72
src/util.h
72
src/util.h
|
@ -12,6 +12,7 @@
|
||||||
|
|
||||||
#include "compat.h"
|
#include "compat.h"
|
||||||
#include "serialize.h"
|
#include "serialize.h"
|
||||||
|
#include "tinyformat.h"
|
||||||
|
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#include <exception>
|
#include <exception>
|
||||||
|
@ -99,21 +100,6 @@ inline void MilliSleep(int64_t n)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This GNU C extension enables the compiler to check the format string against the parameters provided.
|
|
||||||
* X is the number of the "format string" parameter, and Y is the number of the first variadic parameter.
|
|
||||||
* Parameters count from 1.
|
|
||||||
*/
|
|
||||||
#ifdef __GNUC__
|
|
||||||
#define ATTR_WARN_PRINTF(X,Y) __attribute__((format(gnu_printf,X,Y)))
|
|
||||||
#else
|
|
||||||
#define ATTR_WARN_PRINTF(X,Y)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
extern std::map<std::string, std::string> mapArgs;
|
extern std::map<std::string, std::string> mapArgs;
|
||||||
|
@ -130,27 +116,49 @@ extern volatile bool fReopenDebugLog;
|
||||||
void RandAddSeed();
|
void RandAddSeed();
|
||||||
void RandAddSeedPerfmon();
|
void RandAddSeedPerfmon();
|
||||||
|
|
||||||
// Print to debug.log if -debug=category switch is given OR category is NULL.
|
/* Return true if log accepts specified category */
|
||||||
int ATTR_WARN_PRINTF(2,3) LogPrint(const char* category, const char* pszFormat, ...);
|
bool LogAcceptCategory(const char* category);
|
||||||
|
/* Send a string to the log output */
|
||||||
|
int LogPrintStr(const std::string &str);
|
||||||
|
|
||||||
|
#define strprintf tfm::format
|
||||||
#define LogPrintf(...) LogPrint(NULL, __VA_ARGS__)
|
#define LogPrintf(...) LogPrint(NULL, __VA_ARGS__)
|
||||||
|
|
||||||
/*
|
/* When we switch to C++11, this can be switched to variadic templates instead
|
||||||
Rationale for the real_strprintf / strprintf construction:
|
* of this macro-based construction (see tinyformat.h).
|
||||||
It is not allowed to use va_start with a pass-by-reference argument.
|
|
||||||
(C++ standard, 18.7, paragraph 3). Use a dummy argument to work around this, and use a
|
|
||||||
macro to keep similar semantics.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** Overload strprintf for char*, so that GCC format type warnings can be given */
|
|
||||||
std::string ATTR_WARN_PRINTF(1,3) real_strprintf(const char *format, int dummy, ...);
|
|
||||||
/** Overload strprintf for std::string, to be able to use it with _ (translation).
|
|
||||||
* This will not support GCC format type warnings (-Wformat) so be careful.
|
|
||||||
*/
|
*/
|
||||||
std::string real_strprintf(const std::string &format, int dummy, ...);
|
#define MAKE_ERROR_AND_LOG_FUNC(n) \
|
||||||
#define strprintf(format, ...) real_strprintf(format, 0, __VA_ARGS__)
|
/* Print to debug.log if -debug=category switch is given OR category is NULL. */ \
|
||||||
std::string vstrprintf(const char *format, va_list ap);
|
template<TINYFORMAT_ARGTYPES(n)> \
|
||||||
|
static inline int LogPrint(const char* category, const char* format, TINYFORMAT_VARARGS(n)) \
|
||||||
|
{ \
|
||||||
|
if(!LogAcceptCategory(category)) return 0; \
|
||||||
|
return LogPrintStr(tfm::format(format, TINYFORMAT_PASSARGS(n))); \
|
||||||
|
} \
|
||||||
|
/* Log error and return false */ \
|
||||||
|
template<TINYFORMAT_ARGTYPES(n)> \
|
||||||
|
static inline bool error(const char* format, TINYFORMAT_VARARGS(n)) \
|
||||||
|
{ \
|
||||||
|
LogPrintStr("ERROR: " + tfm::format(format, TINYFORMAT_PASSARGS(n))); \
|
||||||
|
return false; \
|
||||||
|
}
|
||||||
|
|
||||||
|
TINYFORMAT_FOREACH_ARGNUM(MAKE_ERROR_AND_LOG_FUNC)
|
||||||
|
|
||||||
|
/* Zero-arg versions of logging and error, these are not covered by
|
||||||
|
* TINYFORMAT_FOREACH_ARGNUM
|
||||||
|
*/
|
||||||
|
static inline int LogPrint(const char* category, const char* format)
|
||||||
|
{
|
||||||
|
if(!LogAcceptCategory(category)) return 0;
|
||||||
|
return LogPrintStr(format);
|
||||||
|
}
|
||||||
|
static inline bool error(const char* format)
|
||||||
|
{
|
||||||
|
LogPrintStr(std::string("ERROR: ") + format);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
bool ATTR_WARN_PRINTF(1,2) error(const char *format, ...);
|
|
||||||
|
|
||||||
void LogException(std::exception* pex, const char* pszThread);
|
void LogException(std::exception* pex, const char* pszThread);
|
||||||
void PrintException(std::exception* pex, const char* pszThread);
|
void PrintException(std::exception* pex, const char* pszThread);
|
||||||
|
|
|
@ -381,10 +381,10 @@ void CWallet::WalletUpdateSpent(const CTransaction &tx)
|
||||||
{
|
{
|
||||||
CWalletTx& wtx = (*mi).second;
|
CWalletTx& wtx = (*mi).second;
|
||||||
if (txin.prevout.n >= wtx.vout.size())
|
if (txin.prevout.n >= wtx.vout.size())
|
||||||
LogPrintf("WalletUpdateSpent: bad wtx %s\n", wtx.GetHash().ToString().c_str());
|
LogPrintf("WalletUpdateSpent: bad wtx %s\n", wtx.GetHash().ToString());
|
||||||
else if (!wtx.IsSpent(txin.prevout.n) && IsMine(wtx.vout[txin.prevout.n]))
|
else if (!wtx.IsSpent(txin.prevout.n) && IsMine(wtx.vout[txin.prevout.n]))
|
||||||
{
|
{
|
||||||
LogPrintf("WalletUpdateSpent found spent coin %sbc %s\n", FormatMoney(wtx.GetCredit()).c_str(), wtx.GetHash().ToString().c_str());
|
LogPrintf("WalletUpdateSpent found spent coin %sbc %s\n", FormatMoney(wtx.GetCredit()), wtx.GetHash().ToString());
|
||||||
wtx.MarkSpent(txin.prevout.n);
|
wtx.MarkSpent(txin.prevout.n);
|
||||||
wtx.WriteToDisk();
|
wtx.WriteToDisk();
|
||||||
NotifyTransactionChanged(this, txin.prevout.hash, CT_UPDATED);
|
NotifyTransactionChanged(this, txin.prevout.hash, CT_UPDATED);
|
||||||
|
@ -460,8 +460,8 @@ bool CWallet::AddToWallet(const CWalletTx& wtxIn)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
LogPrintf("AddToWallet() : found %s in block %s not in index\n",
|
LogPrintf("AddToWallet() : found %s in block %s not in index\n",
|
||||||
wtxIn.GetHash().ToString().c_str(),
|
wtxIn.GetHash().ToString(),
|
||||||
wtxIn.hashBlock.ToString().c_str());
|
wtxIn.hashBlock.ToString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -489,7 +489,7 @@ bool CWallet::AddToWallet(const CWalletTx& wtxIn)
|
||||||
}
|
}
|
||||||
|
|
||||||
//// debug print
|
//// debug print
|
||||||
LogPrintf("AddToWallet %s %s%s\n", wtxIn.GetHash().ToString().c_str(), (fInsertedNew ? "new" : ""), (fUpdated ? "update" : ""));
|
LogPrintf("AddToWallet %s %s%s\n", wtxIn.GetHash().ToString(), (fInsertedNew ? "new" : ""), (fUpdated ? "update" : ""));
|
||||||
|
|
||||||
// Write to disk
|
// Write to disk
|
||||||
if (fInsertedNew || fUpdated)
|
if (fInsertedNew || fUpdated)
|
||||||
|
@ -690,7 +690,7 @@ void CWalletTx::GetAmounts(list<pair<CTxDestination, int64_t> >& listReceived,
|
||||||
if (!ExtractDestination(txout.scriptPubKey, address))
|
if (!ExtractDestination(txout.scriptPubKey, address))
|
||||||
{
|
{
|
||||||
LogPrintf("CWalletTx::GetAmounts: Unknown transaction type found, txid %s\n",
|
LogPrintf("CWalletTx::GetAmounts: Unknown transaction type found, txid %s\n",
|
||||||
this->GetHash().ToString().c_str());
|
this->GetHash().ToString());
|
||||||
address = CNoDestination();
|
address = CNoDestination();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -883,7 +883,7 @@ void CWallet::ReacceptWalletTransactions()
|
||||||
}
|
}
|
||||||
if (fUpdated)
|
if (fUpdated)
|
||||||
{
|
{
|
||||||
LogPrintf("ReacceptWalletTransactions found spent coin %sbc %s\n", FormatMoney(wtx.GetCredit()).c_str(), wtx.GetHash().ToString().c_str());
|
LogPrintf("ReacceptWalletTransactions found spent coin %sbc %s\n", FormatMoney(wtx.GetCredit()), wtx.GetHash().ToString());
|
||||||
wtx.MarkDirty();
|
wtx.MarkDirty();
|
||||||
wtx.WriteToDisk();
|
wtx.WriteToDisk();
|
||||||
}
|
}
|
||||||
|
@ -919,7 +919,7 @@ void CWalletTx::RelayWalletTransaction()
|
||||||
{
|
{
|
||||||
if (GetDepthInMainChain() == 0) {
|
if (GetDepthInMainChain() == 0) {
|
||||||
uint256 hash = GetHash();
|
uint256 hash = GetHash();
|
||||||
LogPrintf("Relaying wtx %s\n", hash.ToString().c_str());
|
LogPrintf("Relaying wtx %s\n", hash.ToString());
|
||||||
RelayTransaction((CTransaction)*this, hash);
|
RelayTransaction((CTransaction)*this, hash);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1186,8 +1186,8 @@ bool CWallet::SelectCoinsMinConf(int64_t nTargetValue, int nConfMine, int nConfT
|
||||||
LogPrint("selectcoins", "SelectCoins() best subset: ");
|
LogPrint("selectcoins", "SelectCoins() best subset: ");
|
||||||
for (unsigned int i = 0; i < vValue.size(); i++)
|
for (unsigned int i = 0; i < vValue.size(); i++)
|
||||||
if (vfBest[i])
|
if (vfBest[i])
|
||||||
LogPrint("selectcoins", "%s ", FormatMoney(vValue[i].first).c_str());
|
LogPrint("selectcoins", "%s ", FormatMoney(vValue[i].first));
|
||||||
LogPrint("selectcoins", "total %s\n", FormatMoney(nBest).c_str());
|
LogPrint("selectcoins", "total %s\n", FormatMoney(nBest));
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -1396,7 +1396,7 @@ bool CWallet::CommitTransaction(CWalletTx& wtxNew, CReserveKey& reservekey)
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
LOCK2(cs_main, cs_wallet);
|
LOCK2(cs_main, cs_wallet);
|
||||||
LogPrintf("CommitTransaction:\n%s", wtxNew.ToString().c_str());
|
LogPrintf("CommitTransaction:\n%s", wtxNew.ToString());
|
||||||
{
|
{
|
||||||
// This is only to keep the database open to defeat the auto-flush for the
|
// This is only to keep the database open to defeat the auto-flush for the
|
||||||
// duration of this scope. This is the only place where this optimization
|
// duration of this scope. This is the only place where this optimization
|
||||||
|
@ -1451,15 +1451,15 @@ string CWallet::SendMoney(CScript scriptPubKey, int64_t nValue, CWalletTx& wtxNe
|
||||||
if (IsLocked())
|
if (IsLocked())
|
||||||
{
|
{
|
||||||
string strError = _("Error: Wallet locked, unable to create transaction!");
|
string strError = _("Error: Wallet locked, unable to create transaction!");
|
||||||
LogPrintf("SendMoney() : %s", strError.c_str());
|
LogPrintf("SendMoney() : %s", strError);
|
||||||
return strError;
|
return strError;
|
||||||
}
|
}
|
||||||
string strError;
|
string strError;
|
||||||
if (!CreateTransaction(scriptPubKey, nValue, wtxNew, reservekey, nFeeRequired, strError))
|
if (!CreateTransaction(scriptPubKey, nValue, wtxNew, reservekey, nFeeRequired, strError))
|
||||||
{
|
{
|
||||||
if (nValue + nFeeRequired > GetBalance())
|
if (nValue + nFeeRequired > GetBalance())
|
||||||
strError = strprintf(_("Error: This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds!"), FormatMoney(nFeeRequired).c_str());
|
strError = strprintf(_("Error: This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds!"), FormatMoney(nFeeRequired));
|
||||||
LogPrintf("SendMoney() : %s\n", strError.c_str());
|
LogPrintf("SendMoney() : %s\n", strError);
|
||||||
return strError;
|
return strError;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -374,12 +374,12 @@ ReadKeyValue(CWallet* pwallet, CDataStream& ssKey, CDataStream& ssValue,
|
||||||
char fUnused;
|
char fUnused;
|
||||||
ssValue >> fTmp >> fUnused >> wtx.strFromAccount;
|
ssValue >> fTmp >> fUnused >> wtx.strFromAccount;
|
||||||
strErr = strprintf("LoadWallet() upgrading tx ver=%d %d '%s' %s",
|
strErr = strprintf("LoadWallet() upgrading tx ver=%d %d '%s' %s",
|
||||||
wtx.fTimeReceivedIsTxTime, fTmp, wtx.strFromAccount.c_str(), hash.ToString().c_str());
|
wtx.fTimeReceivedIsTxTime, fTmp, wtx.strFromAccount, hash.ToString());
|
||||||
wtx.fTimeReceivedIsTxTime = fTmp;
|
wtx.fTimeReceivedIsTxTime = fTmp;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
strErr = strprintf("LoadWallet() repairing tx ver=%d %s", wtx.fTimeReceivedIsTxTime, hash.ToString().c_str());
|
strErr = strprintf("LoadWallet() repairing tx ver=%d %s", wtx.fTimeReceivedIsTxTime, hash.ToString());
|
||||||
wtx.fTimeReceivedIsTxTime = 0;
|
wtx.fTimeReceivedIsTxTime = 0;
|
||||||
}
|
}
|
||||||
wss.vWalletUpgrade.push_back(hash);
|
wss.vWalletUpgrade.push_back(hash);
|
||||||
|
@ -390,12 +390,12 @@ ReadKeyValue(CWallet* pwallet, CDataStream& ssKey, CDataStream& ssValue,
|
||||||
|
|
||||||
pwallet->mapWallet[hash] = wtx;
|
pwallet->mapWallet[hash] = wtx;
|
||||||
//// debug print
|
//// debug print
|
||||||
//LogPrintf("LoadWallet %s\n", wtx.GetHash().ToString().c_str());
|
//LogPrintf("LoadWallet %s\n", wtx.GetHash().ToString());
|
||||||
//LogPrintf(" %12"PRId64" %s %s %s\n",
|
//LogPrintf(" %12"PRId64" %s %s %s\n",
|
||||||
// wtx.vout[0].nValue,
|
// wtx.vout[0].nValue,
|
||||||
// DateTimeStrFormat("%Y-%m-%d %H:%M:%S", wtx.GetBlockTime()).c_str(),
|
// DateTimeStrFormat("%Y-%m-%d %H:%M:%S", wtx.GetBlockTime()),
|
||||||
// wtx.hashBlock.ToString().c_str(),
|
// wtx.hashBlock.ToString(),
|
||||||
// wtx.mapValue["message"].c_str());
|
// wtx.mapValue["message"]);
|
||||||
}
|
}
|
||||||
else if (strType == "acentry")
|
else if (strType == "acentry")
|
||||||
{
|
{
|
||||||
|
@ -646,7 +646,7 @@ DBErrors CWalletDB::LoadWallet(CWallet* pwallet)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!strErr.empty())
|
if (!strErr.empty())
|
||||||
LogPrintf("%s\n", strErr.c_str());
|
LogPrintf("%s\n", strErr);
|
||||||
}
|
}
|
||||||
pcursor->close();
|
pcursor->close();
|
||||||
}
|
}
|
||||||
|
@ -779,10 +779,10 @@ bool BackupWallet(const CWallet& wallet, const string& strDest)
|
||||||
#else
|
#else
|
||||||
filesystem::copy_file(pathSrc, pathDest);
|
filesystem::copy_file(pathSrc, pathDest);
|
||||||
#endif
|
#endif
|
||||||
LogPrintf("copied wallet.dat to %s\n", pathDest.string().c_str());
|
LogPrintf("copied wallet.dat to %s\n", pathDest.string());
|
||||||
return true;
|
return true;
|
||||||
} catch(const filesystem::filesystem_error &e) {
|
} catch(const filesystem::filesystem_error &e) {
|
||||||
LogPrintf("error copying wallet.dat to %s - %s\n", pathDest.string().c_str(), e.what());
|
LogPrintf("error copying wallet.dat to %s - %s\n", pathDest.string(), e.what());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -810,10 +810,10 @@ bool CWalletDB::Recover(CDBEnv& dbenv, std::string filename, bool fOnlyKeys)
|
||||||
int result = dbenv.dbenv.dbrename(NULL, filename.c_str(), NULL,
|
int result = dbenv.dbenv.dbrename(NULL, filename.c_str(), NULL,
|
||||||
newFilename.c_str(), DB_AUTO_COMMIT);
|
newFilename.c_str(), DB_AUTO_COMMIT);
|
||||||
if (result == 0)
|
if (result == 0)
|
||||||
LogPrintf("Renamed %s to %s\n", filename.c_str(), newFilename.c_str());
|
LogPrintf("Renamed %s to %s\n", filename, newFilename);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
LogPrintf("Failed to rename %s to %s\n", filename.c_str(), newFilename.c_str());
|
LogPrintf("Failed to rename %s to %s\n", filename, newFilename);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -821,7 +821,7 @@ bool CWalletDB::Recover(CDBEnv& dbenv, std::string filename, bool fOnlyKeys)
|
||||||
bool allOK = dbenv.Salvage(newFilename, true, salvagedData);
|
bool allOK = dbenv.Salvage(newFilename, true, salvagedData);
|
||||||
if (salvagedData.empty())
|
if (salvagedData.empty())
|
||||||
{
|
{
|
||||||
LogPrintf("Salvage(aggressive) found no records in %s.\n", newFilename.c_str());
|
LogPrintf("Salvage(aggressive) found no records in %s.\n", newFilename);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
LogPrintf("Salvage(aggressive) found %"PRIszu" records\n", salvagedData.size());
|
LogPrintf("Salvage(aggressive) found %"PRIszu" records\n", salvagedData.size());
|
||||||
|
@ -836,7 +836,7 @@ bool CWalletDB::Recover(CDBEnv& dbenv, std::string filename, bool fOnlyKeys)
|
||||||
0);
|
0);
|
||||||
if (ret > 0)
|
if (ret > 0)
|
||||||
{
|
{
|
||||||
LogPrintf("Cannot create database file %s\n", filename.c_str());
|
LogPrintf("Cannot create database file %s\n", filename);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
CWallet dummyWallet;
|
CWallet dummyWallet;
|
||||||
|
@ -856,7 +856,7 @@ bool CWalletDB::Recover(CDBEnv& dbenv, std::string filename, bool fOnlyKeys)
|
||||||
continue;
|
continue;
|
||||||
if (!fReadOK)
|
if (!fReadOK)
|
||||||
{
|
{
|
||||||
LogPrintf("WARNING: CWalletDB::Recover skipping %s: %s\n", strType.c_str(), strErr.c_str());
|
LogPrintf("WARNING: CWalletDB::Recover skipping %s: %s\n", strType, strErr);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue