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.
1// Copyright (c) 2014 BitPay Inc.2// Copyright (c) 2014-present The Bitcoin Core developers3// Distributed under the MIT software license, see the accompanying4// file COPYING or https://opensource.org/licenses/mit-license.php.6#include <univalue.h>8#include <cassert>9#include <cstdint>10#include <map>11#include <stdexcept>12#include <string>13#include <string_view>14#include <vector>16#define BOOST_CHECK(expr) assert(expr)17#define BOOST_CHECK_EQUAL(v1, v2) assert((v1) == (v2))18#define BOOST_CHECK_THROW(stmt, excMatch) { \19try { \20(stmt); \21assert(0 && "No exception caught"); \22} catch (excMatch&) { \23} catch (...) { \24assert(0 && "Wrong exception caught"); \25} \26}27#define BOOST_CHECK_NO_THROW(stmt) { \28try { \29(stmt); \30} catch (...) { \31assert(0); \32} \33}35void univalue_constructor()36{37UniValue v1;38BOOST_CHECK(v1.isNull());40UniValue v2(UniValue::VSTR);41BOOST_CHECK(v2.isStr());43UniValue v3(UniValue::VSTR, "foo");44BOOST_CHECK(v3.isStr());45BOOST_CHECK_EQUAL(v3.getValStr(), "foo");47UniValue numTest;48numTest.setNumStr("82");49BOOST_CHECK(numTest.isNum());50BOOST_CHECK_EQUAL(numTest.getValStr(), "82");52uint64_t vu64 = 82;53UniValue v4(vu64);54BOOST_CHECK(v4.isNum());55BOOST_CHECK_EQUAL(v4.getValStr(), "82");57int64_t vi64 = -82;58UniValue v5(vi64);59BOOST_CHECK(v5.isNum());60BOOST_CHECK_EQUAL(v5.getValStr(), "-82");62int vi = -688;63UniValue v6(vi);64BOOST_CHECK(v6.isNum());65BOOST_CHECK_EQUAL(v6.getValStr(), "-688");67double vd = -7.21;68UniValue v7(vd);69BOOST_CHECK(v7.isNum());70BOOST_CHECK_EQUAL(v7.getValStr(), "-7.21");72std::string vs("yawn");73UniValue v8(vs);74BOOST_CHECK(v8.isStr());75BOOST_CHECK_EQUAL(v8.getValStr(), "yawn");77const char *vcs = "zappa";78UniValue v9(vcs);79BOOST_CHECK(v9.isStr());80BOOST_CHECK_EQUAL(v9.getValStr(), "zappa");81}83void univalue_push_throw()84{85UniValue j;86BOOST_CHECK_THROW(j.push_back(1), std::runtime_error);87BOOST_CHECK_THROW(j.push_backV({1}), std::runtime_error);88BOOST_CHECK_THROW(j.pushKVEnd("k", 1), std::runtime_error);89BOOST_CHECK_THROW(j.pushKV("k", 1), std::runtime_error);90BOOST_CHECK_THROW(j.pushKVs({}), std::runtime_error);91}93void univalue_typecheck()94{95UniValue v1;96v1.setNumStr("1");97BOOST_CHECK(v1.isNum());98BOOST_CHECK_THROW(v1.get_bool(), std::runtime_error);100{101UniValue v_negative;102v_negative.setNumStr("-1");103BOOST_CHECK_THROW(v_negative.getInt<uint8_t>(), std::runtime_error);104BOOST_CHECK_EQUAL(v_negative.getInt<int8_t>(), -1);105}107UniValue v2;108v2.setBool(true);109BOOST_CHECK_EQUAL(v2.get_bool(), true);110BOOST_CHECK_THROW(v2.getInt<int>(), std::runtime_error);112UniValue v3;113v3.setNumStr("32482348723847471234");114BOOST_CHECK_THROW(v3.getInt<int64_t>(), std::runtime_error);115v3.setNumStr("1000");116BOOST_CHECK_EQUAL(v3.getInt<int64_t>(), 1000);118UniValue v4;119v4.setNumStr("2147483648");120BOOST_CHECK_EQUAL(v4.getInt<int64_t>(), 2147483648);121BOOST_CHECK_THROW(v4.getInt<int>(), std::runtime_error);122v4.setNumStr("1000");123BOOST_CHECK_EQUAL(v4.getInt<int>(), 1000);124BOOST_CHECK_THROW(v4.get_str(), std::runtime_error);125BOOST_CHECK_EQUAL(v4.get_real(), 1000);126BOOST_CHECK_THROW(v4.get_array(), std::runtime_error);127BOOST_CHECK_THROW(v4.getKeys(), std::runtime_error);128BOOST_CHECK_THROW(v4.getValues(), std::runtime_error);129BOOST_CHECK_THROW(v4.get_obj(), std::runtime_error);131UniValue v5;132BOOST_CHECK(v5.read("[true, 10]"));133BOOST_CHECK_NO_THROW(v5.get_array());134std::vector<UniValue> vals = v5.getValues();135BOOST_CHECK_THROW(vals[0].getInt<int>(), std::runtime_error);136BOOST_CHECK_EQUAL(vals[0].get_bool(), true);138BOOST_CHECK_EQUAL(vals[1].getInt<int>(), 10);139BOOST_CHECK_THROW(vals[1].get_bool(), std::runtime_error);140}142void univalue_set()143{144UniValue v(UniValue::VSTR, "foo");145v.clear();146BOOST_CHECK(v.isNull());147BOOST_CHECK_EQUAL(v.getValStr(), "");149v.setObject();150BOOST_CHECK(v.isObject());151BOOST_CHECK_EQUAL(v.size(), 0);152BOOST_CHECK_EQUAL(v.getType(), UniValue::VOBJ);153BOOST_CHECK(v.empty());155v.setArray();156BOOST_CHECK(v.isArray());157BOOST_CHECK_EQUAL(v.size(), 0);159v.setStr("zum");160BOOST_CHECK(v.isStr());161BOOST_CHECK_EQUAL(v.getValStr(), "zum");163{164std::string_view sv{"ab\0c", 4};165UniValue j{sv};166BOOST_CHECK(j.isStr());167BOOST_CHECK_EQUAL(j.getValStr(), sv);168BOOST_CHECK_EQUAL(j.write(), "\"ab\\u0000c\"");169}171v.setFloat(-1.01);172BOOST_CHECK(v.isNum());173BOOST_CHECK_EQUAL(v.getValStr(), "-1.01");175v.setInt(int{1023});176BOOST_CHECK(v.isNum());177BOOST_CHECK_EQUAL(v.getValStr(), "1023");179v.setInt(int64_t{-1023LL});180BOOST_CHECK(v.isNum());181BOOST_CHECK_EQUAL(v.getValStr(), "-1023");183v.setInt(uint64_t{1023ULL});184BOOST_CHECK(v.isNum());185BOOST_CHECK_EQUAL(v.getValStr(), "1023");187v.setNumStr("-688");188BOOST_CHECK(v.isNum());189BOOST_CHECK_EQUAL(v.getValStr(), "-688");191v.setBool(false);192BOOST_CHECK_EQUAL(v.isBool(), true);193BOOST_CHECK_EQUAL(v.isTrue(), false);194BOOST_CHECK_EQUAL(v.isFalse(), true);195BOOST_CHECK_EQUAL(v.get_bool(), false);197v.setBool(true);198BOOST_CHECK_EQUAL(v.isBool(), true);199BOOST_CHECK_EQUAL(v.isTrue(), true);200BOOST_CHECK_EQUAL(v.isFalse(), false);201BOOST_CHECK_EQUAL(v.get_bool(), true);203BOOST_CHECK_THROW(v.setNumStr("zombocom"), std::runtime_error);205v.setNull();206BOOST_CHECK(v.isNull());207}209void univalue_array()210{211UniValue arr(UniValue::VARR);213UniValue v((int64_t)1023LL);214arr.push_back(v);216std::string vStr("zippy");217arr.push_back(vStr);219const char *s = "pippy";220arr.push_back(s);222std::vector<UniValue> vec;223v.setStr("boing");224vec.push_back(v);226v.setStr("going");227vec.push_back(v);229arr.push_backV(vec);231arr.push_back(uint64_t{400ULL});232arr.push_back(int64_t{-400LL});233arr.push_back(int{-401});234arr.push_back(-40.1);235arr.push_back(true);237BOOST_CHECK_EQUAL(arr.empty(), false);238BOOST_CHECK_EQUAL(arr.size(), 10);240BOOST_CHECK_EQUAL(arr[0].getValStr(), "1023");241BOOST_CHECK_EQUAL(arr[0].getType(), UniValue::VNUM);242BOOST_CHECK_EQUAL(arr[1].getValStr(), "zippy");243BOOST_CHECK_EQUAL(arr[1].getType(), UniValue::VSTR);244BOOST_CHECK_EQUAL(arr[2].getValStr(), "pippy");245BOOST_CHECK_EQUAL(arr[2].getType(), UniValue::VSTR);246BOOST_CHECK_EQUAL(arr[3].getValStr(), "boing");247BOOST_CHECK_EQUAL(arr[3].getType(), UniValue::VSTR);248BOOST_CHECK_EQUAL(arr[4].getValStr(), "going");249BOOST_CHECK_EQUAL(arr[4].getType(), UniValue::VSTR);250BOOST_CHECK_EQUAL(arr[5].getValStr(), "400");
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.