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.
501Transaction tx{hex_string_to_byte_vec("020000000248c03e66fd371c7033196ce24298628e59ebefa00363026044e0f35e0325a65d000000006a473044022004893432347f39beaa280e99da595681ddb20fc45010176897e6e055d716dbfa022040a9e46648a5d10c33ef7cee5e6cf4b56bd513eae3ae044f0039824b02d0f44c012102982331a52822fd9b62e9b5d120da1d248558fac3da3a3c51cd7d9c8ad3da760efeffffffb856678c6e4c3c84e39e2ca818807049d6fba274b42af3c6d3f9d4b6513212d2000000006a473044022068bcedc7fe39c9f21ad318df2c2da62c2dc9522a89c28c8420ff9d03d2e6bf7b0220132afd752754e5cb1ea2fd0ed6a38ec666781e34b0e93dc9a08f2457842cf5660121033aeb9c079ea3e08ea03556182ab520ce5c22e6b0cb95cee6435ee17144d860cdfeffffff0260d50b00000000001976a914363cc8d55ea8d0500de728ef6d63804ddddbdc9888ac67040f00000000001976a914c303bdc5064bf9c9a8b507b5496bd0987285707988ac6acb0700")};502TransactionInput input_0 = tx.GetInput(0);503TransactionInput input_1 = tx.GetInput(1);504CheckHandle(input_0, input_1);505CheckRange(tx.Inputs(), tx.CountInputs());506OutPoint point_0 = input_0.OutPoint();507OutPoint point_1 = input_1.OutPoint();508CheckHandle(point_0, point_1);510WitnessStackView ws_0 = input_0.GetWitnessStack();511BOOST_CHECK_EQUAL(ws_0.CountItems(), 0);512BOOST_CHECK(ws_0.Items().empty());514// P2PKH: DER sig + compressed pubkey push.515BOOST_CHECK(input_0.GetScriptSig() == hex_string_to_byte_vec("473044022004893432347f39beaa280e99da595681ddb20fc45010176897e6e055d716dbfa022040a9e46648a5d10c33ef7cee5e6cf4b56bd513eae3ae044f0039824b02d0f44c012102982331a52822fd9b62e9b5d120da1d248558fac3da3a3c51cd7d9c8ad3da760e"));516BOOST_CHECK(input_1.GetScriptSig() == hex_string_to_byte_vec("473044022068bcedc7fe39c9f21ad318df2c2da62c2dc9522a89c28c8420ff9d03d2e6bf7b0220132afd752754e5cb1ea2fd0ed6a38ec666781e34b0e93dc9a08f2457842cf5660121033aeb9c079ea3e08ea03556182ab520ce5c22e6b0cb95cee6435ee17144d860cd"));518// P2WSH input: OP_0, sig, sig, redeem_script (0, 71, 71, 105 bytes); no scriptSig.519Transaction segwit_tx{hex_string_to_byte_vec("010000000001011f97548fbbe7a0db7588a66e18d803d0089315aa7d4cc28360b6ec50ef36718a0100000000ffffffff02df1776000000000017a9146c002a686959067f4866b8fb493ad7970290ab728757d29f0000000000220020701a8d401c84fb13e6baf169d59684e17abd9fa216c8cc5b9fc63d622ff8c58d04004730440220565d170eed95ff95027a69b313758450ba84a01224e1f7f130dda46e94d13f8602207bdd20e307f062594022f12ed5017bbf4a055a06aea91c10110a0e3bb23117fc014730440220647d2dc5b15f60bc37dc42618a370b2a1490293f9e5c8464f53ec4fe1dfe067302203598773895b4b16d37485cbe21b337f4e4b650739880098c592553add7dd4355016952210375e00eb72e29da82b89367947f29ef34afb75e8654f6ea368e0acdfd92976b7c2103a1b26313f430c4b15bb1fdce663207659d8cac749a0e53d70eff01874496feff2103c96d495bfdd5ba4145e3e046fee45e84a8a48ad05bd8dbb395c011a32cf9f88053ae00000000")};520TransactionInputView segwit_input = segwit_tx.GetInput(0);521WitnessStackView ws = segwit_input.GetWitnessStack();522BOOST_CHECK_EQUAL(ws.CountItems(), 4);523BOOST_CHECK(ws.GetItem(0).empty());524BOOST_CHECK(ws.GetItem(1) == hex_string_to_byte_vec("30440220565d170eed95ff95027a69b313758450ba84a01224e1f7f130dda46e94d13f8602207bdd20e307f062594022f12ed5017bbf4a055a06aea91c10110a0e3bb23117fc01"));525BOOST_CHECK(ws.GetItem(2) == hex_string_to_byte_vec("30440220647d2dc5b15f60bc37dc42618a370b2a1490293f9e5c8464f53ec4fe1dfe067302203598773895b4b16d37485cbe21b337f4e4b650739880098c592553add7dd435501"));526BOOST_CHECK(ws.GetItem(3) == hex_string_to_byte_vec("52210375e00eb72e29da82b89367947f29ef34afb75e8654f6ea368e0acdfd92976b7c2103a1b26313f430c4b15bb1fdce663207659d8cac749a0e53d70eff01874496feff2103c96d495bfdd5ba4145e3e046fee45e84a8a48ad05bd8dbb395c011a32cf9f88053ae"));527auto items = ws.Items();528BOOST_CHECK_EQUAL(items.size(), 4);529for (size_t i = 0; i < items.size(); ++i) {530BOOST_CHECK(items[i] == ws.GetItem(i));531}532WitnessStack owned_ws_0{ws_0};533WitnessStack owned_ws{ws};534CheckHandle(owned_ws_0, owned_ws);535BOOST_CHECK(segwit_input.GetScriptSig().empty());536}538BOOST_AUTO_TEST_CASE(btck_precomputed_txdata) {539auto tx_data{hex_string_to_byte_vec("02000000013f7cebd65c27431a90bba7f796914fe8cc2ddfc3f2cbd6f7e5f2fc854534da95000000006b483045022100de1ac3bcdfb0332207c4a91f3832bd2c2915840165f876ab47c5f8996b971c3602201c6c053d750fadde599e6f5c4e1963df0f01fc0d97815e8157e3d59fe09ca30d012103699b464d1d8bc9e47d4fb1cdaa89a1c5783d68363c4dbc4b524ed3d857148617feffffff02836d3c01000000001976a914fc25d6d5c94003bf5b0c7b640a248e2c637fcfb088ac7ada8202000000001976a914fbed3d9b11183209a57999d54d59f67c019e756c88ac6acb0700")};540auto tx{Transaction{tx_data}};541auto tx_data_2{hex_string_to_byte_vec("02000000000101904f4ee5c87d20090b642f116e458cd6693292ad9ece23e72f15fb6c05b956210500000000fdffffff02e2010000000000002251200839a723933b56560487ec4d67dda58f09bae518ffa7e148313c5696ac837d9f10060000000000002251205826bcdae7abfb1c468204170eab00d887b61ab143464a4a09e1450bdc59a3340140f26e7af574e647355830772946356c27e7bbc773c5293688890f58983499581be84de40be7311a14e6d6422605df086620e75adae84ff06b75ce5894de5e994a00000000")};542auto tx2{Transaction{tx_data_2}};543auto precomputed_txdata{PrecomputedTransactionData{544/*tx_to=*/tx,545/*spent_outputs=*/{},546}};547auto precomputed_txdata_2{PrecomputedTransactionData{548/*tx_to=*/tx2,549/*spent_outputs=*/{},550}};551CheckHandle(precomputed_txdata, precomputed_txdata_2);552}554BOOST_AUTO_TEST_CASE(btck_script_verify_tests)555{556// Legacy transaction aca326a724eda9a461c10a876534ecd5ae7b27f10f26c3862fb996f80ea2d45d557auto legacy_spent_script_pubkey{ScriptPubkey{hex_string_to_byte_vec("76a9144bfbaf6afb76cc5771bc6404810d1cc041a6933988ac")}};558auto legacy_spending_tx{Transaction{hex_string_to_byte_vec("02000000013f7cebd65c27431a90bba7f796914fe8cc2ddfc3f2cbd6f7e5f2fc854534da95000000006b483045022100de1ac3bcdfb0332207c4a91f3832bd2c2915840165f876ab47c5f8996b971c3602201c6c053d750fadde599e6f5c4e1963df0f01fc0d97815e8157e3d59fe09ca30d012103699b464d1d8bc9e47d4fb1cdaa89a1c5783d68363c4dbc4b524ed3d857148617feffffff02836d3c01000000001976a914fc25d6d5c94003bf5b0c7b640a248e2c637fcfb088ac7ada8202000000001976a914fbed3d9b11183209a57999d54d59f67c019e756c88ac6acb0700")}};559run_verify_test(560/*spent_script_pubkey=*/legacy_spent_script_pubkey,561/*spending_tx=*/legacy_spending_tx,562/*precomputed_txdata=*/nullptr,563/*amount=*/0,564/*input_index=*/0,565/*taproot=*/false);567// Legacy transaction aca326a724eda9a461c10a876534ecd5ae7b27f10f26c3862fb996f80ea2d45d with precomputed_txdata568auto legacy_precomputed_txdata{PrecomputedTransactionData{569/*tx_to=*/legacy_spending_tx,570/*spent_outputs=*/{},571}};572run_verify_test(573/*spent_script_pubkey=*/legacy_spent_script_pubkey,574/*spending_tx=*/legacy_spending_tx,575/*precomputed_txdata=*/&legacy_precomputed_txdata,576/*amount=*/0,577/*input_index=*/0,578/*taproot=*/false);580// Segwit transaction 1a3e89644985fbbb41e0dcfe176739813542b5937003c46a07de1e3ee7a4a7f3581auto segwit_spent_script_pubkey{ScriptPubkey{hex_string_to_byte_vec("0020701a8d401c84fb13e6baf169d59684e17abd9fa216c8cc5b9fc63d622ff8c58d")}};582auto segwit_spending_tx{Transaction{hex_string_to_byte_vec("010000000001011f97548fbbe7a0db7588a66e18d803d0089315aa7d4cc28360b6ec50ef36718a0100000000ffffffff02df1776000000000017a9146c002a686959067f4866b8fb493ad7970290ab728757d29f0000000000220020701a8d401c84fb13e6baf169d59684e17abd9fa216c8cc5b9fc63d622ff8c58d04004730440220565d170eed95ff95027a69b313758450ba84a01224e1f7f130dda46e94d13f8602207bdd20e307f062594022f12ed5017bbf4a055a06aea91c10110a0e3bb23117fc014730440220647d2dc5b15f60bc37dc42618a370b2a1490293f9e5c8464f53ec4fe1dfe067302203598773895b4b16d37485cbe21b337f4e4b650739880098c592553add7dd4355016952210375e00eb72e29da82b89367947f29ef34afb75e8654f6ea368e0acdfd92976b7c2103a1b26313f430c4b15bb1fdce663207659d8cac749a0e53d70eff01874496feff2103c96d495bfdd5ba4145e3e046fee45e84a8a48ad05bd8dbb395c011a32cf9f88053ae00000000")}};583run_verify_test(584/*spent_script_pubkey=*/segwit_spent_script_pubkey,585/*spending_tx=*/segwit_spending_tx,586/*precomputed_txdata=*/nullptr,587/*amount=*/18393430,588/*input_index=*/0,589/*taproot=*/false);591// Segwit transaction 1a3e89644985fbbb41e0dcfe176739813542b5937003c46a07de1e3ee7a4a7f3 with precomputed_txdata592auto segwit_precomputed_txdata{PrecomputedTransactionData{593/*tx_to=*/segwit_spending_tx,594/*spent_outputs=*/{},595}};596run_verify_test(597/*spent_script_pubkey=*/segwit_spent_script_pubkey,598/*spending_tx=*/segwit_spending_tx,599/*precomputed_txdata=*/&segwit_precomputed_txdata,600/*amount=*/18393430,601/*input_index=*/0,602/*taproot=*/false);604// Taproot transaction 33e794d097969002ee05d336686fc03c9e15a597c1b9827669460fac98799036605auto taproot_spent_script_pubkey{ScriptPubkey{hex_string_to_byte_vec("5120339ce7e165e67d93adb3fef88a6d4beed33f01fa876f05a225242b82a631abc0")}};606auto taproot_spending_tx{Transaction{hex_string_to_byte_vec("01000000000101d1f1c1f8cdf6759167b90f52c9ad358a369f95284e841d7a2536cef31c0549580100000000fdffffff020000000000000000316a2f49206c696b65205363686e6f7272207369677320616e6420492063616e6e6f74206c69652e204062697462756734329e06010000000000225120a37c3903c8d0db6512e2b40b0dffa05e5a3ab73603ce8c9c4b7771e5412328f90140a60c383f71bac0ec919b1d7dbc3eb72dd56e7aa99583615564f9f99b8ae4e837b758773a5b2e4c51348854c8389f008e05029db7f464a5ff2e01d5e6e626174affd30a00")}};607std::vector<TransactionOutput> taproot_spent_outputs;608taproot_spent_outputs.emplace_back(taproot_spent_script_pubkey, 88480);609auto taproot_precomputed_txdata{PrecomputedTransactionData{610/*tx_to=*/taproot_spending_tx,611/*spent_outputs=*/taproot_spent_outputs,612}};613run_verify_test(614/*spent_script_pubkey=*/taproot_spent_script_pubkey,615/*spending_tx=*/taproot_spending_tx,616/*precomputed_txdata=*/&taproot_precomputed_txdata,617/*amount=*/88480,618/*input_index=*/0,619/*taproot=*/true);621// Two-input taproot transaction e8e8320f40c31ed511570e9cdf1d241f8ec9a5cc392e6105240ac8dbea2098de622auto taproot2_spent_script_pubkey0{ScriptPubkey{hex_string_to_byte_vec("5120b7da80f57e36930b0515eb09293e25858d13e6b91fee6184943f5a584cb4248e")}};623auto taproot2_spent_script_pubkey1{ScriptPubkey{hex_string_to_byte_vec("5120ab78e077d062e7b8acd7063668b4db5355a1b5d5fd2a46a8e98e62e5e63fab77")}};624auto taproot2_spending_tx{Transaction{hex_string_to_byte_vec("02000000000102c0f01ead18750892c84b1d4f595149ad38f16847df1fbf490e235b3b78c1f98a0100000000ffffffff456764a19c2682bf5b1567119f06a421849ad1664cf42b5ef95b69d6e2159e9d0000000000ffffffff022202000000000000225120b6c0c2a8ee25a2ae0322ab7f1a06f01746f81f6b90d179c3c2a51a356e6188f1d70e020000000000225120b7da80f57e36930b0515eb09293e25858d13e6b91fee6184943f5a584cb4248e0141933fdc49eb1af1f08ed1e9cf5559259309a8acd25ff1e6999b6955124438aef4fceaa4e6a5f85286631e24837329563595bc3cf4b31e1c687442abb01c4206818101401c9620faf1e8c84187762ad14d04ae3857f59a2f03f1dcbb99290e16dfc572a63b4ea435780a5787af59beb5742fd71cda8a95381517a1ff14b4c67996c4bf8100000000")}};625std::vector<TransactionOutput> taproot2_spent_outputs;626taproot2_spent_outputs.emplace_back(taproot2_spent_script_pubkey0, 546);627taproot2_spent_outputs.emplace_back(taproot2_spent_script_pubkey1, 135125);628auto taproot2_precomputed_txdata{PrecomputedTransactionData{629/*tx_to=*/taproot2_spending_tx,630/*spent_outputs=*/taproot2_spent_outputs,631}};632run_verify_test(633/*spent_script_pubkey=*/taproot2_spent_script_pubkey0,634/*spending_tx=*/taproot2_spending_tx,635/*precomputed_txdata=*/&taproot2_precomputed_txdata,636/*amount=*/546,637/*input_index=*/0,638/*taproot=*/true);639run_verify_test(640/*spent_script_pubkey=*/taproot2_spent_script_pubkey1,641/*spending_tx=*/taproot2_spending_tx,642/*precomputed_txdata=*/&taproot2_precomputed_txdata,643/*amount=*/135125,644/*input_index=*/1,645/*taproot=*/true);646}648BOOST_AUTO_TEST_CASE(logging_tests)649{650btck_LoggingOptions logging_options = {651.log_timestamps = true,652.log_time_micros = true,653.log_threadnames = false,654.log_sourcelocations = false,655.always_print_category_levels = true,656};658logging_set_options(logging_options);659logging_set_level_category(LogCategory::BENCH, LogLevel::TRACE_LEVEL);660logging_disable_category(LogCategory::BENCH);661logging_enable_category(LogCategory::VALIDATION);662logging_disable_category(LogCategory::VALIDATION);664// Check that connecting, connecting another, and then disconnecting and connecting a logger again works.665{666logging_set_level_category(LogCategory::KERNEL, LogLevel::TRACE_LEVEL);667logging_enable_category(LogCategory::KERNEL);668Logger logger{std::make_unique<TestLog>()};669Logger logger_2{std::make_unique<TestLog>()};670}671Logger logger{std::make_unique<TestLog>()};672}674BOOST_AUTO_TEST_CASE(btck_chainparams_tests)675{676ChainParams params_signet{ChainType::SIGNET};677ChainParams params_signet_challenge{hex_string_to_byte_vec("51")};678CheckHandle(params_signet, params_signet_challenge);679}681BOOST_AUTO_TEST_CASE(btck_context_tests)682{683{ // test default context684Context context{};685Context context2{};686CheckHandle(context, context2);687}689{ // test with context options, but not options set690ContextOptions options{};691Context context{options};692}694{ // test with context options695ContextOptions options{};696ChainParams params{ChainType::MAINNET};697ChainParams regtest_params{ChainType::REGTEST};698CheckHandle(params, regtest_params);699options.SetChainParams(params);700options.SetNotifications(std::make_shared<TestKernelNotifications>());701Context context{options};702}703}705BOOST_AUTO_TEST_CASE(btck_block_header_tests)706{707// Block header format: version(4) + prev_hash(32) + merkle_root(32) + timestamp(4) + bits(4) + nonce(4) = 80 bytes708BlockHeader header_0{hex_string_to_byte_vec("00e07a26beaaeee2e71d7eb19279545edbaf15de0999983626ec00000000000000000000579cf78b65229bfb93f4a11463af2eaa5ad91780f27f5d147a423bea5f7e4cdf2a47e268b4dd01173a9662ee")};709BOOST_CHECK_EQUAL(byte_span_to_hex_string_reversed(header_0.Hash().ToBytes()), "00000000000000000000325c7e14a4ee3b4fcb2343089a839287308a0ddbee4f");710BlockHeader header_1{hex_string_to_byte_vec("00c00020e7cb7b4de21d26d55bd384017b8bb9333ac3b2b55bed00000000000000000000d91b4484f801b99f03d36b9d26cfa83420b67f81da12d7e6c1e7f364e743c5ba9946e268b4dd011799c8533d")};711CheckHandle(header_0, header_1);713// Test all header field accessors using mainnet block 1714auto mainnet_block_1_header = hex_string_to_byte_vec("010000006fe28c0ab6f1b372c1a6a246ae63f74f931e8365e15a089c68d6190000000000982051fd1e4ba744bbbe680e1fee14677ba1a3c3540bf7b1cdb606e857233e0e61bc6649ffff001d01e36299");715BlockHeader header{mainnet_block_1_header};716BOOST_CHECK_EQUAL(header.Version(), 1);717BOOST_CHECK_EQUAL(header.Timestamp(), 1231469665);718BOOST_CHECK_EQUAL(header.Bits(), 0x1d00ffff);719BOOST_CHECK_EQUAL(header.Nonce(), 2573394689);720BOOST_CHECK_EQUAL(byte_span_to_hex_string_reversed(header.Hash().ToBytes()), "00000000839a8e6886ab5951d76f411475428afc90947ee320161bbf18eb6048");721auto prev_hash = header.PrevHash();722BOOST_CHECK_EQUAL(byte_span_to_hex_string_reversed(prev_hash.ToBytes()), "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f");724// Test round-trip serialization of block header725auto header_roundtrip{BlockHeader{header.ToBytes()}};726check_equal(header_roundtrip.ToBytes(), mainnet_block_1_header);728auto raw_block = hex_string_to_byte_vec("010000006fe28c0ab6f1b372c1a6a246ae63f74f931e8365e15a089c68d6190000000000982051fd1e4ba744bbbe680e1fee14677ba1a3c3540bf7b1cdb606e857233e0e61bc6649ffff001d01e362990101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0704ffff001d0104ffffffff0100f2052a0100000043410496b538e853519c726a2c91e61ec11600ae1390813a627c66fb8be7947be63c52da7589379515d4e0a604f8141781e62294721166bf621e73a82cbf2342c858eeac00000000");729Block block{raw_block};730BlockHeader block_header{block.GetHeader()};731BOOST_CHECK_EQUAL(block_header.Version(), 1);732BOOST_CHECK_EQUAL(block_header.Timestamp(), 1231469665);733BOOST_CHECK_EQUAL(block_header.Bits(), 0x1d00ffff);734BOOST_CHECK_EQUAL(block_header.Nonce(), 2573394689);735BOOST_CHECK_EQUAL(byte_span_to_hex_string_reversed(block_header.Hash().ToBytes()), "00000000839a8e6886ab5951d76f411475428afc90947ee320161bbf18eb6048");737// Verify header from block serializes to first 80 bytes of raw block738auto block_header_bytes = block_header.ToBytes();739BOOST_CHECK_EQUAL(block_header_bytes.size(), 80);740check_equal(block_header_bytes, std::span<const std::byte>(raw_block.data(), 80));741}743BOOST_AUTO_TEST_CASE(btck_block)744{745Block block{hex_string_to_byte_vec(REGTEST_BLOCK_DATA[0])};746Block block_100{hex_string_to_byte_vec(REGTEST_BLOCK_DATA[100])};747CheckHandle(block, block_100);748Block block_tx{hex_string_to_byte_vec(REGTEST_BLOCK_DATA[205])};749CheckRange(block_tx.Transactions(), block_tx.CountTransactions());750auto transactions{block_tx.Transactions()};
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.