17066 Commits

Author SHA1 Message Date
Olaoluwa Osuntokun
bf8df499ea htlcswitch: change LinkDirection to be a type alias
In this commit, we change LinkDirection to be a type alias. This makes
creating wrapper structs/interfaces easier, as we don't need to leak
htlcswitch.LinkDirection, instead we can accept a bool.
2024-08-16 15:43:03 -07:00
Olaoluwa Osuntokun
f81bf5feca peer: move existing chan closer init logic to new method
In the next commit, we'll start checking feature bits to decide how to
init the chan closer.

In the future, we can move the current chan closer handling logic into
an `MsgEndpoint`, which'll allow us to get rid of the explicit chan
closer map and direct handling.
2024-08-16 15:43:00 -07:00
Olaoluwa Osuntokun
49888b4fe7 feature: set optional bit for rbf-coop close by default 2024-08-16 15:28:18 -07:00
Olaoluwa Osuntokun
c7a09418a0 lnwire: add feature bits for new rbf coop close 2024-08-16 15:21:10 -07:00
Olaoluwa Osuntokun
a4852de69e lnwallet/chancloser: add unit tests for new rbf coop close 2024-08-16 15:17:31 -07:00
Olaoluwa Osuntokun
dcc4d8ea1d lnwallet/chancloser: create a MsgMapper for the protofsm rbf close
This'll allow us to treat the state machine as a MsgEndpoint, and have
the readHandler in the peer automatically send new messages to it.
2024-08-16 15:17:31 -07:00
Olaoluwa Osuntokun
a6e37466e2 lnwallet/chancloser: add state transitions for new protofsm rbf closer
In this commit, we add the state transitions for the new protofsm based
RBF chan closer. The underlying protocol is a new asymmetric co-op close
process, wherein either side can initiate a chan closer, and use their
settled funds to pay for fees within the channel.
2024-08-16 15:17:31 -07:00
Olaoluwa Osuntokun
7afdccecbb lnwallet: add ability to specify custom sequence for co-op close tx
In this commit, we add the ability to specify a custom sequence for a
co-op close tx. This'll come in handy later as the new co-op close
process allows a party to set a custom sequence.
2024-08-16 15:05:56 -07:00
Olaoluwa Osuntokun
a10245ee33 lnwallet/chancloser: add states for new protofsm rbf closer
In this commit, we add the initial set of states for the new protofsm
based rbf chan closer. A diagram outlining the new states and their
transitions can be found here:
https://gist.github.com/Roasbeef/acc4ff51b9dff127230228a05553cdfe.

Unlike the existing co-op close process, this co-op close can be
restarted at anytime if either side sends a shutdown message. From
there, we'll each obtain a new RBF'd version that can be re-broadcasted.

This commit creates the set of states, along with the environment that
our state machine will use to drive itself forward.
2024-08-16 15:05:56 -07:00
Olaoluwa Osuntokun
06c691e753 protofsm: allow multiple internal events to be emitted
In this commit, we update the execution logic to allow multiple internal
events to be emitted. This is useful to handle potential out of order
state transitions, as they can be cached, then emitted once the relevant
pre-conditions have been met.
2024-08-16 14:59:47 -07:00
Olaoluwa Osuntokun
8816b357ef protofsm: add SpendMapper to craft custom spend events
In this commit, we add the SpendMapper which allows callers to create
custom spent events. Before this commit, the caller would be able to
have an event sent to them in the case a spend happens, but that event
wouldn't have any of the relevant spend details.

