Crate bitcoin_keypool
source ·Structs
| A key from a CWallet’s keypool
|
| The wallet holds one (for pre HD-split wallets)
| or several keypools. These are sets of keys
| that have not yet been used to provide
| addresses or receive change.
|
| The Bitcoin Core wallet was originally
| a collection of unrelated private keys with
| their associated addresses. If a non-HD wallet
| generated a key/address, gave that address out
| and then restored a backup from before that
| key’s generation, then any funds sent to that
| address would be lost definitively.
|
| The keypool was implemented to avoid this
| scenario (commit: 10384941). The wallet would
| generate a set of keys (100 by default). When
| a new public key was required, either to give
| out as an address or to use in a change output,
| it would be drawn from the keypool. The keypool
| would then be topped up to maintain 100
| keys. This ensured that as long as the wallet
| hadn’t used more than 100 keys since the
| previous backup, all funds would be safe, since
| a restored wallet would be able to scan for all
| owned addresses.
|
| A keypool also allowed encrypted wallets to
| give out addresses without having to be
| decrypted to generate a new private key.
|
| With the introduction of HD wallets (commit:
| f1902510), the keypool essentially became an
| address look-ahead pool. Restoring old backups
| can no longer definitively lose funds as long
| as the addresses used were from the wallet’s HD
| seed (since all private keys can be rederived
| from the seed). However, if many addresses
| were used since the backup, then the wallet may
| not know how far ahead in the HD chain to look
| for its addresses. The keypool is used to
| implement a ‘gap limit’. The keypool maintains
| a set of keys (by default 1000) ahead of the
| last used key and scans for the addresses of
| those keys. This avoids the risk of not seeing
| transactions involving the wallet’s addresses,
| or of re-using the same address. In the
| unlikely case where none of the addresses in
| the
gap limit
are used on-chain, the
| look-ahead will not be incremented to keep
| a constant size and addresses beyond this range
| will not be detected by an old backup. For this
| reason, it is not recommended to decrease
| keypool size lower than default value.
|
| The HD-split wallet feature added a second
| keypool (commit: 02592f4c). There is an
| external keypool (for addresses to hand out)
| and an internal keypool (for change addresses).
|
| Keypool keys are stored in the
| wallet/keystore’s keymap. The keypool data is
| stored as sets of indexes in the wallet
| (setInternalKeyPool, setExternalKeyPool and
| set_pre_split_keypool), and a map from the key
| to the index (m_pool_key_to_index). The
| CKeyPool object is used to
| serialize/deserialize the pool data to/from the
| database.Constants
| Default for -keypool
|