lnd/routing
Olaoluwa Osuntokun ac3234d768 routing: let an attempt take as long as its route
In this commit, we split the scheduler's resolve step in two and charge
the second half on the hops the htlc actually crossed.

The event loop had one step for "the htlc is in the air": it sent the
route, learned what the network did, and told the router, all at one
virtual instant a flat attempt_sec after the route was chosen. That is
the uniform tick, and it prices a nine hop settle exactly like a refusal
by the sender's own peer.

Now the resolve step dispatches and the report step tells the router,
and the gap between them is the round trip to whatever hop resolved the
htlc. With no latency section the gap is zero and the two run back to
back inside one step, so nothing can slip between them and the timeline
is the one every scenario file before this stage produced. With one, the
sender waits, and the wait depends on the route.

The split falls along the line between what the network did and what the
sender knows. Money moves and liquidity is reserved at dispatch, out on
the network, because that is when it happens and because a sibling
racing this payment has to contend with a hold that exists from the
moment the shard arrives, not from the moment the news gets home. The
router's belief, the amount still owed and the settle of a completed
hold all wait for the report.

The round trip is priced off the TRUE result, before an attribution
section has had a chance to blame a neighbour of the node that really
failed. The clock is not something a damaged failure message gets to
edit.

Reporting is the pair every stage since A has needed: a per-attempt
latency in the trace, which is where the differential structure is
auditable, and a per-payment wall time, which is what objective L would
be charged on. Both are pointers, so a file with no latency section
emits neither and stays byte identical, and a file with one emits the
zeroes too: a route the fee budget refused never reached the wire and
really did cost no time.

