watchtower: make use of the new AddressIterator
This commit upgrades the wtclient package to make use of the new `AddressIterator`. It does so by first creating new `Tower` and `ClientSession` types. The new `Tower` type has an `AddressIterator` instead of a list of addresses. The `ClientSession` type contains a `Tower`.
This commit is contained in:
13 files changed
+274
-184
No files matched your search
@@ -429,7 +429,7 @@ func (c *ClientDB) RemoveTower(pubKey *btcec.PublicKey, addr net.Addr) error {
|
||||
}
|
||||
|
||||
towerSessions, err := listTowerSessions(
|
||||
towerID, sessions, towers, towersToSessionsIndex,
|
||||
towerID, sessions, towersToSessionsIndex,
|
||||
WithPerCommittedUpdate(perCommittedUpdate),
|
||||
)
|
||||
if err != nil {
|
||||
@@ -766,7 +766,7 @@ func (c *ClientDB) ListClientSessions(id *TowerID,
|
||||
// known to the db.
|
||||
if id == nil {
|
||||
clientSessions, err = listClientAllSessions(
|
||||
sessions, towers, opts...,
|
||||
sessions, opts...,
|
||||
)
|
||||
return err
|
||||
}
|
||||
@@ -778,7 +778,7 @@ func (c *ClientDB) ListClientSessions(id *TowerID,
|
||||
}
|
||||
|
||||
clientSessions, err = listTowerSessions(
|
||||
*id, sessions, towers, towerToSessionIndex, opts...,
|
||||
*id, sessions, towerToSessionIndex, opts...,
|
||||
)
|
||||
return err
|
||||
}, func() {
|
||||
@@ -792,7 +792,7 @@ func (c *ClientDB) ListClientSessions(id *TowerID,
|
||||
}
|
||||
|
||||
// listClientAllSessions returns the set of all client sessions known to the db.
|
||||
func listClientAllSessions(sessions, towers kvdb.RBucket,
|
||||
func listClientAllSessions(sessions kvdb.RBucket,
|
||||
opts ...ClientSessionListOption) (map[SessionID]*ClientSession, error) {
|
||||
|
||||
clientSessions := make(map[SessionID]*ClientSession)
|
||||
@@ -801,7 +801,7 @@ func listClientAllSessions(sessions, towers kvdb.RBucket,
|
||||
// the CommittedUpdates and AckedUpdates on startup to resume
|
||||
// committed updates and compute the highest known commit height
|
||||
// for each channel.
|
||||
session, err := getClientSession(sessions, towers, k, opts...)
|
||||
session, err := getClientSession(sessions, k, opts...)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -819,7 +819,7 @@ func listClientAllSessions(sessions, towers kvdb.RBucket,
|
||||
|
||||
// listTowerSessions returns the set of all client sessions known to the db
|
||||
// that are associated with the given tower id.
|
||||
func listTowerSessions(id TowerID, sessionsBkt, towersBkt,
|
||||
func listTowerSessions(id TowerID, sessionsBkt,
|
||||
towerToSessionIndex kvdb.RBucket, opts ...ClientSessionListOption) (
|
||||
map[SessionID]*ClientSession, error) {
|
||||
|
||||
@@ -834,9 +834,7 @@ func listTowerSessions(id TowerID, sessionsBkt, towersBkt,
|
||||
// the CommittedUpdates and AckedUpdates on startup to resume
|
||||
// committed updates and compute the highest known commit height
|
||||
// for each channel.
|
||||
session, err := getClientSession(
|
||||
sessionsBkt, towersBkt, k, opts...,
|
||||
)
|
||||
session, err := getClientSession(sessionsBkt, k, opts...)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -1248,7 +1246,7 @@ func WithPerCommittedUpdate(cb PerCommittedUpdateCB) ClientSessionListOption {
|
||||
// getClientSession loads the full ClientSession associated with the serialized
|
||||
// session id. This method populates the CommittedUpdates, AckUpdates and Tower
|
||||
// in addition to the ClientSession's body.
|
||||
func getClientSession(sessions, towers kvdb.RBucket, idBytes []byte,
|
||||
func getClientSession(sessions kvdb.RBucket, idBytes []byte,
|
||||
opts ...ClientSessionListOption) (*ClientSession, error) {
|
||||
|
||||
cfg := NewClientSessionCfg()
|
||||
@@ -1261,13 +1259,6 @@ func getClientSession(sessions, towers kvdb.RBucket, idBytes []byte,
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// Fetch the tower associated with this session.
|
||||
tower, err := getTower(towers, session.TowerID.Bytes())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
session.Tower = tower
|
||||
|
||||
// Can't fail because client session body has already been read.
|
||||
sessionBkt := sessions.NestedReadBucket(idBytes)
|
||||
|
||||
|
||||
@@ -343,8 +343,11 @@ func testCreateTower(h *clientDBHarness) {
|
||||
h.loadTowerByID(20, wtdb.ErrTowerNotFound)
|
||||
|
||||
tower := h.newTower()
|
||||
require.Len(h.t, tower.LNAddrs(), 1)
|
||||
towerAddr := tower.LNAddrs()[0]
|
||||
require.Len(h.t, tower.Addresses, 1)
|
||||
towerAddr := &lnwire.NetAddress{
|
||||
IdentityKey: tower.IdentityKey,
|
||||
Address: tower.Addresses[0],
|
||||
}
|
||||
|
||||
// Load the tower from the database and assert that it matches the tower
|
||||
// we created.
|
||||
|
||||
@@ -4,7 +4,6 @@ import (
|
||||
"fmt"
|
||||
"io"
|
||||
|
||||
"github.com/lightningnetwork/lnd/keychain"
|
||||
"github.com/lightningnetwork/lnd/lnwire"
|
||||
"github.com/lightningnetwork/lnd/watchtower/blob"
|
||||
"github.com/lightningnetwork/lnd/watchtower/wtpolicy"
|
||||
@@ -36,19 +35,6 @@ type ClientSession struct {
|
||||
ID SessionID
|
||||
|
||||
ClientSessionBody
|
||||
|
||||
// Tower holds the pubkey and address of the watchtower.
|
||||
//
|
||||
// NOTE: This value is not serialized. It is recovered by looking up the
|
||||
// tower with TowerID.
|
||||
Tower *Tower
|
||||
|
||||
// SessionKeyECDH is the ECDH capable wrapper of the ephemeral secret
|
||||
// key used to connect to the watchtower.
|
||||
//
|
||||
// NOTE: This value is not serialized. It is derived using the KeyIndex
|
||||
// on startup to avoid storing private keys on disk.
|
||||
SessionKeyECDH keychain.SingleKeyECDH
|
||||
}
|
||||
|
||||
// ClientSessionBody represents the primary components of a ClientSession that
|
||||
|
||||
@@ -7,7 +7,6 @@ import (
|
||||
"net"
|
||||
|
||||
"github.com/btcsuite/btcd/btcec/v2"
|
||||
"github.com/lightningnetwork/lnd/lnwire"
|
||||
)
|
||||
|
||||
// TowerID is a unique 64-bit identifier allocated to each unique watchtower.
|
||||
@@ -77,23 +76,6 @@ func (t *Tower) RemoveAddress(addr net.Addr) {
|
||||
}
|
||||
}
|
||||
|
||||
// LNAddrs generates a list of lnwire.NetAddress from a Tower instance's
|
||||
// addresses. This can be used to have a client try multiple addresses for the
|
||||
// same Tower.
|
||||
//
|
||||
// NOTE: This method is NOT safe for concurrent use.
|
||||
func (t *Tower) LNAddrs() []*lnwire.NetAddress {
|
||||
addrs := make([]*lnwire.NetAddress, 0, len(t.Addresses))
|
||||
for _, addr := range t.Addresses {
|
||||
addrs = append(addrs, &lnwire.NetAddress{
|
||||
IdentityKey: t.IdentityKey,
|
||||
Address: addr,
|
||||
})
|
||||
}
|
||||
|
||||
return addrs
|
||||
}
|
||||
|
||||
// String returns a user-friendly identifier of the tower.
|
||||
func (t *Tower) String() string {
|
||||
pubKey := hex.EncodeToString(t.IdentityKey.SerializeCompressed())
|
||||
|
||||
Reference in new issue
Block a user