Как bitcoind генерирует новый адрес, если кошелек зашифрован

Предположим, что мой кошелек зашифрован фазой-паролем, и в настоящее время я не предоставил bitcoindфразу-пароль для доступа к разделу закрытых ключей кошелька.

Если я ввожу:

bitcoind getnewaddress

Он печатает новый адрес, скажем [someaddress], но где он хранит закрытый ключ, который идет с ним?

Если я ввожу:

bitcoind dumpprivkey [someaddress]

Я получаю сообщение об ошибке, так как я не предоставил кодовую фразу кошелька.

Но если я сначала укажу кодовую фразу кошелька, а затем попытаюсь dumpprivkeyпоказать закрытый ключ.

Когда я попросил его получить новый адрес, я не предоставил кодовую фразу, так как же он хранит закрытый ключ?

Ответы (1)

Он получает его из пула ключей, который по умолчанию имеет 100 предварительно сгенерированных адресов. В следующий раз, когда вы введете свою парольную фразу, она пополнит пул новыми адресами.

Вот пример, показывающий, что пул заканчивается и пополняется при вводе пароля. Следующие команды были выполнены обученным профессионалом. Пожалуйста, не пытайтесь повторить это дома (особенно первые 2 команды):

$ cd ~/.bitcoin
$ rm wallet.dat
$ bitcoin-cli -daemon -keypool=5
bitcoin server starting
$ bitcoin-cli encryptwallet mypass
wallet encrypted; bitcoin server stopping, restart to run with encrypted wallet
$ bitcoin-cli -daemon -keypool=5
bitcoin server starting
$ bitcoin-cli getnewaddress
1Bf6TrgiBxzZhdtEWZuWuREkbfoAtmZ5xa
$ bitcoin-cli getnewaddress
1JzjmeH1LHzJ5JYzUu3wh36N7LWvfVeB2u
$ bitcoin-cli getnewaddress
1sjVdVJAAWB6JTsja4nEVezdnqiE6Ko3V
$ bitcoin-cli walletpassphrase mypass 3600
$ bitcoin-cli walletlock
$ bitcoin-cli getnewaddress
1DVZHRNbdBivqRKzas7iFT8emsb8EtcJT1
$ bitcoin-cli getnewaddress
1HBXkVkWCVhntzgkxdb9hnUxNeMdFqVssQ
$ bitcoin-cli getnewaddress
18n17UHshaufcufo5z1PBPAdErPWxesBhs
$ bitcoin-cli getnewaddress
1CofrGkqWrAmibBUgtLysknXdsBpDJARTs
$ bitcoin-cli getnewaddress
1NwWuba3khc31ebZU8fVAept2MDdnSndgV
$ bitcoin-cli getnewaddress
16QVdikDatH2FkQNkrRgGXrQ9LbEooHAPF
$ bitcoin-cli getnewaddress
error: {"code":-12,"message":"Error: Keypool ran out, please call keypoolrefill first"}
$ bitcoin-cli walletpassphrase mypass 3600
$ bitcoin-cli walletlock
$ bitcoin-cli getnewaddress
1BSDX4PiHKvdssjAzDLVACAAQvwiijmETV
$ bitcoin-cli getnewaddress
1JJphgnC5gqunLtbbLAwtN8LXRnCUYWARm
$ bitcoin-cli getnewaddress
17UJqrpuakgPPuxPTLa8LeeWVAKijZW66x
$ bitcoin-cli getnewaddress
16itq5LpuwyhtfbiHbQxVzJYYdGE7nQRoz
$ bitcoin-cli getnewaddress
1QA4EnXPUHquK9WBxBppicfBTD2gYTB9ic
$ bitcoin-cli getnewaddress
12bgaABsakRouK9NZyUAK1RAD9nmDtHQKa
$ bitcoin-cli getnewaddress
error: {"code":-12,"message":"Error: Keypool ran out, please call keypoolrefill first"}
$ 
Где пул ключей отслеживает использование ключа, если кошелек заблокирован? Что делать, если биткойн перезапущен? биткойн.stackexchange.com/q/5800/1878
Каждый getnewaddress берет адрес из пула ключей. Быть «заблокированным» просто означает, что парольная фраза, используемая для шифрования закрытого ключа каждого адреса, недоступна. Это предотвращает создание новых адресов (поскольку парольная фраза требуется для шифрования нового закрытого ключа) и трату содержимого существующих адресов (поскольку парольная фраза требуется для расшифровки их закрытого ключа). Кошелек не заблокирован в том смысле, что его нельзя изменить, поэтому адреса могут быть помечены как отсутствующие в пуле ключей.