¿Cómo genera bitcoind una nueva dirección si la billetera está encriptada?

Supongamos que mi billetera está encriptada con una fase de contraseña y actualmente no he proporcionado bitcoindla frase de contraseña para acceder a la sección de claves privadas de la billetera.

Si entro:

bitcoind getnewaddress

Imprime una nueva dirección, digamos [alguna dirección], pero ¿dónde almacena la clave privada que la acompaña?

Si entro:

bitcoind dumpprivkey [someaddress]

Recibo un mensaje de error porque no proporcioné la frase de contraseña de la billetera.

Pero si primero proporciono la frase de contraseña de la billetera y luego dumpprivkeylo intento, muestra la clave privada.

Cuando le pedí que obtuviera una nueva dirección, no había proporcionado la frase de contraseña, entonces, ¿cómo almacena la clave privada?

Respuestas (1)

Lo obtiene del conjunto de claves, que tiene 100 direcciones pregeneradas de forma predeterminada. La próxima vez que ingrese su frase de contraseña, volverá a llenar el grupo con nuevas direcciones.

Aquí hay un ejemplo que muestra que el grupo se está agotando y se vuelve a llenar cuando se proporciona la contraseña. Los siguientes comandos fueron realizados por un profesional capacitado. No intente esto en casa (especialmente los primeros 2 comandos):

$ 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"}
$ 
¿Dónde rastrea el conjunto de claves que la clave se está utilizando si la billetera está bloqueada? ¿Qué sucede si se reinicia bitcoind? bitcoin.stackexchange.com/q/5800/1878
Cada 'getnewaddress' toma una dirección del conjunto de claves. Estar 'bloqueado' simplemente significa que la frase de contraseña utilizada para cifrar la clave privada de cada dirección no está disponible. Esto evita que se creen nuevas direcciones (ya que se requiere la frase de contraseña para cifrar la nueva clave privada) y que se gaste el contenido de las direcciones existentes (ya que se requiere la frase de contraseña para descifrar su clave privada). La billetera no está bloqueada en el sentido de que no se puede modificar, por lo que las direcciones se pueden marcar como si ya no estuvieran en el conjunto de claves.