multi: migrate instances of mockSigner to the mock package
This commit moves all localized instances of mock implementations of the Signer interface to the lntest/mock package. This allows us to remove a lot of code and have it housed under a single interface in many cases.
This commit is contained in:
parent
e4764a67cc
commit
49d8f04197
@ -29,6 +29,7 @@ import (
|
|||||||
"github.com/lightningnetwork/lnd/htlcswitch"
|
"github.com/lightningnetwork/lnd/htlcswitch"
|
||||||
"github.com/lightningnetwork/lnd/input"
|
"github.com/lightningnetwork/lnd/input"
|
||||||
"github.com/lightningnetwork/lnd/keychain"
|
"github.com/lightningnetwork/lnd/keychain"
|
||||||
|
"github.com/lightningnetwork/lnd/lntest/mock"
|
||||||
"github.com/lightningnetwork/lnd/lntest/wait"
|
"github.com/lightningnetwork/lnd/lntest/wait"
|
||||||
"github.com/lightningnetwork/lnd/lnwallet"
|
"github.com/lightningnetwork/lnd/lnwallet"
|
||||||
"github.com/lightningnetwork/lnd/lnwallet/chainfee"
|
"github.com/lightningnetwork/lnd/lnwallet/chainfee"
|
||||||
@ -1670,7 +1671,7 @@ func createTestArbiter(t *testing.T, contractBreaches chan *ContractBreachEvent,
|
|||||||
|
|
||||||
aliceKeyPriv, _ := btcec.PrivKeyFromBytes(btcec.S256(),
|
aliceKeyPriv, _ := btcec.PrivKeyFromBytes(btcec.S256(),
|
||||||
alicesPrivKey)
|
alicesPrivKey)
|
||||||
signer := &mockSigner{key: aliceKeyPriv}
|
signer := &mock.SingleSigner{Privkey: aliceKeyPriv}
|
||||||
|
|
||||||
// Assemble our test arbiter.
|
// Assemble our test arbiter.
|
||||||
notifier := makeMockSpendNotifier()
|
notifier := makeMockSpendNotifier()
|
||||||
@ -1897,8 +1898,8 @@ func createInitChannels(revocationWindow int) (*lnwallet.LightningChannel, *lnwa
|
|||||||
Packager: channeldb.NewChannelPackager(shortChanID),
|
Packager: channeldb.NewChannelPackager(shortChanID),
|
||||||
}
|
}
|
||||||
|
|
||||||
aliceSigner := &mockSigner{aliceKeyPriv}
|
aliceSigner := &mock.SingleSigner{Privkey: aliceKeyPriv}
|
||||||
bobSigner := &mockSigner{bobKeyPriv}
|
bobSigner := &mock.SingleSigner{Privkey: bobKeyPriv}
|
||||||
|
|
||||||
alicePool := lnwallet.NewSigPool(1, aliceSigner)
|
alicePool := lnwallet.NewSigPool(1, aliceSigner)
|
||||||
channelAlice, err := lnwallet.NewLightningChannel(
|
channelAlice, err := lnwallet.NewLightningChannel(
|
||||||
|
@ -7,7 +7,6 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/btcsuite/btcd/btcec"
|
|
||||||
"github.com/btcsuite/btcd/txscript"
|
"github.com/btcsuite/btcd/txscript"
|
||||||
"github.com/btcsuite/btcd/wire"
|
"github.com/btcsuite/btcd/wire"
|
||||||
"github.com/btcsuite/btcutil"
|
"github.com/btcsuite/btcutil"
|
||||||
@ -15,33 +14,11 @@ import (
|
|||||||
"github.com/lightningnetwork/lnd/channeldb"
|
"github.com/lightningnetwork/lnd/channeldb"
|
||||||
"github.com/lightningnetwork/lnd/channeldb/kvdb"
|
"github.com/lightningnetwork/lnd/channeldb/kvdb"
|
||||||
"github.com/lightningnetwork/lnd/input"
|
"github.com/lightningnetwork/lnd/input"
|
||||||
|
"github.com/lightningnetwork/lnd/lntest/mock"
|
||||||
"github.com/lightningnetwork/lnd/lntypes"
|
"github.com/lightningnetwork/lnd/lntypes"
|
||||||
"github.com/lightningnetwork/lnd/lnwallet"
|
"github.com/lightningnetwork/lnd/lnwallet"
|
||||||
)
|
)
|
||||||
|
|
||||||
type dummySignature struct{}
|
|
||||||
|
|
||||||
func (s *dummySignature) Serialize() []byte {
|
|
||||||
return []byte{}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *dummySignature) Verify(_ []byte, _ *btcec.PublicKey) bool {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
type mockSigner struct {
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *mockSigner) SignOutputRaw(tx *wire.MsgTx,
|
|
||||||
signDesc *input.SignDescriptor) (input.Signature, error) {
|
|
||||||
return &dummySignature{}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *mockSigner) ComputeInputScript(tx *wire.MsgTx,
|
|
||||||
signDesc *input.SignDescriptor) (*input.Script, error) {
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type mockWitnessBeacon struct {
|
type mockWitnessBeacon struct {
|
||||||
preImageUpdates chan lntypes.Preimage
|
preImageUpdates chan lntypes.Preimage
|
||||||
newPreimages chan []lntypes.Preimage
|
newPreimages chan []lntypes.Preimage
|
||||||
@ -93,7 +70,7 @@ func TestHtlcTimeoutResolver(t *testing.T) {
|
|||||||
|
|
||||||
copy(fakePreimage[:], fakePreimageBytes)
|
copy(fakePreimage[:], fakePreimageBytes)
|
||||||
|
|
||||||
signer := &mockSigner{}
|
signer := &mock.DummySigner{}
|
||||||
sweepTx := &wire.MsgTx{
|
sweepTx := &wire.MsgTx{
|
||||||
TxIn: []*wire.TxIn{
|
TxIn: []*wire.TxIn{
|
||||||
{
|
{
|
||||||
@ -164,7 +141,7 @@ func TestHtlcTimeoutResolver(t *testing.T) {
|
|||||||
timeout: true,
|
timeout: true,
|
||||||
txToBroadcast: func() (*wire.MsgTx, error) {
|
txToBroadcast: func() (*wire.MsgTx, error) {
|
||||||
witness, err := input.SenderHtlcSpendTimeout(
|
witness, err := input.SenderHtlcSpendTimeout(
|
||||||
&dummySignature{}, txscript.SigHashAll,
|
&mock.DummySignature{}, txscript.SigHashAll,
|
||||||
signer, fakeSignDesc, sweepTx,
|
signer, fakeSignDesc, sweepTx,
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -189,7 +166,7 @@ func TestHtlcTimeoutResolver(t *testing.T) {
|
|||||||
timeout: false,
|
timeout: false,
|
||||||
txToBroadcast: func() (*wire.MsgTx, error) {
|
txToBroadcast: func() (*wire.MsgTx, error) {
|
||||||
witness, err := input.ReceiverHtlcSpendRedeem(
|
witness, err := input.ReceiverHtlcSpendRedeem(
|
||||||
&dummySignature{}, txscript.SigHashAll,
|
&mock.DummySignature{}, txscript.SigHashAll,
|
||||||
fakePreimageBytes, signer, fakeSignDesc,
|
fakePreimageBytes, signer, fakeSignDesc,
|
||||||
sweepTx,
|
sweepTx,
|
||||||
)
|
)
|
||||||
|
@ -23,8 +23,8 @@ import (
|
|||||||
"github.com/go-errors/errors"
|
"github.com/go-errors/errors"
|
||||||
"github.com/lightningnetwork/lnd/chainntnfs"
|
"github.com/lightningnetwork/lnd/chainntnfs"
|
||||||
"github.com/lightningnetwork/lnd/channeldb"
|
"github.com/lightningnetwork/lnd/channeldb"
|
||||||
"github.com/lightningnetwork/lnd/input"
|
|
||||||
"github.com/lightningnetwork/lnd/lnpeer"
|
"github.com/lightningnetwork/lnd/lnpeer"
|
||||||
|
"github.com/lightningnetwork/lnd/lntest/mock"
|
||||||
"github.com/lightningnetwork/lnd/lntest/wait"
|
"github.com/lightningnetwork/lnd/lntest/wait"
|
||||||
"github.com/lightningnetwork/lnd/lnwire"
|
"github.com/lightningnetwork/lnd/lnwire"
|
||||||
"github.com/lightningnetwork/lnd/netann"
|
"github.com/lightningnetwork/lnd/netann"
|
||||||
@ -92,26 +92,6 @@ func makeTestDB() (*channeldb.DB, func(), error) {
|
|||||||
return cdb, cleanUp, nil
|
return cdb, cleanUp, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
type mockSigner struct {
|
|
||||||
privKey *btcec.PrivateKey
|
|
||||||
}
|
|
||||||
|
|
||||||
func (n *mockSigner) SignMessage(pubKey *btcec.PublicKey,
|
|
||||||
msg []byte) (input.Signature, error) {
|
|
||||||
|
|
||||||
if !pubKey.IsEqual(n.privKey.PubKey()) {
|
|
||||||
return nil, fmt.Errorf("unknown public key")
|
|
||||||
}
|
|
||||||
|
|
||||||
digest := chainhash.DoubleHashB(msg)
|
|
||||||
sign, err := n.privKey.Sign(digest)
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("can't sign the message: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
return sign, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type mockGraphSource struct {
|
type mockGraphSource struct {
|
||||||
bestHeight uint32
|
bestHeight uint32
|
||||||
|
|
||||||
@ -555,7 +535,7 @@ func createNodeAnnouncement(priv *btcec.PrivateKey,
|
|||||||
a.ExtraOpaqueData = extraBytes[0]
|
a.ExtraOpaqueData = extraBytes[0]
|
||||||
}
|
}
|
||||||
|
|
||||||
signer := mockSigner{priv}
|
signer := mock.SingleSigner{Privkey: priv}
|
||||||
sig, err := netann.SignAnnouncement(&signer, priv.PubKey(), a)
|
sig, err := netann.SignAnnouncement(&signer, priv.PubKey(), a)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -607,7 +587,7 @@ func createUpdateAnnouncement(blockHeight uint32,
|
|||||||
|
|
||||||
func signUpdate(nodeKey *btcec.PrivateKey, a *lnwire.ChannelUpdate) error {
|
func signUpdate(nodeKey *btcec.PrivateKey, a *lnwire.ChannelUpdate) error {
|
||||||
pub := nodeKey.PubKey()
|
pub := nodeKey.PubKey()
|
||||||
signer := mockSigner{nodeKey}
|
signer := mock.SingleSigner{Privkey: nodeKey}
|
||||||
sig, err := netann.SignAnnouncement(&signer, pub, a)
|
sig, err := netann.SignAnnouncement(&signer, pub, a)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@ -649,7 +629,7 @@ func createRemoteChannelAnnouncement(blockHeight uint32,
|
|||||||
a := createAnnouncementWithoutProof(blockHeight, extraBytes...)
|
a := createAnnouncementWithoutProof(blockHeight, extraBytes...)
|
||||||
|
|
||||||
pub := nodeKeyPriv1.PubKey()
|
pub := nodeKeyPriv1.PubKey()
|
||||||
signer := mockSigner{nodeKeyPriv1}
|
signer := mock.SingleSigner{Privkey: nodeKeyPriv1}
|
||||||
sig, err := netann.SignAnnouncement(&signer, pub, a)
|
sig, err := netann.SignAnnouncement(&signer, pub, a)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -660,7 +640,7 @@ func createRemoteChannelAnnouncement(blockHeight uint32,
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub = nodeKeyPriv2.PubKey()
|
pub = nodeKeyPriv2.PubKey()
|
||||||
signer = mockSigner{nodeKeyPriv2}
|
signer = mock.SingleSigner{Privkey: nodeKeyPriv2}
|
||||||
sig, err = netann.SignAnnouncement(&signer, pub, a)
|
sig, err = netann.SignAnnouncement(&signer, pub, a)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -671,7 +651,7 @@ func createRemoteChannelAnnouncement(blockHeight uint32,
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub = bitcoinKeyPriv1.PubKey()
|
pub = bitcoinKeyPriv1.PubKey()
|
||||||
signer = mockSigner{bitcoinKeyPriv1}
|
signer = mock.SingleSigner{Privkey: bitcoinKeyPriv1}
|
||||||
sig, err = netann.SignAnnouncement(&signer, pub, a)
|
sig, err = netann.SignAnnouncement(&signer, pub, a)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -682,7 +662,7 @@ func createRemoteChannelAnnouncement(blockHeight uint32,
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub = bitcoinKeyPriv2.PubKey()
|
pub = bitcoinKeyPriv2.PubKey()
|
||||||
signer = mockSigner{bitcoinKeyPriv2}
|
signer = mock.SingleSigner{Privkey: bitcoinKeyPriv2}
|
||||||
sig, err = netann.SignAnnouncement(&signer, pub, a)
|
sig, err = netann.SignAnnouncement(&signer, pub, a)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -761,7 +741,7 @@ func createTestCtx(startHeight uint32) (*testCtx, func(), error) {
|
|||||||
RotateTicker: ticker.NewForce(DefaultSyncerRotationInterval),
|
RotateTicker: ticker.NewForce(DefaultSyncerRotationInterval),
|
||||||
HistoricalSyncTicker: ticker.NewForce(DefaultHistoricalSyncInterval),
|
HistoricalSyncTicker: ticker.NewForce(DefaultHistoricalSyncInterval),
|
||||||
NumActiveSyncers: 3,
|
NumActiveSyncers: 3,
|
||||||
AnnSigner: &mockSigner{nodeKeyPriv1},
|
AnnSigner: &mock.SingleSigner{Privkey: nodeKeyPriv1},
|
||||||
SubBatchDelay: time.Second * 5,
|
SubBatchDelay: time.Second * 5,
|
||||||
MinimumBatchSize: 10,
|
MinimumBatchSize: 10,
|
||||||
}, nodeKeyPub1)
|
}, nodeKeyPub1)
|
||||||
|
@ -33,6 +33,7 @@ import (
|
|||||||
"github.com/lightningnetwork/lnd/keychain"
|
"github.com/lightningnetwork/lnd/keychain"
|
||||||
"github.com/lightningnetwork/lnd/lnpeer"
|
"github.com/lightningnetwork/lnd/lnpeer"
|
||||||
"github.com/lightningnetwork/lnd/lnrpc"
|
"github.com/lightningnetwork/lnd/lnrpc"
|
||||||
|
"github.com/lightningnetwork/lnd/lntest/mock"
|
||||||
"github.com/lightningnetwork/lnd/lnwallet"
|
"github.com/lightningnetwork/lnd/lnwallet"
|
||||||
"github.com/lightningnetwork/lnd/lnwallet/chainfee"
|
"github.com/lightningnetwork/lnd/lnwallet/chainfee"
|
||||||
"github.com/lightningnetwork/lnd/lnwire"
|
"github.com/lightningnetwork/lnd/lnwire"
|
||||||
@ -301,8 +302,8 @@ func createTestFundingManager(t *testing.T, privKey *btcec.PrivateKey,
|
|||||||
wc := &mockWalletController{
|
wc := &mockWalletController{
|
||||||
rootKey: alicePrivKey,
|
rootKey: alicePrivKey,
|
||||||
}
|
}
|
||||||
signer := &mockSigner{
|
signer := &mock.SingleSigner{
|
||||||
key: alicePrivKey,
|
Privkey: alicePrivKey,
|
||||||
}
|
}
|
||||||
bio := &mockChainIO{
|
bio := &mockChainIO{
|
||||||
bestHeight: fundingBroadcastHeight,
|
bestHeight: fundingBroadcastHeight,
|
||||||
|
@ -16,7 +16,6 @@ import (
|
|||||||
|
|
||||||
"github.com/btcsuite/btcd/btcec"
|
"github.com/btcsuite/btcd/btcec"
|
||||||
"github.com/btcsuite/btcd/chaincfg/chainhash"
|
"github.com/btcsuite/btcd/chaincfg/chainhash"
|
||||||
"github.com/btcsuite/btcd/txscript"
|
|
||||||
"github.com/btcsuite/btcd/wire"
|
"github.com/btcsuite/btcd/wire"
|
||||||
"github.com/go-errors/errors"
|
"github.com/go-errors/errors"
|
||||||
sphinx "github.com/lightningnetwork/lightning-onion"
|
sphinx "github.com/lightningnetwork/lightning-onion"
|
||||||
@ -25,7 +24,6 @@ import (
|
|||||||
"github.com/lightningnetwork/lnd/clock"
|
"github.com/lightningnetwork/lnd/clock"
|
||||||
"github.com/lightningnetwork/lnd/contractcourt"
|
"github.com/lightningnetwork/lnd/contractcourt"
|
||||||
"github.com/lightningnetwork/lnd/htlcswitch/hop"
|
"github.com/lightningnetwork/lnd/htlcswitch/hop"
|
||||||
"github.com/lightningnetwork/lnd/input"
|
|
||||||
"github.com/lightningnetwork/lnd/invoices"
|
"github.com/lightningnetwork/lnd/invoices"
|
||||||
"github.com/lightningnetwork/lnd/lnpeer"
|
"github.com/lightningnetwork/lnd/lnpeer"
|
||||||
"github.com/lightningnetwork/lnd/lntypes"
|
"github.com/lightningnetwork/lnd/lntypes"
|
||||||
@ -855,67 +853,6 @@ func (i *mockInvoiceRegistry) HodlUnsubscribeAll(subscriber chan<- interface{})
|
|||||||
|
|
||||||
var _ InvoiceDatabase = (*mockInvoiceRegistry)(nil)
|
var _ InvoiceDatabase = (*mockInvoiceRegistry)(nil)
|
||||||
|
|
||||||
type mockSigner struct {
|
|
||||||
key *btcec.PrivateKey
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *mockSigner) SignOutputRaw(tx *wire.MsgTx,
|
|
||||||
signDesc *input.SignDescriptor) (input.Signature, error) {
|
|
||||||
|
|
||||||
amt := signDesc.Output.Value
|
|
||||||
witnessScript := signDesc.WitnessScript
|
|
||||||
privKey := m.key
|
|
||||||
|
|
||||||
if !privKey.PubKey().IsEqual(signDesc.KeyDesc.PubKey) {
|
|
||||||
return nil, fmt.Errorf("incorrect key passed")
|
|
||||||
}
|
|
||||||
|
|
||||||
switch {
|
|
||||||
case signDesc.SingleTweak != nil:
|
|
||||||
privKey = input.TweakPrivKey(privKey,
|
|
||||||
signDesc.SingleTweak)
|
|
||||||
case signDesc.DoubleTweak != nil:
|
|
||||||
privKey = input.DeriveRevocationPrivKey(privKey,
|
|
||||||
signDesc.DoubleTweak)
|
|
||||||
}
|
|
||||||
|
|
||||||
sig, err := txscript.RawTxInWitnessSignature(tx, signDesc.SigHashes,
|
|
||||||
signDesc.InputIndex, amt, witnessScript, signDesc.HashType,
|
|
||||||
privKey)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return btcec.ParseDERSignature(sig[:len(sig)-1], btcec.S256())
|
|
||||||
}
|
|
||||||
func (m *mockSigner) ComputeInputScript(tx *wire.MsgTx, signDesc *input.SignDescriptor) (*input.Script, error) {
|
|
||||||
|
|
||||||
// TODO(roasbeef): expose tweaked signer from lnwallet so don't need to
|
|
||||||
// duplicate this code?
|
|
||||||
|
|
||||||
privKey := m.key
|
|
||||||
|
|
||||||
switch {
|
|
||||||
case signDesc.SingleTweak != nil:
|
|
||||||
privKey = input.TweakPrivKey(privKey,
|
|
||||||
signDesc.SingleTweak)
|
|
||||||
case signDesc.DoubleTweak != nil:
|
|
||||||
privKey = input.DeriveRevocationPrivKey(privKey,
|
|
||||||
signDesc.DoubleTweak)
|
|
||||||
}
|
|
||||||
|
|
||||||
witnessScript, err := txscript.WitnessSignature(tx, signDesc.SigHashes,
|
|
||||||
signDesc.InputIndex, signDesc.Output.Value, signDesc.Output.PkScript,
|
|
||||||
signDesc.HashType, privKey, true)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return &input.Script{
|
|
||||||
Witness: witnessScript,
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type mockNotifier struct {
|
type mockNotifier struct {
|
||||||
epochChan chan *chainntnfs.BlockEpoch
|
epochChan chan *chainntnfs.BlockEpoch
|
||||||
}
|
}
|
||||||
|
@ -29,6 +29,7 @@ import (
|
|||||||
"github.com/lightningnetwork/lnd/input"
|
"github.com/lightningnetwork/lnd/input"
|
||||||
"github.com/lightningnetwork/lnd/keychain"
|
"github.com/lightningnetwork/lnd/keychain"
|
||||||
"github.com/lightningnetwork/lnd/lnpeer"
|
"github.com/lightningnetwork/lnd/lnpeer"
|
||||||
|
"github.com/lightningnetwork/lnd/lntest/mock"
|
||||||
"github.com/lightningnetwork/lnd/lntest/wait"
|
"github.com/lightningnetwork/lnd/lntest/wait"
|
||||||
"github.com/lightningnetwork/lnd/lntypes"
|
"github.com/lightningnetwork/lnd/lntypes"
|
||||||
"github.com/lightningnetwork/lnd/lnwallet"
|
"github.com/lightningnetwork/lnd/lnwallet"
|
||||||
@ -376,8 +377,8 @@ func createTestChannel(alicePrivKey, bobPrivKey []byte,
|
|||||||
os.RemoveAll(alicePath)
|
os.RemoveAll(alicePath)
|
||||||
}
|
}
|
||||||
|
|
||||||
aliceSigner := &mockSigner{aliceKeyPriv}
|
aliceSigner := &mock.SingleSigner{Privkey: aliceKeyPriv}
|
||||||
bobSigner := &mockSigner{bobKeyPriv}
|
bobSigner := &mock.SingleSigner{Privkey: bobKeyPriv}
|
||||||
|
|
||||||
alicePool := lnwallet.NewSigPool(runtime.NumCPU(), aliceSigner)
|
alicePool := lnwallet.NewSigPool(runtime.NumCPU(), aliceSigner)
|
||||||
channelAlice, err := lnwallet.NewLightningChannel(
|
channelAlice, err := lnwallet.NewLightningChannel(
|
||||||
|
127
lntest/mock/signer.go
Normal file
127
lntest/mock/signer.go
Normal file
@ -0,0 +1,127 @@
|
|||||||
|
package mock
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/btcsuite/btcd/btcec"
|
||||||
|
"github.com/btcsuite/btcd/chaincfg/chainhash"
|
||||||
|
"github.com/btcsuite/btcd/txscript"
|
||||||
|
"github.com/btcsuite/btcd/wire"
|
||||||
|
|
||||||
|
"github.com/lightningnetwork/lnd/input"
|
||||||
|
)
|
||||||
|
|
||||||
|
// DummySignature is a dummy Signature implementation.
|
||||||
|
type DummySignature struct{}
|
||||||
|
|
||||||
|
// Serialize returns an empty byte slice.
|
||||||
|
func (d *DummySignature) Serialize() []byte {
|
||||||
|
return []byte{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Verify always returns true.
|
||||||
|
func (d *DummySignature) Verify(_ []byte, _ *btcec.PublicKey) bool {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// DummySigner is an implementation of the Signer interface that returns
|
||||||
|
// dummy values when called.
|
||||||
|
type DummySigner struct{}
|
||||||
|
|
||||||
|
// SignOutputRaw returns a dummy signature.
|
||||||
|
func (d *DummySigner) SignOutputRaw(tx *wire.MsgTx,
|
||||||
|
signDesc *input.SignDescriptor) (input.Signature, error) {
|
||||||
|
|
||||||
|
return &DummySignature{}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ComputeInputScript returns nil for both values.
|
||||||
|
func (d *DummySigner) ComputeInputScript(tx *wire.MsgTx,
|
||||||
|
signDesc *input.SignDescriptor) (*input.Script, error) {
|
||||||
|
|
||||||
|
return &input.Script{}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// SingleSigner is an implementation of the Signer interface that signs
|
||||||
|
// everything with a single private key.
|
||||||
|
type SingleSigner struct {
|
||||||
|
Privkey *btcec.PrivateKey
|
||||||
|
}
|
||||||
|
|
||||||
|
// SignOutputRaw generates a signature for the passed transaction using the
|
||||||
|
// stored private key.
|
||||||
|
func (s *SingleSigner) SignOutputRaw(tx *wire.MsgTx,
|
||||||
|
signDesc *input.SignDescriptor) (input.Signature, error) {
|
||||||
|
|
||||||
|
amt := signDesc.Output.Value
|
||||||
|
witnessScript := signDesc.WitnessScript
|
||||||
|
privKey := s.Privkey
|
||||||
|
|
||||||
|
if !privKey.PubKey().IsEqual(signDesc.KeyDesc.PubKey) {
|
||||||
|
return nil, fmt.Errorf("incorrect key passed")
|
||||||
|
}
|
||||||
|
|
||||||
|
switch {
|
||||||
|
case signDesc.SingleTweak != nil:
|
||||||
|
privKey = input.TweakPrivKey(privKey,
|
||||||
|
signDesc.SingleTweak)
|
||||||
|
case signDesc.DoubleTweak != nil:
|
||||||
|
privKey = input.DeriveRevocationPrivKey(privKey,
|
||||||
|
signDesc.DoubleTweak)
|
||||||
|
}
|
||||||
|
|
||||||
|
sig, err := txscript.RawTxInWitnessSignature(tx, signDesc.SigHashes,
|
||||||
|
signDesc.InputIndex, amt, witnessScript, signDesc.HashType,
|
||||||
|
privKey)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return btcec.ParseDERSignature(sig[:len(sig)-1], btcec.S256())
|
||||||
|
}
|
||||||
|
|
||||||
|
// ComputeInputScript computes an input script with the stored private key
|
||||||
|
// given a transaction and a SignDescriptor.
|
||||||
|
func (s *SingleSigner) ComputeInputScript(tx *wire.MsgTx,
|
||||||
|
signDesc *input.SignDescriptor) (*input.Script, error) {
|
||||||
|
|
||||||
|
privKey := s.Privkey
|
||||||
|
|
||||||
|
switch {
|
||||||
|
case signDesc.SingleTweak != nil:
|
||||||
|
privKey = input.TweakPrivKey(privKey,
|
||||||
|
signDesc.SingleTweak)
|
||||||
|
case signDesc.DoubleTweak != nil:
|
||||||
|
privKey = input.DeriveRevocationPrivKey(privKey,
|
||||||
|
signDesc.DoubleTweak)
|
||||||
|
}
|
||||||
|
|
||||||
|
witnessScript, err := txscript.WitnessSignature(tx, signDesc.SigHashes,
|
||||||
|
signDesc.InputIndex, signDesc.Output.Value, signDesc.Output.PkScript,
|
||||||
|
signDesc.HashType, privKey, true)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &input.Script{
|
||||||
|
Witness: witnessScript,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// SignMessage takes a public key and a message and only signs the message
|
||||||
|
// with the stored private key if the public key matches the private key.
|
||||||
|
func (s *SingleSigner) SignMessage(pubKey *btcec.PublicKey,
|
||||||
|
msg []byte) (input.Signature, error) {
|
||||||
|
|
||||||
|
if !pubKey.IsEqual(s.Privkey.PubKey()) {
|
||||||
|
return nil, fmt.Errorf("unknown public key")
|
||||||
|
}
|
||||||
|
|
||||||
|
digest := chainhash.DoubleHashB(msg)
|
||||||
|
sign, err := s.Privkey.Sign(digest)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("can't sign the message: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return sign, nil
|
||||||
|
}
|
65
mock.go
65
mock.go
@ -2,7 +2,6 @@ package lnd
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"fmt"
|
|
||||||
"sync"
|
"sync"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
"time"
|
"time"
|
||||||
@ -10,14 +9,12 @@ import (
|
|||||||
"github.com/btcsuite/btcd/btcec"
|
"github.com/btcsuite/btcd/btcec"
|
||||||
"github.com/btcsuite/btcd/chaincfg"
|
"github.com/btcsuite/btcd/chaincfg"
|
||||||
"github.com/btcsuite/btcd/chaincfg/chainhash"
|
"github.com/btcsuite/btcd/chaincfg/chainhash"
|
||||||
"github.com/btcsuite/btcd/txscript"
|
|
||||||
"github.com/btcsuite/btcd/wire"
|
"github.com/btcsuite/btcd/wire"
|
||||||
"github.com/btcsuite/btcutil"
|
"github.com/btcsuite/btcutil"
|
||||||
"github.com/btcsuite/btcwallet/wallet/txauthor"
|
"github.com/btcsuite/btcwallet/wallet/txauthor"
|
||||||
"github.com/btcsuite/btcwallet/wtxmgr"
|
"github.com/btcsuite/btcwallet/wtxmgr"
|
||||||
|
|
||||||
"github.com/lightningnetwork/lnd/chainntnfs"
|
"github.com/lightningnetwork/lnd/chainntnfs"
|
||||||
"github.com/lightningnetwork/lnd/input"
|
|
||||||
"github.com/lightningnetwork/lnd/keychain"
|
"github.com/lightningnetwork/lnd/keychain"
|
||||||
"github.com/lightningnetwork/lnd/lnwallet"
|
"github.com/lightningnetwork/lnd/lnwallet"
|
||||||
"github.com/lightningnetwork/lnd/lnwallet/chainfee"
|
"github.com/lightningnetwork/lnd/lnwallet/chainfee"
|
||||||
@ -30,68 +27,6 @@ var (
|
|||||||
// The block height returned by the mock BlockChainIO's GetBestBlock.
|
// The block height returned by the mock BlockChainIO's GetBestBlock.
|
||||||
const fundingBroadcastHeight = 123
|
const fundingBroadcastHeight = 123
|
||||||
|
|
||||||
type mockSigner struct {
|
|
||||||
key *btcec.PrivateKey
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *mockSigner) SignOutputRaw(tx *wire.MsgTx,
|
|
||||||
signDesc *input.SignDescriptor) (input.Signature, error) {
|
|
||||||
amt := signDesc.Output.Value
|
|
||||||
witnessScript := signDesc.WitnessScript
|
|
||||||
privKey := m.key
|
|
||||||
|
|
||||||
if !privKey.PubKey().IsEqual(signDesc.KeyDesc.PubKey) {
|
|
||||||
return nil, fmt.Errorf("incorrect key passed")
|
|
||||||
}
|
|
||||||
|
|
||||||
switch {
|
|
||||||
case signDesc.SingleTweak != nil:
|
|
||||||
privKey = input.TweakPrivKey(privKey,
|
|
||||||
signDesc.SingleTweak)
|
|
||||||
case signDesc.DoubleTweak != nil:
|
|
||||||
privKey = input.DeriveRevocationPrivKey(privKey,
|
|
||||||
signDesc.DoubleTweak)
|
|
||||||
}
|
|
||||||
|
|
||||||
sig, err := txscript.RawTxInWitnessSignature(tx, signDesc.SigHashes,
|
|
||||||
signDesc.InputIndex, amt, witnessScript, signDesc.HashType,
|
|
||||||
privKey)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return btcec.ParseDERSignature(sig[:len(sig)-1], btcec.S256())
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *mockSigner) ComputeInputScript(tx *wire.MsgTx,
|
|
||||||
signDesc *input.SignDescriptor) (*input.Script, error) {
|
|
||||||
|
|
||||||
// TODO(roasbeef): expose tweaked signer from lnwallet so don't need to
|
|
||||||
// duplicate this code?
|
|
||||||
|
|
||||||
privKey := m.key
|
|
||||||
|
|
||||||
switch {
|
|
||||||
case signDesc.SingleTweak != nil:
|
|
||||||
privKey = input.TweakPrivKey(privKey,
|
|
||||||
signDesc.SingleTweak)
|
|
||||||
case signDesc.DoubleTweak != nil:
|
|
||||||
privKey = input.DeriveRevocationPrivKey(privKey,
|
|
||||||
signDesc.DoubleTweak)
|
|
||||||
}
|
|
||||||
|
|
||||||
witnessScript, err := txscript.WitnessSignature(tx, signDesc.SigHashes,
|
|
||||||
signDesc.InputIndex, signDesc.Output.Value, signDesc.Output.PkScript,
|
|
||||||
signDesc.HashType, privKey, true)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return &input.Script{
|
|
||||||
Witness: witnessScript,
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type mockNotfier struct {
|
type mockNotfier struct {
|
||||||
confChannel chan *chainntnfs.TxConfirmation
|
confChannel chan *chainntnfs.TxConfirmation
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,6 @@ import (
|
|||||||
"bytes"
|
"bytes"
|
||||||
crand "crypto/rand"
|
crand "crypto/rand"
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"fmt"
|
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
@ -15,7 +14,6 @@ import (
|
|||||||
"github.com/btcsuite/btcd/btcec"
|
"github.com/btcsuite/btcd/btcec"
|
||||||
"github.com/btcsuite/btcd/chaincfg"
|
"github.com/btcsuite/btcd/chaincfg"
|
||||||
"github.com/btcsuite/btcd/chaincfg/chainhash"
|
"github.com/btcsuite/btcd/chaincfg/chainhash"
|
||||||
"github.com/btcsuite/btcd/txscript"
|
|
||||||
"github.com/btcsuite/btcd/wire"
|
"github.com/btcsuite/btcd/wire"
|
||||||
"github.com/btcsuite/btcutil"
|
"github.com/btcsuite/btcutil"
|
||||||
"github.com/btcsuite/btcwallet/wallet/txauthor"
|
"github.com/btcsuite/btcwallet/wallet/txauthor"
|
||||||
@ -25,6 +23,7 @@ import (
|
|||||||
"github.com/lightningnetwork/lnd/htlcswitch"
|
"github.com/lightningnetwork/lnd/htlcswitch"
|
||||||
"github.com/lightningnetwork/lnd/input"
|
"github.com/lightningnetwork/lnd/input"
|
||||||
"github.com/lightningnetwork/lnd/keychain"
|
"github.com/lightningnetwork/lnd/keychain"
|
||||||
|
"github.com/lightningnetwork/lnd/lntest/mock"
|
||||||
"github.com/lightningnetwork/lnd/lnwallet"
|
"github.com/lightningnetwork/lnd/lnwallet"
|
||||||
"github.com/lightningnetwork/lnd/lnwallet/chainfee"
|
"github.com/lightningnetwork/lnd/lnwallet/chainfee"
|
||||||
"github.com/lightningnetwork/lnd/lnwire"
|
"github.com/lightningnetwork/lnd/lnwire"
|
||||||
@ -103,70 +102,6 @@ var (
|
|||||||
// call the setup code with no custom values on the channels set up.
|
// call the setup code with no custom values on the channels set up.
|
||||||
var noUpdate = func(a, b *channeldb.OpenChannel) {}
|
var noUpdate = func(a, b *channeldb.OpenChannel) {}
|
||||||
|
|
||||||
type mockSigner struct {
|
|
||||||
key *btcec.PrivateKey
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *mockSigner) SignOutputRaw(tx *wire.MsgTx,
|
|
||||||
signDesc *input.SignDescriptor) (input.Signature, error) {
|
|
||||||
amt := signDesc.Output.Value
|
|
||||||
witnessScript := signDesc.WitnessScript
|
|
||||||
privKey := m.key
|
|
||||||
|
|
||||||
if !privKey.PubKey().IsEqual(signDesc.KeyDesc.PubKey) {
|
|
||||||
return nil, fmt.Errorf("incorrect key passed")
|
|
||||||
}
|
|
||||||
|
|
||||||
switch {
|
|
||||||
case signDesc.SingleTweak != nil:
|
|
||||||
privKey = input.TweakPrivKey(privKey,
|
|
||||||
signDesc.SingleTweak)
|
|
||||||
case signDesc.DoubleTweak != nil:
|
|
||||||
privKey = input.DeriveRevocationPrivKey(privKey,
|
|
||||||
signDesc.DoubleTweak)
|
|
||||||
}
|
|
||||||
|
|
||||||
sig, err := txscript.RawTxInWitnessSignature(tx, signDesc.SigHashes,
|
|
||||||
signDesc.InputIndex, amt, witnessScript, signDesc.HashType,
|
|
||||||
privKey)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return btcec.ParseDERSignature(sig[:len(sig)-1], btcec.S256())
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *mockSigner) ComputeInputScript(tx *wire.MsgTx,
|
|
||||||
signDesc *input.SignDescriptor) (*input.Script, error) {
|
|
||||||
|
|
||||||
// TODO(roasbeef): expose tweaked signer from lnwallet so don't need to
|
|
||||||
// duplicate this code?
|
|
||||||
|
|
||||||
privKey := m.key
|
|
||||||
|
|
||||||
switch {
|
|
||||||
case signDesc.SingleTweak != nil:
|
|
||||||
privKey = input.TweakPrivKey(privKey,
|
|
||||||
signDesc.SingleTweak)
|
|
||||||
case signDesc.DoubleTweak != nil:
|
|
||||||
privKey = input.DeriveRevocationPrivKey(privKey,
|
|
||||||
signDesc.DoubleTweak)
|
|
||||||
}
|
|
||||||
|
|
||||||
witnessScript, err := txscript.WitnessSignature(tx, signDesc.SigHashes,
|
|
||||||
signDesc.InputIndex, signDesc.Output.Value, signDesc.Output.PkScript,
|
|
||||||
signDesc.HashType, privKey, true)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return &input.Script{
|
|
||||||
Witness: witnessScript,
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
var _ input.Signer = (*mockSigner)(nil)
|
|
||||||
|
|
||||||
type mockChainIO struct {
|
type mockChainIO struct {
|
||||||
bestHeight int32
|
bestHeight int32
|
||||||
}
|
}
|
||||||
@ -575,8 +510,8 @@ func createTestPeer(notifier chainntnfs.ChainNotifier,
|
|||||||
os.RemoveAll(alicePath)
|
os.RemoveAll(alicePath)
|
||||||
}
|
}
|
||||||
|
|
||||||
aliceSigner := &mockSigner{aliceKeyPriv}
|
aliceSigner := &mock.SingleSigner{Privkey: aliceKeyPriv}
|
||||||
bobSigner := &mockSigner{bobKeyPriv}
|
bobSigner := &mock.SingleSigner{Privkey: bobKeyPriv}
|
||||||
|
|
||||||
alicePool := lnwallet.NewSigPool(1, aliceSigner)
|
alicePool := lnwallet.NewSigPool(1, aliceSigner)
|
||||||
channelAlice, err := lnwallet.NewLightningChannel(
|
channelAlice, err := lnwallet.NewLightningChannel(
|
||||||
|
@ -14,6 +14,7 @@ import (
|
|||||||
"github.com/lightningnetwork/lnd/build"
|
"github.com/lightningnetwork/lnd/build"
|
||||||
"github.com/lightningnetwork/lnd/input"
|
"github.com/lightningnetwork/lnd/input"
|
||||||
"github.com/lightningnetwork/lnd/keychain"
|
"github.com/lightningnetwork/lnd/keychain"
|
||||||
|
"github.com/lightningnetwork/lnd/lntest/mock"
|
||||||
"github.com/lightningnetwork/lnd/lnwallet"
|
"github.com/lightningnetwork/lnd/lnwallet"
|
||||||
"github.com/lightningnetwork/lnd/lnwallet/chainfee"
|
"github.com/lightningnetwork/lnd/lnwallet/chainfee"
|
||||||
)
|
)
|
||||||
@ -128,7 +129,7 @@ func createSweeperTestContext(t *testing.T) *sweeperTestContext {
|
|||||||
return c
|
return c
|
||||||
},
|
},
|
||||||
Store: store,
|
Store: store,
|
||||||
Signer: &mockSigner{},
|
Signer: &mock.DummySigner{},
|
||||||
GenSweepScript: func() ([]byte, error) {
|
GenSweepScript: func() ([]byte, error) {
|
||||||
script := []byte{outputScriptCount}
|
script := []byte{outputScriptCount}
|
||||||
outputScriptCount++
|
outputScriptCount++
|
||||||
|
@ -6,11 +6,9 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/btcsuite/btcd/btcec"
|
|
||||||
"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/input"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@ -19,31 +17,6 @@ var (
|
|||||||
mockChainHeight = int32(100)
|
mockChainHeight = int32(100)
|
||||||
)
|
)
|
||||||
|
|
||||||
type dummySignature struct{}
|
|
||||||
|
|
||||||
func (s *dummySignature) Serialize() []byte {
|
|
||||||
return []byte{}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *dummySignature) Verify(_ []byte, _ *btcec.PublicKey) bool {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
type mockSigner struct {
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *mockSigner) SignOutputRaw(tx *wire.MsgTx,
|
|
||||||
signDesc *input.SignDescriptor) (input.Signature, error) {
|
|
||||||
|
|
||||||
return &dummySignature{}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *mockSigner) ComputeInputScript(tx *wire.MsgTx,
|
|
||||||
signDesc *input.SignDescriptor) (*input.Script, error) {
|
|
||||||
|
|
||||||
return &input.Script{}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// MockNotifier simulates the chain notifier for test purposes. This type is
|
// MockNotifier simulates the chain notifier for test purposes. This type is
|
||||||
// exported because it is used in nursery tests.
|
// exported because it is used in nursery tests.
|
||||||
type MockNotifier struct {
|
type MockNotifier struct {
|
||||||
|
@ -9,6 +9,7 @@ import (
|
|||||||
"github.com/btcsuite/btcd/txscript"
|
"github.com/btcsuite/btcd/txscript"
|
||||||
"github.com/btcsuite/btcd/wire"
|
"github.com/btcsuite/btcd/wire"
|
||||||
"github.com/btcsuite/btcutil"
|
"github.com/btcsuite/btcutil"
|
||||||
|
"github.com/lightningnetwork/lnd/lntest/mock"
|
||||||
"github.com/lightningnetwork/lnd/lnwallet"
|
"github.com/lightningnetwork/lnd/lnwallet"
|
||||||
"github.com/lightningnetwork/lnd/lnwallet/chainfee"
|
"github.com/lightningnetwork/lnd/lnwallet/chainfee"
|
||||||
)
|
)
|
||||||
@ -335,7 +336,7 @@ func TestCraftSweepAllTx(t *testing.T) {
|
|||||||
|
|
||||||
// First, we'll make a mock signer along with a fee estimator, We'll
|
// First, we'll make a mock signer along with a fee estimator, We'll
|
||||||
// use zero fees to we can assert a precise output value.
|
// use zero fees to we can assert a precise output value.
|
||||||
signer := &mockSigner{}
|
signer := &mock.DummySigner{}
|
||||||
feeEstimator := newMockFeeEstimator(0, 0)
|
feeEstimator := newMockFeeEstimator(0, 0)
|
||||||
|
|
||||||
// For our UTXO source, we'll pass in all the UTXOs that we know of,
|
// For our UTXO source, we'll pass in all the UTXOs that we know of,
|
||||||
|
Loading…
Reference in New Issue
Block a user