With this new addition, the caller can specify how to take a generic
spend event, and transform it into the state machine specific spend
event.
2024-08-16 14:59:47 -07:00
Olaoluwa Osuntokun
383e192b4e protofsm: add CustomPollInterval for mocking purposes
Adding this makes a state machine easier to unit test, as the caller can
specify a custom polling interval.
2024-08-16 14:59:47 -07:00
Olaoluwa Osuntokun
12e9e07d9f protofsm: add ErrorReporter interface
We'll use this to be able to signal to a caller that a critical error
occurred during the state transition.
2024-08-16 14:59:47 -07:00
Olaoluwa Osuntokun
cd26a48526 protofsm: add logging 2024-08-16 14:59:47 -07:00
Olaoluwa Osuntokun
edaa465556 protofsm: add a Name() method to the env
This'll be used later to uniquely identify state machines for
routing/dispatch purposes.
2024-08-16 14:59:47 -07:00
Olaoluwa Osuntokun
e8fbe2de26 protofsm: add ability for state machine to consume wire msgs
In this commit, we add the ability for the state machine to consume wire
messages. This'll allow the creation of a new generic message router
that takes the place of the current peer `readHandler` in an upcoming
commit.
2024-08-16 14:59:47 -07:00
Olaoluwa Osuntokun
75dffff1eb protofsm: convert state machine args into config 2024-08-16 14:59:47 -07:00
Olaoluwa Osuntokun
633b73df8f protofsm: add optional daemon event on init
In this commit, we add an optional daemon event that can be specified to
dispatch during init. This is useful for instances where before we
start, we want to make sure we have a registered spend/conf notification
before normal operation starts.

We also add new unit tests to cover this, and the prior spend/conf event
additions.
2024-08-16 14:59:47 -07:00
Olaoluwa Osuntokun
014efb3272 protofsm: add daemon events for spend+conf registration 2024-08-16 14:59:47 -07:00
Olaoluwa Osuntokun
a0178bf873 protofsm: add new package for driving generic protocol FSMs
In this PR, we create a new package, `protofsm` which is intended to
abstract away from something we've done dozens of time in the daemon:
create a new event-drive protocol FSM. One example of this is the co-op
close state machine, and also the channel state machine itself.

This packages picks out the common themes of:

  * clear states and transitions between them
  * calling out to special daemon adapters for I/O such as transaction
    broadcast or sending a message to a peer
  * cleaning up after state machine execution
  * notifying relevant callers of updates to the state machine

The goal of this PR, is that devs can now implement a state machine
based off of this primary interface:
```go
// State defines an abstract state along, namely its state transition function
// that takes as input an event and an environment, and returns a state
// transition (next state, and set of events to emit). As state can also either
// be terminal, or not, a terminal event causes state execution to halt.
type State[Event any, Env Environment] interface {
	// ProcessEvent takes an event and an environment, and returns a new
	// state transition. This will be iteratively called until either a
	// terminal state is reached, or no further internal events are
	// emitted.
	ProcessEvent(event Event, env Env) (*StateTransition[Event, Env], error)

	// IsTerminal returns true if this state is terminal, and false otherwise.
	IsTerminal() bool
}
```

With their focus being _only_ on each state transition, rather than all
the boiler plate involved (processing new events, advancing to
completion, doing I/O, etc, etc).

Instead, they just make their states, then create the state machine
given the starting state and env. The only other custom component needed
is something capable of mapping wire messages or other events from the
"outside world" into the domain of the state machine.

The set of types is based on a pseudo sum type system wherein you
declare an interface, make the sole method private, then create other
instances based on that interface. This restricts call sites (must pass
in that interface) type, and with some tooling, exhaustive matching can
also be enforced via a linter.

