mirror of
https://github.com/lightningnetwork/lnd.git
synced 2025-03-29 19:22:40 +01:00
wtclinet+itest: expose anchor client via rpc + add itest
This commit is contained in:
parent
5b3a08a1cd
commit
b28bbc3223
@ -14,6 +14,8 @@ import (
|
|||||||
"github.com/lightningnetwork/lnd/lnwire"
|
"github.com/lightningnetwork/lnd/lnwire"
|
||||||
"github.com/lightningnetwork/lnd/watchtower"
|
"github.com/lightningnetwork/lnd/watchtower"
|
||||||
"github.com/lightningnetwork/lnd/watchtower/wtclient"
|
"github.com/lightningnetwork/lnd/watchtower/wtclient"
|
||||||
|
"github.com/lightningnetwork/lnd/watchtower/wtdb"
|
||||||
|
"github.com/lightningnetwork/lnd/watchtower/wtpolicy"
|
||||||
"google.golang.org/grpc"
|
"google.golang.org/grpc"
|
||||||
"gopkg.in/macaroon-bakery.v2/bakery"
|
"gopkg.in/macaroon-bakery.v2/bakery"
|
||||||
)
|
)
|
||||||
@ -176,9 +178,14 @@ func (c *WatchtowerClient) AddTower(ctx context.Context,
|
|||||||
IdentityKey: pubKey,
|
IdentityKey: pubKey,
|
||||||
Address: addr,
|
Address: addr,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO(conner): make atomic via multiplexed client
|
||||||
if err := c.cfg.Client.AddTower(towerAddr); err != nil {
|
if err := c.cfg.Client.AddTower(towerAddr); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
if err := c.cfg.AnchorClient.AddTower(towerAddr); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
return &AddTowerResponse{}, nil
|
return &AddTowerResponse{}, nil
|
||||||
}
|
}
|
||||||
@ -211,7 +218,13 @@ func (c *WatchtowerClient) RemoveTower(ctx context.Context,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := c.cfg.Client.RemoveTower(pubKey, addr); err != nil {
|
// TODO(conner): make atomic via multiplexed client
|
||||||
|
err = c.cfg.Client.RemoveTower(pubKey, addr)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
err = c.cfg.AnchorClient.RemoveTower(pubKey, addr)
|
||||||
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -226,11 +239,25 @@ func (c *WatchtowerClient) ListTowers(ctx context.Context,
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
towers, err := c.cfg.Client.RegisteredTowers()
|
anchorTowers, err := c.cfg.AnchorClient.RegisteredTowers()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
legacyTowers, err := c.cfg.Client.RegisteredTowers()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Filter duplicates.
|
||||||
|
towers := make(map[wtdb.TowerID]*wtclient.RegisteredTower)
|
||||||
|
for _, tower := range anchorTowers {
|
||||||
|
towers[tower.Tower.ID] = tower
|
||||||
|
}
|
||||||
|
for _, tower := range legacyTowers {
|
||||||
|
towers[tower.Tower.ID] = tower
|
||||||
|
}
|
||||||
|
|
||||||
rpcTowers := make([]*Tower, 0, len(towers))
|
rpcTowers := make([]*Tower, 0, len(towers))
|
||||||
for _, tower := range towers {
|
for _, tower := range towers {
|
||||||
rpcTower := marshallTower(tower, req.IncludeSessions)
|
rpcTower := marshallTower(tower, req.IncludeSessions)
|
||||||
@ -253,7 +280,11 @@ func (c *WatchtowerClient) GetTowerInfo(ctx context.Context,
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
tower, err := c.cfg.Client.LookupTower(pubKey)
|
var tower *wtclient.RegisteredTower
|
||||||
|
tower, err = c.cfg.Client.LookupTower(pubKey)
|
||||||
|
if err == wtdb.ErrTowerNotFound {
|
||||||
|
tower, err = c.cfg.AnchorClient.LookupTower(pubKey)
|
||||||
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -269,7 +300,24 @@ func (c *WatchtowerClient) Stats(ctx context.Context,
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
stats := c.cfg.Client.Stats()
|
clientStats := []wtclient.ClientStats{
|
||||||
|
c.cfg.Client.Stats(),
|
||||||
|
c.cfg.AnchorClient.Stats(),
|
||||||
|
}
|
||||||
|
|
||||||
|
var stats wtclient.ClientStats
|
||||||
|
for i := range clientStats {
|
||||||
|
// Grab a reference to the slice index rather than copying bc
|
||||||
|
// ClientStats contains a lock which cannot be copied by value.
|
||||||
|
stat := &clientStats[i]
|
||||||
|
|
||||||
|
stats.NumTasksAccepted += stat.NumTasksAccepted
|
||||||
|
stats.NumTasksIneligible += stat.NumTasksIneligible
|
||||||
|
stats.NumTasksReceived += stat.NumTasksReceived
|
||||||
|
stats.NumSessionsAcquired += stat.NumSessionsAcquired
|
||||||
|
stats.NumSessionsExhausted += stat.NumSessionsExhausted
|
||||||
|
}
|
||||||
|
|
||||||
return &StatsResponse{
|
return &StatsResponse{
|
||||||
NumBackups: uint32(stats.NumTasksAccepted),
|
NumBackups: uint32(stats.NumTasksAccepted),
|
||||||
NumFailedBackups: uint32(stats.NumTasksIneligible),
|
NumFailedBackups: uint32(stats.NumTasksIneligible),
|
||||||
@ -287,7 +335,17 @@ func (c *WatchtowerClient) Policy(ctx context.Context,
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
policy := c.cfg.Client.Policy()
|
var policy wtpolicy.Policy
|
||||||
|
switch req.PolicyType {
|
||||||
|
case PolicyType_LEGACY:
|
||||||
|
policy = c.cfg.Client.Policy()
|
||||||
|
case PolicyType_ANCHOR:
|
||||||
|
policy = c.cfg.AnchorClient.Policy()
|
||||||
|
default:
|
||||||
|
return nil, fmt.Errorf("unknown policy type: %v",
|
||||||
|
req.PolicyType)
|
||||||
|
}
|
||||||
|
|
||||||
return &PolicyResponse{
|
return &PolicyResponse{
|
||||||
MaxUpdates: uint32(policy.MaxUpdates),
|
MaxUpdates: uint32(policy.MaxUpdates),
|
||||||
SweepSatPerByte: uint32(policy.SweepFeeRate.FeePerKVByte() / 1000),
|
SweepSatPerByte: uint32(policy.SweepFeeRate.FeePerKVByte() / 1000),
|
||||||
|
@ -9071,6 +9071,19 @@ func testRevokedCloseRetributionRemoteHodl(net *lntest.NetworkHarness,
|
|||||||
func testRevokedCloseRetributionAltruistWatchtower(net *lntest.NetworkHarness,
|
func testRevokedCloseRetributionAltruistWatchtower(net *lntest.NetworkHarness,
|
||||||
t *harnessTest) {
|
t *harnessTest) {
|
||||||
|
|
||||||
|
t.t.Run("anchors", func(tt *testing.T) {
|
||||||
|
ht := newHarnessTest(tt, net)
|
||||||
|
testRevokedCloseRetributionAltruistWatchtowerCase(net, ht, true)
|
||||||
|
})
|
||||||
|
t.t.Run("legacy", func(tt *testing.T) {
|
||||||
|
ht := newHarnessTest(tt, net)
|
||||||
|
testRevokedCloseRetributionAltruistWatchtowerCase(net, ht, false)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func testRevokedCloseRetributionAltruistWatchtowerCase(
|
||||||
|
net *lntest.NetworkHarness, t *harnessTest, anchors bool) {
|
||||||
|
|
||||||
ctxb := context.Background()
|
ctxb := context.Background()
|
||||||
const (
|
const (
|
||||||
chanAmt = lnd.MaxBtcFundingAmount
|
chanAmt = lnd.MaxBtcFundingAmount
|
||||||
@ -9081,7 +9094,11 @@ func testRevokedCloseRetributionAltruistWatchtower(net *lntest.NetworkHarness,
|
|||||||
|
|
||||||
// Since we'd like to test some multi-hop failure scenarios, we'll
|
// Since we'd like to test some multi-hop failure scenarios, we'll
|
||||||
// introduce another node into our test network: Carol.
|
// introduce another node into our test network: Carol.
|
||||||
carol, err := net.NewNode("Carol", []string{"--hodl.exit-settle"})
|
carolArgs := []string{"--hodl.exit-settle"}
|
||||||
|
if anchors {
|
||||||
|
carolArgs = append(carolArgs, "--protocol.anchors")
|
||||||
|
}
|
||||||
|
carol, err := net.NewNode("Carol", carolArgs)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("unable to create new nodes: %v", err)
|
t.Fatalf("unable to create new nodes: %v", err)
|
||||||
}
|
}
|
||||||
@ -9134,10 +9151,14 @@ func testRevokedCloseRetributionAltruistWatchtower(net *lntest.NetworkHarness,
|
|||||||
// Dave will be the breached party. We set --nolisten to ensure Carol
|
// Dave will be the breached party. We set --nolisten to ensure Carol
|
||||||
// won't be able to connect to him and trigger the channel data
|
// won't be able to connect to him and trigger the channel data
|
||||||
// protection logic automatically.
|
// protection logic automatically.
|
||||||
dave, err := net.NewNode("Dave", []string{
|
daveArgs := []string{
|
||||||
"--nolisten",
|
"--nolisten",
|
||||||
"--wtclient.active",
|
"--wtclient.active",
|
||||||
})
|
}
|
||||||
|
if anchors {
|
||||||
|
daveArgs = append(daveArgs, "--protocol.anchors")
|
||||||
|
}
|
||||||
|
dave, err := net.NewNode("Dave", daveArgs)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("unable to create new node: %v", err)
|
t.Fatalf("unable to create new node: %v", err)
|
||||||
}
|
}
|
||||||
@ -9250,7 +9271,9 @@ func testRevokedCloseRetributionAltruistWatchtower(net *lntest.NetworkHarness,
|
|||||||
err = wait.NoError(func() error {
|
err = wait.NoError(func() error {
|
||||||
ctxt, cancel := context.WithTimeout(ctxb, defaultTimeout)
|
ctxt, cancel := context.WithTimeout(ctxb, defaultTimeout)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
bkpStats, err := dave.WatchtowerClient.Stats(ctxt, &wtclientrpc.StatsRequest{})
|
bkpStats, err := dave.WatchtowerClient.Stats(ctxt,
|
||||||
|
&wtclientrpc.StatsRequest{},
|
||||||
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user