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.
1252// Sighash1253if (input.sighash_type != std::nullopt) {1254in.pushKV("sighash", SighashToStr(*input.sighash_type));1255}1257// Redeem script and witness script1258if (!input.redeem_script.empty()) {1259UniValue r(UniValue::VOBJ);1260ScriptToUniv(input.redeem_script, /*out=*/r);1261in.pushKV("redeem_script", std::move(r));1262}1263if (!input.witness_script.empty()) {1264UniValue r(UniValue::VOBJ);1265ScriptToUniv(input.witness_script, /*out=*/r);1266in.pushKV("witness_script", std::move(r));1267}1269// keypaths1270if (!input.hd_keypaths.empty()) {1271UniValue keypaths(UniValue::VARR);1272for (auto entry : input.hd_keypaths) {1273UniValue keypath(UniValue::VOBJ);1274keypath.pushKV("pubkey", HexStr(entry.first));1276keypath.pushKV("master_fingerprint", strprintf("%08x", ReadBE32(entry.second.fingerprint.data())));1277keypath.pushKV("path", WriteHDKeypath(entry.second.path));1278keypaths.push_back(std::move(keypath));1279}1280in.pushKV("bip32_derivs", std::move(keypaths));1281}1283// Final scriptSig and scriptwitness1284if (!input.final_script_sig.empty()) {1285UniValue scriptsig(UniValue::VOBJ);1286scriptsig.pushKV("asm", ScriptToAsmStr(input.final_script_sig, true));1287scriptsig.pushKV("hex", HexStr(input.final_script_sig));1288in.pushKV("final_scriptSig", std::move(scriptsig));1289}1290if (!input.final_script_witness.IsNull()) {1291UniValue txinwitness(UniValue::VARR);1292for (const auto& item : input.final_script_witness.stack) {1293txinwitness.push_back(HexStr(item));1294}1295in.pushKV("final_scriptwitness", std::move(txinwitness));1296}1298// Ripemd160 hash preimages1299if (!input.ripemd160_preimages.empty()) {1300UniValue ripemd160_preimages(UniValue::VOBJ);1301for (const auto& [hash, preimage] : input.ripemd160_preimages) {1302ripemd160_preimages.pushKVEnd(HexStr(hash), HexStr(preimage));1303}1304in.pushKV("ripemd160_preimages", std::move(ripemd160_preimages));1305}1307// Sha256 hash preimages1308if (!input.sha256_preimages.empty()) {1309UniValue sha256_preimages(UniValue::VOBJ);1310for (const auto& [hash, preimage] : input.sha256_preimages) {1311sha256_preimages.pushKVEnd(HexStr(hash), HexStr(preimage));1312}1313in.pushKV("sha256_preimages", std::move(sha256_preimages));1314}1316// Hash160 hash preimages1317if (!input.hash160_preimages.empty()) {1318UniValue hash160_preimages(UniValue::VOBJ);1319for (const auto& [hash, preimage] : input.hash160_preimages) {1320hash160_preimages.pushKVEnd(HexStr(hash), HexStr(preimage));1321}1322in.pushKV("hash160_preimages", std::move(hash160_preimages));1323}1325// Hash256 hash preimages1326if (!input.hash256_preimages.empty()) {1327UniValue hash256_preimages(UniValue::VOBJ);1328for (const auto& [hash, preimage] : input.hash256_preimages) {1329hash256_preimages.pushKVEnd(HexStr(hash), HexStr(preimage));1330}1331in.pushKV("hash256_preimages", std::move(hash256_preimages));1332}1334// PSBTv21335if (psbtx.GetVersion() >= 2) {1336in.pushKV("previous_txid", input.prev_txid.GetHex());1337in.pushKV("previous_vout", static_cast<uint64_t>(input.prev_out));1338if (input.sequence.has_value()) {1339in.pushKV("sequence", static_cast<uint64_t>(*input.sequence));1340}1341if (input.time_locktime.has_value()) {1342in.pushKV("time_locktime", static_cast<uint64_t>(*input.time_locktime));1343}1344if (input.height_locktime.has_value()) {1345in.pushKV("height_locktime", static_cast<uint64_t>(*input.height_locktime));1346}1347}1349// Taproot key path signature1350if (!input.m_tap_key_sig.empty()) {1351in.pushKV("taproot_key_path_sig", HexStr(input.m_tap_key_sig));1352}1354// Taproot script path signatures1355if (!input.m_tap_script_sigs.empty()) {1356UniValue script_sigs(UniValue::VARR);1357for (const auto& [pubkey_leaf, sig] : input.m_tap_script_sigs) {1358const auto& [xonly, leaf_hash] = pubkey_leaf;1359UniValue sigobj(UniValue::VOBJ);1360sigobj.pushKV("pubkey", HexStr(xonly));1361sigobj.pushKV("leaf_hash", HexStr(leaf_hash));1362sigobj.pushKV("sig", HexStr(sig));1363script_sigs.push_back(std::move(sigobj));1364}1365in.pushKV("taproot_script_path_sigs", std::move(script_sigs));1366}1368// Taproot leaf scripts1369if (!input.m_tap_scripts.empty()) {1370UniValue tap_scripts(UniValue::VARR);1371for (const auto& [leaf, control_blocks] : input.m_tap_scripts) {1372const auto& [script, leaf_ver] = leaf;1373UniValue script_info(UniValue::VOBJ);1374script_info.pushKV("script", HexStr(script));1375script_info.pushKV("leaf_ver", leaf_ver);1376UniValue control_blocks_univ(UniValue::VARR);1377for (const auto& control_block : control_blocks) {1378control_blocks_univ.push_back(HexStr(control_block));1379}1380script_info.pushKV("control_blocks", std::move(control_blocks_univ));1381tap_scripts.push_back(std::move(script_info));1382}1383in.pushKV("taproot_scripts", std::move(tap_scripts));1384}1386// Taproot bip32 keypaths1387if (!input.m_tap_bip32_paths.empty()) {1388UniValue keypaths(UniValue::VARR);1389for (const auto& [xonly, leaf_origin] : input.m_tap_bip32_paths) {1390const auto& [leaf_hashes, origin] = leaf_origin;1391UniValue path_obj(UniValue::VOBJ);1392path_obj.pushKV("pubkey", HexStr(xonly));1393path_obj.pushKV("master_fingerprint", strprintf("%08x", ReadBE32(origin.fingerprint.data())));1394path_obj.pushKV("path", WriteHDKeypath(origin.path));1395UniValue leaf_hashes_arr(UniValue::VARR);1396for (const auto& leaf_hash : leaf_hashes) {1397leaf_hashes_arr.push_back(HexStr(leaf_hash));1398}1399path_obj.pushKV("leaf_hashes", std::move(leaf_hashes_arr));1400keypaths.push_back(std::move(path_obj));1401}1402in.pushKV("taproot_bip32_derivs", std::move(keypaths));1403}1405// Taproot internal key1406if (!input.m_tap_internal_key.IsNull()) {1407in.pushKV("taproot_internal_key", HexStr(input.m_tap_internal_key));1408}1410// Write taproot merkle root1411if (!input.m_tap_merkle_root.IsNull()) {1412in.pushKV("taproot_merkle_root", HexStr(input.m_tap_merkle_root));1413}1415// Write MuSig2 fields1416if (!input.m_musig2_participants.empty()) {1417UniValue musig_pubkeys(UniValue::VARR);1418for (const auto& [agg, parts] : input.m_musig2_participants) {1419UniValue musig_part(UniValue::VOBJ);1420musig_part.pushKV("aggregate_pubkey", HexStr(agg));1421UniValue part_pubkeys(UniValue::VARR);1422for (const auto& pub : parts) {1423part_pubkeys.push_back(HexStr(pub));1424}1425musig_part.pushKV("participant_pubkeys", part_pubkeys);1426musig_pubkeys.push_back(musig_part);1427}1428in.pushKV("musig2_participant_pubkeys", musig_pubkeys);1429}1430if (!input.m_musig2_pubnonces.empty()) {1431UniValue musig_pubnonces(UniValue::VARR);1432for (const auto& [agg_lh, part_pubnonce] : input.m_musig2_pubnonces) {1433const auto& [agg, lh] = agg_lh;1434for (const auto& [part, pubnonce] : part_pubnonce) {1435UniValue info(UniValue::VOBJ);1436info.pushKV("participant_pubkey", HexStr(part));1437info.pushKV("aggregate_pubkey", HexStr(agg));1438if (!lh.IsNull()) info.pushKV("leaf_hash", HexStr(lh));1439info.pushKV("pubnonce", HexStr(pubnonce));1440musig_pubnonces.push_back(info);1441}1442}1443in.pushKV("musig2_pubnonces", musig_pubnonces);1444}1445if (!input.m_musig2_partial_sigs.empty()) {1446UniValue musig_partial_sigs(UniValue::VARR);1447for (const auto& [agg_lh, part_psig] : input.m_musig2_partial_sigs) {1448const auto& [agg, lh] = agg_lh;1449for (const auto& [part, psig] : part_psig) {1450UniValue info(UniValue::VOBJ);1451info.pushKV("participant_pubkey", HexStr(part));1452info.pushKV("aggregate_pubkey", HexStr(agg));1453if (!lh.IsNull()) info.pushKV("leaf_hash", HexStr(lh));1454info.pushKV("partial_sig", HexStr(psig));1455musig_partial_sigs.push_back(info);1456}1457}1458in.pushKV("musig2_partial_sigs", musig_partial_sigs);1459}1461// Proprietary1462if (!input.m_proprietary.empty()) {1463UniValue proprietary(UniValue::VARR);1464for (const auto& entry : input.m_proprietary) {1465UniValue this_prop(UniValue::VOBJ);1466this_prop.pushKV("identifier", HexStr(entry.identifier));1467this_prop.pushKV("subtype", entry.subtype);1468this_prop.pushKV("key", HexStr(entry.key));1469this_prop.pushKV("value", HexStr(entry.value));1470proprietary.push_back(std::move(this_prop));1471}1472in.pushKV("proprietary", std::move(proprietary));1473}1475// Unknown data1476if (input.unknown.size() > 0) {1477UniValue unknowns(UniValue::VOBJ);1478for (auto [key, value] : input.unknown) {1479unknowns.pushKVEnd(HexStr(key), HexStr(value));1480}1481in.pushKV("unknown", std::move(unknowns));1482}1484inputs.push_back(std::move(in));1485}1486result.pushKV("inputs", std::move(inputs));1488// outputs1489CAmount output_value = 0;1490UniValue outputs(UniValue::VARR);1491for (unsigned int i = 0; i < psbtx.outputs.size(); ++i) {1492const PSBTOutput& output = psbtx.outputs[i];1493UniValue out(UniValue::VOBJ);1494// Redeem script and witness script1495if (!output.redeem_script.empty()) {1496UniValue r(UniValue::VOBJ);1497ScriptToUniv(output.redeem_script, /*out=*/r);1498out.pushKV("redeem_script", std::move(r));1499}1500if (!output.witness_script.empty()) {