Change count type used by gettxoutsetinfo (#1415)

changing CAmount (is a int64_t) to arith_uint256 for nTotalAmount in CCoinsStats to prevent overflow
This commit is contained in:
Ross Nicoll 2018-01-01 16:24:14 +00:00 committed by GitHub
parent bc74b3a2c8
commit e9db975d2f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 14 additions and 2 deletions

View file

@ -808,7 +808,7 @@ struct CCoinsStats
uint64_t nTransactionOutputs;
uint64_t nSerializedSize;
uint256 hashSerialized;
CAmount nTotalAmount;
arith_uint256 nTotalAmount;
CCoinsStats() : nHeight(0), nTransactions(0), nTransactionOutputs(0), nSerializedSize(0), nTotalAmount(0) {}
};
@ -825,7 +825,7 @@ static bool GetUTXOStats(CCoinsView *view, CCoinsStats &stats)
stats.nHeight = mapBlockIndex.find(stats.hashBlock)->second->nHeight;
}
ss << stats.hashBlock;
CAmount nTotalAmount = 0;
arith_uint256 nTotalAmount = 0;
while (pcursor->Valid()) {
boost::this_thread::interruption_point();
uint256 key;

View file

@ -143,6 +143,16 @@ UniValue ValueFromAmount(const CAmount& amount)
strprintf("%s%d.%08d", sign ? "-" : "", quotient, remainder));
}
UniValue ValueFromAmount(const arith_uint256& amount)
{
bool sign = amount < 0;
arith_uint256 n_abs = (sign ? -amount : amount);
arith_uint256 quotient = n_abs / COIN;
arith_uint256 remainder = n_abs - (quotient * COIN);
return UniValue(UniValue::VNUM,
strprintf("%s%d.%08d", sign ? "-" : "", (int64_t)quotient.getdouble(), (int64_t)remainder.getdouble()));
}
uint256 ParseHashV(const UniValue& v, string strName)
{
string strHex;

View file

@ -7,6 +7,7 @@
#define BITCOIN_RPCSERVER_H
#include "amount.h"
#include "arith_uint256.h"
#include "rpc/protocol.h"
#include "uint256.h"
@ -193,6 +194,7 @@ extern std::vector<unsigned char> ParseHexO(const UniValue& o, std::string strKe
extern int64_t nWalletUnlockTime;
extern CAmount AmountFromValue(const UniValue& value);
extern UniValue ValueFromAmount(const CAmount& amount);
extern UniValue ValueFromAmount(const arith_uint256& amount);
extern double GetDifficulty(const CBlockIndex* blockindex = NULL);
extern std::string HelpRequiringPassphrase();
extern std::string HelpExampleCli(const std::string& methodname, const std::string& args);