lnd/keychain
Olaoluwa Osuntokun d6524ea517
keychain+lnwallet: when fetching priv keys or signing try to use cache
In this commit, we start to optimistically use the new private key cache
that was added to btcwallet. As is, btcwallet will cache the decrypted
account keys for each scope in memory. However, the existing methods
to derive a child key from those account keys requires a write database
transaction, and will re-derive the private key using BIP-32 each time.

The newly added `DeriveFromKeyPathCache` lets us skip all this and
directly use a cache assuming the account info is already cached. The
new logic will try to use this method, but if it fails fall back to the
existing `DeriveFromKeyPath` method. All calls after this will use this
new cached key.

Fixes https://github.com/lightningnetwork/lnd/issues/5125.

Basic benchmark before the btcwallet change and after:
```
benchmark                    old ns/op     new ns/op     delta
BenchmarkDerivePrivKey-8     22840583      125           -100.00%

benchmark                    old allocs     new allocs     delta
BenchmarkDerivePrivKey-8     89             2              -97.75%

benchmark                    old bytes     new bytes     delta
BenchmarkDerivePrivKey-8     10225         24            -99.77%
```
2021-08-25 18:55:22 -07:00
..
bench_test.go keychain: add basic benchmark for privkey derivation 2021-08-25 18:55:16 -07:00
btcwallet.go keychain+lnwallet: when fetching priv keys or signing try to use cache 2021-08-25 18:55:22 -07:00
derivation.go keychain: add missing KeyFamily type 2020-09-17 10:14:54 +08:00
ecdh.go keychain: add single key wrapper implementations 2020-05-20 09:04:05 +02:00
interface_test.go kvdb: add timeout options for bbolt (#4787) 2020-12-07 15:31:49 -08:00
signer.go keychain: add single key wrapper implementations 2020-05-20 09:04:05 +02:00