watchtower/multi: move BreachHint to blob pkg
This commit is contained in:
parent
8e6b903476
commit
1b89ba1782
@ -1,4 +1,4 @@
|
|||||||
package wtdb
|
package blob
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/hex"
|
"encoding/hex"
|
@ -4,6 +4,7 @@ import (
|
|||||||
"github.com/btcsuite/btcd/chaincfg/chainhash"
|
"github.com/btcsuite/btcd/chaincfg/chainhash"
|
||||||
"github.com/btcsuite/btcd/wire"
|
"github.com/btcsuite/btcd/wire"
|
||||||
"github.com/lightningnetwork/lnd/chainntnfs"
|
"github.com/lightningnetwork/lnd/chainntnfs"
|
||||||
|
"github.com/lightningnetwork/lnd/watchtower/blob"
|
||||||
"github.com/lightningnetwork/lnd/watchtower/wtdb"
|
"github.com/lightningnetwork/lnd/watchtower/wtdb"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -37,7 +38,7 @@ type DB interface {
|
|||||||
// QueryMatches searches its database for any state updates matching the
|
// QueryMatches searches its database for any state updates matching the
|
||||||
// provided breach hints. If any matches are found, they will be
|
// provided breach hints. If any matches are found, they will be
|
||||||
// returned along with encrypted blobs so that justice can be exacted.
|
// returned along with encrypted blobs so that justice can be exacted.
|
||||||
QueryMatches([]wtdb.BreachHint) ([]wtdb.Match, error)
|
QueryMatches([]blob.BreachHint) ([]wtdb.Match, error)
|
||||||
|
|
||||||
// SetLookoutTip writes the best epoch for which the watchtower has
|
// SetLookoutTip writes the best epoch for which the watchtower has
|
||||||
// queried for breach hints.
|
// queried for breach hints.
|
||||||
|
@ -7,7 +7,6 @@ import (
|
|||||||
"github.com/btcsuite/btcd/wire"
|
"github.com/btcsuite/btcd/wire"
|
||||||
"github.com/lightningnetwork/lnd/chainntnfs"
|
"github.com/lightningnetwork/lnd/chainntnfs"
|
||||||
"github.com/lightningnetwork/lnd/watchtower/blob"
|
"github.com/lightningnetwork/lnd/watchtower/blob"
|
||||||
"github.com/lightningnetwork/lnd/watchtower/wtdb"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// Config houses the Lookout's required resources to properly fulfill it's duty,
|
// Config houses the Lookout's required resources to properly fulfill it's duty,
|
||||||
@ -159,11 +158,11 @@ func (l *Lookout) processEpoch(epoch *chainntnfs.BlockEpoch,
|
|||||||
// Iterate over the transactions contained in the block, deriving a
|
// Iterate over the transactions contained in the block, deriving a
|
||||||
// breach hint for each transaction and constructing an index mapping
|
// breach hint for each transaction and constructing an index mapping
|
||||||
// the hint back to it's original transaction.
|
// the hint back to it's original transaction.
|
||||||
hintToTx := make(map[wtdb.BreachHint]*wire.MsgTx, numTxnsInBlock)
|
hintToTx := make(map[blob.BreachHint]*wire.MsgTx, numTxnsInBlock)
|
||||||
txHints := make([]wtdb.BreachHint, 0, numTxnsInBlock)
|
txHints := make([]blob.BreachHint, 0, numTxnsInBlock)
|
||||||
for _, tx := range block.Transactions {
|
for _, tx := range block.Transactions {
|
||||||
hash := tx.TxHash()
|
hash := tx.TxHash()
|
||||||
hint := wtdb.NewBreachHintFromHash(&hash)
|
hint := blob.NewBreachHintFromHash(&hash)
|
||||||
|
|
||||||
txHints = append(txHints, hint)
|
txHints = append(txHints, hint)
|
||||||
hintToTx[hint] = tx
|
hintToTx[hint] = tx
|
||||||
|
@ -163,13 +163,13 @@ func TestLookoutBreachMatching(t *testing.T) {
|
|||||||
// Add both state updates to the tower's database.
|
// Add both state updates to the tower's database.
|
||||||
txBlob1 := &wtdb.SessionStateUpdate{
|
txBlob1 := &wtdb.SessionStateUpdate{
|
||||||
ID: makeArray33(1),
|
ID: makeArray33(1),
|
||||||
Hint: wtdb.NewBreachHintFromHash(&hash1),
|
Hint: blob.NewBreachHintFromHash(&hash1),
|
||||||
EncryptedBlob: encBlob1,
|
EncryptedBlob: encBlob1,
|
||||||
SeqNum: 1,
|
SeqNum: 1,
|
||||||
}
|
}
|
||||||
txBlob2 := &wtdb.SessionStateUpdate{
|
txBlob2 := &wtdb.SessionStateUpdate{
|
||||||
ID: makeArray33(2),
|
ID: makeArray33(2),
|
||||||
Hint: wtdb.NewBreachHintFromHash(&hash2),
|
Hint: blob.NewBreachHintFromHash(&hash2),
|
||||||
EncryptedBlob: encBlob2,
|
EncryptedBlob: encBlob2,
|
||||||
SeqNum: 1,
|
SeqNum: 1,
|
||||||
}
|
}
|
||||||
|
@ -173,9 +173,9 @@ func (t *backupTask) bindSession(session *wtdb.ClientSessionBody) error {
|
|||||||
// required pieces from signatures, witness scripts, etc are then packaged into
|
// required pieces from signatures, witness scripts, etc are then packaged into
|
||||||
// a JusticeKit and encrypted using the breach transaction's key.
|
// a JusticeKit and encrypted using the breach transaction's key.
|
||||||
func (t *backupTask) craftSessionPayload(
|
func (t *backupTask) craftSessionPayload(
|
||||||
signer input.Signer) (wtdb.BreachHint, []byte, error) {
|
signer input.Signer) (blob.BreachHint, []byte, error) {
|
||||||
|
|
||||||
var hint wtdb.BreachHint
|
var hint blob.BreachHint
|
||||||
|
|
||||||
// First, copy over the sweep pkscript, the pubkeys used to derive the
|
// First, copy over the sweep pkscript, the pubkeys used to derive the
|
||||||
// to-local script, and the remote CSV delay.
|
// to-local script, and the remote CSV delay.
|
||||||
@ -290,7 +290,7 @@ func (t *backupTask) craftSessionPayload(
|
|||||||
// Finally, compute the breach hint, taken as the first half of the
|
// Finally, compute the breach hint, taken as the first half of the
|
||||||
// breach transactions txid. Once the tower sees the breach transaction
|
// breach transactions txid. Once the tower sees the breach transaction
|
||||||
// on the network, it can use the full txid to decyrpt the blob.
|
// on the network, it can use the full txid to decyrpt the blob.
|
||||||
hint = wtdb.NewBreachHintFromHash(&breachKey)
|
hint = blob.NewBreachHintFromHash(&breachKey)
|
||||||
|
|
||||||
return hint, encBlob, nil
|
return hint, encBlob, nil
|
||||||
}
|
}
|
||||||
|
@ -516,7 +516,7 @@ func testBackupTask(t *testing.T, test backupTaskTest) {
|
|||||||
|
|
||||||
// Verify that the breach hint matches the breach txid's prefix.
|
// Verify that the breach hint matches the breach txid's prefix.
|
||||||
breachTxID := test.breachInfo.BreachTransaction.TxHash()
|
breachTxID := test.breachInfo.BreachTransaction.TxHash()
|
||||||
expHint := wtdb.NewBreachHintFromHash(&breachTxID)
|
expHint := blob.NewBreachHintFromHash(&breachTxID)
|
||||||
if hint != expHint {
|
if hint != expHint {
|
||||||
t.Fatalf("breach hint mismatch, want: %x, got: %v",
|
t.Fatalf("breach hint mismatch, want: %x, got: %v",
|
||||||
expHint, hint)
|
expHint, hint)
|
||||||
|
@ -576,17 +576,17 @@ func (h *testHarness) registerChannel(id uint64) {
|
|||||||
// advanceChannelN calls advanceState on the channel identified by id the number
|
// advanceChannelN calls advanceState on the channel identified by id the number
|
||||||
// of provided times and returns the breach hints corresponding to the new
|
// of provided times and returns the breach hints corresponding to the new
|
||||||
// states.
|
// states.
|
||||||
func (h *testHarness) advanceChannelN(id uint64, n int) []wtdb.BreachHint {
|
func (h *testHarness) advanceChannelN(id uint64, n int) []blob.BreachHint {
|
||||||
h.t.Helper()
|
h.t.Helper()
|
||||||
|
|
||||||
channel := h.channel(id)
|
channel := h.channel(id)
|
||||||
|
|
||||||
var hints []wtdb.BreachHint
|
var hints []blob.BreachHint
|
||||||
for i := uint64(0); i < uint64(n); i++ {
|
for i := uint64(0); i < uint64(n); i++ {
|
||||||
channel.advanceState(h.t)
|
channel.advanceState(h.t)
|
||||||
commitTx, _ := h.channel(id).getState(i)
|
commitTx, _ := h.channel(id).getState(i)
|
||||||
breachTxID := commitTx.TxHash()
|
breachTxID := commitTx.TxHash()
|
||||||
hints = append(hints, wtdb.NewBreachHintFromHash(&breachTxID))
|
hints = append(hints, blob.NewBreachHintFromHash(&breachTxID))
|
||||||
}
|
}
|
||||||
|
|
||||||
return hints
|
return hints
|
||||||
@ -621,18 +621,18 @@ func (h *testHarness) backupState(id, i uint64, expErr error) {
|
|||||||
// party for each state in from-to times and returns the breach hints for states
|
// party for each state in from-to times and returns the breach hints for states
|
||||||
// [from, to).
|
// [from, to).
|
||||||
func (h *testHarness) sendPayments(id, from, to uint64,
|
func (h *testHarness) sendPayments(id, from, to uint64,
|
||||||
amt lnwire.MilliSatoshi) []wtdb.BreachHint {
|
amt lnwire.MilliSatoshi) []blob.BreachHint {
|
||||||
|
|
||||||
h.t.Helper()
|
h.t.Helper()
|
||||||
|
|
||||||
channel := h.channel(id)
|
channel := h.channel(id)
|
||||||
|
|
||||||
var hints []wtdb.BreachHint
|
var hints []blob.BreachHint
|
||||||
for i := from; i < to; i++ {
|
for i := from; i < to; i++ {
|
||||||
h.channel(id).sendPayment(h.t, amt)
|
h.channel(id).sendPayment(h.t, amt)
|
||||||
commitTx, _ := channel.getState(i)
|
commitTx, _ := channel.getState(i)
|
||||||
breachTxID := commitTx.TxHash()
|
breachTxID := commitTx.TxHash()
|
||||||
hints = append(hints, wtdb.NewBreachHintFromHash(&breachTxID))
|
hints = append(hints, blob.NewBreachHintFromHash(&breachTxID))
|
||||||
}
|
}
|
||||||
|
|
||||||
return hints
|
return hints
|
||||||
@ -642,18 +642,18 @@ func (h *testHarness) sendPayments(id, from, to uint64,
|
|||||||
// remote party for each state in from-to times and returns the breach hints for
|
// remote party for each state in from-to times and returns the breach hints for
|
||||||
// states [from, to).
|
// states [from, to).
|
||||||
func (h *testHarness) recvPayments(id, from, to uint64,
|
func (h *testHarness) recvPayments(id, from, to uint64,
|
||||||
amt lnwire.MilliSatoshi) []wtdb.BreachHint {
|
amt lnwire.MilliSatoshi) []blob.BreachHint {
|
||||||
|
|
||||||
h.t.Helper()
|
h.t.Helper()
|
||||||
|
|
||||||
channel := h.channel(id)
|
channel := h.channel(id)
|
||||||
|
|
||||||
var hints []wtdb.BreachHint
|
var hints []blob.BreachHint
|
||||||
for i := from; i < to; i++ {
|
for i := from; i < to; i++ {
|
||||||
channel.receivePayment(h.t, amt)
|
channel.receivePayment(h.t, amt)
|
||||||
commitTx, _ := channel.getState(i)
|
commitTx, _ := channel.getState(i)
|
||||||
breachTxID := commitTx.TxHash()
|
breachTxID := commitTx.TxHash()
|
||||||
hints = append(hints, wtdb.NewBreachHintFromHash(&breachTxID))
|
hints = append(hints, blob.NewBreachHintFromHash(&breachTxID))
|
||||||
}
|
}
|
||||||
|
|
||||||
return hints
|
return hints
|
||||||
@ -662,7 +662,7 @@ func (h *testHarness) recvPayments(id, from, to uint64,
|
|||||||
// waitServerUpdates blocks until the breach hints provided all appear in the
|
// waitServerUpdates blocks until the breach hints provided all appear in the
|
||||||
// watchtower's database or the timeout expires. This is used to test that the
|
// watchtower's database or the timeout expires. This is used to test that the
|
||||||
// client in fact sends the updates to the server, even if it is offline.
|
// client in fact sends the updates to the server, even if it is offline.
|
||||||
func (h *testHarness) waitServerUpdates(hints []wtdb.BreachHint,
|
func (h *testHarness) waitServerUpdates(hints []blob.BreachHint,
|
||||||
timeout time.Duration) {
|
timeout time.Duration) {
|
||||||
|
|
||||||
h.t.Helper()
|
h.t.Helper()
|
||||||
@ -671,7 +671,7 @@ func (h *testHarness) waitServerUpdates(hints []wtdb.BreachHint,
|
|||||||
// assert that no updates appear.
|
// assert that no updates appear.
|
||||||
wantUpdates := len(hints) > 0
|
wantUpdates := len(hints) > 0
|
||||||
|
|
||||||
hintSet := make(map[wtdb.BreachHint]struct{})
|
hintSet := make(map[blob.BreachHint]struct{})
|
||||||
for _, hint := range hints {
|
for _, hint := range hints {
|
||||||
hintSet[hint] = struct{}{}
|
hintSet[hint] = struct{}{}
|
||||||
}
|
}
|
||||||
@ -737,7 +737,7 @@ func (h *testHarness) waitServerUpdates(hints []wtdb.BreachHint,
|
|||||||
// assertUpdatesForPolicy queries the server db for matches using the provided
|
// assertUpdatesForPolicy queries the server db for matches using the provided
|
||||||
// breach hints, then asserts that each match has a session with the expected
|
// breach hints, then asserts that each match has a session with the expected
|
||||||
// policy.
|
// policy.
|
||||||
func (h *testHarness) assertUpdatesForPolicy(hints []wtdb.BreachHint,
|
func (h *testHarness) assertUpdatesForPolicy(hints []blob.BreachHint,
|
||||||
expPolicy wtpolicy.Policy) {
|
expPolicy wtpolicy.Policy) {
|
||||||
|
|
||||||
// Query for matches on the provided hints.
|
// Query for matches on the provided hints.
|
||||||
@ -1113,7 +1113,7 @@ var clientTests = []clientTest{
|
|||||||
|
|
||||||
// Generate the retributions for all 10 channels and
|
// Generate the retributions for all 10 channels and
|
||||||
// collect the breach hints.
|
// collect the breach hints.
|
||||||
var hints []wtdb.BreachHint
|
var hints []blob.BreachHint
|
||||||
for id := uint64(0); id < 10; id++ {
|
for id := uint64(0); id < 10; id++ {
|
||||||
chanHints := h.advanceChannelN(id, numUpdates)
|
chanHints := h.advanceChannelN(id, numUpdates)
|
||||||
hints = append(hints, chanHints...)
|
hints = append(hints, chanHints...)
|
||||||
|
@ -664,7 +664,7 @@ func randCommittedUpdate(t *testing.T, seqNum uint16) *wtdb.CommittedUpdate {
|
|||||||
t.Fatalf("unable to generate chan id: %v", err)
|
t.Fatalf("unable to generate chan id: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
var hint wtdb.BreachHint
|
var hint blob.BreachHint
|
||||||
if _, err := io.ReadFull(crand.Reader, hint[:]); err != nil {
|
if _, err := io.ReadFull(crand.Reader, hint[:]); err != nil {
|
||||||
t.Fatalf("unable to generate breach hint: %v", err)
|
t.Fatalf("unable to generate breach hint: %v", err)
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,7 @@ import (
|
|||||||
|
|
||||||
"github.com/btcsuite/btcd/btcec"
|
"github.com/btcsuite/btcd/btcec"
|
||||||
"github.com/lightningnetwork/lnd/lnwire"
|
"github.com/lightningnetwork/lnd/lnwire"
|
||||||
|
"github.com/lightningnetwork/lnd/watchtower/blob"
|
||||||
"github.com/lightningnetwork/lnd/watchtower/wtpolicy"
|
"github.com/lightningnetwork/lnd/watchtower/wtpolicy"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -178,7 +179,7 @@ type CommittedUpdateBody struct {
|
|||||||
BackupID BackupID
|
BackupID BackupID
|
||||||
|
|
||||||
// Hint is the 16-byte prefix of the revoked commitment transaction ID.
|
// Hint is the 16-byte prefix of the revoked commitment transaction ID.
|
||||||
Hint BreachHint
|
Hint blob.BreachHint
|
||||||
|
|
||||||
// EncryptedBlob is a ciphertext containing the sweep information for
|
// EncryptedBlob is a ciphertext containing the sweep information for
|
||||||
// exacting justice if the commitment transaction matching the breach
|
// exacting justice if the commitment transaction matching the breach
|
||||||
|
@ -36,7 +36,7 @@ func ReadElement(r io.Reader, element interface{}) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
case *BreachHint:
|
case *blob.BreachHint:
|
||||||
if _, err := io.ReadFull(r, e[:]); err != nil {
|
if _, err := io.ReadFull(r, e[:]); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -94,7 +94,7 @@ func WriteElement(w io.Writer, element interface{}) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
case BreachHint:
|
case blob.BreachHint:
|
||||||
if _, err := w.Write(e[:]); err != nil {
|
if _, err := w.Write(e[:]); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,7 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"io"
|
"io"
|
||||||
|
|
||||||
|
"github.com/lightningnetwork/lnd/watchtower/blob"
|
||||||
"github.com/lightningnetwork/lnd/watchtower/wtpolicy"
|
"github.com/lightningnetwork/lnd/watchtower/wtpolicy"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -134,7 +135,7 @@ type Match struct {
|
|||||||
SeqNum uint16
|
SeqNum uint16
|
||||||
|
|
||||||
// Hint is the breach hint that triggered the match.
|
// Hint is the breach hint that triggered the match.
|
||||||
Hint BreachHint
|
Hint blob.BreachHint
|
||||||
|
|
||||||
// EncryptedBlob is the encrypted payload containing the justice kit
|
// EncryptedBlob is the encrypted payload containing the justice kit
|
||||||
// uploaded by the client.
|
// uploaded by the client.
|
||||||
|
@ -1,6 +1,10 @@
|
|||||||
package wtdb
|
package wtdb
|
||||||
|
|
||||||
import "io"
|
import (
|
||||||
|
"io"
|
||||||
|
|
||||||
|
"github.com/lightningnetwork/lnd/watchtower/blob"
|
||||||
|
)
|
||||||
|
|
||||||
// SessionStateUpdate holds a state update sent by a client along with its
|
// SessionStateUpdate holds a state update sent by a client along with its
|
||||||
// SessionID.
|
// SessionID.
|
||||||
@ -16,7 +20,7 @@ type SessionStateUpdate struct {
|
|||||||
LastApplied uint16
|
LastApplied uint16
|
||||||
|
|
||||||
// Hint is the 16-byte prefix of the revoked commitment transaction.
|
// Hint is the 16-byte prefix of the revoked commitment transaction.
|
||||||
Hint BreachHint
|
Hint blob.BreachHint
|
||||||
|
|
||||||
// EncryptedBlob is a ciphertext containing the sweep information for
|
// EncryptedBlob is a ciphertext containing the sweep information for
|
||||||
// exacting justice if the commitment transaction matching the breach
|
// exacting justice if the commitment transaction matching the breach
|
||||||
|
@ -7,6 +7,7 @@ import (
|
|||||||
"github.com/btcsuite/btcd/chaincfg/chainhash"
|
"github.com/btcsuite/btcd/chaincfg/chainhash"
|
||||||
"github.com/coreos/bbolt"
|
"github.com/coreos/bbolt"
|
||||||
"github.com/lightningnetwork/lnd/chainntnfs"
|
"github.com/lightningnetwork/lnd/chainntnfs"
|
||||||
|
"github.com/lightningnetwork/lnd/watchtower/blob"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@ -369,7 +370,7 @@ func (t *TowerDB) DeleteSession(target SessionID) error {
|
|||||||
// QueryMatches searches against all known state updates for any that match the
|
// QueryMatches searches against all known state updates for any that match the
|
||||||
// passed breachHints. More than one Match will be returned for a given hint if
|
// passed breachHints. More than one Match will be returned for a given hint if
|
||||||
// they exist in the database.
|
// they exist in the database.
|
||||||
func (t *TowerDB) QueryMatches(breachHints []BreachHint) ([]Match, error) {
|
func (t *TowerDB) QueryMatches(breachHints []blob.BreachHint) ([]Match, error) {
|
||||||
var matches []Match
|
var matches []Match
|
||||||
err := t.db.View(func(tx *bbolt.Tx) error {
|
err := t.db.View(func(tx *bbolt.Tx) error {
|
||||||
sessions := tx.Bucket(sessionsBkt)
|
sessions := tx.Bucket(sessionsBkt)
|
||||||
@ -534,20 +535,20 @@ func removeSessionHintBkt(updateIndex *bbolt.Bucket, id *SessionID) error {
|
|||||||
// If the index for the session has not been initialized, this method returns
|
// If the index for the session has not been initialized, this method returns
|
||||||
// ErrNoSessionHintIndex.
|
// ErrNoSessionHintIndex.
|
||||||
func getHintsForSession(updateIndex *bbolt.Bucket,
|
func getHintsForSession(updateIndex *bbolt.Bucket,
|
||||||
id *SessionID) ([]BreachHint, error) {
|
id *SessionID) ([]blob.BreachHint, error) {
|
||||||
|
|
||||||
sessionHints := updateIndex.Bucket(id[:])
|
sessionHints := updateIndex.Bucket(id[:])
|
||||||
if sessionHints == nil {
|
if sessionHints == nil {
|
||||||
return nil, ErrNoSessionHintIndex
|
return nil, ErrNoSessionHintIndex
|
||||||
}
|
}
|
||||||
|
|
||||||
var hints []BreachHint
|
var hints []blob.BreachHint
|
||||||
err := sessionHints.ForEach(func(k, _ []byte) error {
|
err := sessionHints.ForEach(func(k, _ []byte) error {
|
||||||
if len(k) != BreachHintSize {
|
if len(k) != blob.BreachHintSize {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
var hint BreachHint
|
var hint blob.BreachHint
|
||||||
copy(hint[:], k)
|
copy(hint[:], k)
|
||||||
hints = append(hints, hint)
|
hints = append(hints, hint)
|
||||||
return nil
|
return nil
|
||||||
@ -565,7 +566,7 @@ func getHintsForSession(updateIndex *bbolt.Bucket,
|
|||||||
// for the session has not been initialized, this method returns
|
// for the session has not been initialized, this method returns
|
||||||
// ErrNoSessionHintIndex.
|
// ErrNoSessionHintIndex.
|
||||||
func putHintForSession(updateIndex *bbolt.Bucket, id *SessionID,
|
func putHintForSession(updateIndex *bbolt.Bucket, id *SessionID,
|
||||||
hint BreachHint) error {
|
hint blob.BreachHint) error {
|
||||||
|
|
||||||
sessionHints := updateIndex.Bucket(id[:])
|
sessionHints := updateIndex.Bucket(id[:])
|
||||||
if sessionHints == nil {
|
if sessionHints == nil {
|
||||||
|
@ -10,6 +10,7 @@ import (
|
|||||||
"github.com/btcsuite/btcd/chaincfg/chainhash"
|
"github.com/btcsuite/btcd/chaincfg/chainhash"
|
||||||
"github.com/lightningnetwork/lnd/chainntnfs"
|
"github.com/lightningnetwork/lnd/chainntnfs"
|
||||||
"github.com/lightningnetwork/lnd/watchtower"
|
"github.com/lightningnetwork/lnd/watchtower"
|
||||||
|
"github.com/lightningnetwork/lnd/watchtower/blob"
|
||||||
"github.com/lightningnetwork/lnd/watchtower/wtdb"
|
"github.com/lightningnetwork/lnd/watchtower/wtdb"
|
||||||
"github.com/lightningnetwork/lnd/watchtower/wtmock"
|
"github.com/lightningnetwork/lnd/watchtower/wtmock"
|
||||||
"github.com/lightningnetwork/lnd/watchtower/wtpolicy"
|
"github.com/lightningnetwork/lnd/watchtower/wtpolicy"
|
||||||
@ -97,10 +98,10 @@ func (h *towerDBHarness) deleteSession(id wtdb.SessionID, expErr error) {
|
|||||||
|
|
||||||
// queryMatches queries that database for the passed breach hint, returning all
|
// queryMatches queries that database for the passed breach hint, returning all
|
||||||
// matches found.
|
// matches found.
|
||||||
func (h *towerDBHarness) queryMatches(hint wtdb.BreachHint) []wtdb.Match {
|
func (h *towerDBHarness) queryMatches(hint blob.BreachHint) []wtdb.Match {
|
||||||
h.t.Helper()
|
h.t.Helper()
|
||||||
|
|
||||||
matches, err := h.db.QueryMatches([]wtdb.BreachHint{hint})
|
matches, err := h.db.QueryMatches([]blob.BreachHint{hint})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
h.t.Fatalf("unable to query matches: %v", err)
|
h.t.Fatalf("unable to query matches: %v", err)
|
||||||
}
|
}
|
||||||
@ -111,7 +112,7 @@ func (h *towerDBHarness) queryMatches(hint wtdb.BreachHint) []wtdb.Match {
|
|||||||
// hasUpdate queries the database for the passed breach hint, asserting that
|
// hasUpdate queries the database for the passed breach hint, asserting that
|
||||||
// only one match is present and that the hints indeed match. If successful, the
|
// only one match is present and that the hints indeed match. If successful, the
|
||||||
// match is returned.
|
// match is returned.
|
||||||
func (h *towerDBHarness) hasUpdate(hint wtdb.BreachHint) wtdb.Match {
|
func (h *towerDBHarness) hasUpdate(hint blob.BreachHint) wtdb.Match {
|
||||||
h.t.Helper()
|
h.t.Helper()
|
||||||
|
|
||||||
matches := h.queryMatches(hint)
|
matches := h.queryMatches(hint)
|
||||||
@ -169,7 +170,7 @@ func testMultipleMatches(h *towerDBHarness) {
|
|||||||
const numUpdates = 3
|
const numUpdates = 3
|
||||||
|
|
||||||
// Create a new session and send updates with all the same hint.
|
// Create a new session and send updates with all the same hint.
|
||||||
var hint wtdb.BreachHint
|
var hint blob.BreachHint
|
||||||
for i := 0; i < numUpdates; i++ {
|
for i := 0; i < numUpdates; i++ {
|
||||||
id := *id(i)
|
id := *id(i)
|
||||||
session := &wtdb.SessionInfo{
|
session := &wtdb.SessionInfo{
|
||||||
@ -291,7 +292,7 @@ func testDeleteSession(h *towerDBHarness) {
|
|||||||
h.insertSession(session1, nil)
|
h.insertSession(session1, nil)
|
||||||
|
|
||||||
// Create and insert updates for both sessions that have the same hint.
|
// Create and insert updates for both sessions that have the same hint.
|
||||||
var hint wtdb.BreachHint
|
var hint blob.BreachHint
|
||||||
update0 := &wtdb.SessionStateUpdate{
|
update0 := &wtdb.SessionStateUpdate{
|
||||||
ID: *id0,
|
ID: *id0,
|
||||||
Hint: hint,
|
Hint: hint,
|
||||||
@ -705,7 +706,7 @@ func updateFromInt(id *wtdb.SessionID, i int,
|
|||||||
lastApplied uint16) *wtdb.SessionStateUpdate {
|
lastApplied uint16) *wtdb.SessionStateUpdate {
|
||||||
|
|
||||||
// Ensure the hint is unique.
|
// Ensure the hint is unique.
|
||||||
var hint wtdb.BreachHint
|
var hint blob.BreachHint
|
||||||
copy(hint[:4], id[:4])
|
copy(hint[:4], id[:4])
|
||||||
binary.BigEndian.PutUint16(hint[4:6], uint16(i))
|
binary.BigEndian.PutUint16(hint[4:6], uint16(i))
|
||||||
|
|
||||||
|
@ -4,6 +4,7 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"github.com/lightningnetwork/lnd/chainntnfs"
|
"github.com/lightningnetwork/lnd/chainntnfs"
|
||||||
|
"github.com/lightningnetwork/lnd/watchtower/blob"
|
||||||
"github.com/lightningnetwork/lnd/watchtower/wtdb"
|
"github.com/lightningnetwork/lnd/watchtower/wtdb"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -12,14 +13,14 @@ type TowerDB struct {
|
|||||||
mu sync.Mutex
|
mu sync.Mutex
|
||||||
lastEpoch *chainntnfs.BlockEpoch
|
lastEpoch *chainntnfs.BlockEpoch
|
||||||
sessions map[wtdb.SessionID]*wtdb.SessionInfo
|
sessions map[wtdb.SessionID]*wtdb.SessionInfo
|
||||||
blobs map[wtdb.BreachHint]map[wtdb.SessionID]*wtdb.SessionStateUpdate
|
blobs map[blob.BreachHint]map[wtdb.SessionID]*wtdb.SessionStateUpdate
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewTowerDB initializes a fresh mock TowerDB.
|
// NewTowerDB initializes a fresh mock TowerDB.
|
||||||
func NewTowerDB() *TowerDB {
|
func NewTowerDB() *TowerDB {
|
||||||
return &TowerDB{
|
return &TowerDB{
|
||||||
sessions: make(map[wtdb.SessionID]*wtdb.SessionInfo),
|
sessions: make(map[wtdb.SessionID]*wtdb.SessionInfo),
|
||||||
blobs: make(map[wtdb.BreachHint]map[wtdb.SessionID]*wtdb.SessionStateUpdate),
|
blobs: make(map[blob.BreachHint]map[wtdb.SessionID]*wtdb.SessionStateUpdate),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -113,7 +114,7 @@ func (db *TowerDB) DeleteSession(target wtdb.SessionID) error {
|
|||||||
// passed breachHints. More than one Match will be returned for a given hint if
|
// passed breachHints. More than one Match will be returned for a given hint if
|
||||||
// they exist in the database.
|
// they exist in the database.
|
||||||
func (db *TowerDB) QueryMatches(
|
func (db *TowerDB) QueryMatches(
|
||||||
breachHints []wtdb.BreachHint) ([]wtdb.Match, error) {
|
breachHints []blob.BreachHint) ([]wtdb.Match, error) {
|
||||||
|
|
||||||
db.mu.Lock()
|
db.mu.Lock()
|
||||||
defer db.mu.Unlock()
|
defer db.mu.Unlock()
|
||||||
|
Loading…
Reference in New Issue
Block a user