Tor stopped serving v2 onion services in October 2021; lnd should not
produce v2 addresses anymore, but it must still verify signatures on
and re-broadcast peer NodeAnnouncement messages that carry v2 entries.
Stop accepting v2 as configuration input (lncfg), strip the legacy
`--tor.v2` flag from the sample config, and remove the
`tor.OnionHostToFakeIP` helper. Operator entry points (`--externalip`,
`--listen`, `lncli connect`, `lncli wtclient towers add`) fail fast on
a v2 `.onion` string, so upgrading nodes must remove any v2 entry from
`lnd.conf` before lnd will start.
Filter persisted v2 state before use without rewriting on-disk records:
the self-announcement builder strips any v2 entry inherited from the
stored self-node; the watchtower client drops v2 entries from each
persisted tower's address list (skipping the tower entirely if no
non-v2 address remains); the autopilot connector, graph bootstrapper,
and static-channel backup restore paths skip v2 entries before
attempting outbound dials. Restrict the Tor controller's ADD_ONION
path to v3 keys, including the encrypted on-disk legacy-key fallback.
For inbound announcements, keep the wire codec wire-faithful:
`lnwire.WriteOnionAddr`, `graph/db.encodeOnionAddr`, and the matching
decoders round-trip v2 bytes so `DataToSign` reproduces the bytes the
remote peer signed, signature validation succeeds, and the announcement
is persisted to the graph DB and re-broadcast across restarts byte-for-
byte. RPC surfaces continue to expose the full address set so external
tools can independently reproduce and verify the signed bytes.
Add a netann regression test that signs a [v3, v2, ipv4] announcement,
round-trips it through Encode/Decode, verifies the signature, and
confirms the resulting models.Node preserves the v2 entry. Add a
graph bootstrapper test asserting v2 entries are skipped while v3 and
plain TCP entries on the same node still surface as bootstrap
candidates.
(cherry picked from commit
|
||
|---|---|---|
| .. | ||
| config.go | ||
| flakes.go | ||
| list_exclude_test.go | ||
| list_off_test.go | ||
| list_on_test.go | ||
| lnd_access_perm_test.go | ||
| lnd_amp_test.go | ||
| lnd_bump_fee.go | ||
| lnd_channel_backup_test.go | ||
| lnd_channel_balance_test.go | ||
| lnd_channel_force_close_test.go | ||
| lnd_channel_funding_fund_max_test.go | ||
| lnd_channel_funding_utxo_selection_test.go | ||
| lnd_channel_graph_test.go | ||
| lnd_channel_policy_test.go | ||
| lnd_coop_close_external_delivery_test.go | ||
| lnd_coop_close_rbf_test.go | ||
| lnd_coop_close_with_htlcs_test.go | ||
| lnd_custom_features.go | ||
| lnd_custom_message_test.go | ||
| lnd_delete_canceled_invoice_test.go | ||
| lnd_estimate_on_chain_fee_test.go | ||
| lnd_estimate_route_fee_test.go | ||
| lnd_etcd_failover_test.go | ||
| lnd_experimental_accountability.go | ||
| lnd_forward_delete_test.go | ||
| lnd_forward_interceptor_test.go | ||
| lnd_funding_test.go | ||
| lnd_graph.go | ||
| lnd_graph_migration_test.go | ||
| lnd_hold_invoice_force_test.go | ||
| lnd_hold_persistence_test.go | ||
| lnd_htlc_test.go | ||
| lnd_htlc_timeout_resolver_test.go | ||
| lnd_invoice_acceptor_test.go | ||
| lnd_invoice_migration_test.go | ||
| lnd_macaroons_test.go | ||
| lnd_max_channel_size_test.go | ||
| lnd_max_htlc_path_test.go | ||
| lnd_max_htlcs_test.go | ||
| lnd_misc_test.go | ||
| lnd_mpp_test.go | ||
| lnd_multi-hop-error-propagation_test.go | ||
| lnd_multi-hop-payments_test.go | ||
| lnd_multi-hop_force_close_test.go | ||
| lnd_network_test.go | ||
| lnd_neutrino_headers_import_test.go | ||
| lnd_neutrino_test.go | ||
| lnd_no_etcd_dummy_failover_test.go | ||
| lnd_nonstd_sweep_test.go | ||
| lnd_onchain_test.go | ||
| lnd_onion_message_forward_test.go | ||
| lnd_onion_message_test.go | ||
| lnd_open_channel_test.go | ||
| lnd_payment_migration_test.go | ||
| lnd_payment_test.go | ||
| lnd_postgres_network_separation_test.go | ||
| lnd_psbt_test.go | ||
| lnd_quiescence_test.go | ||
| lnd_recovery_test.go | ||
| lnd_remote_signer_test.go | ||
| lnd_res_handoff_test.go | ||
| lnd_rest_api_test.go | ||
| lnd_revocation_test.go | ||
| lnd_route_blinding_test.go | ||
| lnd_routing_test.go | ||
| lnd_rpc_middleware_interceptor_test.go | ||
| lnd_signer_test.go | ||
| lnd_single_hop_invoice_test.go | ||
| lnd_sweep_test.go | ||
| lnd_switch_test.go | ||
| lnd_taproot_test.go | ||
| lnd_test.go | ||
| lnd_trackpayments_test.go | ||
| lnd_wallet.go | ||
| lnd_wallet_import_test.go | ||
| lnd_wallet_sync_test.go | ||
| lnd_watchtower_test.go | ||
| lnd_wipe_fwdpkgs_test.go | ||
| lnd_wumbo_channels_test.go | ||
| lnd_zero_conf_close_event_test.go | ||
| lnd_zero_conf_test.go | ||
| log_check_errors.sh | ||
| log_substitutions.txt | ||
| README.md | ||
Integration Test
itest is a package that houses the integration tests made for lnd. This
package builds test cases using the test framework lntest.
Add New Tests
To add a new test case, create a TestFunc and add it in list_on_test.go.
Ideally, the Name should just be the snake case of the name used in
TestFunc without the leading test and underscores. For instance, to test
lnd's exporting channel backup, we have,
{
Name: "export channel backup",
TestFunc: testExportChannelBackup,
}
The place to put the code of the TestFunc is case-specific. itest package
has loosely defined a list of files to test different functionalities of lnd.
The new test needs to be put into one of these files, otherwise, a new file
needs to be created.
Run Tests
Run a single test case
To run a single test case, use make itest icase=$case, where case is the
name defined in list_on_test.go, with spaces replaced with underscores(_).
# Run `testListChannels`.
make itest icase=list_channels
Run multiple test cases
There are two ways to run multiple test cases. One way is to use make itest icase=$cases, where cases has the format cases='(case|case|...)'. The
case is the name defined in list_on_test.go, with spaces replaced with
underscores(_).
# Run `testListChannels` and `testListAddresses` together.
make itest icase='(list_channels|list_addresses)'
Another way to run multiple cases is similar to how Go runs its tests - by
simple regex matching. For instance, the following command will run three cases
since they all start with the word list,
# Run `testListChannels`, `testListAddresses`, and `testListPayments` together.
make itest icase=list
Run all tests
To run all tests, use make itest without icase flag.
# Run all test cases.
make itest
Run tests in parallel
To run tests in parallel, use make itest-parallel. This command takes two
special arguments,
tranches, specifies the number of parts the test cases will be split into.parallel, specifies the number of threads to run in parallel. This value must be smaller than or equal totranches.
# Split the tests into 4 parts, and run them using 2 threads.
make itest-parallel tranches=4 parallel=2
By default, itest-parallel splits the tests into 4 parts and uses 4 threads
to run each of them.
Additional arguments
For both make itest and make itest-parallel, the following arguments are
allowed,
timeout, specifies the timeout value used in testing.dbbackend, specifies the database backend. Must bebbolt,etcd, orpostgres, default tobbolt.backend, specifies the chain backend to be used. Must be one of,btcd, the default value.neutrinobitcoindbitcoind notxindexbitcoind rpcpolling
# Run a single test case using bitcoind as the chain backend and etcd as the
# database backend, with a timeout of 5 minutes.
make itest icase=list_channels backend=bitcoind dbbackend=etcd timeout=5m
# Run all test cases in parallel, using bitcoind notxindex as the chain backend
# and etcd as the database backend, with a timeout of 60 minutes for each
# parallel.
make itest-parallel backend="bitcoind notxindex" dbbackend=etcd timeout=60m