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.
251CHECKASSIGNMENTOPERATOR(Zero,R1,|)252CHECKASSIGNMENTOPERATOR(Zero,R1,^)253CHECKASSIGNMENTOPERATOR(Zero,R1,&)254CHECKASSIGNMENTOPERATOR(Max,R1,|)255CHECKASSIGNMENTOPERATOR(Max,R1,^)256CHECKASSIGNMENTOPERATOR(Max,R1,&)258uint64_t Tmp64 = 0xe1db685c9a0b47a2ULL;259TmpL = R1L; TmpL |= Tmp64; BOOST_CHECK(TmpL == (R1L | arith_uint256(Tmp64)));260TmpL = R1L; TmpL |= 0; BOOST_CHECK(TmpL == R1L);261TmpL ^= 0; BOOST_CHECK(TmpL == R1L);262TmpL ^= Tmp64; BOOST_CHECK(TmpL == (R1L ^ arith_uint256(Tmp64)));263}265BOOST_AUTO_TEST_CASE( comparison ) // <= >= < >266{267arith_uint256 TmpL;268for (unsigned int i = 0; i < 256; ++i) {269TmpL= OneL<< i;270BOOST_CHECK(TmpL >= ZeroL);271BOOST_CHECK(TmpL > ZeroL);272BOOST_CHECK(ZeroL < TmpL);273BOOST_CHECK(ZeroL <= TmpL);274BOOST_CHECK(TmpL >= 0);275BOOST_CHECK(TmpL > 0);276BOOST_CHECK(0 < TmpL);277BOOST_CHECK(0 <= TmpL);278TmpL |= R1L;279BOOST_CHECK( TmpL >= R1L ); BOOST_CHECK( (TmpL == R1L) != (TmpL > R1L)); BOOST_CHECK( (TmpL == R1L) || !( TmpL <= R1L));280BOOST_CHECK( R1L <= TmpL ); BOOST_CHECK( (R1L == TmpL) != (R1L < TmpL)); BOOST_CHECK( (TmpL == R1L) || !( R1L >= TmpL));281BOOST_CHECK(! (TmpL < R1L)); BOOST_CHECK(! (R1L > TmpL));282}284BOOST_CHECK_LT(ZeroL,285OneL);286}288BOOST_AUTO_TEST_CASE( plusMinus )289{290arith_uint256 TmpL = 0;291BOOST_CHECK_EQUAL(R1L + R2L, UintToArith256(uint256{"549fb09fea236a1ea3e31d4d58f1b1369288d204211ca751527cfc175767850c"}));292TmpL += R1L;293BOOST_CHECK(TmpL == R1L);294TmpL += R2L;295BOOST_CHECK(TmpL == R1L + R2L);296BOOST_CHECK(OneL+MaxL == ZeroL);297BOOST_CHECK(MaxL+OneL == ZeroL);298for (unsigned int i = 1; i < 256; ++i) {299BOOST_CHECK( (MaxL >> i) + OneL == (HalfL >> (i-1)) );300BOOST_CHECK( OneL + (MaxL >> i) == (HalfL >> (i-1)) );301TmpL = (MaxL>>i); TmpL += OneL;302BOOST_CHECK( TmpL == (HalfL >> (i-1)) );303TmpL = (MaxL>>i); TmpL += 1;304BOOST_CHECK( TmpL == (HalfL >> (i-1)) );305TmpL = (MaxL>>i);306BOOST_CHECK( TmpL++ == (MaxL>>i) );307BOOST_CHECK( TmpL == (HalfL >> (i-1)));308}309BOOST_CHECK(arith_uint256(0xbedc77e27940a7ULL) + 0xee8d836fce66fbULL == arith_uint256(0xbedc77e27940a7ULL + 0xee8d836fce66fbULL));310TmpL = arith_uint256(0xbedc77e27940a7ULL); TmpL += 0xee8d836fce66fbULL;311BOOST_CHECK(TmpL == arith_uint256(0xbedc77e27940a7ULL+0xee8d836fce66fbULL));312TmpL -= 0xee8d836fce66fbULL; BOOST_CHECK(TmpL == 0xbedc77e27940a7ULL);313TmpL = R1L;314BOOST_CHECK(++TmpL == R1L+1);316BOOST_CHECK(R1L -(-R2L) == R1L+R2L);317BOOST_CHECK(R1L -(-OneL) == R1L+OneL);318BOOST_CHECK(R1L - OneL == R1L+(-OneL));319for (unsigned int i = 1; i < 256; ++i) {320BOOST_CHECK((MaxL>>i) - (-OneL) == (HalfL >> (i-1)));321BOOST_CHECK((HalfL >> (i-1)) - OneL == (MaxL>>i));322TmpL = (HalfL >> (i-1));323BOOST_CHECK(TmpL-- == (HalfL >> (i-1)));324BOOST_CHECK(TmpL == (MaxL >> i));325TmpL = (HalfL >> (i-1));326BOOST_CHECK(--TmpL == (MaxL >> i));327}328TmpL = R1L;329BOOST_CHECK(--TmpL == R1L-1);330}332BOOST_AUTO_TEST_CASE( multiply )333{334BOOST_CHECK((R1L * R1L).ToString() == "62a38c0486f01e45879d7910a7761bf30d5237e9873f9bff3642a732c4d84f10");335BOOST_CHECK((R1L * R2L).ToString() == "de37805e9986996cfba76ff6ba51c008df851987d9dd323f0e5de07760529c40");336BOOST_CHECK((R1L * ZeroL) == ZeroL);337BOOST_CHECK((R1L * OneL) == R1L);338BOOST_CHECK((R1L * MaxL) == -R1L);339BOOST_CHECK((R2L * R1L) == (R1L * R2L));340BOOST_CHECK((R2L * R2L).ToString() == "ac8c010096767d3cae5005dec28bb2b45a1d85ab7996ccd3e102a650f74ff100");341BOOST_CHECK((R2L * ZeroL) == ZeroL);342BOOST_CHECK((R2L * OneL) == R2L);343BOOST_CHECK((R2L * MaxL) == -R2L);345BOOST_CHECK(MaxL * MaxL == OneL);347BOOST_CHECK((R1L * 0) == 0);348BOOST_CHECK((R1L * 1) == R1L);349BOOST_CHECK((R1L * 3).ToString() == "7759b1c0ed14047f961ad09b20ff83687876a0181a367b813634046f91def7d4");350BOOST_CHECK((R2L * 0x87654321UL).ToString() == "23f7816e30c4ae2017257b7a0fa64d60402f5234d46e746b61c960d09a26d070");351}353BOOST_AUTO_TEST_CASE( divide )354{355arith_uint256 D1L{UintToArith256(uint256{"00000000000000000000000000000000000000000000000ad7133ac1977fa2b7"})};356arith_uint256 D2L{UintToArith256(uint256{"0000000000000000000000000000000000000000000000000000000ecd751716"})};357BOOST_CHECK((R1L / D1L).ToString() == "00000000000000000b8ac01106981635d9ed112290f8895545a7654dde28fb3a");358BOOST_CHECK((R1L / D2L).ToString() == "000000000873ce8efec5b67150bad3aa8c5fcb70e947586153bf2cec7c37c57a");359BOOST_CHECK(R1L / OneL == R1L);360BOOST_CHECK(R1L / MaxL == ZeroL);361BOOST_CHECK(MaxL / R1L == 2);362BOOST_CHECK_THROW(R1L / ZeroL, uint_error);363BOOST_CHECK((R2L / D1L).ToString() == "000000000000000013e1665895a1cc981de6d93670105a6b3ec3b73141b3a3c5");364BOOST_CHECK((R2L / D2L).ToString() == "000000000e8f0abe753bb0afe2e9437ee85d280be60882cf0bd1aaf7fa3cc2c4");365BOOST_CHECK(R2L / OneL == R2L);366BOOST_CHECK(R2L / MaxL == ZeroL);367BOOST_CHECK(MaxL / R2L == 1);368BOOST_CHECK_THROW(R2L / ZeroL, uint_error);369}372static bool almostEqual(double d1, double d2)373{374return fabs(d1-d2) <= 4*fabs(d1)*std::numeric_limits<double>::epsilon();375}377BOOST_AUTO_TEST_CASE(methods)378{379BOOST_CHECK(R1L.GetHex() == R1L.ToString());380BOOST_CHECK(R2L.GetHex() == R2L.ToString());381BOOST_CHECK(OneL.GetHex() == OneL.ToString());382BOOST_CHECK(MaxL.GetHex() == MaxL.ToString());383arith_uint256 TmpL(R1L);384BOOST_CHECK(TmpL == R1L);385TmpL = R2L;386BOOST_CHECK(TmpL == R2L);387TmpL = ZeroL;388BOOST_CHECK(TmpL == 0);389TmpL = HalfL;390BOOST_CHECK(TmpL == HalfL);392TmpL = R1L;393BOOST_CHECK(R1L.size() == 32);394BOOST_CHECK(R2L.size() == 32);395BOOST_CHECK(ZeroL.size() == 32);396BOOST_CHECK(MaxL.size() == 32);397BOOST_CHECK(R1L.GetLow64() == R1LLow64);398BOOST_CHECK(HalfL.GetLow64() ==0x0000000000000000ULL);399BOOST_CHECK(OneL.GetLow64() ==0x0000000000000001ULL);401for (unsigned int i = 0; i < 255; ++i)402{403BOOST_CHECK((OneL << i).getdouble() == ldexp(1.0,i));404}405BOOST_CHECK(ZeroL.getdouble() == 0.0);406for (int i = 256; i > 53; --i)407BOOST_CHECK(almostEqual((R1L>>(256-i)).getdouble(), ldexp(R1Ldouble,i)));408uint64_t R1L64part = (R1L>>192).GetLow64();409for (int i = 53; i > 0; --i) // doubles can store all integers in {0,...,2^54-1} exactly410{411BOOST_CHECK((R1L>>(256-i)).getdouble() == (double)(R1L64part >> (64-i)));412}413}415BOOST_AUTO_TEST_CASE(bignum_SetCompact)416{417arith_uint256 num;418bool fNegative;419bool fOverflow;420num.SetCompact(0, &fNegative, &fOverflow);421BOOST_CHECK_EQUAL(num.GetHex(), "0000000000000000000000000000000000000000000000000000000000000000");422BOOST_CHECK_EQUAL(num.GetCompact(), 0U);423BOOST_CHECK_EQUAL(fNegative, false);424BOOST_CHECK_EQUAL(fOverflow, false);426num.SetCompact(0x00123456, &fNegative, &fOverflow);427BOOST_CHECK_EQUAL(num.GetHex(), "0000000000000000000000000000000000000000000000000000000000000000");428BOOST_CHECK_EQUAL(num.GetCompact(), 0U);429BOOST_CHECK_EQUAL(fNegative, false);430BOOST_CHECK_EQUAL(fOverflow, false);432num.SetCompact(0x01003456, &fNegative, &fOverflow);433BOOST_CHECK_EQUAL(num.GetHex(), "0000000000000000000000000000000000000000000000000000000000000000");434BOOST_CHECK_EQUAL(num.GetCompact(), 0U);435BOOST_CHECK_EQUAL(fNegative, false);436BOOST_CHECK_EQUAL(fOverflow, false);438num.SetCompact(0x02000056, &fNegative, &fOverflow);439BOOST_CHECK_EQUAL(num.GetHex(), "0000000000000000000000000000000000000000000000000000000000000000");440BOOST_CHECK_EQUAL(num.GetCompact(), 0U);441BOOST_CHECK_EQUAL(fNegative, false);442BOOST_CHECK_EQUAL(fOverflow, false);444num.SetCompact(0x03000000, &fNegative, &fOverflow);445BOOST_CHECK_EQUAL(num.GetHex(), "0000000000000000000000000000000000000000000000000000000000000000");446BOOST_CHECK_EQUAL(num.GetCompact(), 0U);447BOOST_CHECK_EQUAL(fNegative, false);448BOOST_CHECK_EQUAL(fOverflow, false);450num.SetCompact(0x04000000, &fNegative, &fOverflow);451BOOST_CHECK_EQUAL(num.GetHex(), "0000000000000000000000000000000000000000000000000000000000000000");452BOOST_CHECK_EQUAL(num.GetCompact(), 0U);453BOOST_CHECK_EQUAL(fNegative, false);454BOOST_CHECK_EQUAL(fOverflow, false);456num.SetCompact(0x00923456, &fNegative, &fOverflow);457BOOST_CHECK_EQUAL(num.GetHex(), "0000000000000000000000000000000000000000000000000000000000000000");458BOOST_CHECK_EQUAL(num.GetCompact(), 0U);459BOOST_CHECK_EQUAL(fNegative, false);460BOOST_CHECK_EQUAL(fOverflow, false);462num.SetCompact(0x01803456, &fNegative, &fOverflow);463BOOST_CHECK_EQUAL(num.GetHex(), "0000000000000000000000000000000000000000000000000000000000000000");464BOOST_CHECK_EQUAL(num.GetCompact(), 0U);465BOOST_CHECK_EQUAL(fNegative, false);466BOOST_CHECK_EQUAL(fOverflow, false);468num.SetCompact(0x02800056, &fNegative, &fOverflow);469BOOST_CHECK_EQUAL(num.GetHex(), "0000000000000000000000000000000000000000000000000000000000000000");470BOOST_CHECK_EQUAL(num.GetCompact(), 0U);471BOOST_CHECK_EQUAL(fNegative, false);472BOOST_CHECK_EQUAL(fOverflow, false);474num.SetCompact(0x03800000, &fNegative, &fOverflow);475BOOST_CHECK_EQUAL(num.GetHex(), "0000000000000000000000000000000000000000000000000000000000000000");476BOOST_CHECK_EQUAL(num.GetCompact(), 0U);477BOOST_CHECK_EQUAL(fNegative, false);478BOOST_CHECK_EQUAL(fOverflow, false);480num.SetCompact(0x04800000, &fNegative, &fOverflow);481BOOST_CHECK_EQUAL(num.GetHex(), "0000000000000000000000000000000000000000000000000000000000000000");482BOOST_CHECK_EQUAL(num.GetCompact(), 0U);483BOOST_CHECK_EQUAL(fNegative, false);484BOOST_CHECK_EQUAL(fOverflow, false);486num.SetCompact(0x01123456, &fNegative, &fOverflow);487BOOST_CHECK_EQUAL(num.GetHex(), "0000000000000000000000000000000000000000000000000000000000000012");488BOOST_CHECK_EQUAL(num.GetCompact(), 0x01120000U);489BOOST_CHECK_EQUAL(fNegative, false);490BOOST_CHECK_EQUAL(fOverflow, false);492// Make sure that we don't generate compacts with the 0x00800000 bit set493num = 0x80;494BOOST_CHECK_EQUAL(num.GetCompact(), 0x02008000U);496num.SetCompact(0x01fedcba, &fNegative, &fOverflow);497BOOST_CHECK_EQUAL(num.GetHex(), "000000000000000000000000000000000000000000000000000000000000007e");498BOOST_CHECK_EQUAL(num.GetCompact(true), 0x01fe0000U);499BOOST_CHECK_EQUAL(fNegative, true);500BOOST_CHECK_EQUAL(fOverflow, false);
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.