Commit graph

4274 commits

Author SHA1 Message Date
yyforyongyu
a5a57b901f
x - demo consensus bug 2026-04-27 08:59:07 +08:00
yyforyongyu
de90fba3dc
txscript: refactor script handling 2026-04-27 08:59:07 +08:00
yyforyongyu
0d31f67963
txscript: align unknown witness version handling with Core
The refreshed Bitcoin Core tx_valid reference tests expect newer
witness versions to short-circuit successfully when
DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM is unset.
2026-04-27 08:45:50 +08:00
yyforyongyu
0fc16396bf
txscript: align empty CHECKSIG pubkey validation with Core
The refreshed Bitcoin Core script reference tests cover cases where an
empty CHECKSIG input must still fail pubkey encoding checks before the
interpreter falls back to a generic false result.
2026-04-27 08:45:50 +08:00
yyforyongyu
818c841ce0
txscript: return ErrCleanStack for witness cleanstack failures
The refreshed Bitcoin Core script reference tests expect witness
clean-stack failures to report CLEANSTACK rather than a generic
EVAL_FALSE result.
2026-04-27 08:45:50 +08:00
yyforyongyu
f837d37265
txscript: update tx_invalid.json from Bitcoin Core
Updated from Bitcoin Core master
(e32bc7f817e7adeffef22a985bf8dbd4aa3e08d8), file
src/test/data/tx_invalid.json.
2026-04-27 08:45:50 +08:00
yyforyongyu
e20edd39ae
txscript: update tx_valid.json from Bitcoin Core
Updated from Bitcoin Core master
(e32bc7f817e7adeffef22a985bf8dbd4aa3e08d8), file
src/test/data/tx_valid.json.
2026-04-27 08:45:50 +08:00
yyforyongyu
a49fdf17a4
txscript: update script_tests.json from Bitcoin Core
Updated from Bitcoin Core master
(e32bc7f817e7adeffef22a985bf8dbd4aa3e08d8), file
src/test/data/script_tests.json.
2026-04-27 08:45:50 +08:00
yyforyongyu
b1aa5a9121
txscript: support latest Core tx_invalid semantics
Handle BADTX sanity cases while keeping tx_invalid on Bitcoin Core's
included-flags convention.
2026-04-27 08:45:50 +08:00
yyforyongyu
897d5e33b6
txscript: support latest Core tx_valid semantics
Bitcoin Core's tx_valid vectors now specify flags to exclude from the
full script-flag set. Apply that parser directly in TestTxValidTests.
2026-04-27 08:45:49 +08:00
yyforyongyu
f4e1c1b253
txscript: support latest Core script_tests format
Add support for newly named Bitcoin Core script-test result tokens and
skip taproot placeholder rows that are already covered by
TestTaprootReferenceTests.
2026-04-27 08:45:49 +08:00
Olaoluwa Osuntokun
51e9b53c78
Merge pull request #2518 from kcalvinalvin/2026-04-06-use-maxprotocol-message-len-on-msg-reject
wire: use maxprotocol message len on msg reject
2026-04-08 16:49:44 -07:00
Olaoluwa Osuntokun
b047478a26
Merge pull request #2504 from erickcestari/fix-max-message-payload
wire: separate protocol message limit from serialization bound
2026-04-08 16:49:25 -07:00
Calvin Kim
28fd6a7fd7 wire: use MaxProtocolMessageLength as a max size for MsgReject
As we introduced a new MaxProtocolMessageLength, MsgReject max size
should also be lowered to MaxProtocolMessageLength.

