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.
251BOOST_CHECK_EQUAL(arr[5].getType(), UniValue::VNUM);252BOOST_CHECK_EQUAL(arr[6].getValStr(), "-400");253BOOST_CHECK_EQUAL(arr[6].getType(), UniValue::VNUM);254BOOST_CHECK_EQUAL(arr[7].getValStr(), "-401");255BOOST_CHECK_EQUAL(arr[7].getType(), UniValue::VNUM);256BOOST_CHECK_EQUAL(arr[8].getValStr(), "-40.1");257BOOST_CHECK_EQUAL(arr[8].getType(), UniValue::VNUM);258BOOST_CHECK_EQUAL(arr[9].getValStr(), "1");259BOOST_CHECK_EQUAL(arr[9].getType(), UniValue::VBOOL);261BOOST_CHECK_EQUAL(arr[999].getValStr(), "");263arr.clear();264BOOST_CHECK(arr.empty());265BOOST_CHECK_EQUAL(arr.size(), 0);266}268void univalue_object()269{270UniValue obj(UniValue::VOBJ);271std::string strKey, strVal;272UniValue v;274strKey = "age";275v.setInt(100);276obj.pushKV(strKey, v);278strKey = "first";279strVal = "John";280obj.pushKV(strKey, strVal);282strKey = "last";283const char* cVal = "Smith";284obj.pushKV(strKey, cVal);286strKey = "distance";287obj.pushKV(strKey, int64_t{25});289strKey = "time";290obj.pushKV(strKey, uint64_t{3600});292strKey = "calories";293obj.pushKV(strKey, int{12});295strKey = "temperature";296obj.pushKV(strKey, double{90.012});298strKey = "moon";299obj.pushKV(strKey, true);301strKey = "spoon";302obj.pushKV(strKey, false);304UniValue obj2(UniValue::VOBJ);305obj2.pushKV("cat1", 9000);306obj2.pushKV("cat2", 12345);308obj.pushKVs(obj2);310BOOST_CHECK_EQUAL(obj.empty(), false);311BOOST_CHECK_EQUAL(obj.size(), 11);313BOOST_CHECK_EQUAL(obj["age"].getValStr(), "100");314BOOST_CHECK_EQUAL(obj["first"].getValStr(), "John");315BOOST_CHECK_EQUAL(obj["last"].getValStr(), "Smith");316BOOST_CHECK_EQUAL(obj["distance"].getValStr(), "25");317BOOST_CHECK_EQUAL(obj["time"].getValStr(), "3600");318BOOST_CHECK_EQUAL(obj["calories"].getValStr(), "12");319BOOST_CHECK_EQUAL(obj["temperature"].getValStr(), "90.012");320BOOST_CHECK_EQUAL(obj["moon"].getValStr(), "1");321BOOST_CHECK_EQUAL(obj["spoon"].getValStr(), "");322BOOST_CHECK_EQUAL(obj["cat1"].getValStr(), "9000");323BOOST_CHECK_EQUAL(obj["cat2"].getValStr(), "12345");325BOOST_CHECK_EQUAL(obj["nyuknyuknyuk"].getValStr(), "");327BOOST_CHECK(obj.exists("age"));328BOOST_CHECK(obj.exists("first"));329BOOST_CHECK(obj.exists("last"));330BOOST_CHECK(obj.exists("distance"));331BOOST_CHECK(obj.exists("time"));332BOOST_CHECK(obj.exists("calories"));333BOOST_CHECK(obj.exists("temperature"));334BOOST_CHECK(obj.exists("moon"));335BOOST_CHECK(obj.exists("spoon"));336BOOST_CHECK(obj.exists("cat1"));337BOOST_CHECK(obj.exists("cat2"));339BOOST_CHECK(!obj.exists("nyuknyuknyuk"));341std::map<std::string, UniValue::VType> objTypes;342objTypes["age"] = UniValue::VNUM;343objTypes["first"] = UniValue::VSTR;344objTypes["last"] = UniValue::VSTR;345objTypes["distance"] = UniValue::VNUM;346objTypes["time"] = UniValue::VNUM;347objTypes["calories"] = UniValue::VNUM;348objTypes["temperature"] = UniValue::VNUM;349objTypes["moon"] = UniValue::VBOOL;350objTypes["spoon"] = UniValue::VBOOL;351objTypes["cat1"] = UniValue::VNUM;352objTypes["cat2"] = UniValue::VNUM;353BOOST_CHECK(obj.checkObject(objTypes));355objTypes["cat2"] = UniValue::VSTR;356BOOST_CHECK(!obj.checkObject(objTypes));358obj.clear();359BOOST_CHECK(obj.empty());360BOOST_CHECK_EQUAL(obj.size(), 0);361BOOST_CHECK_EQUAL(obj.getType(), UniValue::VNULL);363obj.setObject();364UniValue uv;365uv.setInt(42);366obj.pushKVEnd("age", uv);367BOOST_CHECK_EQUAL(obj.size(), 1);368BOOST_CHECK_EQUAL(obj["age"].getValStr(), "42");370uv.setInt(43);371obj.pushKV("age", uv);372BOOST_CHECK_EQUAL(obj.size(), 1);373BOOST_CHECK_EQUAL(obj["age"].getValStr(), "43");375obj.pushKV("name", "foo bar");377std::map<std::string,UniValue> kv;378obj.getObjMap(kv);379BOOST_CHECK_EQUAL(kv["age"].getValStr(), "43");380BOOST_CHECK_EQUAL(kv["name"].getValStr(), "foo bar");382}384static const char *json1 =385"[1.10000000,{\"key1\":\"str\\u0000\",\"key2\":800,\"key3\":{\"name\":\"martian http://test.com\"}}]";387void univalue_readwrite()388{389UniValue v;390BOOST_CHECK(v.read(json1));392std::string strJson1(json1);393BOOST_CHECK(v.read(strJson1));395BOOST_CHECK(v.isArray());396BOOST_CHECK_EQUAL(v.size(), 2);398BOOST_CHECK_EQUAL(v[0].getValStr(), "1.10000000");400UniValue obj = v[1];401BOOST_CHECK(obj.isObject());402BOOST_CHECK_EQUAL(obj.size(), 3);404BOOST_CHECK(obj["key1"].isStr());405std::string correctValue("str");406correctValue.push_back('\0');407BOOST_CHECK_EQUAL(obj["key1"].getValStr(), correctValue);408BOOST_CHECK(obj["key2"].isNum());409BOOST_CHECK_EQUAL(obj["key2"].getValStr(), "800");410BOOST_CHECK(obj["key3"].isObject());412BOOST_CHECK_EQUAL(strJson1, v.write());414// Valid415BOOST_CHECK(v.read("1.0") && (v.get_real() == 1.0));416BOOST_CHECK(v.read("true") && v.get_bool());417BOOST_CHECK(v.read("[false]") && !v[0].get_bool());418BOOST_CHECK(v.read("{\"a\": true}") && v["a"].get_bool());419BOOST_CHECK(v.read("{\"1\": \"true\"}") && (v["1"].get_str() == "true"));420// Valid, with leading or trailing whitespace421BOOST_CHECK(v.read(" 1.0") && (v.get_real() == 1.0));422BOOST_CHECK(v.read("1.0 ") && (v.get_real() == 1.0));423BOOST_CHECK(v.read("0.00000000000000000000000000000000000001e+30 "));425BOOST_CHECK(!v.read(".19e-6")); //should fail, missing leading 0, therefore invalid JSON426// Invalid, initial garbage427BOOST_CHECK(!v.read("[1.0"));428BOOST_CHECK(!v.read("a1.0"));429// Invalid, trailing garbage430BOOST_CHECK(!v.read("1.0sds"));431BOOST_CHECK(!v.read("1.0]"));432// Invalid, keys have to be names433BOOST_CHECK(!v.read("{1: \"true\"}"));434BOOST_CHECK(!v.read("{true: 1}"));435BOOST_CHECK(!v.read("{[1]: 1}"));436BOOST_CHECK(!v.read("{{\"a\": \"a\"}: 1}"));437// BTC addresses should fail parsing438BOOST_CHECK(!v.read("175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W"));439BOOST_CHECK(!v.read("3J98t1WpEZ73CNmQviecrnyiWrnqRhWNL"));441/* Check for (correctly reporting) a parsing error if the initial442JSON construct is followed by more stuff. Note that whitespace443is, of course, exempt. */445BOOST_CHECK(v.read(" {}\n "));446BOOST_CHECK(v.isObject());447BOOST_CHECK(v.read(" []\n "));448BOOST_CHECK(v.isArray());450BOOST_CHECK(!v.read("@{}"));451BOOST_CHECK(!v.read("{} garbage"));452BOOST_CHECK(!v.read("[]{}"));453BOOST_CHECK(!v.read("{}[]"));454BOOST_CHECK(!v.read("{} 42"));456// Failed read clears value457{458UniValue val{"previous value"};459BOOST_CHECK(!val.read(R"({"key":)"));460BOOST_CHECK(val.isNull());461}462}464int main(int argc, char* argv[])465{466univalue_constructor();467univalue_push_throw();468univalue_typecheck();469univalue_set();470univalue_array();471univalue_object();472univalue_readwrite();473return 0;474}
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.