2017-05-01 18:58:08 +02:00
|
|
|
package htlcswitch
|
|
|
|
|
|
|
|
import (
|
2017-05-03 16:02:22 +02:00
|
|
|
"github.com/lightningnetwork/lnd/channeldb"
|
2017-05-01 18:58:08 +02:00
|
|
|
"github.com/lightningnetwork/lnd/lnwire"
|
2017-05-03 16:02:22 +02:00
|
|
|
"github.com/roasbeef/btcd/chaincfg/chainhash"
|
2017-11-23 08:15:21 +01:00
|
|
|
"github.com/roasbeef/btcd/wire"
|
2017-05-01 18:58:08 +02:00
|
|
|
)
|
|
|
|
|
2017-05-03 16:02:22 +02:00
|
|
|
// InvoiceDatabase is an interface which represents the persistent subsystem
|
|
|
|
// which may search, lookup and settle invoices.
|
|
|
|
type InvoiceDatabase interface {
|
2018-02-07 04:13:07 +01:00
|
|
|
// LookupInvoice attempts to look up an invoice according to its 32
|
2017-05-03 16:02:22 +02:00
|
|
|
// byte payment hash.
|
2017-11-12 01:09:14 +01:00
|
|
|
LookupInvoice(chainhash.Hash) (channeldb.Invoice, error)
|
2017-05-03 16:02:22 +02:00
|
|
|
|
2017-06-16 23:32:41 +02:00
|
|
|
// SettleInvoice attempts to mark an invoice corresponding to the
|
|
|
|
// passed payment hash as fully settled.
|
2017-05-03 16:02:22 +02:00
|
|
|
SettleInvoice(chainhash.Hash) error
|
|
|
|
}
|
|
|
|
|
2017-06-16 23:32:41 +02:00
|
|
|
// ChannelLink is an interface which represents the subsystem for managing the
|
|
|
|
// incoming htlc requests, applying the changes to the channel, and also
|
2017-05-01 18:58:08 +02:00
|
|
|
// propagating/forwarding it to htlc switch.
|
|
|
|
//
|
|
|
|
// abstraction level
|
|
|
|
// ^
|
|
|
|
// |
|
|
|
|
// | - - - - - - - - - - - - Lightning - - - - - - - - - - - - -
|
|
|
|
// |
|
|
|
|
// | (Switch) (Switch) (Switch)
|
|
|
|
// | Alice <-- channel link --> Bob <-- channel link --> Carol
|
2018-04-05 18:52:35 +02:00
|
|
|
// |
|
2017-05-01 18:58:08 +02:00
|
|
|
// | - - - - - - - - - - - - - TCP - - - - - - - - - - - - - - -
|
|
|
|
// |
|
|
|
|
// | (Peer) (Peer) (Peer)
|
|
|
|
// | Alice <----- tcp conn --> Bob <---- tcp conn -----> Carol
|
|
|
|
// |
|
|
|
|
//
|
|
|
|
type ChannelLink interface {
|
2017-11-10 23:48:23 +01:00
|
|
|
// TODO(roasbeef): modify interface to embed mail boxes?
|
|
|
|
|
2017-05-01 18:58:08 +02:00
|
|
|
// HandleSwitchPacket handles the switch packets. This packets might be
|
|
|
|
// forwarded to us from another channel link in case the htlc update
|
|
|
|
// came from another peer or if the update was created by user
|
|
|
|
// initially.
|
2017-11-10 23:48:23 +01:00
|
|
|
//
|
|
|
|
// NOTE: This function MUST be non-blocking (or block as little as
|
|
|
|
// possible).
|
2018-01-16 21:55:41 +01:00
|
|
|
HandleSwitchPacket(*htlcPacket) error
|
2017-05-01 18:58:08 +02:00
|
|
|
|
|
|
|
// HandleChannelUpdate handles the htlc requests as settle/add/fail
|
|
|
|
// which sent to us from remote peer we have a channel with.
|
2017-11-10 23:48:23 +01:00
|
|
|
//
|
|
|
|
// NOTE: This function MUST be non-blocking (or block as little as
|
|
|
|
// possible).
|
2017-05-01 18:58:08 +02:00
|
|
|
HandleChannelUpdate(lnwire.Message)
|
|
|
|
|
2017-06-16 23:32:41 +02:00
|
|
|
// ChanID returns the channel ID for the channel link. The channel ID
|
|
|
|
// is a more compact representation of a channel's full outpoint.
|
2017-05-01 18:58:08 +02:00
|
|
|
ChanID() lnwire.ChannelID
|
|
|
|
|
2017-06-16 23:32:41 +02:00
|
|
|
// ShortChanID returns the short channel ID for the channel link. The
|
|
|
|
// short channel ID encodes the exact location in the main chain that
|
|
|
|
// the original funding output can be found.
|
|
|
|
ShortChanID() lnwire.ShortChannelID
|
2017-06-17 00:01:00 +02:00
|
|
|
|
2018-02-04 03:14:09 +01:00
|
|
|
// UpdateShortChanID updates the short channel ID for a link. This may
|
|
|
|
// be required in the event that a link is created before the short
|
|
|
|
// chan ID for it is known, or a re-org occurs, and the funding
|
2018-02-07 09:30:09 +01:00
|
|
|
// transaction changes location within the chain.
|
2018-02-04 03:14:09 +01:00
|
|
|
UpdateShortChanID(lnwire.ShortChannelID)
|
|
|
|
|
2017-06-17 00:01:00 +02:00
|
|
|
// UpdateForwardingPolicy updates the forwarding policy for the target
|
|
|
|
// ChannelLink. Once updated, the link will use the new forwarding
|
|
|
|
// policy to govern if it an incoming HTLC should be forwarded or not.
|
|
|
|
UpdateForwardingPolicy(ForwardingPolicy)
|
|
|
|
|
2017-08-22 08:36:43 +02:00
|
|
|
// Bandwidth returns the amount of milli-satoshis which current link
|
|
|
|
// might pass through channel link. The value returned from this method
|
2017-06-17 00:01:00 +02:00
|
|
|
// represents the up to date available flow through the channel. This
|
|
|
|
// takes into account any forwarded but un-cleared HTLC's, and any
|
|
|
|
// HTLC's which have been set to the over flow queue.
|
2017-08-22 08:36:43 +02:00
|
|
|
Bandwidth() lnwire.MilliSatoshi
|
2017-05-01 18:58:08 +02:00
|
|
|
|
|
|
|
// Stats return the statistics of channel link. Number of updates,
|
2017-08-22 08:36:43 +02:00
|
|
|
// total sent/received milli-satoshis.
|
|
|
|
Stats() (uint64, lnwire.MilliSatoshi, lnwire.MilliSatoshi)
|
2017-05-01 18:58:08 +02:00
|
|
|
|
2017-06-16 23:32:41 +02:00
|
|
|
// Peer returns the representation of remote peer with which we have
|
|
|
|
// the channel link opened.
|
2017-05-01 18:58:08 +02:00
|
|
|
Peer() Peer
|
|
|
|
|
2017-12-06 02:48:28 +01:00
|
|
|
// EligibleToForward returns a bool indicating if the channel is able
|
|
|
|
// to actively accept requests to forward HTLC's. A channel may be
|
|
|
|
// active, but not able to forward HTLC's if it hasn't yet finalized
|
|
|
|
// the pre-channel operation protocol with the remote peer. The switch
|
|
|
|
// will use this function in forwarding decisions accordingly.
|
|
|
|
EligibleToForward() bool
|
|
|
|
|
2018-01-16 21:55:41 +01:00
|
|
|
// AttachMailBox delivers an active MailBox to the link. The MailBox may
|
|
|
|
// have buffered messages.
|
|
|
|
AttachMailBox(MailBox)
|
|
|
|
|
2017-06-16 23:32:41 +02:00
|
|
|
// Start/Stop are used to initiate the start/stop of the channel link
|
|
|
|
// functioning.
|
2017-05-01 18:58:08 +02:00
|
|
|
Start() error
|
|
|
|
Stop()
|
|
|
|
}
|
|
|
|
|
|
|
|
// Peer is an interface which represents the remote lightning node inside our
|
|
|
|
// system.
|
|
|
|
type Peer interface {
|
2018-04-05 02:43:51 +02:00
|
|
|
// SendMessage sends message to remote peer. The second argument
|
|
|
|
// denotes if the method should block until the message has been sent
|
|
|
|
// to the remote peer.
|
2018-04-05 02:36:38 +02:00
|
|
|
SendMessage(msg lnwire.Message, sync bool) error
|
2017-05-01 18:58:08 +02:00
|
|
|
|
2017-11-23 08:15:21 +01:00
|
|
|
// WipeChannel removes the channel uniquely identified by its channel
|
|
|
|
// point from all indexes associated with the peer.
|
|
|
|
WipeChannel(*wire.OutPoint) error
|
2017-05-03 16:02:22 +02:00
|
|
|
|
2017-06-16 23:38:42 +02:00
|
|
|
// PubKey returns the serialize public key of the source peer.
|
|
|
|
PubKey() [33]byte
|
2017-05-01 18:58:08 +02:00
|
|
|
|
|
|
|
// Disconnect disconnects with peer if we have error which we can't
|
|
|
|
// properly handle.
|
2017-07-12 15:44:17 +02:00
|
|
|
Disconnect(reason error)
|
2017-05-01 18:58:08 +02:00
|
|
|
}
|
2018-02-28 07:18:52 +01:00
|
|
|
|
|
|
|
// ForwardingLog is an interface that represents a time series database which
|
|
|
|
// keep track of all successfully completed payment circuits. Every few
|
|
|
|
// seconds, the switch will collate and flush out all the successful payment
|
|
|
|
// circuits during the last interval.
|
|
|
|
type ForwardingLog interface {
|
|
|
|
// AddForwardingEvents is a method that should write out the set of
|
|
|
|
// forwarding events in a batch to persistent storage. Outside
|
|
|
|
// sub-systems can then query the contents of the log for analysis,
|
|
|
|
// visualizations, etc.
|
|
|
|
AddForwardingEvents([]channeldb.ForwardingEvent) error
|
|
|
|
}
|