If this isn't lowered and if we ever have a MsgReject message that is
bigger than MaxProtocolMessageLength, then the MaxPayloadLength() check
on the message will pass but it won't serialize in functions
WriteMessageWithEncodingN() and WriteV2MessageN() as both of these
functions have a separate check that each message isn't greater than
MaxProtocolMessageLength.
2026-04-06 15:36:11 +09:00
Olaoluwa Osuntokun
dd78e09276
Merge pull request #2515 from kcalvinalvin/2026-03-30-no-wrap-ipv4-in-ipv6
wire: don't wrap ipv4 in ipv6 addresses
2026-03-31 16:18:16 -07:00
Yong
14e32c216d
Merge pull request #2488 from Abdulkbk/btcwallet-regtest
main: add regtest port for btcwallet
2026-03-31 20:45:49 +08:00
Abdullahi Yunus
2c19db8a4d
main: add regtest port for btcwallet
Since btcwallet now supports regtest, we add the default port
`18332`. Now `--wallet` command works on regtest.
2026-03-30 10:40:37 +01:00
Calvin Kim
077c9b7c6f wire: fix IPv4-mapped IPv6 addresses using wrong networkID in addrv2
Go's net.ParseIP stores IPv4 addresses as 16-byte IPv4-mapped IPv6
addresses (::ffff:x.x.x.x). NetAddressV2FromBytes dispatches on
address length, so these 16-byte addresses were incorrectly matched
as IPv6 and serialized with networkID 0x02 (IPv6) instead of 0x01
(IPv4). BIP-155 doesn't forbid this, but Bitcoin Core silently drops
them anyway (undocumented, naturally). Detect IPv4-mapped IPv6
addresses and extract the 4-byte IPv4 address with the correct
networkID.
2026-03-30 17:12:49 +09:00
Calvin Kim
1031309a22 wire: add test for IPv4-mapped IPv6 address in NetAddressV2FromBytes
Add a test case that passes a 16-byte IPv4-mapped IPv6 address
(::ffff:127.0.0.1) to NetAddressV2FromBytes and asserts that it
is recognized as IPv4 with networkID 0x01, not IPv6 with 0x02.
2026-03-30 17:12:44 +09:00
Olaoluwa Osuntokun
c47cb8aae0
Merge pull request #2425 from kcalvinalvin/2025-09-20-add-treapnode-pool
treap, ffldb: add treapNodePool
2026-03-25 16:28:22 -07:00
Olaoluwa Osuntokun
6b04a0b494
Merge pull request #2487 from Abdulkbk/allow-ip-regtest
netsync: allow sync with non localhost peers
2026-03-24 20:46:50 -04:00
Erick Cestari
5e96c5b30b
wire: separate protocol message limit from serialization bound
Revert MaxMessagePayload to 32MB and introduce MaxProtocolMessageLength
(~4MB) for p2p network message size enforcement. This mirrors Bitcoin
Core's separation between MAX_SIZE (32MB serialization bound) and
MAX_PROTOCOL_MESSAGE_LENGTH (~4MB network limit) introduced in
bitcoin/bitcoin#5843.

The previous commit reduced MaxMessagePayload to 4MB, but that constant
is also used as a serialization bound for deriving maxTxInPerMessage,
maxTxOutPerMessage, and variable-length string limits in contexts beyond
network messages (e.g. database deserialization via MsgTx.Deserialize).
While consensus limits keep real values well below the 4MB-derived
bounds, conflating the two constants is architecturally incorrect and
diverges from Bitcoin Core's design.

The new MaxProtocolMessageLength is now enforced in all four network
read/write paths: WriteMessageN, WriteMessageWithEncodingN,
ReadMessageWithEncodingN, and ReadV2MessageN (which previously had no
overall message size check).
2026-03-24 09:26:45 -03:00
Olaoluwa Osuntokun
7f47da83bb netsync: add TestIsSyncCandidateRegtest
Add a test verifying that isSyncCandidate accepts peers from any
address on regtest, including Docker bridge IPs, remote IPs, and IPv6.
2026-03-23 21:13:59 -04:00
Abdullahi Yunus
26124d2754 netsync: allow sync with non-localhost peers on regtest/simnet
In this commit, we remove the localhost-only restriction for sync peer
candidates on regtest and simnet. Previously, isSyncCandidate rejected
any regtest peer not on 127.0.0.1 or localhost, which prevented IBD
when nodes run in Docker containers on bridge networks (e.g. 172.18.0.x).

We also replace fragile pointer-equality checks against global chaincfg
params with value-based Name field comparisons, and extend the exception
to simnet since it has the same local-only usage pattern.
2026-03-23 21:13:48 -04:00
Olaoluwa Osuntokun
b950e5b1af
Merge pull request #2477 from erickcestari/fix-doc-nonce-generation-schnorr
btcec/schnorr: fix incorrect comment about nonce generation
2026-03-23 21:04:52 -04:00
Olaoluwa Osuntokun
c70d6b9026
Merge pull request #2474 from EricGrill/fix/ipv6-zero-address-routable
addrmgr: mark IPv6 zero addresses as non-routable
2026-03-23 20:58:50 -04:00
Eric Grill
4a4e2d2495 addrmgr: fix IsRoutable for IPv6 addresses starting with 0
In this commit, we fix `IsRoutable` to correctly reject IPv6 addresses
whose first 16-bit group is zero (i.e., in the `0000::/16` reserved
block per RFC 4291). Differential fuzzing between btcd and Bitcoin Core
revealed that addresses like `0:9881:8181:8181:fe00🅰️9e:9801` were
slipping through as routable when they shouldn't be.

