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 2014 BitPay Inc.2// Copyright (c) 2015-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 <univalue/test/fail1.json.h>9#include <univalue/test/fail10.json.h>10#include <univalue/test/fail11.json.h>11#include <univalue/test/fail12.json.h>12#include <univalue/test/fail13.json.h>13#include <univalue/test/fail14.json.h>14#include <univalue/test/fail15.json.h>15#include <univalue/test/fail16.json.h>16#include <univalue/test/fail17.json.h>17#include <univalue/test/fail18.json.h>18#include <univalue/test/fail19.json.h>19#include <univalue/test/fail2.json.h>20#include <univalue/test/fail20.json.h>21#include <univalue/test/fail21.json.h>22#include <univalue/test/fail22.json.h>23#include <univalue/test/fail23.json.h>24#include <univalue/test/fail24.json.h>25#include <univalue/test/fail25.json.h>26#include <univalue/test/fail26.json.h>27#include <univalue/test/fail27.json.h>28#include <univalue/test/fail28.json.h>29#include <univalue/test/fail29.json.h>30#include <univalue/test/fail3.json.h>31#include <univalue/test/fail30.json.h>32#include <univalue/test/fail31.json.h>33#include <univalue/test/fail32.json.h>34#include <univalue/test/fail33.json.h>35#include <univalue/test/fail34.json.h>36#include <univalue/test/fail35.json.h>37#include <univalue/test/fail36.json.h>38#include <univalue/test/fail37.json.h>39#include <univalue/test/fail38.json.h>40#include <univalue/test/fail39.json.h>41#include <univalue/test/fail4.json.h>42#include <univalue/test/fail40.json.h>43#include <univalue/test/fail41.json.h>44#include <univalue/test/fail42.json.h>45#include <univalue/test/fail44.json.h>46#include <univalue/test/fail45.json.h>47#include <univalue/test/fail5.json.h>48#include <univalue/test/fail6.json.h>49#include <univalue/test/fail7.json.h>50#include <univalue/test/fail8.json.h>51#include <univalue/test/fail9.json.h>52#include <univalue/test/pass1.json.h>53#include <univalue/test/pass2.json.h>54#include <univalue/test/pass3.json.h>55#include <univalue/test/pass4.json.h>56#include <univalue/test/round1.json.h>57#include <univalue/test/round2.json.h>58#include <univalue/test/round3.json.h>59#include <univalue/test/round4.json.h>60#include <univalue/test/round5.json.h>61#include <univalue/test/round6.json.h>62#include <univalue/test/round7.json.h>64#include <array>65#include <cassert>66#include <string>67#include <string_view>68#include <tuple>70static std::string rtrim(std::string s)71{72s.erase(s.find_last_not_of(" \n\r\t") + 1);73return s;74}76static void runtest(std::string filename, const std::string& jdata)77{78std::string prefix = filename.substr(0, 4);80bool wantPass = (prefix == "pass") || (prefix == "roun");81bool wantFail = (prefix == "fail");82bool wantRoundTrip = (prefix == "roun");83assert(wantPass || wantFail);85UniValue val;86bool testResult = val.read(jdata);88if (wantPass) {89assert(testResult == true);90} else {91assert(testResult == false);92}94if (wantRoundTrip) {95std::string odata = val.write(0, 0);96assert(odata == rtrim(jdata));97}98}100#define TEST_FILE(name) {#name, json_tests::name}101inline constexpr std::array tests{std::to_array<std::tuple<std::string_view, std::string_view>>({102TEST_FILE(fail1),103TEST_FILE(fail10),104TEST_FILE(fail11),105TEST_FILE(fail12),106TEST_FILE(fail13),107TEST_FILE(fail14),108TEST_FILE(fail15),109TEST_FILE(fail16),110TEST_FILE(fail17),111TEST_FILE(fail18),112TEST_FILE(fail19),113TEST_FILE(fail2),114TEST_FILE(fail20),115TEST_FILE(fail21),116TEST_FILE(fail22),117TEST_FILE(fail23),118TEST_FILE(fail24),119TEST_FILE(fail25),120TEST_FILE(fail26),121TEST_FILE(fail27),122TEST_FILE(fail28),123TEST_FILE(fail29),124TEST_FILE(fail3),125TEST_FILE(fail30),126TEST_FILE(fail31),127TEST_FILE(fail32),128TEST_FILE(fail33),129TEST_FILE(fail34),130TEST_FILE(fail35),131TEST_FILE(fail36),132TEST_FILE(fail37),133TEST_FILE(fail38), // invalid unicode: only first half of surrogate pair134TEST_FILE(fail39), // invalid unicode: only second half of surrogate pair135TEST_FILE(fail4), // extra comma136TEST_FILE(fail40), // invalid unicode: broken UTF-8137TEST_FILE(fail41), // invalid unicode: unfinished UTF-8138TEST_FILE(fail42), // valid json with garbage following a nul byte139TEST_FILE(fail44), // unterminated string140TEST_FILE(fail45), // nested beyond max depth141TEST_FILE(fail5),142TEST_FILE(fail6),143TEST_FILE(fail7),144TEST_FILE(fail8),145TEST_FILE(fail9), // extra comma146TEST_FILE(pass1),147TEST_FILE(pass2),148TEST_FILE(pass3),149TEST_FILE(pass4),150TEST_FILE(round1), // round-trip test151TEST_FILE(round2), // unicode152TEST_FILE(round3), // bare string153TEST_FILE(round4), // bare number154TEST_FILE(round5), // bare true155TEST_FILE(round6), // bare false156TEST_FILE(round7), // bare null157})};159// Test \u handling160void unescape_unicode_test()161{162UniValue val;163bool testResult;164// Escaped ASCII (quote)165testResult = val.read("[\"\\u0022\"]");166assert(testResult);167assert(val[0].get_str() == "\"");168// Escaped Basic Plane character, two-byte UTF-8169testResult = val.read("[\"\\u0191\"]");170assert(testResult);171assert(val[0].get_str() == "\xc6\x91");172// Escaped Basic Plane character, three-byte UTF-8173testResult = val.read("[\"\\u2191\"]");174assert(testResult);175assert(val[0].get_str() == "\xe2\x86\x91");176// Escaped Supplementary Plane character U+1d161177testResult = val.read("[\"\\ud834\\udd61\"]");178assert(testResult);179assert(val[0].get_str() == "\xf0\x9d\x85\xa1");180}182void no_nul_test()183{184char buf[] = "___[1,2,3]___";185UniValue val;186assert(val.read({buf + 3, 7}));187}189int main(int argc, char* argv[])190{191for (const auto& [file, json] : tests) {192runtest(std::string{file}, std::string{json});193}195unescape_unicode_test();196no_nul_test();198return 0;199}
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.