htlcswicth: start use htlcswitch and channel link inside lnd
In current commit big shift have been made in direction of unit testable
payments scenarios. Previosly two additional structures have been added
which had been spreaded in the lnd package before, and now we apply
them in the lnd itself:
1. ChannelLink - is an interface which represents the subsystem for
managing the incoming htlc requests, applying the changes to the
channel, and also propagating/forwarding it to htlc switch.
2. Switch - is a central messaging bus for all incoming/outgoing htlc's.
The goal of the switch is forward the incoming/outgoing htlc messages
from one channel to another, and also propagate the settle/fail htlc
messages back to original requester.
With this abtractions the folowing schema becomes nearly complete:
abstraction
^
|
| - - - - - - - - - - - - Lightning - - - - - - - - - - - - -
|
| (Switch) (Switch) (Switch)
| Alice <-- channel link --> Bob <-- channel link --> Carol
|
| - - - - - - - - - - - - - TCP - - - - - - - - - - - - - - -
|
| (Peer) (Peer) (Peer)
| Alice <----- tcp conn --> Bob <---- tcp conn -----> Carol
This commit is contained in:
1 parent
79feebea80
commit
c4955258f1
6 files changed
+142
-1837
No files matched your search
@@ -5,7 +5,6 @@ import (
|
||||
"crypto/rand"
|
||||
"crypto/sha256"
|
||||
"encoding/hex"
|
||||
"errors"
|
||||
"fmt"
|
||||
"net"
|
||||
"strconv"
|
||||
@@ -25,9 +24,11 @@ import (
|
||||
"github.com/lightningnetwork/lnd/routing"
|
||||
"github.com/lightningnetwork/lnd/routing/chainview"
|
||||
"github.com/roasbeef/btcd/btcec"
|
||||
"github.com/roasbeef/btcd/chaincfg/chainhash"
|
||||
"github.com/roasbeef/btcd/connmgr"
|
||||
"github.com/roasbeef/btcutil"
|
||||
|
||||
"github.com/go-errors/errors"
|
||||
"github.com/lightningnetwork/lnd/htlcswitch"
|
||||
)
|
||||
|
||||
// server is the main server of the Lightning Network Daemon. The server houses
|
||||
@@ -69,7 +70,7 @@ type server struct {
|
||||
fundingMgr *fundingManager
|
||||
chanDB *channeldb.DB
|
||||
|
||||
htlcSwitch *htlcSwitch
|
||||
htlcSwitch *htlcswitch.Switch
|
||||
invoices *invoiceRegistry
|
||||
breachArbiter *breachArbiter
|
||||
|
||||
@@ -136,7 +137,6 @@ func newServer(listenAddrs []string, notifier chainntnfs.ChainNotifier,
|
||||
|
||||
invoices: newInvoiceRegistry(chanDB),
|
||||
utxoNursery: newUtxoNursery(chanDB, notifier, wallet),
|
||||
htlcSwitch: newHtlcSwitch(),
|
||||
|
||||
identityPriv: privKey,
|
||||
nodeSigner: newNodeSigner(privKey),
|
||||
@@ -177,6 +177,23 @@ func newServer(listenAddrs []string, notifier chainntnfs.ChainNotifier,
|
||||
debugPre[:], debugHash[:])
|
||||
}
|
||||
|
||||
s.htlcSwitch = htlcswitch.New(htlcswitch.Config{
|
||||
LocalChannelClose: func(pubKey []byte,
|
||||
request *htlcswitch.ChanClose) {
|
||||
s.peersMtx.RLock()
|
||||
peer, ok := s.peersByPub[string(pubKey)]
|
||||
s.peersMtx.RUnlock()
|
||||
|
||||
if !ok {
|
||||
srvrLog.Error("unable to close channel, peer"+
|
||||
" with %v id can't be found", pubKey)
|
||||
return
|
||||
}
|
||||
|
||||
peer.localCloseChanReqs <- request
|
||||
},
|
||||
})
|
||||
|
||||
// If external IP addresses have been specified, add those to the list
|
||||
// of this server's addresses.
|
||||
selfAddrs := make([]net.Addr, 0, len(cfg.ExternalIPs))
|
||||
@@ -237,14 +254,8 @@ func newServer(listenAddrs []string, notifier chainntnfs.ChainNotifier,
|
||||
ChainView: chainView,
|
||||
SendToSwitch: func(firstHop *btcec.PublicKey,
|
||||
htlcAdd *lnwire.UpdateAddHTLC) ([32]byte, error) {
|
||||
|
||||
firstHopPub := firstHop.SerializeCompressed()
|
||||
destInterface := chainhash.Hash(sha256.Sum256(firstHopPub))
|
||||
|
||||
return s.htlcSwitch.SendHTLC(&htlcPacket{
|
||||
dest: destInterface,
|
||||
msg: htlcAdd,
|
||||
})
|
||||
return s.htlcSwitch.SendHTLC(firstHopPub, htlcAdd)
|
||||
},
|
||||
})
|
||||
if err != nil {
|
||||
@@ -657,10 +668,22 @@ func (s *server) peerTerminationWatcher(p *peer) {
|
||||
|
||||
srvrLog.Debugf("Peer %v has been disconnected", p)
|
||||
|
||||
// Tell the switch to unregister all links associated with this peer.
|
||||
// Tell the switch to remove all links associated with this peer.
|
||||
// Passing nil as the target link indicates that all links associated
|
||||
// with this interface should be closed.
|
||||
p.server.htlcSwitch.UnregisterLink(p.addr.IdentityKey, nil)
|
||||
hop := htlcswitch.NewHopID(p.addr.IdentityKey.SerializeCompressed())
|
||||
links, err := p.server.htlcSwitch.GetLinks(hop)
|
||||
if err != nil {
|
||||
srvrLog.Errorf("unable to get channel links: %v", err)
|
||||
}
|
||||
|
||||
for _, link := range links {
|
||||
err := p.server.htlcSwitch.RemoveLink(link.ChanID())
|
||||
if err != nil {
|
||||
srvrLog.Errorf("unable to remove channel link: %v",
|
||||
err)
|
||||
}
|
||||
}
|
||||
|
||||
// Send the peer to be garbage collected by the server.
|
||||
p.server.donePeers <- p
|
||||
|
||||
Reference in new issue
Block a user