We add a new `zero6Net` (`0000::/16`) definition alongside the existing
`zero4Net`, and introduce an `IsZero` helper that checks both. The /16
prefix width is intentional: the broader /8 reservation would
incorrectly catch allocated sub-ranges like `0064:ff9b::/96` (RFC 6052,
NAT64). We also carve out an exception for RFC 6145 translated IPv4
addresses (`::ffff:0:0:0/96`), which live within `0000::/16` but are
valid for routing.

Test coverage includes the original bug report address, various
zero-prefix IPv6 addresses, the RFC 6145 exclusion, and corresponding
`GroupKey` entries to confirm they land in the "unroutable" bucket.

Fixes #2431
2026-03-23 20:46:11 -04:00
Olaoluwa Osuntokun
50f056f3c2
Merge pull request #2428 from kcalvinalvin/2025-09-16-new-parallel-block-downloads
blockchain, netsync: implement a complete headers-first download during ibd
2026-03-23 20:31:17 -04:00
Olaoluwa Osuntokun
1c55c7c181
Merge pull request #2493 from erickcestari/use-text-template
txscript: switch template engine from html/template to text/template
2026-03-10 11:36:10 -05:00
Erick Cestari
d36b9ded6d
txscript: switch template engine from html/template to text/template
html/template automatically HTML-escapes special characters to prevent
XSS, which can silently corrupt arbitrary script data. Since the output
is binary script bytes and not HTML, this escaping provides no benefit
and might breaks correctness.
2026-03-10 10:38:49 -03:00
Olaoluwa Osuntokun
cac334b6aa
Merge pull request #2479 from erickcestari/fix-addrv2-address-validation
Fix addrv2 address validation
2026-03-09 19:17:27 -05:00
Erick Cestari
45135e677d
peer: add panic recovery to message handling goroutines
Add a recoverFromPanic method that catches panics in peer goroutines,
logs the error with a stack trace, and disconnects the offending peer
instead of crashing the entire node. This provides defense-in-depth
against future unknown panics in message parsing or handling.

Protect two goroutine boundaries:
- The negotiation goroutine in start(), which handles pre-handshake
  message decoding via BtcDecode.
- The inHandler goroutine, which processes all post-handshake messages.

Refactor inHandler cleanup from manual end-of-function calls to
defer-based cleanup, ensuring close(p.inQuit) always runs even on
panic, which prevents stallHandler from hanging.
2026-03-09 09:49:49 -03:00
Erick Cestari
2037864821
wire: Reduce MaxMessagePayload to 4MB
To align with Bitcoin Core, reduce the maximum message payload size from
32MB to 4MB.
2026-03-06 09:55:34 -03:00
Erick Cestari
3bf00861fc
wire: bound witness read to remaining slab
Add a bounds check against the remaining slab capacity so oversized
witness items return a decode error. Add a regression test for witness
items that overflow the decode slab.
2026-03-06 09:55:34 -03:00
Erick Cestari
40eea632ed
wire: skip IPv4-mapped IPv6 addresses in addrv2 messages
This issue was discovered through differential fuzzing between btcd and
Bitcoin Core.

IPv4-mapped IPv6 addresses (::ffff:0:0/96, RFC 4291) sent with networkID
0x02 (IPv6) in addrv2 messages are now properly rejected. Per BIP155,
these addresses should use networkID 0x01 (IPv4) instead. This aligns
btcd's behavior with Bitcoin Core's addrv2 handling.

Changes:
- Add ipv4MappedPrefix constant for the ::ffff:0:0/96 prefix
- Add isIPv4Mapped() helper function to detect these addresses
- Update readNetAddressV2() to skip IPv4-mapped addresses with IPv6 networkID
- Add comprehensive test coverage for IPv4-mapped address detection
2026-03-06 09:55:33 -03:00
Erick Cestari
52e7b26a11
addrmgr: treat RFC7343 (ORCHIDv2) addresses as unroutable
This issue was discovered through differential fuzzing between btcd and
Bitcoin Core.

Add detection and filtering of IPv6 ORCHIDv2 addresses as defined by
RFC7343 (2001:20::/28). These addresses are overlay routable
cryptographic hash identifiers and should not be treated as routable
peer addresses, consistent with Bitcoin Core's behavior.

