Inside Bitcoin
Opening the selected file…
Inside Bitcoin
Opening the selected file…
The code behind the network, with room to understand it.
Release published 2026-10-28 · Snapshot fetched 2026-11-01. Latest stable release at fetch time; development branches and Git history are excluded. Only the selected code window and visible folders load here.
252// Key not "data" (bad address)253BOOST_CHECK_THROW(CallRPC("createrawtransaction [{\"txid\":\"a3b807410df0b60fcb9736768df5823938b2f838694939ba45f3c0a1bff150ed\",\"vout\":0}] {\"somedata\":\"68656c6c6f776f726c64\"}"), std::runtime_error);255// Bad hex encoding of data output256BOOST_CHECK_THROW(CallRPC("createrawtransaction [{\"txid\":\"a3b807410df0b60fcb9736768df5823938b2f838694939ba45f3c0a1bff150ed\",\"vout\":0}] {\"data\":\"12345\"}"), std::runtime_error);257BOOST_CHECK_THROW(CallRPC("createrawtransaction [{\"txid\":\"a3b807410df0b60fcb9736768df5823938b2f838694939ba45f3c0a1bff150ed\",\"vout\":0}] {\"data\":\"12345g\"}"), std::runtime_error);259// Data 81 bytes long260BOOST_CHECK_NO_THROW(CallRPC("createrawtransaction [{\"txid\":\"a3b807410df0b60fcb9736768df5823938b2f838694939ba45f3c0a1bff150ed\",\"vout\":0}] {\"data\":\"010203040506070809101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081\"}"));261}263BOOST_AUTO_TEST_CASE(rpc_format_monetary_values)264{265BOOST_CHECK(ValueFromAmount(0LL).write() == "0.00000000");266BOOST_CHECK(ValueFromAmount(1LL).write() == "0.00000001");267BOOST_CHECK(ValueFromAmount(17622195LL).write() == "0.17622195");268BOOST_CHECK(ValueFromAmount(50000000LL).write() == "0.50000000");269BOOST_CHECK(ValueFromAmount(89898989LL).write() == "0.89898989");270BOOST_CHECK(ValueFromAmount(100000000LL).write() == "1.00000000");271BOOST_CHECK(ValueFromAmount(2099999999999990LL).write() == "20999999.99999990");272BOOST_CHECK(ValueFromAmount(2099999999999999LL).write() == "20999999.99999999");274BOOST_CHECK_EQUAL(ValueFromAmount(0).write(), "0.00000000");275BOOST_CHECK_EQUAL(ValueFromAmount((COIN/10000)*123456789).write(), "12345.67890000");276BOOST_CHECK_EQUAL(ValueFromAmount(-COIN).write(), "-1.00000000");277BOOST_CHECK_EQUAL(ValueFromAmount(-COIN/10).write(), "-0.10000000");279BOOST_CHECK_EQUAL(ValueFromAmount(COIN*100000000).write(), "100000000.00000000");280BOOST_CHECK_EQUAL(ValueFromAmount(COIN*10000000).write(), "10000000.00000000");281BOOST_CHECK_EQUAL(ValueFromAmount(COIN*1000000).write(), "1000000.00000000");282BOOST_CHECK_EQUAL(ValueFromAmount(COIN*100000).write(), "100000.00000000");283BOOST_CHECK_EQUAL(ValueFromAmount(COIN*10000).write(), "10000.00000000");284BOOST_CHECK_EQUAL(ValueFromAmount(COIN*1000).write(), "1000.00000000");285BOOST_CHECK_EQUAL(ValueFromAmount(COIN*100).write(), "100.00000000");286BOOST_CHECK_EQUAL(ValueFromAmount(COIN*10).write(), "10.00000000");287BOOST_CHECK_EQUAL(ValueFromAmount(COIN).write(), "1.00000000");288BOOST_CHECK_EQUAL(ValueFromAmount(COIN/10).write(), "0.10000000");289BOOST_CHECK_EQUAL(ValueFromAmount(COIN/100).write(), "0.01000000");290BOOST_CHECK_EQUAL(ValueFromAmount(COIN/1000).write(), "0.00100000");291BOOST_CHECK_EQUAL(ValueFromAmount(COIN/10000).write(), "0.00010000");292BOOST_CHECK_EQUAL(ValueFromAmount(COIN/100000).write(), "0.00001000");293BOOST_CHECK_EQUAL(ValueFromAmount(COIN/1000000).write(), "0.00000100");294BOOST_CHECK_EQUAL(ValueFromAmount(COIN/10000000).write(), "0.00000010");295BOOST_CHECK_EQUAL(ValueFromAmount(COIN/100000000).write(), "0.00000001");297BOOST_CHECK_EQUAL(ValueFromAmount(std::numeric_limits<CAmount>::max()).write(), "92233720368.54775807");298BOOST_CHECK_EQUAL(ValueFromAmount(std::numeric_limits<CAmount>::max() - 1).write(), "92233720368.54775806");299BOOST_CHECK_EQUAL(ValueFromAmount(std::numeric_limits<CAmount>::max() - 2).write(), "92233720368.54775805");300BOOST_CHECK_EQUAL(ValueFromAmount(std::numeric_limits<CAmount>::max() - 3).write(), "92233720368.54775804");301// ...302BOOST_CHECK_EQUAL(ValueFromAmount(std::numeric_limits<CAmount>::min() + 3).write(), "-92233720368.54775805");303BOOST_CHECK_EQUAL(ValueFromAmount(std::numeric_limits<CAmount>::min() + 2).write(), "-92233720368.54775806");304BOOST_CHECK_EQUAL(ValueFromAmount(std::numeric_limits<CAmount>::min() + 1).write(), "-92233720368.54775807");305BOOST_CHECK_EQUAL(ValueFromAmount(std::numeric_limits<CAmount>::min()).write(), "-92233720368.54775808");306}308static UniValue ValueFromString(const std::string& str) noexcept309{310UniValue value;311value.setNumStr(str);312return value;313}315BOOST_AUTO_TEST_CASE(rpc_parse_monetary_values)316{317BOOST_CHECK_THROW(AmountFromValue(ValueFromString("-0.00000001")), UniValue);318BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("0")), 0LL);319BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("0.00000000")), 0LL);320BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("0.00000001")), 1LL);321BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("0.17622195")), 17622195LL);322BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("0.5")), 50000000LL);323BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("0.50000000")), 50000000LL);324BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("0.89898989")), 89898989LL);325BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("1.00000000")), 100000000LL);326BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("20999999.9999999")), 2099999999999990LL);327BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("20999999.99999999")), 2099999999999999LL);329BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("1e-8")), COIN/100000000);330BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("0.1e-7")), COIN/100000000);331BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("0.01e-6")), COIN/100000000);332BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("0.00000000000000000000000000000000000001e+30")), 1);333BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("0.0000000000000000000000000000000000000000000000000000000000000000000000000001e+68")), COIN/100000000);334BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("10000000000000000000000000000000000000000000000000000000000000000e-64")), COIN);335BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("0.000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000e64")), COIN);337BOOST_CHECK_THROW(AmountFromValue(ValueFromString("1e-9")), UniValue); //should fail338BOOST_CHECK_THROW(AmountFromValue(ValueFromString("0.000000019")), UniValue); //should fail339BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("0.00000001000000")), 1LL); //should pass, cut trailing 0340BOOST_CHECK_THROW(AmountFromValue(ValueFromString("19e-9")), UniValue); //should fail341BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("0.19e-6")), 19); //should pass, leading 0 is present342BOOST_CHECK_EXCEPTION(AmountFromValue(".19e-6"), UniValue, HasJSON(R"({"code":-3,"message":"Invalid amount"})")); //should fail, no leading 0344BOOST_CHECK_THROW(AmountFromValue(ValueFromString("92233720368.54775808")), UniValue); //overflow error345BOOST_CHECK_THROW(AmountFromValue(ValueFromString("1e+11")), UniValue); //overflow error346BOOST_CHECK_THROW(AmountFromValue(ValueFromString("1e11")), UniValue); //overflow error signless347BOOST_CHECK_THROW(AmountFromValue(ValueFromString("93e+9")), UniValue); //overflow error348}350BOOST_AUTO_TEST_CASE(rpc_ban)351{352BOOST_CHECK_NO_THROW(CallRPC(std::string("clearbanned")));354UniValue r;355BOOST_CHECK_NO_THROW(r = CallRPC(std::string("setban 127.0.0.0 add")));356BOOST_CHECK_THROW(r = CallRPC(std::string("setban 127.0.0.0:8334")), std::runtime_error); //portnumber for setban not allowed357BOOST_CHECK_NO_THROW(r = CallRPC(std::string("listbanned")));358UniValue ar = r.get_array();359UniValue o1 = ar[0].get_obj();360UniValue adr = o1.find_value("address");361BOOST_CHECK_EQUAL(adr.get_str(), "127.0.0.0/32");362BOOST_CHECK_NO_THROW(CallRPC(std::string("setban 127.0.0.0 remove")));363BOOST_CHECK_NO_THROW(r = CallRPC(std::string("listbanned")));364ar = r.get_array();365BOOST_CHECK_EQUAL(ar.size(), 0U);367BOOST_CHECK_NO_THROW(r = CallRPC(std::string("setban 127.0.0.0/24 add 9907731200 true")));368BOOST_CHECK_NO_THROW(r = CallRPC(std::string("listbanned")));369ar = r.get_array();370o1 = ar[0].get_obj();371adr = o1.find_value("address");372int64_t banned_until{o1.find_value("banned_until").getInt<int64_t>()};373BOOST_CHECK_EQUAL(adr.get_str(), "127.0.0.0/24");374BOOST_CHECK_EQUAL(banned_until, 9907731200); // absolute time check376BOOST_CHECK_NO_THROW(CallRPC(std::string("clearbanned")));378FakeNodeClock clock{10'000s};379BOOST_CHECK_NO_THROW(r = CallRPC(std::string("setban 127.0.0.0/24 add 200")));380clock += 2s;381const int64_t time_remaining_expected{198};382BOOST_CHECK_NO_THROW(r = CallRPC(std::string("listbanned")));383ar = r.get_array();384o1 = ar[0].get_obj();385adr = o1.find_value("address");386banned_until = o1.find_value("banned_until").getInt<int64_t>();387const int64_t ban_created{o1.find_value("ban_created").getInt<int64_t>()};388const int64_t ban_duration{o1.find_value("ban_duration").getInt<int64_t>()};389const int64_t time_remaining{o1.find_value("time_remaining").getInt<int64_t>()};390BOOST_CHECK_EQUAL(adr.get_str(), "127.0.0.0/24");391BOOST_CHECK_EQUAL(banned_until, time_remaining_expected + TicksSinceEpoch<std::chrono::seconds>(NodeClock::now()));392BOOST_CHECK_EQUAL(ban_duration, banned_until - ban_created);393BOOST_CHECK_EQUAL(time_remaining, time_remaining_expected);395// must throw an exception because 127.0.0.1 is in already banned subnet range396BOOST_CHECK_THROW(r = CallRPC(std::string("setban 127.0.0.1 add")), std::runtime_error);398BOOST_CHECK_NO_THROW(CallRPC(std::string("setban 127.0.0.0/24 remove")));399BOOST_CHECK_NO_THROW(r = CallRPC(std::string("listbanned")));400ar = r.get_array();401BOOST_CHECK_EQUAL(ar.size(), 0U);403BOOST_CHECK_NO_THROW(r = CallRPC(std::string("setban 127.0.0.0/255.255.0.0 add")));404BOOST_CHECK_THROW(r = CallRPC(std::string("setban 127.0.1.1 add")), std::runtime_error);406BOOST_CHECK_NO_THROW(CallRPC(std::string("clearbanned")));407BOOST_CHECK_NO_THROW(r = CallRPC(std::string("listbanned")));408ar = r.get_array();409BOOST_CHECK_EQUAL(ar.size(), 0U);412BOOST_CHECK_THROW(r = CallRPC(std::string("setban test add")), std::runtime_error); //invalid IP414//IPv6 tests415BOOST_CHECK_NO_THROW(r = CallRPC(std::string("setban FE80:0000:0000:0000:0202:B3FF:FE1E:8329 add")));416BOOST_CHECK_NO_THROW(r = CallRPC(std::string("listbanned")));417ar = r.get_array();418o1 = ar[0].get_obj();419adr = o1.find_value("address");420BOOST_CHECK_EQUAL(adr.get_str(), "fe80::202:b3ff:fe1e:8329/128");422BOOST_CHECK_NO_THROW(CallRPC(std::string("clearbanned")));423BOOST_CHECK_NO_THROW(r = CallRPC(std::string("setban 2001:db8::/ffff:fffc:0:0:0:0:0:0 add")));424BOOST_CHECK_NO_THROW(r = CallRPC(std::string("listbanned")));425ar = r.get_array();426o1 = ar[0].get_obj();427adr = o1.find_value("address");428BOOST_CHECK_EQUAL(adr.get_str(), "2001:db8::/30");430BOOST_CHECK_NO_THROW(CallRPC(std::string("clearbanned")));431BOOST_CHECK_NO_THROW(r = CallRPC(std::string("setban 2001:4d48:ac57:400:cacf:e9ff:fe1d:9c63/128 add")));432BOOST_CHECK_NO_THROW(r = CallRPC(std::string("listbanned")));433ar = r.get_array();434o1 = ar[0].get_obj();435adr = o1.find_value("address");436BOOST_CHECK_EQUAL(adr.get_str(), "2001:4d48:ac57:400:cacf:e9ff:fe1d:9c63/128");437}439BOOST_AUTO_TEST_CASE(rpc_convert_values_generatetoaddress)440{441UniValue result;443BOOST_CHECK_NO_THROW(result = RPCConvertValues("generatetoaddress", {"101", "mkESjLZW66TmHhiFX8MCaBjrhZ543PPh9a"}));444BOOST_CHECK_EQUAL(result[0].getInt<int>(), 101);445BOOST_CHECK_EQUAL(result[1].get_str(), "mkESjLZW66TmHhiFX8MCaBjrhZ543PPh9a");447BOOST_CHECK_NO_THROW(result = RPCConvertValues("generatetoaddress", {"101", "mhMbmE2tE9xzJYCV9aNC8jKWN31vtGrguU"}));448BOOST_CHECK_EQUAL(result[0].getInt<int>(), 101);449BOOST_CHECK_EQUAL(result[1].get_str(), "mhMbmE2tE9xzJYCV9aNC8jKWN31vtGrguU");451BOOST_CHECK_NO_THROW(result = RPCConvertValues("generatetoaddress", {"1", "mkESjLZW66TmHhiFX8MCaBjrhZ543PPh9a", "9"}));452BOOST_CHECK_EQUAL(result[0].getInt<int>(), 1);453BOOST_CHECK_EQUAL(result[1].get_str(), "mkESjLZW66TmHhiFX8MCaBjrhZ543PPh9a");454BOOST_CHECK_EQUAL(result[2].getInt<int>(), 9);456BOOST_CHECK_NO_THROW(result = RPCConvertValues("generatetoaddress", {"1", "mhMbmE2tE9xzJYCV9aNC8jKWN31vtGrguU", "9"}));457BOOST_CHECK_EQUAL(result[0].getInt<int>(), 1);458BOOST_CHECK_EQUAL(result[1].get_str(), "mhMbmE2tE9xzJYCV9aNC8jKWN31vtGrguU");459BOOST_CHECK_EQUAL(result[2].getInt<int>(), 9);460}462BOOST_AUTO_TEST_CASE(rpc_getblockstats_calculate_percentiles_by_weight)463{464int64_t total_weight = 200;465std::vector<std::pair<CAmount, int64_t>> feerates;466feerates.reserve(200);467CAmount result[NUM_GETBLOCKSTATS_PERCENTILES] = { 0 };469for (int64_t i = 0; i < 100; i++) {470feerates.emplace_back(1 ,1);471}473for (int64_t i = 0; i < 100; i++) {474feerates.emplace_back(2 ,1);475}477CalculatePercentilesByWeight(result, feerates, total_weight);478BOOST_CHECK_EQUAL(result[0], 1);479BOOST_CHECK_EQUAL(result[1], 1);480BOOST_CHECK_EQUAL(result[2], 1);481BOOST_CHECK_EQUAL(result[3], 2);482BOOST_CHECK_EQUAL(result[4], 2);484// Test with more pairs, and two pairs overlapping 2 percentiles.485total_weight = 100;486CAmount result2[NUM_GETBLOCKSTATS_PERCENTILES] = { 0 };487feerates.clear();489feerates.emplace_back(1, 9);490feerates.emplace_back(2 , 16); //10th + 25th percentile491feerates.emplace_back(4 ,50); //50th + 75th percentile492feerates.emplace_back(5 ,10);493feerates.emplace_back(9 ,15); // 90th percentile495CalculatePercentilesByWeight(result2, feerates, total_weight);497BOOST_CHECK_EQUAL(result2[0], 2);498BOOST_CHECK_EQUAL(result2[1], 2);499BOOST_CHECK_EQUAL(result2[2], 4);500BOOST_CHECK_EQUAL(result2[3], 4);
Independent explanations by MyBitcoinExplorer. Not affiliated with or endorsed by Bitcoin Core. Guides are educational and do not replace the source or its tests.
Bitcoin Core source © its contributors, distributed under the MIT license. Original notices and bundled third-party licenses are retained in the source tree.