The best way to get a hang of the pattern proposed here is to check out
the tests. They make a mock state machine, and then use the new executor
to drive it to completion. You'll also get a view of how the code will
actually look, with the focus being on the: input event, current state,
and output transition (can also emit events to drive itself forward).
2024-08-16 14:59:47 -07:00
Olaoluwa Osuntokun
8ac184a911
Merge pull request #8520 from lightningnetwork/peer-msg-router
[2/4] - peer: add new abstract message router
2024-08-16 14:57:44 -07:00
Olaoluwa Osuntokun
7c24e33614
Merge pull request #8996 from ProofOfKeags/dual
[MICRO]: lntypes: Add Dual[A] primitive type
2024-08-16 14:47:39 -07:00
Keagan McClelland
34f7c31dc8
lntypes: Add Dual[A] primitive type
This commit introduces a new type Dual[A] to make it easier to
manage symmetric configurations or state for lightning channels.
2024-08-15 10:53:18 -07:00
Oliver Gugger
0aced5ce2d
Merge pull request #8857 from MPins/issue-8793
Fixing the current state update when lncli debuglevel and lncli setmccfg are called
2024-08-15 02:33:54 -06:00
Olaoluwa Osuntokun
f09c517bc6 peer: don't stop global msg router
In this commit, we fix a bug that would cause a global message router to
be stopped anytime a peer disconnected. The global msg router only
allows `Start` to be called once, so afterwards, no messages would
properly be routed.
2024-08-14 19:23:02 -07:00
Olaoluwa Osuntokun
b028af1836 multi: make MsgRouter available in the ImplementationCfg
With this commit, we allow the `MsgRouter` to be available in the
`ImplementationCfg`. With this, programs outside of lnd itself are able
to now hook into the message processing flow to direct handle custom
messages, and even normal wire messages.
2024-08-14 19:23:02 -07:00
Olaoluwa Osuntokun
927aa84b5f peer: update readHandler to dispatch to msgRouter if set
Over time with this, we should be able to significantly reduce the size
of the peer.Brontide struct as we only need all those deps as the peer
needs to recognize and handle each incoming wire message itself.
2024-08-14 19:23:02 -07:00
Olaoluwa Osuntokun
f124195ae9 msgmux: add new abstract message router
In this commit, we add a new abstract message router. Over time, the
goal is that this message router replaces the logic we currently have in
the readHandler (the giant switch for each message).

With this new abstraction, can reduce the responsibilities of the
readHandler to *just* reading messages off the wire and handing them off
to the msg router. The readHandler no longer needs to know *where* the
messages should go, or how they should be dispatched.

This will be used in tandem with the new `protofsm` module in an
upcoming PR implementing the new rbf-coop close.
2024-08-14 19:23:02 -07:00
MPins
4dda2e2c23 docs: release-notes-0.19.0.md 2024-08-14 14:44:17 -03:00
MPins
cde5c5b59d lnd: Update the DebugLevel on main cfg 2024-08-14 14:42:49 -03:00
MPins
b08e65ec85 lnd: Create a callback function (UpdatingRoutingConfig)
This callback function is called whenever the command `lncli setmccfg`
is used to change the routing settings.
2024-08-14 14:42:49 -03:00
MPins
de495534e4 routing: Call the function to update routing config on main cfg
NewMissionControl propagate the callback function defined on server.go and
SetConfig call it to update the infos on main cfg.
2024-08-14 14:42:49 -03:00
Yong
77c7f776d5
Merge pull request #9002 from Roasbeef/tlv-edge-info-bug-fix
discovery: fix bug that can lead to sending invalid chan_ann msgs
2024-08-14 23:29:36 +08:00
Olaoluwa Osuntokun
f7daa307dd
discovery: fix bug that can lead to sending invalid chan_ann msgs
Initially in lnd, we didn't store the extra TLV data that could be
dangling off of gossip messages. This was fixed initially in lnd v0.5
with this PR: https://github.com/lightningnetwork/lnd/pull/1825.

Within the PR, we incorrect set the `ExtraOpaqueData` (extra TLV blob)
of the `ChannelAnnouncement` to the value stored in `edge`, which is
actually our channel update. As 6-ish years ago we didn't yet have
anything that used the TLV gossip fields, this went unnoticed.

Fast forward to 2024, we shipped an experimental version of inbounbd
fees. This starts to store additional data in the `ExtraOpaqueData`
field, the TLV for the inbound fee. Initially, everything is valid when
the first `ChannelAnnouncement` is sent, but as soon as a user attempts
to set an inbound fee policy, we'd incorrectly swap in that new
serialized TLV for the _channel announcement_:
841e24399c (diff-1eda595bbebe495bd74a6a0431c46b66cb4e8b53beb311067c010feac2665dcbR2560).