Changes:
- Add rfc7343Net variable for the 2001:20::/28 address block
- Add IsRFC7343() function to detect ORCHIDv2 addresses
- Update IsRoutable() to exclude RFC7343 addresses
- Add comprehensive test coverage for RFC7343 detection
- Fix incorrect error message in TestIPTypes (IsRFC1918 -> IsRFC6145)
2026-03-06 09:55:31 -03:00
Calvin Kim
2aae8a6d68 netsync: add TestStartSyncChainCurrent for chain-current noop path
Verify that startSync does not set syncPeer or ibdMode when the
chain tip is recent and no peer advertises a height above ours.
2026-02-26 23:08:01 +09:00
Calvin Kim
570d3c8da3 netsync: add TestStallNoDisconnectAtSameHeight for stall handler 2026-02-26 22:22:51 +09:00
Calvin Kim
ce094262ff netsync: add TestStartSyncBlockFallback for block-only sync path
Verify that startSync skips header download and directly requests
blocks when the header chain is already caught up to the peer's
height but the block chain lags behind.
2026-02-26 22:05:57 +09:00
Calvin Kim
dc6e096cd3 netsync: add TestSyncStateMachine for end-to-end IBD sync flow
Tests the full IBD state machine: startSync → fetchHeaders →
handleHeadersMsg → fetchHeaderBlocks → handleBlockMsg → IBD complete.

Three sub-cases exercise different paths:
- fresh IBD from genesis
- node restart with partially synced blocks
- stalled sync peer recovery via handleStallSample
2026-02-26 21:57:54 +09:00
Calvin Kim
0b1c7b7acd netsync: rename headersFirstMode to ibdMode
ibdMode is a more fitting name than headersFirstMode since all blocks
are downloaded headers-first during the initial block download.
2026-02-26 18:10:29 +09:00
Calvin Kim
5af7680b2b netsync: remove unused headerList and checkpoint code
Since we no longer utilize the headerList for doing headers-first
download and checkpoint tracking, we remove related code.
2026-02-26 18:10:29 +09:00
Calvin Kim
9530eda3ee netsync: update handleBlockMsg
handleBlockMsg is updated to not be based off of the headerList and
sm.nextCheckpoint when doing operations related to checkpoints and
headers.
2026-02-26 18:10:29 +09:00
Calvin Kim
46574cc746 netsync: change startSync to be based off of processed headers
ince we now utilize ProcessBlockHeaders, we change the startSync
function to utilize the block index for downloading blocks/headers
instead of using the headerList in SyncManager.
2026-02-26 18:10:29 +09:00
Calvin Kim
717926887c integration: add reorg regression test for fetchHeaderBlocks fork point
This tests that after two nodes diverge and reconnect, the shorter
node downloads blocks starting from the fork point rather than its
current height. It verifies the reorg completes, both nodes
converge, and the orphaned fork appears as a side chain via
getchaintips.
2026-02-26 16:40:01 +09:00
Calvin Kim
8588a25129 netsync: require peer argument in fetchHeaderBlocks
Refactor fetchHeaderBlocks and buildBlockRequest to take an explicit
peer parameter instead of implicitly using sm.syncPeer. This makes the
caller responsible for choosing which peer to fetch from and adds a nil
guard to prevent a panic if the sync peer has been cleared.
2026-02-26 16:40:01 +09:00
Calvin Kim
dc90f8ca2a netsync: change fetchHeaderBlocks to be based on the processed block
headers

We introduce buildBlockRequest that'll create a getdata message based
off of the block index instead of the headerList in SyncManager.

The new fetchHeaderBlocks utilizes buildBlockRequest and now will create
fetch requests based on the processed block headers.
2026-02-26 16:39:55 +09:00
Calvin Kim
28b6690ca9 blockchain: add BestChainHeaderForkHeight to return the fork point
between the best chain and the best header chain
2026-02-26 16:34:46 +09:00
Calvin Kim
26c24592d2 netsync: use ProcessBlockHeader in handleBlockHeader
Instead of the old headerList based header processing, we make use of
the new ProcessBlockHeader function.
2026-02-26 16:34:46 +09:00
Calvin Kim
2f2364db66 netsync: add fetchHeaders
fetchHeaders picks a random peer at a higher advertised block and
requests headers from them.
2026-02-26 16:34:46 +09:00