#include "net.h"
#include "script.h"
#include "scrypt.h"
+#include "ui_interface.h"
#include <limits>
#include <list>
#include <map>
+using namespace std;
+
class CWallet;
class CBlock;
class CBlockIndex;
static const int64_t MIN_TX_FEE = CENT/10;
static const int64_t MIN_RELAY_TX_FEE = CENT/50;
-static const int64_t MAX_MONEY = std::numeric_limits<int64_t>::max();
+static const int64_t MAX_MONEY = numeric_limits<int64_t>::max();
static const int64_t MAX_MINT_PROOF_OF_WORK = 100 * COIN;
static const int64_t MAX_MINT_PROOF_OF_STAKE = 1 * COIN;
static const int64_t MIN_TXOUT_AMOUNT = CENT/100;
inline bool MoneyRange(int64_t nValue) { return (nValue >= 0 && nValue <= MAX_MONEY); }
+inline bool MoneyRange(CBigNum nValue) { return (nValue >= 0 && nValue <= MAX_MONEY); }
// Threshold for nLockTime: below this value it is interpreted as block number, otherwise as UNIX timestamp.
static const unsigned int LOCKTIME_THRESHOLD = 500000000; // Tue Nov 5 00:53:20 1985 UTC
// Maximum number of script-checking threads allowed
extern CScript COINBASE_FLAGS;
extern CCriticalSection cs_main;
-extern std::map<uint256, CBlockIndex*> mapBlockIndex;
-extern std::set<std::pair<COutPoint, unsigned int> > setStakeSeen;
+extern map<uint256, CBlockIndex*> mapBlockIndex;
+extern set<pair<COutPoint, unsigned int> > setStakeSeen;
extern CBlockIndex* pindexGenesisBlock;
extern unsigned int nNodeLifespan;
extern unsigned int nStakeMinAge;
extern uint64_t nLastBlockTx;
extern uint64_t nLastBlockSize;
extern uint32_t nLastCoinStakeSearchInterval;
-extern const std::string strMessageMagic;
+extern const string strMessageMagic;
extern int64_t nTimeBestReceived;
extern CCriticalSection cs_setpwalletRegistered;
-extern std::set<CWallet*> setpwalletRegistered;
-extern unsigned char pchMessageStart[4];
-extern std::map<uint256, CBlock*> mapOrphanBlocks;
+extern set<CWallet*> setpwalletRegistered;
+extern uint32_t nNetworkID;
+extern map<uint256, CBlock*> mapOrphanBlocks;
// Settings
extern int64_t nTransactionFee;
CBlockIndex* FindBlockByHeight(int nHeight);
bool ProcessMessages(CNode* pfrom);
bool SendMessages(CNode* pto);
-bool LoadExternalBlockFile(FILE* fileIn);
+bool LoadExternalBlockFile(FILE* fileIn, CClientUIInterface& uiInterface);
// Run an instance of the script checking thread
void ThreadScriptCheck(void* parg);
unsigned int ComputeMinStake(unsigned int nBase, int64_t nTime, unsigned int nBlockTime);
int GetNumBlocksOfPeers();
bool IsInitialBlockDownload();
-std::string GetWarnings(std::string strFor);
+string GetWarnings(string strFor);
bool GetTransaction(const uint256 &hash, CTransaction &tx, uint256 &hashBlock);
uint256 WantedByOrphan(const CBlock* pblockOrphan);
const CBlockIndex* GetLastBlockIndex(const CBlockIndex* pindex, bool fProofOfStake);
void ResendWalletTransactions(bool fForceResend=false);
-bool VerifySignature(const CTransaction& txFrom, const CTransaction& txTo, unsigned int nIn, unsigned int flags, int nHashType);
+bool VerifySignature(const CTransaction& txFrom, const CTransaction& txTo, uint32_t nIn, unsigned int flags, int nHashType);
-bool GetWalletFile(CWallet* pwallet, std::string &strWalletFileOut);
+bool GetWalletFile(CWallet* pwallet, string &strWalletFileOut);
/** Position on disk for a particular transaction. */
class CDiskTxPos
}
IMPLEMENT_SERIALIZE( READWRITE(FLATDATA(*this)); )
- void SetNull() { nFile = std::numeric_limits<uint32_t>::max(); nBlockPos = 0; nTxPos = 0; }
- bool IsNull() const { return (nFile == std::numeric_limits<uint32_t>::max()); }
+ void SetNull() { nFile = numeric_limits<uint32_t>::max(); nBlockPos = 0; nTxPos = 0; }
+ bool IsNull() const { return (nFile == numeric_limits<uint32_t>::max()); }
friend bool operator==(const CDiskTxPos& a, const CDiskTxPos& b)
{
}
- std::string ToString() const
+ string ToString() const
{
if (IsNull())
return "null";
else
- return strprintf("(nFile=%u, nBlockPos=%u, nTxPos=%u)", nFile, nBlockPos, nTxPos);
+ return strprintf("(nFile=%" PRIu32 ", nBlockPos=%" PRIu32 ", nTxPos=%" PRIu32 ")", nFile, nBlockPos, nTxPos);
}
void print() const
uint32_t n;
CInPoint() { SetNull(); }
- CInPoint(CTransaction* ptxIn, unsigned int nIn) { ptx = ptxIn; n = nIn; }
- void SetNull() { ptx = NULL; n = std::numeric_limits<uint32_t>::max(); }
- bool IsNull() const { return (ptx == NULL && n == std::numeric_limits<uint32_t>::max()); }
+ CInPoint(CTransaction* ptxIn, uint32_t nIn) { ptx = ptxIn; n = nIn; }
+ void SetNull() { ptx = NULL; n = numeric_limits<uint32_t>::max(); }
+ bool IsNull() const { return (ptx == NULL && n == numeric_limits<uint32_t>::max()); }
};
uint32_t n;
COutPoint() { SetNull(); }
- COutPoint(uint256 hashIn, unsigned int nIn) { hash = hashIn; n = nIn; }
+ COutPoint(uint256 hashIn, uint32_t nIn) { hash = hashIn; n = nIn; }
IMPLEMENT_SERIALIZE( READWRITE(FLATDATA(*this)); )
- void SetNull() { hash = 0; n = std::numeric_limits<uint32_t>::max(); }
- bool IsNull() const { return (hash == 0 && n == std::numeric_limits<uint32_t>::max()); }
+ void SetNull() { hash = 0; n = numeric_limits<uint32_t>::max(); }
+ bool IsNull() const { return (hash == 0 && n == numeric_limits<uint32_t>::max()); }
friend bool operator<(const COutPoint& a, const COutPoint& b)
{
return !(a == b);
}
- std::string ToString() const
+ string ToString() const
{
- return strprintf("COutPoint(%s, %u)", hash.ToString().substr(0,10).c_str(), n);
+ return strprintf("COutPoint(%s, %" PRIu32 ")", hash.ToString().substr(0,10).c_str(), n);
}
void print() const
CTxIn()
{
- nSequence = std::numeric_limits<unsigned int>::max();
+ nSequence = numeric_limits<unsigned int>::max();
}
- explicit CTxIn(COutPoint prevoutIn, CScript scriptSigIn=CScript(), unsigned int nSequenceIn=std::numeric_limits<unsigned int>::max())
+ explicit CTxIn(COutPoint prevoutIn, CScript scriptSigIn=CScript(), unsigned int nSequenceIn=numeric_limits<unsigned int>::max())
{
prevout = prevoutIn;
scriptSig = scriptSigIn;
nSequence = nSequenceIn;
}
- CTxIn(uint256 hashPrevTx, unsigned int nOut, CScript scriptSigIn=CScript(), unsigned int nSequenceIn=std::numeric_limits<unsigned int>::max())
+ CTxIn(uint256 hashPrevTx, unsigned int nOut, CScript scriptSigIn=CScript(), unsigned int nSequenceIn=numeric_limits<unsigned int>::max())
{
prevout = COutPoint(hashPrevTx, nOut);
scriptSig = scriptSigIn;
bool IsFinal() const
{
- return (nSequence == std::numeric_limits<unsigned int>::max());
+ return (nSequence == numeric_limits<unsigned int>::max());
}
friend bool operator==(const CTxIn& a, const CTxIn& b)
return !(a == b);
}
- std::string ToStringShort() const
+ string ToStringShort() const
{
return strprintf(" %s %d", prevout.hash.ToString().c_str(), prevout.n);
}
- std::string ToString() const
+ string ToString() const
{
- std::string str;
+ string str;
str += "CTxIn(";
str += prevout.ToString();
if (prevout.IsNull())
str += strprintf(", coinbase %s", HexStr(scriptSig).c_str());
else
str += strprintf(", scriptSig=%s", scriptSig.ToString().substr(0,24).c_str());
- if (nSequence != std::numeric_limits<unsigned int>::max())
- str += strprintf(", nSequence=%u", nSequence);
+ if (nSequence != numeric_limits<unsigned int>::max())
+ str += strprintf(", nSequence=%" PRIu32, nSequence);
str += ")";
return str;
}
return !(a == b);
}
- std::string ToStringShort() const
+ string ToStringShort() const
{
return strprintf(" out %s %s", FormatMoney(nValue).c_str(), scriptPubKey.ToString(true).c_str());
}
- std::string ToString() const
+ string ToString() const
{
if (IsEmpty()) return "CTxOut(empty)";
if (scriptPubKey.size() < 6)
GMF_SEND
};
-typedef std::map<uint256, std::pair<CTxIndex, CTransaction> > MapPrevTx;
+typedef map<uint256, pair<CTxIndex, CTransaction> > MapPrevTx;
/** The basic transaction that is broadcasted on the network and contained in
* blocks. A transaction can contain multiple inputs and outputs.
static const int CURRENT_VERSION=1;
int nVersion;
uint32_t nTime;
- std::vector<CTxIn> vin;
- std::vector<CTxOut> vout;
+ vector<CTxIn> vin;
+ vector<CTxOut> vout;
uint32_t nLockTime;
// Denial-of-service detection:
return false;
bool fNewer = false;
- unsigned int nLowest = std::numeric_limits<unsigned int>::max();
+ unsigned int nLowest = numeric_limits<unsigned int>::max();
for (unsigned int i = 0; i < vin.size(); i++)
{
if (vin[i].nSequence != old.vin[i].nSequence)
/** Check for standard transaction types
@return True if all outputs (scriptPubKeys) use only standard transaction forms
*/
- bool IsStandard(std::string& strReason) const;
+ bool IsStandard(string& strReason) const;
bool IsStandard() const
{
- std::string strReason;
+ string strReason;
return IsStandard(strReason);
}
*/
int64_t GetValueOut() const
{
- int64_t nValueOut = 0;
- for(const CTxOut& txout : vout)
+ CBigNum nValueOut = 0;
+ for(const auto& txout : vout)
{
nValueOut += txout.nValue;
if (!MoneyRange(txout.nValue) || !MoneyRange(nValueOut))
- throw std::runtime_error("CTransaction::GetValueOut() : value out of range");
+ throw runtime_error("CTransaction::GetValueOut() : value out of range");
}
- return nValueOut;
+ return nValueOut.getint64();
}
/** Amount of bitcoins coming in to this transaction
try {
filein >> *this;
}
- catch (const std::exception&) {
+ catch (const exception&) {
return error("%s() : deserialize or I/O error", BOOST_CURRENT_FUNCTION);
}
return !(a == b);
}
- std::string ToStringShort() const
+ string ToStringShort() const
{
- std::string str;
+ string str;
str += strprintf("%s %s", GetHash().ToString().c_str(), IsCoinBase()? "base" : (IsCoinStake()? "stake" : "user"));
return str;
}
- std::string ToString() const
+ string ToString() const
{
- std::string str;
+ string str;
str += IsCoinBase()? "Coinbase" : (IsCoinStake()? "Coinstake" : "CTransaction");
str += strprintf("(hash=%s, nTime=%d, ver=%d, vin.size=%" PRIszu ", vout.size=%" PRIszu ", nLockTime=%d)\n",
GetHash().ToString().substr(0,10).c_str(),
@param[out] fInvalid returns true if transaction is invalid
@return Returns true if all inputs are in txdb or mapTestPool
*/
- bool FetchInputs(CTxDB& txdb, const std::map<uint256, CTxIndex>& mapTestPool,
+ bool FetchInputs(CTxDB& txdb, const map<uint256, CTxIndex>& mapTestPool,
bool fBlock, bool fMiner, MapPrevTx& inputsRet, bool& fInvalid);
/** Sanity check previous transactions, then, if all checks succeed,
@param[in] pvChecks NULL If pvChecks is not NULL, script checks are pushed onto it instead of being performed inline.
@return Returns true if all checks succeed
*/
- bool ConnectInputs(CTxDB& txdb, MapPrevTx inputs, std::map<uint256, CTxIndex>& mapTestPool, const CDiskTxPos& posThisTx, const CBlockIndex* pindexBlock,
+ bool ConnectInputs(CTxDB& txdb, MapPrevTx inputs, map<uint256, CTxIndex>& mapTestPool, const CDiskTxPos& posThisTx, const CBlockIndex* pindexBlock,
bool fBlock, bool fMiner, bool fScriptChecks=true,
- unsigned int flags=STRICT_FLAGS, std::vector<CScriptCheck> *pvChecks = NULL);
+ unsigned int flags=STRICT_FLAGS, vector<CScriptCheck> *pvChecks = NULL);
bool ClientConnectInputs();
bool CheckTransaction() const;
bool AcceptToMemoryPool(CTxDB& txdb, bool fCheckInputs=true, bool* pfMissingInputs=NULL);
{
private:
CScript scriptPubKey;
- const CTransaction *ptxTo;
- unsigned int nIn;
- unsigned int nFlags;
- int nHashType;
+ const CTransaction *ptxTo = nullptr;
+ uint32_t nIn = 0;
+ unsigned int nFlags = 0;
+ int nHashType = 0;
public:
CScriptCheck() {}
- CScriptCheck(const CTransaction& txFromIn, const CTransaction& txToIn, unsigned int nInIn, unsigned int nFlagsIn, int nHashTypeIn) :
+ CScriptCheck(const CTransaction& txFromIn, const CTransaction& txToIn, uint32_t nInIn, unsigned int nFlagsIn, int nHashTypeIn) :
scriptPubKey(txFromIn.vout[txToIn.vin[nInIn].prevout.n].scriptPubKey),
ptxTo(&txToIn), nIn(nInIn), nFlags(nFlagsIn), nHashType(nHashTypeIn) { }
{
public:
uint256 hashBlock;
- std::vector<uint256> vMerkleBranch;
+ vector<uint256> vMerkleBranch;
int32_t nIndex;
// memory only
{
public:
CDiskTxPos pos;
- std::vector<CDiskTxPos> vSpent;
+ vector<CDiskTxPos> vSpent;
CTxIndex()
{
uint32_t nNonce;
// network and disk
- std::vector<CTransaction> vtx;
+ vector<CTransaction> vtx;
// ppcoin: block signature - signed by one of the coin base txout[N]'s owner
- std::vector<unsigned char> vchBlockSig;
+ vector<unsigned char> vchBlockSig;
// memory only
- mutable std::vector<uint256> vMerkleTree;
+ mutable vector<uint256> vMerkleTree;
// Denial-of-service detection:
mutable int nDoS;
if (nHeight >= 9689 || fTestNet)
{
// Take last bit of block hash as entropy bit
- unsigned int nEntropyBit = (GetHash().Get64()) & (uint64_t)1;
+ auto nEntropyBit = (GetHash().Get32()) & (uint32_t)1;
if (fDebug && GetBoolArg("-printstakemodifier"))
- printf("GetStakeEntropyBit: nTime=%u hashBlock=%s nEntropyBit=%u\n", nTime, GetHash().ToString().c_str(), nEntropyBit);
+ printf("GetStakeEntropyBit: nTime=%" PRIu32 " hashBlock=%s nEntropyBit=%" PRIu32 "\n", nTime, GetHash().ToString().c_str(), nEntropyBit);
return nEntropyBit;
}
int nBitNum = nHeight & 0xFF;
int nItemNum = nHeight / 0xFF;
- unsigned int nEntropyBit = (unsigned int) ((entropyStore[nItemNum] & (uint256(1) << nBitNum)) >> nBitNum).Get64();
+ auto nEntropyBit = ((entropyStore[nItemNum] & (uint256(1) << nBitNum)) >> nBitNum).Get32();
if (fDebug && GetBoolArg("-printstakemodifier"))
- printf("GetStakeEntropyBit: from pregenerated table, nHeight=%d nEntropyBit=%u\n", nHeight, nEntropyBit);
+ printf("GetStakeEntropyBit: from pregenerated table, nHeight=%" PRIu32 " nEntropyBit=%" PRIu32 "\n", nHeight, nEntropyBit);
return nEntropyBit;
}
return !IsProofOfStake();
}
- std::pair<COutPoint, unsigned int> GetProofOfStake() const
+ pair<COutPoint, unsigned int> GetProofOfStake() const
{
- return IsProofOfStake()? std::make_pair(vtx[1].vin[0].prevout, vtx[1].nTime) : std::make_pair(COutPoint(), (unsigned int)0);
+ if (IsProofOfStake())
+ return { vtx[1].vin[0].prevout, vtx[1].nTime };
+ return { COutPoint(), (unsigned int)0 };
}
// ppcoin: get max transaction timestamp
int64_t GetMaxTransactionTime() const
{
int64_t maxTransactionTime = 0;
- for(const auto& tx : vtx)
- maxTransactionTime = std::max(maxTransactionTime, (int64_t)tx.nTime);
+ for(const auto& tx : vtx)
+ maxTransactionTime = max(maxTransactionTime, (int64_t)tx.nTime);
return maxTransactionTime;
}
{
for (int i = 0; i < nSize; i += 2)
{
- int i2 = std::min(i+1, nSize-1);
- vMerkleTree.push_back(Hash(BEGIN(vMerkleTree[j+i]), END(vMerkleTree[j+i]),
- BEGIN(vMerkleTree[j+i2]), END(vMerkleTree[j+i2])));
+ int i2 = min(i+1, nSize-1);
+ vMerkleTree.push_back(Hash(vMerkleTree[j+i].begin(), vMerkleTree[j+i].end(),
+ vMerkleTree[j+i2].begin(), vMerkleTree[j+i2].end()));
}
j += nSize;
}
return (vMerkleTree.empty() ? 0 : vMerkleTree.back());
}
- std::vector<uint256> GetMerkleBranch(int nIndex) const
+ vector<uint256> GetMerkleBranch(int nIndex) const
{
if (vMerkleTree.empty())
BuildMerkleTree();
- std::vector<uint256> vMerkleBranch;
+ vector<uint256> vMerkleBranch;
int j = 0;
for (int nSize = (int)vtx.size(); nSize > 1; nSize = (nSize + 1) / 2)
{
- int i = std::min(nIndex^1, nSize-1);
+ int i = min(nIndex^1, nSize-1);
vMerkleBranch.push_back(vMerkleTree[j+i]);
nIndex >>= 1;
j += nSize;
return vMerkleBranch;
}
- static uint256 CheckMerkleBranch(uint256 hash, const std::vector<uint256>& vMerkleBranch, int nIndex)
+ static uint256 CheckMerkleBranch(uint256 hash, const vector<uint256>& vMerkleBranch, int nIndex)
{
if (nIndex == -1)
return 0;
for(const uint256& otherside : vMerkleBranch)
{
if (nIndex & 1)
- hash = Hash(BEGIN(otherside), END(otherside), BEGIN(hash), END(hash));
+ hash = Hash(otherside.begin(), otherside.end(), hash.begin(), hash.end());
else
- hash = Hash(BEGIN(hash), END(hash), BEGIN(otherside), END(otherside));
+ hash = Hash(hash.begin(), hash.end(), otherside.begin(), otherside.end());
nIndex >>= 1;
}
return hash;
// Write index header
unsigned int nSize = fileout.GetSerializeSize(*this);
- fileout << FLATDATA(pchMessageStart) << nSize;
+ fileout << nNetworkID << nSize;
// Write block
long fileOutPos = ftell(fileout);
try {
filein >> *this;
}
- catch (const std::exception&) {
+ catch (const exception&) {
return error("%s() : deserialize or I/O error", BOOST_CURRENT_FUNCTION);
}
void print() const
{
- printf("CBlock(hash=%s, ver=%d, hashPrevBlock=%s, hashMerkleRoot=%s, nTime=%u, nBits=%08x, nNonce=%u, vtx=%" PRIszu ", vchBlockSig=%s)\n",
+ printf("CBlock(hash=%s, ver=%" PRId32 ", hashPrevBlock=%s, hashMerkleRoot=%s, nTime=%" PRIu32 ", nBits=%08x, nNonce=%" PRIu32 ", vtx=%" PRIszu ", vchBlockSig=%s)\n",
GetHash().ToString().c_str(),
nVersion,
hashPrevBlock.ToString().c_str(),
for (int i = 0; i < nMedianTimeSpan && pindex; i++, pindex = pindex->pprev)
*(--pbegin) = pindex->GetBlockTime();
- std::sort(pbegin, pend);
+ sort(pbegin, pend);
return pbegin[(pend - pbegin)/2];
}
nFlags |= BLOCK_STAKE_MODIFIER;
}
- std::string ToString() const
+ string ToString() const
{
return strprintf("CBlockIndex(nprev=%p, pnext=%p, nFile=%u, nBlockPos=%-6d nHeight=%d, nMint=%s, nMoneySupply=%s, nFlags=(%s)(%d)(%s), nStakeModifier=%016" PRIx64 ", nStakeModifierChecksum=%08x, hashProofOfStake=%s, prevoutStake=(%s), nStakeTime=%d merkle=%s, hashBlock=%s)",
(const void*)pprev, (const void*)pnext, nFile, nBlockPos, nHeight,
uint256 GetBlockHash() const
{
- if (fUseFastIndex && (nTime < GetAdjustedTime() - nOneDay) && blockHash != 0)
+ if (fUseFastIndex && blockHash != 0)
return blockHash;
CBlock block;
return blockHash;
}
- std::string ToString() const
+ string ToString() const
{
- std::string str = "CDiskBlockIndex(";
+ string str = "CDiskBlockIndex(";
str += CBlockIndex::ToString();
str += strprintf("\n hashBlock=%s, hashPrev=%s, hashNext=%s)",
GetBlockHash().ToString().c_str(),
class CBlockLocator
{
protected:
- std::vector<uint256> vHave;
+ vector<uint256> vHave;
public:
CBlockLocator()
explicit CBlockLocator(uint256 hashBlock)
{
- std::map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(hashBlock);
+ auto mi = mapBlockIndex.find(hashBlock);
if (mi != mapBlockIndex.end())
Set((*mi).second);
}
- CBlockLocator(const std::vector<uint256>& vHaveIn)
+ CBlockLocator(const vector<uint256>& vHaveIn)
{
vHave = vHaveIn;
}
// Retrace how far back it was in the sender's branch
int nDistance = 0;
int nStep = 1;
- for(const uint256& hash : vHave)
+ for(const auto& hash : vHave)
{
- std::map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(hash);
+ auto mi = mapBlockIndex.find(hash);
if (mi != mapBlockIndex.end())
{
- CBlockIndex* pindex = (*mi).second;
+ auto pindex = (*mi).second;
if (pindex->IsInMainChain())
return nDistance;
}
CBlockIndex* GetBlockIndex()
{
// Find the first block the caller has in the main chain
- for(const uint256& hash : vHave)
+ for(const auto& hash : vHave)
{
- std::map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(hash);
+ auto mi = mapBlockIndex.find(hash);
if (mi != mapBlockIndex.end())
{
- CBlockIndex* pindex = (*mi).second;
+ auto pindex = (*mi).second;
if (pindex->IsInMainChain())
return pindex;
}
// Find the first block the caller has in the main chain
for(const uint256& hash : vHave)
{
- std::map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(hash);
+ auto mi = mapBlockIndex.find(hash);
if (mi != mapBlockIndex.end())
{
- CBlockIndex* pindex = (*mi).second;
+ auto pindex = (*mi).second;
if (pindex->IsInMainChain())
return hash;
}
{
public:
mutable CCriticalSection cs;
- std::map<uint256, CTransaction> mapTx;
- std::map<COutPoint, CInPoint> mapNextTx;
+ map<uint256, CTransaction> mapTx;
+ map<COutPoint, CInPoint> mapNextTx;
bool accept(CTxDB& txdb, CTransaction &tx,
bool fCheckInputs, bool* pfMissingInputs);
bool addUnchecked(const uint256& hash, CTransaction &tx);
bool remove(CTransaction &tx);
void clear();
- void queryHashes(std::vector<uint256>& vtxid);
+ void queryHashes(vector<uint256>& vtxid);
size_t size()
{
return mapTx.size();
}
- bool exists(uint256 hash)
+ bool exists(const uint256 &hash)
{
return (mapTx.count(hash) != 0);
}
- CTransaction& lookup(uint256 hash)
+ CTransaction& lookup(const uint256 &hash)
{
return mapTx[hash];
}