diff options
| author | Ross Nicoll <[email protected]> | 2018-01-01 16:24:14 +0000 |
|---|---|---|
| committer | Ross Nicoll <[email protected]> | 2018-09-19 19:24:06 +0100 |
| commit | c6eeab75a1c70b6ad63854e036e5843b7f104d31 (patch) | |
| tree | d7e369806b4e5d386820ea031c5cc5083076afbe /src | |
| parent | Update checkpoints and chain work (#1410) (diff) | |
| download | discoin-c6eeab75a1c70b6ad63854e036e5843b7f104d31.tar.xz discoin-c6eeab75a1c70b6ad63854e036e5843b7f104d31.zip | |
Change count type used by `gettxoutsetinfo` (#1415)
changing CAmount (is a int64_t) to arith_uint256 for nTotalAmount in CCoinsStats to prevent overflow
Diffstat (limited to 'src')
| -rw-r--r-- | src/rpc/blockchain.cpp | 4 | ||||
| -rw-r--r-- | src/rpc/server.cpp | 10 | ||||
| -rw-r--r-- | src/rpc/server.h | 2 |
3 files changed, 14 insertions, 2 deletions
diff --git a/src/rpc/blockchain.cpp b/src/rpc/blockchain.cpp index 6fb45a515..a005cde44 100644 --- a/src/rpc/blockchain.cpp +++ b/src/rpc/blockchain.cpp @@ -814,7 +814,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) {} }; @@ -831,7 +831,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; diff --git a/src/rpc/server.cpp b/src/rpc/server.cpp index 67fc82580..26e7297f3 100644 --- a/src/rpc/server.cpp +++ b/src/rpc/server.cpp @@ -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; diff --git a/src/rpc/server.h b/src/rpc/server.h index 52f82866d..2ea9326ac 100644 --- a/src/rpc/server.h +++ b/src/rpc/server.h @@ -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); |