Since we're just trying to generate a new `channel_update`, we don't
also regenerate the signature for the `channel_announcement` message. As
a result, we end up storing a `channel_announcement` with an invalid sig
on disk, continuing to broadcast that to peers.
2024-08-13 19:39:16 -07:00
Olaoluwa Osuntokun
c0420fe67d
Merge pull request #8943 from Roasbeef/alloy-linear-fee-model
docs/alloy-models: add new folder for Alloy models along w/ model for Linear Fee Function bug fix
2024-08-12 19:14:56 -07:00
Oliver Gugger
2f2efc7824
Merge pull request #8843 from ziggie1984/bumpforceclosefee-rpc
bumpforceclosefee rpc
2024-08-12 06:04:53 -06:00
ziggie
08aba8ce31
docs: add release notes. 2024-08-09 19:41:27 +02:00
ziggie
22b504db7c
sweep: add TODO to the sweeper behavior.
Make sure we only trigger the sweep of a specific input when
updating its fee parameters not the all the current pending
registered sweeps.
2024-08-09 19:41:27 +02:00
ziggie
2d04813dc3
itest: Add itest for bumpclosefeerate rpc.
Add an itest which will bump the close fee rate of an anchor
channel which is force closed without having any HTLCs at stake.
2024-08-09 19:41:27 +02:00
ziggie
ae28f75557
miner: bugfix
return the transaction when found in the mempool.
2024-08-09 19:41:26 +02:00
ziggie
75f6622ccf
itest: remove unused LEGACY channel code.
Legacy Channel types are not tested anymore via the multi-hop
test harness, therefore we can remove unused code.
2024-08-09 18:54:57 +02:00
ziggie
07b18c1c86
multi: add bumpforceclosefee rpc endpoint.
Add a new bumpforceclosefee rpc endpoint to the wallet server.
Move the logic from the lncli level to the wallet server rpc level.
This is more in line with a proper client-server design.

wallet lncli: use new bumpforceclosefee endpoint.

Besides using the new bumpforceclosefee rpc endpoint we also enable the
bumping of taproot anchor channels.
2024-08-09 18:54:56 +02:00
Olaoluwa Osuntokun
57a5e4912b
Merge pull request #8994 from ellemouton/rbMicroFixes
Rb micro fixes
fn/v1.2.1
2024-08-08 11:17:16 -07:00
Elle Mouton
ab28cde240
routing: correct initial finalPaddedSize
This purely affects logging. This makes sure that the `padStat`
finalPaddedSize field is initilised correctly with the given minSize.
2024-08-08 16:46:04 +02:00
Elle Mouton
5e84ba92af
multi: add IsBlinded to lnrpc.Invoice for nicer UX
The BlindedPathConfig struct is nice for invoice creation but when we
use the Invoice message for viewing an invoice, it would be nicer to see
an "is_blinded" field.
2024-08-08 16:46:01 +02:00
Oliver Gugger
bbd313dcca
Merge pull request #8992 from guggero/estimate-fee-cli
cmd/lncli: add min relay fee to `lncli wallet estimatefeerate`
2024-08-08 01:43:56 -06:00
Oliver Gugger
eac54601fb
cmd/lncli: add min relay fee to lncli wallet estimatefeerate
This commit adds the new value that was added to the RPC response to the
CLI output as well.
2024-08-08 09:24:49 +02:00
Olaoluwa Osuntokun
5a84ca8032
Merge pull request #8986 from Roasbeef/min-relay-fee-rpc
lnrpc: add new min_relay_fee response to EstimateFee
2024-08-07 21:01:54 -07:00
Olaoluwa Osuntokun
51f3577ef9
Merge pull request #8963 from Roasbeef/always-send-chan-upd
peer: always send channel update on reconnect
2024-08-07 18:50:34 -07:00
Olaoluwa Osuntokun
459ee9b245
Merge pull request #8976 from ellemouton/rb-follow-ups
route blinding: follow ups
2024-08-07 17:54:31 -07:00