diff --git a/peer/config.go b/peer/config.go new file mode 100644 index 00000000..8c0f9313 --- /dev/null +++ b/peer/config.go @@ -0,0 +1,228 @@ +package peer + +import ( + "net" + "time" + + "github.com/btcsuite/btcd/btcec" + "github.com/btcsuite/btcd/connmgr" + + "github.com/lightningnetwork/lnd/chainntnfs" + "github.com/lightningnetwork/lnd/channeldb" + "github.com/lightningnetwork/lnd/channelnotifier" + "github.com/lightningnetwork/lnd/contractcourt" + "github.com/lightningnetwork/lnd/discovery" + "github.com/lightningnetwork/lnd/htlcswitch" + "github.com/lightningnetwork/lnd/htlcswitch/hodl" + "github.com/lightningnetwork/lnd/htlcswitch/hop" + "github.com/lightningnetwork/lnd/input" + "github.com/lightningnetwork/lnd/invoices" + "github.com/lightningnetwork/lnd/lnpeer" + "github.com/lightningnetwork/lnd/lnwallet" + "github.com/lightningnetwork/lnd/lnwallet/chainfee" + "github.com/lightningnetwork/lnd/lnwire" + "github.com/lightningnetwork/lnd/netann" + "github.com/lightningnetwork/lnd/pool" + "github.com/lightningnetwork/lnd/queue" + "github.com/lightningnetwork/lnd/watchtower/wtclient" +) + +// Config defines configuration fields that are necessary for a peer object +// to function. +type Config struct { + // Conn is the underlying network connection for this peer. + Conn net.Conn + + // ConnReq stores information related to the persistent connection request + // for this peer. + ConnReq *connmgr.ConnReq + + // PubKeyBytes is the serialized, compressed public key of this peer. + PubKeyBytes [33]byte + + // Addr is the network address of the peer. + Addr *lnwire.NetAddress + + // Inbound indicates whether or not the peer is an inbound peer. + Inbound bool + + // Features is the set of features that we advertise to the remote party. + Features *lnwire.FeatureVector + + // LegacyFeatures is the set of features that we advertise to the remote + // peer for backwards compatibility. Nodes that have not implemented + // flat features will still be able to read our feature bits from the + // legacy global field, but we will also advertise everything in the + // default features field. + LegacyFeatures *lnwire.FeatureVector + + // OutgoingCltvRejectDelta defines the number of blocks before expiry of + // an htlc where we don't offer it anymore. + OutgoingCltvRejectDelta uint32 + + // ChanActiveTimeout specifies the duration the peer will wait to request + // a channel reenable, beginning from the time the peer was started. + ChanActiveTimeout time.Duration + + // ErrorBuffer stores a set of errors related to a peer. It contains error + // messages that our peer has recently sent us over the wire and records of + // unknown messages that were sent to us so that we can have a full track + // record of the communication errors we have had with our peer. If we + // choose to disconnect from a peer, it also stores the reason we had for + // disconnecting. + ErrorBuffer *queue.CircularBuffer + + // WritePool is the task pool that manages reuse of write buffers. Write + // tasks are submitted to the pool in order to conserve the total number of + // write buffers allocated at any one time, and decouple write buffer + // allocation from the peer life cycle. + WritePool *pool.Write + + // ReadPool is the task pool that manages reuse of read buffers. + ReadPool *pool.Read + + // Switch is a pointer to the htlcswitch. It is used to setup, get, and + // tear-down ChannelLinks. + Switch *htlcswitch.Switch + + // InterceptSwitch is a pointer to the InterceptableSwitch, a wrapper around + // the regular Switch. We only export it here to pass ForwardPackets to the + // ChannelLinkConfig. + InterceptSwitch *htlcswitch.InterceptableSwitch + + // ChannelDB is used to fetch opened channels, closed channels, and the + // channel graph. + ChannelDB *channeldb.DB + + // ChainArb is used to subscribe to channel events, update contract signals, + // and force close channels. + ChainArb *contractcourt.ChainArbitrator + + // AuthGossiper is needed so that the Brontide impl can register with the + // gossiper and process remote channel announcements. + AuthGossiper *discovery.AuthenticatedGossiper + + // ChanStatusMgr is used to set or un-set the disabled bit in channel + // updates. + ChanStatusMgr *netann.ChanStatusManager + + // ChainIO is used to retrieve the best block. + ChainIO lnwallet.BlockChainIO + + // FeeEstimator is used to compute our target ideal fee-per-kw when + // initializing the coop close process. + FeeEstimator chainfee.Estimator + + // Signer is used when creating *lnwallet.LightningChannel instances. + Signer input.Signer + + // SigPool is used when creating *lnwallet.LightningChannel instances. + SigPool *lnwallet.SigPool + + // Wallet is used to publish transactions and generate delivery scripts + // during the coop close process. + Wallet *lnwallet.LightningWallet + + // ChainNotifier is used to receive confirmations of a coop close + // transaction. + ChainNotifier chainntnfs.ChainNotifier + + // RoutingPolicy is used to set the forwarding policy for links created by + // the Brontide. + RoutingPolicy htlcswitch.ForwardingPolicy + + // Sphinx is used when setting up ChannelLinks so they can decode sphinx + // onion blobs. + Sphinx *hop.OnionProcessor + + // WitnessBeacon is used when setting up ChannelLinks so they can add any + // preimages that they learn. + WitnessBeacon contractcourt.WitnessBeacon + + // Invoices is passed to the ChannelLink on creation and handles all + // invoice-related logic. + Invoices *invoices.InvoiceRegistry + + // ChannelNotifier is used by the link to notify other sub-systems about + // channel-related events and by the Brontide to subscribe to + // ActiveLinkEvents. + ChannelNotifier *channelnotifier.ChannelNotifier + + // HtlcNotifier is used when creating a ChannelLink. + HtlcNotifier *htlcswitch.HtlcNotifier + + // TowerClient is used when creating a ChannelLink. + TowerClient wtclient.Client + + // DisconnectPeer is used to disconnect this peer if the cooperative close + // process fails. + DisconnectPeer func(*btcec.PublicKey) error + + // GenNodeAnnouncement is used to send our node announcement to the remote + // on startup. + GenNodeAnnouncement func(bool, + ...netann.NodeAnnModifier) (lnwire.NodeAnnouncement, error) + + // PrunePersistentPeerConnection is used to remove all internal state + // related to this peer in the server. + PrunePersistentPeerConnection func([33]byte) + + // FetchLastChanUpdate fetches our latest channel update for a target + // channel. + FetchLastChanUpdate func(lnwire.ShortChannelID) (*lnwire.ChannelUpdate, + error) + + // ProcessFundingOpen is used to hand off an OpenChannel message to the + // funding manager. + ProcessFundingOpen func(*lnwire.OpenChannel, lnpeer.Peer) + + // ProcessFundingAccept is used to hand off an AcceptChannel message to the + // funding manager. + ProcessFundingAccept func(*lnwire.AcceptChannel, lnpeer.Peer) + + // ProcessFundingCreated is used to hand off a FundingCreated message to + // the funding manager. + ProcessFundingCreated func(*lnwire.FundingCreated, lnpeer.Peer) + + // ProcessFundingSigned is used to hand off a FundingSigned message to the + // funding manager. + ProcessFundingSigned func(*lnwire.FundingSigned, lnpeer.Peer) + + // ProcessFundingLocked is used to hand off a FundingLocked message to the + // funding manager. + ProcessFundingLocked func(*lnwire.FundingLocked, lnpeer.Peer) + + // ProcessFundingError is used to hand off an Error message to the funding + // manager. + ProcessFundingError func(*lnwire.Error, *btcec.PublicKey) + + // IsPendingChannel is used to determine whether to send an Error message + // to the funding manager or not. + IsPendingChannel func([32]byte, *btcec.PublicKey) bool + + // Hodl is used when creating ChannelLinks to specify HodlFlags as + // breakpoints in dev builds. + Hodl *hodl.Config + + // UnsafeReplay is used when creating ChannelLinks to specify whether or + // not to replay adds on its commitment tx. + UnsafeReplay bool + + // MaxOutgoingCltvExpiry is used when creating ChannelLinks and is the max + // number of blocks that funds could be locked up for when forwarding + // payments. + MaxOutgoingCltvExpiry uint32 + + // MaxChannelFeeAllocation is used when creating ChannelLinks and is the + // maximum percentage of total funds that can be allocated to a channel's + // commitment fee. This only applies for the initiator of the channel. + MaxChannelFeeAllocation float64 + + // ServerPubKey is the serialized, compressed public key of our lnd node. + // It is used to determine which policy (channel edge) to pass to the + // ChannelLink. + ServerPubKey [33]byte + + // Quit is the server's quit channel. If this is closed, we halt operation. + Quit chan struct{} +} diff --git a/peer/interfaces.go b/peer/interfaces.go new file mode 100644 index 00000000..05fe4a98 --- /dev/null +++ b/peer/interfaces.go @@ -0,0 +1,11 @@ +package peer + +import "github.com/lightningnetwork/lnd/lnwire" + +// LinkUpdater is an interface implemented by most messages in BOLT 2 that are +// allowed to update the channel state. +type LinkUpdater interface { + // TargetChanID returns the channel id of the link for which this message + // is intended. + TargetChanID() lnwire.ChannelID +}