2
0
mirror of https://github.com/lightninglabs/loop synced 2024-11-11 13:11:12 +00:00

liquidity: add peers to swap interface and include in set reason

This commit adds a peer listing function to our generic swap
interface, which we will use to set reasons for swaps that are
specified by peer pubkey rather than channel.
This commit is contained in:
carla 2021-03-24 15:13:31 +02:00
parent 7ca7a70430
commit 502e47362c
No known key found for this signature in database
GPG Key ID: 4CA7FE54A6213C91
3 changed files with 50 additions and 4 deletions

View File

@ -5,6 +5,7 @@ import (
"github.com/lightninglabs/loop" "github.com/lightninglabs/loop"
"github.com/lightningnetwork/lnd/lnwallet/chainfee" "github.com/lightningnetwork/lnd/lnwallet/chainfee"
"github.com/lightningnetwork/lnd/lnwire" "github.com/lightningnetwork/lnd/lnwire"
"github.com/lightningnetwork/lnd/routing/route"
) )
// FeeLimit is an interface implemented by different strategies for limiting // FeeLimit is an interface implemented by different strategies for limiting
@ -43,8 +44,17 @@ type swapSuggestion interface {
// channels returns the set of channels involved in the swap. // channels returns the set of channels involved in the swap.
channels() []lnwire.ShortChannelID channels() []lnwire.ShortChannelID
// peers returns the set of peers involved in the swap, taking a map
// of known channel IDs to peers as an argument so that channel peers
// can be looked up.
peers(knownChans map[uint64]route.Vertex) []route.Vertex
} }
// Compile-time assertion that loopOutSwapSuggestion satisfies the
// swapSuggestion interface.
var _ swapSuggestion = (*loopOutSwapSuggestion)(nil)
type loopOutSwapSuggestion struct { type loopOutSwapSuggestion struct {
loop.OutRequest loop.OutRequest
} }
@ -69,3 +79,26 @@ func (l *loopOutSwapSuggestion) channels() []lnwire.ShortChannelID {
return channels return channels
} }
// peers returns the set of peers that the loop out swap is restricted to.
func (l *loopOutSwapSuggestion) peers(
knownChans map[uint64]route.Vertex) []route.Vertex {
peers := make(map[route.Vertex]struct{}, len(knownChans))
for _, channel := range l.OutgoingChanSet {
peer, ok := knownChans[channel]
if !ok {
log.Warnf("peer for channel: %v unknown", channel)
}
peers[peer] = struct{}{}
}
peerList := make([]route.Vertex, 0, len(peers))
for peer := range peers {
peerList = append(peerList, peer)
}
return peerList
}

View File

@ -685,8 +685,13 @@ func (m *Manager) SuggestSwaps(ctx context.Context, autoloop bool) (
return nil, err return nil, err
} }
// Collect a map of channel IDs to peer pubkeys, and a set of per-peer
// balances which we will use for peer-level liquidity rules.
channelPeers := make(map[uint64]route.Vertex)
peerChannels := make(map[route.Vertex]*balances) peerChannels := make(map[route.Vertex]*balances)
for _, channel := range channels { for _, channel := range channels {
channelPeers[channel.ChannelID] = channel.PubKeyBytes
bal, ok := peerChannels[channel.PubKeyBytes] bal, ok := peerChannels[channel.PubKeyBytes]
if !ok { if !ok {
bal = &balances{} bal = &balances{}
@ -777,6 +782,15 @@ func (m *Manager) SuggestSwaps(ctx context.Context, autoloop bool) (
// setReason is a helper that adds a swap's channels to our disqualified // setReason is a helper that adds a swap's channels to our disqualified
// list with the reason provided. // list with the reason provided.
setReason := func(reason Reason, swap swapSuggestion) { setReason := func(reason Reason, swap swapSuggestion) {
for _, peer := range swap.peers(channelPeers) {
_, ok := m.params.PeerRules[peer]
if !ok {
continue
}
resp.DisqualifiedPeers[peer] = reason
}
for _, channel := range swap.channels() { for _, channel := range swap.channels() {
_, ok := m.params.ChannelRules[channel] _, ok := m.params.ChannelRules[channel]
if !ok { if !ok {

View File

@ -1198,10 +1198,9 @@ func TestInFlightLimit(t *testing.T) {
chan1Rec, chan1Rec,
}, },
DisqualifiedChans: noneDisqualified, DisqualifiedChans: noneDisqualified,
// This is a bug, we should list our second DisqualifiedPeers: map[route.Vertex]Reason{
// peer as disqualified because we've hit our peer2: ReasonInFlight,
// in-flight limit for now. },
DisqualifiedPeers: noPeersDisqualified,
}, },
}, },
} }