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) 2011-present The Bitcoin Core developers2// Distributed under the MIT software license, see the accompanying3// file COPYING or http://www.opensource.org/licenses/mit-license.php.5#include <primitives/transaction_identifier.h>6#include <streams.h>7#include <test/util/common.h>8#include <uint256.h>9#include <util/strencodings.h>11#include <boost/test/unit_test.hpp>13#include <iomanip>14#include <sstream>15#include <string>16#include <string_view>17#include <vector>19BOOST_AUTO_TEST_SUITE(uint256_tests)21const unsigned char R1Array[] =22"\x9c\x52\x4a\xdb\xcf\x56\x11\x12\x2b\x29\x12\x5e\x5d\x35\xd2\xd2"23"\x22\x81\xaa\xb5\x33\xf0\x08\x32\xd5\x56\xb1\xf9\xea\xe5\x1d\x7d";24const char R1ArrayHex[] = "7D1DE5EAF9B156D53208F033B5AA8122D2d2355d5e12292b121156cfdb4a529c";25const uint256 R1L = uint256(std::vector<unsigned char>(R1Array,R1Array+32));26const uint160 R1S = uint160(std::vector<unsigned char>(R1Array,R1Array+20));28const unsigned char R2Array[] =29"\x70\x32\x1d\x7c\x47\xa5\x6b\x40\x26\x7e\x0a\xc3\xa6\x9c\xb6\xbf"30"\x13\x30\x47\xa3\x19\x2d\xda\x71\x49\x13\x72\xf0\xb4\xca\x81\xd7";31const uint256 R2L = uint256(std::vector<unsigned char>(R2Array,R2Array+32));32const uint160 R2S = uint160(std::vector<unsigned char>(R2Array,R2Array+20));34const unsigned char ZeroArray[] =35"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"36"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00";37const uint256 ZeroL = uint256(std::vector<unsigned char>(ZeroArray,ZeroArray+32));38const uint160 ZeroS = uint160(std::vector<unsigned char>(ZeroArray,ZeroArray+20));40const unsigned char OneArray[] =41"\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"42"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00";43const uint256 OneL = uint256(std::vector<unsigned char>(OneArray,OneArray+32));44const uint160 OneS = uint160(std::vector<unsigned char>(OneArray,OneArray+20));46const unsigned char MaxArray[] =47"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"48"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff";49const uint256 MaxL = uint256(std::vector<unsigned char>(MaxArray,MaxArray+32));50const uint160 MaxS = uint160(std::vector<unsigned char>(MaxArray,MaxArray+20));52static std::string ArrayToString(const unsigned char A[], unsigned int width)53{54std::stringstream Stream;55Stream << std::hex;56for (unsigned int i = 0; i < width; ++i)57{58Stream<<std::setw(2)<<std::setfill('0')<<(unsigned int)A[width-i-1];59}60return Stream.str();61}63BOOST_AUTO_TEST_CASE( basics ) // constructors, equality, inequality64{65// constructor uint256(vector<char>):66BOOST_CHECK_EQUAL(R1L.ToString(), ArrayToString(R1Array,32));67BOOST_CHECK_EQUAL(R1S.ToString(), ArrayToString(R1Array,20));68BOOST_CHECK_EQUAL(R2L.ToString(), ArrayToString(R2Array,32));69BOOST_CHECK_EQUAL(R2S.ToString(), ArrayToString(R2Array,20));70BOOST_CHECK_EQUAL(ZeroL.ToString(), ArrayToString(ZeroArray,32));71BOOST_CHECK_EQUAL(ZeroS.ToString(), ArrayToString(ZeroArray,20));72BOOST_CHECK_EQUAL(OneL.ToString(), ArrayToString(OneArray,32));73BOOST_CHECK_EQUAL(OneS.ToString(), ArrayToString(OneArray,20));74BOOST_CHECK_EQUAL(MaxL.ToString(), ArrayToString(MaxArray,32));75BOOST_CHECK_EQUAL(MaxS.ToString(), ArrayToString(MaxArray,20));76BOOST_CHECK_NE(OneL.ToString(), ArrayToString(ZeroArray,32));77BOOST_CHECK_NE(OneS.ToString(), ArrayToString(ZeroArray,20));79// == and !=80BOOST_CHECK_NE(R1L, R2L); BOOST_CHECK_NE(R1S, R2S);81BOOST_CHECK_NE(ZeroL, OneL); BOOST_CHECK_NE(ZeroS, OneS);82BOOST_CHECK_NE(OneL, ZeroL); BOOST_CHECK_NE(OneS, ZeroS);83BOOST_CHECK_NE(MaxL, ZeroL); BOOST_CHECK_NE(MaxS, ZeroS);85// String Constructor and Copy Constructor86BOOST_CHECK_EQUAL(uint256::FromHex(R1L.ToString()).value(), R1L);87BOOST_CHECK_EQUAL(uint256::FromHex(R2L.ToString()).value(), R2L);88BOOST_CHECK_EQUAL(uint256::FromHex(ZeroL.ToString()).value(), ZeroL);89BOOST_CHECK_EQUAL(uint256::FromHex(OneL.ToString()).value(), OneL);90BOOST_CHECK_EQUAL(uint256::FromHex(MaxL.ToString()).value(), MaxL);91BOOST_CHECK_EQUAL(uint256::FromHex(R1ArrayHex).value(), R1L);92BOOST_CHECK_EQUAL(uint256(R1L), R1L);93BOOST_CHECK_EQUAL(uint256(ZeroL), ZeroL);94BOOST_CHECK_EQUAL(uint256(OneL), OneL);96BOOST_CHECK_EQUAL(uint160::FromHex(R1S.ToString()).value(), R1S);97BOOST_CHECK_EQUAL(uint160::FromHex(R2S.ToString()).value(), R2S);98BOOST_CHECK_EQUAL(uint160::FromHex(ZeroS.ToString()).value(), ZeroS);99BOOST_CHECK_EQUAL(uint160::FromHex(OneS.ToString()).value(), OneS);100BOOST_CHECK_EQUAL(uint160::FromHex(MaxS.ToString()).value(), MaxS);101BOOST_CHECK_EQUAL(uint160::FromHex(std::string_view{R1ArrayHex + 24, 40}).value(), R1S);103BOOST_CHECK_EQUAL(uint160(R1S), R1S);104BOOST_CHECK_EQUAL(uint160(ZeroS), ZeroS);105BOOST_CHECK_EQUAL(uint160(OneS), OneS);106}108BOOST_AUTO_TEST_CASE( comparison ) // <= >= < >109{110uint256 LastL;111for (int i = 255; i >= 0; --i) {112uint256 TmpL;113*(TmpL.begin() + (i>>3)) |= 1<<(7-(i&7));114BOOST_CHECK_LT(LastL, TmpL);115LastL = TmpL;116}118BOOST_CHECK_LT(ZeroL, R1L);119BOOST_CHECK_LT(R2L, R1L);120BOOST_CHECK_LT(ZeroL, OneL);121BOOST_CHECK_LT(OneL, MaxL);122BOOST_CHECK_LT(R1L, MaxL);123BOOST_CHECK_LT(R2L, MaxL);125uint160 LastS;126for (int i = 159; i >= 0; --i) {127uint160 TmpS;128*(TmpS.begin() + (i>>3)) |= 1<<(7-(i&7));129BOOST_CHECK_LT(LastS, TmpS);130LastS = TmpS;131}132BOOST_CHECK_LT(ZeroS, R1S);133BOOST_CHECK_LT(R2S, R1S);134BOOST_CHECK_LT(ZeroS, OneS);135BOOST_CHECK_LT(OneS, MaxS);136BOOST_CHECK_LT(R1S, MaxS);137BOOST_CHECK_LT(R2S, MaxS);139// Non-arithmetic uint256s compare from the beginning of their inner arrays:140BOOST_CHECK_LT(R2L, R1L);141// Ensure first element comparisons give the same order as above:142BOOST_CHECK_LT(*R2L.begin(), *R1L.begin());143// Ensure last element comparisons give a different result (swapped params):144BOOST_CHECK_LT(*(R1L.end()-1), *(R2L.end()-1));145// Hex strings represent reverse-encoded bytes, with lexicographic ordering:146BOOST_CHECK_LT(uint256{"1000000000000000000000000000000000000000000000000000000000000000"},147uint256{"0000000000000000000000000000000000000000000000000000000000000001"});148}150BOOST_AUTO_TEST_CASE(methods) // GetHex FromHex begin() end() size() GetLow64 GetSerializeSize, Serialize, Unserialize151{152BOOST_CHECK_EQUAL(R1L.GetHex(), R1L.ToString());153BOOST_CHECK_EQUAL(R2L.GetHex(), R2L.ToString());154BOOST_CHECK_EQUAL(OneL.GetHex(), OneL.ToString());155BOOST_CHECK_EQUAL(MaxL.GetHex(), MaxL.ToString());156uint256 TmpL(R1L);157BOOST_CHECK_EQUAL(TmpL, R1L);158BOOST_CHECK_EQUAL(uint256::FromHex(R2L.ToString()).value(), R2L);159BOOST_CHECK_EQUAL(uint256::FromHex(ZeroL.ToString()).value(), uint256());161TmpL = uint256::FromHex(R1L.ToString()).value();162BOOST_CHECK_EQUAL_COLLECTIONS(R1L.begin(), R1L.end(), R1Array, R1Array + uint256::size());163BOOST_CHECK_EQUAL_COLLECTIONS(TmpL.begin(), TmpL.end(), R1Array, R1Array + uint256::size());164BOOST_CHECK_EQUAL_COLLECTIONS(R2L.begin(), R2L.end(), R2Array, R2Array + uint256::size());165BOOST_CHECK_EQUAL_COLLECTIONS(ZeroL.begin(), ZeroL.end(), ZeroArray, ZeroArray + uint256::size());166BOOST_CHECK_EQUAL_COLLECTIONS(OneL.begin(), OneL.end(), OneArray, OneArray + uint256::size());167BOOST_CHECK_EQUAL(R1L.size(), sizeof(R1L));168BOOST_CHECK_EQUAL(sizeof(R1L), 32);169BOOST_CHECK_EQUAL(R1L.size(), 32);170BOOST_CHECK_EQUAL(R2L.size(), 32);171BOOST_CHECK_EQUAL(ZeroL.size(), 32);172BOOST_CHECK_EQUAL(MaxL.size(), 32);173BOOST_CHECK_EQUAL(R1L.begin() + 32, R1L.end());174BOOST_CHECK_EQUAL(R2L.begin() + 32, R2L.end());175BOOST_CHECK_EQUAL(OneL.begin() + 32, OneL.end());176BOOST_CHECK_EQUAL(MaxL.begin() + 32, MaxL.end());177BOOST_CHECK_EQUAL(TmpL.begin() + 32, TmpL.end());178BOOST_CHECK_EQUAL(GetSerializeSize(R1L), 32);179BOOST_CHECK_EQUAL(GetSerializeSize(ZeroL), 32);181DataStream ss{};182ss << R1L;183BOOST_CHECK_EQUAL(ss.str(), std::string(R1Array,R1Array+32));184ss >> TmpL;185BOOST_CHECK_EQUAL(R1L, TmpL);186ss.clear();187ss << ZeroL;188BOOST_CHECK_EQUAL(ss.str(), std::string(ZeroArray,ZeroArray+32));189ss >> TmpL;190BOOST_CHECK_EQUAL(ZeroL, TmpL);191ss.clear();192ss << MaxL;193BOOST_CHECK_EQUAL(ss.str(), std::string(MaxArray,MaxArray+32));194ss >> TmpL;195BOOST_CHECK_EQUAL(MaxL, TmpL);196ss.clear();198BOOST_CHECK_EQUAL(R1S.GetHex(), R1S.ToString());199BOOST_CHECK_EQUAL(R2S.GetHex(), R2S.ToString());200BOOST_CHECK_EQUAL(OneS.GetHex(), OneS.ToString());201BOOST_CHECK_EQUAL(MaxS.GetHex(), MaxS.ToString());202uint160 TmpS(R1S);203BOOST_CHECK_EQUAL(TmpS, R1S);204BOOST_CHECK_EQUAL(uint160::FromHex(R2S.ToString()).value(), R2S);205BOOST_CHECK_EQUAL(uint160::FromHex(ZeroS.ToString()).value(), uint160());207TmpS = uint160::FromHex(R1S.ToString()).value();208BOOST_CHECK_EQUAL_COLLECTIONS(R1S.begin(), R1S.end(), R1Array, R1Array + uint160::size());209BOOST_CHECK_EQUAL_COLLECTIONS(TmpS.begin(), TmpS.end(), R1Array, R1Array + uint160::size());210BOOST_CHECK_EQUAL_COLLECTIONS(R2S.begin(), R2S.end(), R2Array, R2Array + uint160::size());211BOOST_CHECK_EQUAL_COLLECTIONS(ZeroS.begin(), ZeroS.end(), ZeroArray, ZeroArray + uint160::size());212BOOST_CHECK_EQUAL_COLLECTIONS(OneS.begin(), OneS.end(), OneArray, OneArray + uint160::size());213BOOST_CHECK_EQUAL(R1S.size(), sizeof(R1S));214BOOST_CHECK_EQUAL(sizeof(R1S), 20);215BOOST_CHECK_EQUAL(R1S.size(), 20);216BOOST_CHECK_EQUAL(R2S.size(), 20);217BOOST_CHECK_EQUAL(ZeroS.size(), 20);218BOOST_CHECK_EQUAL(MaxS.size(), 20);219BOOST_CHECK_EQUAL(R1S.begin() + 20, R1S.end());220BOOST_CHECK_EQUAL(R2S.begin() + 20, R2S.end());221BOOST_CHECK_EQUAL(OneS.begin() + 20, OneS.end());222BOOST_CHECK_EQUAL(MaxS.begin() + 20, MaxS.end());223BOOST_CHECK_EQUAL(TmpS.begin() + 20, TmpS.end());224BOOST_CHECK_EQUAL(GetSerializeSize(R1S), 20);225BOOST_CHECK_EQUAL(GetSerializeSize(ZeroS), 20);227ss << R1S;228BOOST_CHECK_EQUAL(ss.str(), std::string(R1Array,R1Array+20));229ss >> TmpS;230BOOST_CHECK_EQUAL(R1S, TmpS);231ss.clear();232ss << ZeroS;233BOOST_CHECK_EQUAL(ss.str(), std::string(ZeroArray,ZeroArray+20));234ss >> TmpS;235BOOST_CHECK_EQUAL(ZeroS, TmpS);236ss.clear();237ss << MaxS;238BOOST_CHECK_EQUAL(ss.str(), std::string(MaxArray,MaxArray+20));239ss >> TmpS;240BOOST_CHECK_EQUAL(MaxS, TmpS);241ss.clear();242}244/**245* Implemented as a templated function so it can be reused by other classes that have a FromHex()246* method that wraps base_blob::FromHex(), such as transaction_identifier::FromHex().247*/248template <typename T>249void TestFromHex()250{
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.