lnd/routing
Olaoluwa Osuntokun 7d10989fd6 routing: score on balances we did not author, via from_graph
In this commit, we teach the simulator to take the hidden balances out of
the graph file instead of drawing them. The describegraph loader now reads
the two fields an externally modelled graph adds, a node1-side `balance` in
sats and a `balance_certainty` between zero and one, and records them on the
channel ends without applying them. A new `from_graph` liquidity model is
what applies them: node1's end takes the balance the file gave it, the other
end takes the rest of the capacity, no rng involved.

The reason we want this is circularity. Our mainnet tier is real topology
and real policies with our own generator's liquidity painted over it, and
that generator is the one the evolved routers' priors were fit to
(`sim_liquidity.go` draws `ExpFloat64()*0.05`, atomic1's low mode is
`exp(-x/0.055)`). A graph whose balances someone else modelled is the first
liquidity family in the program we did not write, so scoring on it is the
cheapest de-circularization left short of replaying real payment data.

Which side a balance lands on is the one thing here that can be silently
wrong: a balance on the wrong end is still a plausible looking network and
would fail no aggregate, so we key off the pubkey the file calls node1
rather than assuming it is the lexicographically smaller end, and pin both
orderings in the tests. For the same reason a graph that only partly carries
balances is a loud error with a count instead of a fallback, since a
fallback would report a mixture of two liquidity families under the name of
one.

Everything is inert with the model unset. The new fields parse and go
unread, so a snapshot carrying neither, which is every snapshot we have
scored so far, loads exactly as it always did. Seven scenario files across
hard-test, ood-test and corpus-mix run byte-identical on both routers
against a binary built from the tree before this change.
2026-07-30 12:15:18 -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: score on balances we did not author, via from_graph 2026-07-30 12:15:18 -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 simulation: stamp latency onto generated corpora 2026-07-28 01:33:17 -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: score on balances we did not author, via from_graph 2026-07-30 12:15:18 -07:00
sim_liquidity_test.go routing: score on balances we did not author, via from_graph 2026-07-30 12:15:18 -07:00
sim_load.go routing: score on balances we did not author, via from_graph 2026-07-30 12:15:18 -07:00
sim_load_test.go routing: score on balances we did not author, via from_graph 2026-07-30 12:15:18 -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