A latency section needs a clock section, for the reason stage D found
concurrency does: with no virtual time nothing the simulator does moves
a clock, so the section would be charged nowhere. It also satisfies the
concurrency window's own clock requirement on its own, since an attempt
that costs a round trip is an attempt that takes time.
2026-07-28 01:29:00 -07:00
..
blindedpath chanstate: use channel types in interfaces 2026-07-07 07:18:56 -03:00
chainview multi: fix lint findings from btcd v2 migration 2026-06-24 11:57:10 -07:00
localchans chanstate: use channel types in local chans 2026-07-07 07:18:58 -03:00
route Merge pull request #10789 from bitromortac/2604-bolt12-1a 2026-06-15 22:10:31 -03:00
shards multi: Fix typos [skip ci] 2022-01-24 12:19:02 +02:00
testdata routing: add private key attribute in router test 2021-06-23 18:13:02 +08:00
additional_edge.go multi+refactor: move models package to graph/db 2024-11-28 13:34:33 +02:00
additional_edge_test.go lint: remove redundant loop var copies in test files 2026-06-03 15:32:45 -03:00
bandwidth.go graph/db: thread context through ForEachNodeDirectedChannel 2026-02-25 15:33:34 +02:00
bandwidth_test.go multi: upgrade to btcd v2 modules 2026-06-24 10:58:36 -07:00
blinding.go routing: improve lasthoppaylaod size calculation 2024-12-10 19:05:49 +01:00
blinding_test.go lint: remove redundant loop var copies in test files 2026-06-03 15:32:45 -03:00
control_tower.go routing: fix log output line 2026-03-19 19:30:13 +01:00
control_tower_test.go multi: move failed attempt cfg option to the router subsytem 2026-02-25 08:02:26 +01:00
graph.go multi: upgrade to btcd v2 modules 2026-06-24 10:58:36 -07:00
heap.go routing: add inbound fee support to pathfinding 2024-03-31 18:12:28 +02:00
heap_test.go routing: optimize path finding structures 2019-10-24 21:38:07 -03:00
integrated_routing_context_test.go multi: skip range check in pathfinder and switch for custom htlc payments 2025-08-06 09:37:08 +02:00
integrated_routing_test.go multi: upgrade to btcd v2 modules 2026-06-24 10:58:36 -07:00
log.go multi: start updating various loggers to use the new v2 type 2024-10-22 17:03:55 +02:00
missioncontrol.go routing: the distillation patch, one live fix and one measured negative 2026-07-27 11:48:24 -07:00
missioncontrol_state.go routing: separate MissionControl from MissionControlManager 2024-10-01 14:06:50 +02:00
missioncontrol_state_test.go multi: formatting and comment fixes 2022-02-10 11:02:02 +01:00
missioncontrol_store.go routing: allow misson control manager to startup despite errors 2025-12-02 20:38:55 +01:00
missioncontrol_store_test.go lint: remove redundant loop var copies in test files 2026-06-03 15:32:45 -03:00
missioncontrol_test.go multi: update walletdb package 2025-04-09 18:47:53 +02:00
mock_graph_test.go multi: upgrade to btcd v2 modules 2026-06-24 10:58:36 -07:00
mock_test.go multi: upgrade to btcd v2 modules 2026-06-24 10:58:36 -07:00
nodepair.go routing: extended DirectedNodePair functionality 2019-08-13 18:45:06 +02:00
patch_config.go routing: the distillation patch, one live fix and one measured negative 2026-07-27 11:48:24 -07:00
patch_config_test.go routing: the distillation patch, one live fix and one measured negative 2026-07-27 11:48:24 -07:00
pathfind.go routing: the distillation patch, one live fix and one measured negative 2026-07-27 11:48:24 -07:00
pathfind_test.go multi: upgrade to btcd v2 modules 2026-06-24 10:58:36 -07:00
payment_lifecycle.go lint: enable copyloopvar and remove redundant loop var copies in non-test files 2026-06-03 15:32:46 -03:00
payment_lifecycle_test.go lint: remove redundant loop var copies in test files 2026-06-03 15:32:45 -03:00
payment_session.go routing: the distillation patch, one live fix and one measured negative 2026-07-27 11:48:24 -07:00
payment_session_source.go models: simplify models.Node 2025-11-12 22:54:04 +08:00
payment_session_test.go lint: remove redundant loop var copies in test files 2026-06-03 15:32:45 -03:00
probability_apriori.go multi: upgrade to btcd v2 modules 2026-06-24 10:58:36 -07:00
probability_apriori_test.go multi: upgrade to btcd v2 modules 2026-06-24 10:58:36 -07:00
probability_bimodal.go multi: upgrade to btcd v2 modules 2026-06-24 10:58:36 -07:00
probability_bimodal_test.go lint: remove redundant loop var copies in test files 2026-06-03 15:32:45 -03:00
probability_estimator.go multi: upgrade to btcd v2 modules 2026-06-24 10:58:36 -07:00
probability_estimator_test.go routing: add probability benchmarks 2023-02-14 13:34:25 +01:00
README.md scripted-diff: replace ⛰ emoji with $ [skip ci] 2022-10-28 12:06:49 -04:00
result_interpretation.go routing: the distillation patch, one live fix and one measured negative 2026-07-27 11:48:24 -07:00
result_interpretation_test.go routing: the distillation patch, one live fix and one measured negative 2026-07-27 11:48:24 -07:00
router.go multi: upgrade to btcd v2 modules 2026-06-24 10:58:36 -07:00
router_test.go multi: upgrade to btcd v2 modules 2026-06-24 10:58:36 -07:00
setup_test.go channeldb/test: test with postgres 2021-10-29 10:54:44 +02:00
sim_atomic_test.go routing: record which channel a hold reserves 2026-07-28 00:32:59 -07:00
sim_attribution.go routing+routesim: degrade the failure attribution channel 2026-07-27 00:54:37 -07:00
sim_attribution_test.go routing: price lnd's own path finding against the budget 2026-07-28 00:15:43 -07:00
sim_concurrency.go routing: let an attempt take as long as its route 2026-07-28 01:29:00 -07:00
sim_concurrency_test.go routing: do not blame a payment for a batch that never started 2026-07-28 01:05:45 -07:00
sim_corridors_test.go routing: add corridors topology for MPP splitting pressure 2026-07-24 21:15:08 -07:00
sim_fee_limit.go routing: refuse a route the payment cannot afford 2026-07-28 00:15:43 -07:00
sim_fee_limit_test.go routing: price lnd's own path finding against the budget 2026-07-28 00:15:43 -07:00
sim_graph.go routing: record which channel a hold reserves 2026-07-28 00:32:59 -07:00
sim_htlc_limits.go routing: enforce the sender's own htlc limits under the stage A flag 2026-07-27 22:32:12 -07:00
sim_htlc_limits_test.go routing: draw min and max htlc from the mainnet marginals 2026-07-27 22:32:12 -07:00
sim_inbound_fees.go routing: draw inbound fees from the mainnet marginals 2026-07-27 23:31:21 -07:00
sim_inbound_fees_test.go routing: draw inbound fees from the mainnet marginals 2026-07-27 23:31:21 -07:00
sim_latency.go routing: name what a latency section says 2026-07-28 01:20:15 -07:00
sim_latency_test.go routing: let an attempt take as long as its route 2026-07-28 01:29:00 -07:00
sim_liquidity.go routing: parameterize the liquidity generator families 2026-07-27 00:07:05 -07:00
sim_liquidity_test.go routing: parameterize the liquidity generator families 2026-07-27 00:07:05 -07:00
sim_load.go routing: carry the inbound fee every real policy announces 2026-07-27 23:31:21 -07:00
sim_load_test.go routing: carry the inbound fee every real policy announces 2026-07-27 23:31:21 -07:00
sim_policy_test.go routing: enforce the sender's own htlc limits under the stage A flag 2026-07-27 22:32:12 -07:00
sim_router.go routing: run a payment batch on a virtual-time scheduler 2026-07-28 00:47:51 -07:00
sim_run.go routing: let an attempt take as long as its route 2026-07-28 01:29:00 -07:00
sim_test.go routing: add in-process Lightning payment simulator 2026-07-24 12:16:23 -07:00
sim_topology.go routing: add corridors topology for MPP splitting pressure 2026-07-24 21:15:08 -07:00
sim_traffic.go routing: teach the traffic engine what an inbound fee costs 2026-07-27 23:31:21 -07:00
sim_traffic_test.go routing: teach the traffic engine what an inbound fee costs 2026-07-27 23:31:21 -07:00
sim_warmup_test.go routing+routesim: add an unscored warmup phase for exp-012 2026-07-26 02:27:00 -07:00
sim_weights.go routing: price lnd's own path finding against the budget 2026-07-28 00:15:43 -07:00
sim_weights_test.go routing: serve observations, not weights 2026-07-26 22:55:22 -07:00
unified_edges.go multi: upgrade to btcd v2 modules 2026-06-24 10:58:36 -07:00
unified_edges_test.go multi: upgrade to btcd v2 modules 2026-06-24 10:58:36 -07:00

routing

Build Status MIT licensed GoDoc

The routing package implements authentication+validation of channel announcements, pruning of the channel graph, path finding within the network, sending outgoing payments into the network and synchronizing new peers to our channel graph state.

Installation and Updating

$  go get -u github.com/lightningnetwork/lnd/routing