From b06dabfcb99f9c4018f38d597b982a4f9d5e66ff Mon Sep 17 00:00:00 2001 From: Olaoluwa Osuntokun Date: Mon, 13 Aug 2018 19:15:54 -0700 Subject: [PATCH 1/9] lnwallet: properly set auxiliary channel recovery info in NewUnilateralCloseSummary In this commit, we fix a slight bug by ensuring that the revocation info at the final state of the channel, as well as the local chan config is properly set within the channel close summary created within NewUnilateralCloseSummary. Before this commit, for all cooperative close transactions, this state would _only_ include the pubkey itself, which in some cases may not be sufficient to re-derive the key if needed. --- lnwallet/channel.go | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/lnwallet/channel.go b/lnwallet/channel.go index 4c4cf97e..379ccbb7 100644 --- a/lnwallet/channel.go +++ b/lnwallet/channel.go @@ -5094,15 +5094,18 @@ func NewUnilateralCloseSummary(chanState *channeldb.OpenChannel, signer Signer, } closeSummary := channeldb.ChannelCloseSummary{ - ChanPoint: chanState.FundingOutpoint, - ChainHash: chanState.ChainHash, - ClosingTXID: *commitSpend.SpenderTxHash, - CloseHeight: uint32(commitSpend.SpendingHeight), - RemotePub: chanState.IdentityPub, - Capacity: chanState.Capacity, - SettledBalance: btcutil.Amount(localBalance), - CloseType: channeldb.RemoteForceClose, - IsPending: true, + ChanPoint: chanState.FundingOutpoint, + ChainHash: chanState.ChainHash, + ClosingTXID: *commitSpend.SpenderTxHash, + CloseHeight: uint32(commitSpend.SpendingHeight), + RemotePub: chanState.IdentityPub, + Capacity: chanState.Capacity, + SettledBalance: btcutil.Amount(localBalance), + CloseType: channeldb.RemoteForceClose, + IsPending: true, + RemoteCurrentRevocation: chanState.RemoteCurrentRevocation, + RemoteNextRevocation: chanState.RemoteNextRevocation, + LocalChanConfig: chanState.LocalChanCfg, } return &UnilateralCloseSummary{ From c37c9db2de862df7413f1e649c556823da5f5a5c Mon Sep 17 00:00:00 2001 From: Olaoluwa Osuntokun Date: Mon, 13 Aug 2018 19:16:47 -0700 Subject: [PATCH 2/9] funding: properly set auxiliary channel recovery info in close chan summaries --- fundingmanager.go | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/fundingmanager.go b/fundingmanager.go index 3fcce0a3..4df62b32 100644 --- a/fundingmanager.go +++ b/fundingmanager.go @@ -523,10 +523,15 @@ func (f *fundingManager) Start() error { // initiator. closeInfo := &channeldb.ChannelCloseSummary{ - ChainHash: ch.ChainHash, - ChanPoint: ch.FundingOutpoint, - RemotePub: ch.IdentityPub, - CloseType: channeldb.FundingCanceled, + ChainHash: ch.ChainHash, + ChanPoint: ch.FundingOutpoint, + RemotePub: ch.IdentityPub, + Capacity: ch.Capacity, + SettledBalance: ch.LocalBalance, + CloseType: channeldb.FundingCanceled, + RemoteCurrentRevocation: ch.RemoteCurrentRevocation, + RemoteNextRevocation: ch.RemoteNextRevocation, + LocalChanConfig: ch.LocalChanCfg, } if err := ch.CloseChannel(closeInfo); err != nil { @@ -1372,10 +1377,15 @@ func (f *fundingManager) handleFundingCreated(fmsg *fundingCreatedMsg) { // from the database. deleteFromDatabase := func() { closeInfo := &channeldb.ChannelCloseSummary{ - ChanPoint: completeChan.FundingOutpoint, - ChainHash: completeChan.ChainHash, - RemotePub: completeChan.IdentityPub, - CloseType: channeldb.FundingCanceled, + ChanPoint: completeChan.FundingOutpoint, + ChainHash: completeChan.ChainHash, + RemotePub: completeChan.IdentityPub, + CloseType: channeldb.FundingCanceled, + Capacity: completeChan.Capacity, + SettledBalance: completeChan.LocalBalance, + RemoteCurrentRevocation: completeChan.RemoteCurrentRevocation, + RemoteNextRevocation: completeChan.RemoteNextRevocation, + LocalChanConfig: completeChan.LocalChanCfg, } if err := completeChan.CloseChannel(closeInfo); err != nil { From e97e4c1f5d2abd97c86e80adb719f3289b91b54a Mon Sep 17 00:00:00 2001 From: Olaoluwa Osuntokun Date: Mon, 13 Aug 2018 19:17:36 -0700 Subject: [PATCH 3/9] contractcourt: set auxiliary chan recovery info for all created chan close summaries --- contractcourt/chain_watcher.go | 67 +++++++++++++++++++--------------- 1 file changed, 38 insertions(+), 29 deletions(-) diff --git a/contractcourt/chain_watcher.go b/contractcourt/chain_watcher.go index 04fc8647..f1786441 100644 --- a/contractcourt/chain_watcher.go +++ b/contractcourt/chain_watcher.go @@ -502,16 +502,19 @@ func (c *chainWatcher) dispatchCooperativeClose(commitSpend *chainntnfs.SpendDet // database. We can do this as a cooperatively closed channel has all // its outputs resolved after only one confirmation. closeSummary := &channeldb.ChannelCloseSummary{ - ChanPoint: c.cfg.chanState.FundingOutpoint, - ChainHash: c.cfg.chanState.ChainHash, - ClosingTXID: *commitSpend.SpenderTxHash, - RemotePub: c.cfg.chanState.IdentityPub, - Capacity: c.cfg.chanState.Capacity, - CloseHeight: uint32(commitSpend.SpendingHeight), - SettledBalance: localAmt, - CloseType: channeldb.CooperativeClose, - ShortChanID: c.cfg.chanState.ShortChanID(), - IsPending: false, + ChanPoint: c.cfg.chanState.FundingOutpoint, + ChainHash: c.cfg.chanState.ChainHash, + ClosingTXID: *commitSpend.SpenderTxHash, + RemotePub: c.cfg.chanState.IdentityPub, + Capacity: c.cfg.chanState.Capacity, + CloseHeight: uint32(commitSpend.SpendingHeight), + SettledBalance: localAmt, + CloseType: channeldb.CooperativeClose, + ShortChanID: c.cfg.chanState.ShortChanID(), + IsPending: false, + RemoteCurrentRevocation: c.cfg.chanState.RemoteCurrentRevocation, + RemoteNextRevocation: c.cfg.chanState.RemoteNextRevocation, + LocalChanConfig: c.cfg.chanState.LocalChanCfg, } err := c.cfg.chanState.CloseChannel(closeSummary) if err != nil && err != channeldb.ErrNoActiveChannels && @@ -559,15 +562,18 @@ func (c *chainWatcher) dispatchLocalForceClose( // usage by related sub-systems. chanSnapshot := forceClose.ChanSnapshot closeSummary := &channeldb.ChannelCloseSummary{ - ChanPoint: chanSnapshot.ChannelPoint, - ChainHash: chanSnapshot.ChainHash, - ClosingTXID: forceClose.CloseTx.TxHash(), - RemotePub: &chanSnapshot.RemoteIdentity, - Capacity: chanSnapshot.Capacity, - CloseType: channeldb.LocalForceClose, - IsPending: true, - ShortChanID: c.cfg.chanState.ShortChanID(), - CloseHeight: uint32(commitSpend.SpendingHeight), + ChanPoint: chanSnapshot.ChannelPoint, + ChainHash: chanSnapshot.ChainHash, + ClosingTXID: forceClose.CloseTx.TxHash(), + RemotePub: &chanSnapshot.RemoteIdentity, + Capacity: chanSnapshot.Capacity, + CloseType: channeldb.LocalForceClose, + IsPending: true, + ShortChanID: c.cfg.chanState.ShortChanID(), + CloseHeight: uint32(commitSpend.SpendingHeight), + RemoteCurrentRevocation: c.cfg.chanState.RemoteCurrentRevocation, + RemoteNextRevocation: c.cfg.chanState.RemoteNextRevocation, + LocalChanConfig: c.cfg.chanState.LocalChanCfg, } // If our commitment output isn't dust or we have active HTLC's on the @@ -739,16 +745,19 @@ func (c *chainWatcher) dispatchContractBreach(spendEvent *chainntnfs.SpendDetail // TODO(roasbeef): instead mark we got all the monies? settledBalance := remoteCommit.LocalBalance.ToSatoshis() closeSummary := channeldb.ChannelCloseSummary{ - ChanPoint: c.cfg.chanState.FundingOutpoint, - ChainHash: c.cfg.chanState.ChainHash, - ClosingTXID: *spendEvent.SpenderTxHash, - CloseHeight: spendHeight, - RemotePub: c.cfg.chanState.IdentityPub, - Capacity: c.cfg.chanState.Capacity, - SettledBalance: settledBalance, - CloseType: channeldb.BreachClose, - IsPending: true, - ShortChanID: c.cfg.chanState.ShortChanID(), + ChanPoint: c.cfg.chanState.FundingOutpoint, + ChainHash: c.cfg.chanState.ChainHash, + ClosingTXID: *spendEvent.SpenderTxHash, + CloseHeight: spendHeight, + RemotePub: c.cfg.chanState.IdentityPub, + Capacity: c.cfg.chanState.Capacity, + SettledBalance: settledBalance, + CloseType: channeldb.BreachClose, + IsPending: true, + ShortChanID: c.cfg.chanState.ShortChanID(), + RemoteCurrentRevocation: c.cfg.chanState.RemoteCurrentRevocation, + RemoteNextRevocation: c.cfg.chanState.RemoteNextRevocation, + LocalChanConfig: c.cfg.chanState.LocalChanCfg, } if err := c.cfg.chanState.CloseChannel(&closeSummary); err != nil { From ad25ae1a0716a6b820a9d3951e4d8686c02788b8 Mon Sep 17 00:00:00 2001 From: Olaoluwa Osuntokun Date: Mon, 13 Aug 2018 19:19:58 -0700 Subject: [PATCH 4/9] keychain: ensure we properly set the KeyLocator for keys from DeriveNextKey In this commit, we fix a slight bug in the existing implementation of DeriveNextKey for btcwallet. Before this commit, we would only set the public key, and not also the derivation path. It's important that we also set the path information, as in the near future we'll be using the KeyDescriptors returned from this method to create static channel back ups. With these static backups, the key alone may be insufficient to re-derive the private key as we may need to fallback to brute forcing in order to re-derive the key as it's possible we add new key families in the future. --- fundingmanager.go | 7 ++++--- keychain/btcwallet.go | 24 +++++++++++++++++++++--- keychain/derivation.go | 6 +++--- 3 files changed, 28 insertions(+), 9 deletions(-) diff --git a/fundingmanager.go b/fundingmanager.go index 4df62b32..68550ab3 100644 --- a/fundingmanager.go +++ b/fundingmanager.go @@ -521,13 +521,13 @@ func (f *fundingManager) Start() error { // mined since the channel was initiated reaches // maxWaitNumBlocksFundingConf and we are not the channel // initiator. - + localBalance := ch.LocalCommitment.LocalBalance.ToSatoshis() closeInfo := &channeldb.ChannelCloseSummary{ ChainHash: ch.ChainHash, ChanPoint: ch.FundingOutpoint, RemotePub: ch.IdentityPub, Capacity: ch.Capacity, - SettledBalance: ch.LocalBalance, + SettledBalance: localBalance, CloseType: channeldb.FundingCanceled, RemoteCurrentRevocation: ch.RemoteCurrentRevocation, RemoteNextRevocation: ch.RemoteNextRevocation, @@ -1376,13 +1376,14 @@ func (f *fundingManager) handleFundingCreated(fmsg *fundingCreatedMsg) { // we use this convenience method to delete the pending OpenChannel // from the database. deleteFromDatabase := func() { + localBalance := completeChan.LocalCommitment.LocalBalance.ToSatoshis() closeInfo := &channeldb.ChannelCloseSummary{ ChanPoint: completeChan.FundingOutpoint, ChainHash: completeChan.ChainHash, RemotePub: completeChan.IdentityPub, CloseType: channeldb.FundingCanceled, Capacity: completeChan.Capacity, - SettledBalance: completeChan.LocalBalance, + SettledBalance: localBalance, RemoteCurrentRevocation: completeChan.RemoteCurrentRevocation, RemoteNextRevocation: completeChan.RemoteNextRevocation, LocalChanConfig: completeChan.LocalChanCfg, diff --git a/keychain/btcwallet.go b/keychain/btcwallet.go index e0f52203..e1feecfc 100644 --- a/keychain/btcwallet.go +++ b/keychain/btcwallet.go @@ -139,7 +139,10 @@ func (b *BtcWalletKeyRing) createAccountIfNotExists( // // NOTE: This is part of the keychain.KeyRing interface. func (b *BtcWalletKeyRing) DeriveNextKey(keyFam KeyFamily) (KeyDescriptor, error) { - var pubKey *btcec.PublicKey + var ( + pubKey *btcec.PublicKey + keyLoc KeyLocator + ) db := b.wallet.Database() err := walletdb.Update(db, func(tx walletdb.ReadWriteTx) error { @@ -165,7 +168,21 @@ func (b *BtcWalletKeyRing) DeriveNextKey(keyFam KeyFamily) (KeyDescriptor, error return err } - pubKey = addrs[0].(waddrmgr.ManagedPubKeyAddress).PubKey() + // Extract the first address, ensuring that it is of the proper + // interface type, otherwise we can't manipulate it below. + addr, ok := addrs[0].(waddrmgr.ManagedPubKeyAddress) + if !ok { + return fmt.Errorf("address is not a managed pubkey " + + "addr") + } + + pubKey = addr.PubKey() + + _, pathInfo, _ := addr.DerivationInfo() + keyLoc = KeyLocator{ + Family: keyFam, + Index: pathInfo.Index, + } return nil }) @@ -174,7 +191,8 @@ func (b *BtcWalletKeyRing) DeriveNextKey(keyFam KeyFamily) (KeyDescriptor, error } return KeyDescriptor{ - PubKey: pubKey, + PubKey: pubKey, + KeyLocator: keyLoc, }, nil } diff --git a/keychain/derivation.go b/keychain/derivation.go index 241e79d6..c0ad4355 100644 --- a/keychain/derivation.go +++ b/keychain/derivation.go @@ -83,7 +83,7 @@ const ( // will vary per channel and use case) is the final element which allows us to // deterministically derive keys. type KeyLocator struct { - // TODO(roasbeef); add the key scope as well?? + // TODO(roasbeef): add the key scope as well?? // Family is the family of key being identified. Family KeyFamily @@ -92,8 +92,8 @@ type KeyLocator struct { Index uint32 } -// IsEmpty returns true if a KeyLocator is "empty". This may be the case where we -// learn of a key from a remote party for a contract, but don't know the +// IsEmpty returns true if a KeyLocator is "empty". This may be the case where +// we learn of a key from a remote party for a contract, but don't know the // precise details of its derivation (as we don't know the private key!). func (k KeyLocator) IsEmpty() bool { return k.Family == 0 && k.Index == 0 From cf06b041a4aec11292accdfb48dc862a2426234c Mon Sep 17 00:00:00 2001 From: Olaoluwa Osuntokun Date: Mon, 13 Aug 2018 19:20:57 -0700 Subject: [PATCH 5/9] keychain: extend TestKeyRingDerivation to check KeyLocators of derived keys --- keychain/interface_test.go | 61 ++++++++++++++++++++++++++++++++++---- 1 file changed, 55 insertions(+), 6 deletions(-) diff --git a/keychain/interface_test.go b/keychain/interface_test.go index ceae8dd3..ef513cab 100644 --- a/keychain/interface_test.go +++ b/keychain/interface_test.go @@ -5,6 +5,7 @@ import ( "io/ioutil" "math/rand" "os" + "runtime" "testing" "time" @@ -13,6 +14,7 @@ import ( "github.com/btcsuite/btcwallet/waddrmgr" "github.com/btcsuite/btcwallet/wallet" "github.com/btcsuite/btcwallet/walletdb" + "github.com/davecgh/go-spew/spew" _ "github.com/btcsuite/btcwallet/walletdb/bdb" // Required in order to create the default database. ) @@ -91,6 +93,14 @@ func createTestBtcWallet(coinType uint32) (func(), *wallet.Wallet, error) { return cleanUp, baseWallet, nil } +func assertEqualKeyLocator(t *testing.T, a, b KeyLocator) { + _, _, line, _ := runtime.Caller(1) + if a != b { + t.Fatalf("line #%v: mismatched key locators: expected %v, "+ + "got %v", line, spew.Sdump(a), spew.Sdump(b)) + } +} + // secretKeyRingConstructor is a function signature that's used as a generic // constructor for various implementations of the KeyRing interface. A string // naming the returned interface, a function closure that cleans up any @@ -141,6 +151,8 @@ func TestKeyRingDerivation(t *testing.T) { }, } + const numKeysToDerive = 10 + // For each implementation constructor registered above, we'll execute // an identical set of tests in order to ensure that the interface // adheres to our nominal specification. @@ -163,10 +175,16 @@ func TestKeyRingDerivation(t *testing.T) { t.Fatalf("unable to derive next for "+ "keyFam=%v: %v", keyFam, err) } + assertEqualKeyLocator(t, + KeyLocator{ + Family: keyFam, + Index: 0, + }, keyDesc.KeyLocator, + ) - // If we now try to manually derive the *first* - // key, then we should get an identical public - // key back. + // We'll now re-derive that key to ensure that + // we're able to properly access the key via + // the random access derivation methods. keyLoc := KeyLocator{ Family: keyFam, Index: 0, @@ -176,13 +194,41 @@ func TestKeyRingDerivation(t *testing.T) { t.Fatalf("unable to derive first key for "+ "keyFam=%v: %v", keyFam, err) } - if !keyDesc.PubKey.IsEqual(firstKeyDesc.PubKey) { - t.Fatalf("mismatched keys: expected %v, "+ + t.Fatalf("mismatched keys: expected %x, "+ "got %x", keyDesc.PubKey.SerializeCompressed(), firstKeyDesc.PubKey.SerializeCompressed()) } + assertEqualKeyLocator(t, + KeyLocator{ + Family: keyFam, + Index: 0, + }, firstKeyDesc.KeyLocator, + ) + + // If we now try to manually derive the next 10 + // keys (including the original key), then we + // should get an identical public key back and + // their KeyLocator information + // should be set properly. + for i := 0; i < numKeysToDerive+1; i++ { + keyLoc := KeyLocator{ + Family: keyFam, + Index: uint32(i), + } + keyDesc, err := keyRing.DeriveKey(keyLoc) + if err != nil { + t.Fatalf("unable to derive first key for "+ + "keyFam=%v: %v", keyFam, err) + } + + // Ensure that the key locator matches + // up as well. + assertEqualKeyLocator( + t, keyLoc, keyDesc.KeyLocator, + ) + } // If this succeeds, then we'll also try to // derive a random index within the range. @@ -191,12 +237,15 @@ func TestKeyRingDerivation(t *testing.T) { Family: keyFam, Index: randKeyIndex, } - _, err = keyRing.DeriveKey(keyLoc) + keyDesc, err = keyRing.DeriveKey(keyLoc) if err != nil { t.Fatalf("unable to derive key_index=%v "+ "for keyFam=%v: %v", randKeyIndex, keyFam, err) } + assertEqualKeyLocator( + t, keyLoc, keyDesc.KeyLocator, + ) } }) if !success { From 26032f5956830c01ee5a79b00640ccedad6efee4 Mon Sep 17 00:00:00 2001 From: Olaoluwa Osuntokun Date: Mon, 13 Aug 2018 19:21:37 -0700 Subject: [PATCH 6/9] channeldb: extend TestFetchClosedChannels to populate local chan cfg properly --- channeldb/channel_test.go | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/channeldb/channel_test.go b/channeldb/channel_test.go index feb5b2d5..4252b721 100644 --- a/channeldb/channel_test.go +++ b/channeldb/channel_test.go @@ -165,18 +165,38 @@ func createTestChannelState(cdb *DB) (*OpenChannel, error) { CsvDelay: uint16(rand.Int31()), MultiSigKey: keychain.KeyDescriptor{ PubKey: privKey.PubKey(), + KeyLocator: keychain.KeyLocator{ + Family: keychain.KeyFamilyMultiSig, + Index: 9, + }, }, RevocationBasePoint: keychain.KeyDescriptor{ PubKey: privKey.PubKey(), + KeyLocator: keychain.KeyLocator{ + Family: keychain.KeyFamilyRevocationBase, + Index: 8, + }, }, PaymentBasePoint: keychain.KeyDescriptor{ PubKey: privKey.PubKey(), + KeyLocator: keychain.KeyLocator{ + Family: keychain.KeyFamilyPaymentBase, + Index: 7, + }, }, DelayBasePoint: keychain.KeyDescriptor{ PubKey: privKey.PubKey(), + KeyLocator: keychain.KeyLocator{ + Family: keychain.KeyFamilyDelayBase, + Index: 6, + }, }, HtlcBasePoint: keychain.KeyDescriptor{ PubKey: privKey.PubKey(), + KeyLocator: keychain.KeyLocator{ + Family: keychain.KeyFamilyHtlcBase, + Index: 5, + }, }, } @@ -772,6 +792,7 @@ func TestFetchClosedChannels(t *testing.T) { TimeLockedBalance: state.RemoteCommitment.LocalBalance.ToSatoshis() + 10000, CloseType: RemoteForceClose, IsPending: true, + LocalChanConfig: state.LocalChanCfg, } if err := state.CloseChannel(summary); err != nil { t.Fatalf("unable to close channel: %v", err) From 1ff596ecd76639a788a5f952eb5a637ff4ce4318 Mon Sep 17 00:00:00 2001 From: Olaoluwa Osuntokun Date: Mon, 13 Aug 2018 19:22:00 -0700 Subject: [PATCH 7/9] build: update btcwallet to point to latest version --- Gopkg.lock | 4 ++-- Gopkg.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index 7130bb7f..97fc91df 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -120,7 +120,7 @@ revision = "ab6388e0c60ae4834a1f57511e20c17b5f78be4b" [[projects]] - digest = "1:a9bb59675f2aa863eff2bab6f0668b5e6feacaf6b7978fe5a654b068d5ca8e36" + digest = "1:04bf3f47dafa64588795c5e0329dc662e867c3afa191051821dbacbe09ba2ca8" name = "github.com/btcsuite/btcwallet" packages = [ "chain", @@ -140,7 +140,7 @@ "wtxmgr", ] pruneopts = "UT" - revision = "1ede0a1a66bad8f7db796615e496a0a0faba5182" + revision = "5fb94231d0c814f02ffc3110eee588278151b4e1" [[projects]] branch = "master" diff --git a/Gopkg.toml b/Gopkg.toml index b4a091e1..af1ac20f 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -72,7 +72,7 @@ [[constraint]] name = "github.com/btcsuite/btcwallet" - revision = "1ede0a1a66bad8f7db796615e496a0a0faba5182" + revision = "5fb94231d0c814f02ffc3110eee588278151b4e1" [[constraint]] name = "github.com/tv42/zbase32" From 917f929e7092e93f9d1874704bc40ea426b156bf Mon Sep 17 00:00:00 2001 From: Olaoluwa Osuntokun Date: Wed, 15 Aug 2018 16:13:54 -0700 Subject: [PATCH 8/9] keychain: use t.Helper() instead of manually fetching the line no from the runtime --- keychain/interface_test.go | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/keychain/interface_test.go b/keychain/interface_test.go index ef513cab..a297ef96 100644 --- a/keychain/interface_test.go +++ b/keychain/interface_test.go @@ -5,7 +5,6 @@ import ( "io/ioutil" "math/rand" "os" - "runtime" "testing" "time" @@ -94,10 +93,10 @@ func createTestBtcWallet(coinType uint32) (func(), *wallet.Wallet, error) { } func assertEqualKeyLocator(t *testing.T, a, b KeyLocator) { - _, _, line, _ := runtime.Caller(1) + t.Helper() if a != b { - t.Fatalf("line #%v: mismatched key locators: expected %v, "+ - "got %v", line, spew.Sdump(a), spew.Sdump(b)) + t.Fatalf("mismatched key locators: expected %v, "+ + "got %v", spew.Sdump(a), spew.Sdump(b)) } } From b59139f533bf86ba556cfeb0140e37d79bfa12d0 Mon Sep 17 00:00:00 2001 From: Olaoluwa Osuntokun Date: Wed, 15 Aug 2018 16:14:23 -0700 Subject: [PATCH 9/9] build: update to latest version of neutrino --- Gopkg.lock | 4 ++-- Gopkg.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index 97fc91df..0089ed8a 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -279,7 +279,7 @@ revision = "462a8a75388506b68f76661af8d649f0b88e5301" [[projects]] - digest = "1:461543cea211913463b96ed3bf8cbdadf23c5ac8ec205bcbbc79edeba9e93a9a" + digest = "1:11ab77a97c0db5cfe9c82f16cb7c47213612033e8bd711e6ddc9a32615fc747d" name = "github.com/lightninglabs/neutrino" packages = [ ".", @@ -288,7 +288,7 @@ "headerlist", ] pruneopts = "UT" - revision = "b451667d69910cd20995452c56e02441896a3349" + revision = "0d0ce901538af81e234c1b2376babf20fe976b09" [[projects]] digest = "1:58ab6d6525898cbeb86dc29a68f8e9bfe95254b9032134eb9458779574872260" diff --git a/Gopkg.toml b/Gopkg.toml index af1ac20f..ec1fe739 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -44,7 +44,7 @@ [[constraint]] name = "github.com/lightninglabs/neutrino" - revision = "b451667d69910cd20995452c56e02441896a3349" + revision = "0d0ce901538af81e234c1b2376babf20fe976b09" [[constraint]] name = "github.com/lightningnetwork/lightning-onion"