Generación de direcciones reforzadas con monedero de solo reloj BIP44 con xpub

Estoy desconcertado por la derivación de clave endurecida de una billetera BIP44 de solo reloj.

Permítanme primero explicar lo que estoy tratando de hacer.

  • Estoy implementando un esquema multigrado 2 de 3
  • Estoy usando el nodo y la billetera Bcoin
  • Las 3 claves se generan externamente
  • Quiero usar la billetera solo para relojes Bcoin

ts para crear direcciones y scripts

Esto es lo que he hecho hasta ahora:

  1. Creó 3 claves xprv y claves xpubs usando esta herramienta aquí
  2. Utilicé la ruta personalizada m/44'/0'/0'para tener claves reforzadas porque la billetera Bcoin requiere claves reforzadas BIP44
  3. Creé 3 billeteras solo para relojes usando las xpubclaves.
  4. Luego agregué cada una de las claves como claves compartidas entre sí (realmente solo tengo que hacer esto para una billetera)

El código es el siguiente:

const HSM_accountKey = "xpub_HSM...."
const IC_accountKey = "xpub_IC..."
const Paper_accountKey = "xpub_Paper..."

const result_wallet_HSM = await walletClient.createWallet('wallet_HSM', options_wallet);
const result_wallet_IC = await walletClient.createWallet('wallet_IC', options_wallet);
const result_wallet_Paper = await walletClient.createWallet('wallet_Paper', options_wallet);


const wallet_IC_account = await wallet_IC.getAccount('default');
const wallet_Paper_account = await wallet_Paper.getAccount('default');
const result_addkey1 = await wallet_HSM.addSharedKey('default', wallet_IC_account.accountKey);
const result_addkey2 = await wallet_HSM.addSharedKey('default', wallet_Paper_account.accountKey);

Ahora he creado una billetera multisig 2 de 3 solo para ver. Lo que quiero hacer ahora es crear direcciones. No quiero derivar más claves extendidas para niños. Solo necesito un nivel de derivación. Ahora quiero crear direcciones multisig para mis usuarios.

// Create addresses from each wallet
const wallet_HSM_address = await wallet_HSM.createAddress('default');
const wallet_IC_address = await wallet_IC.createAddress('default');
const wallet_Paper_address = await wallet_Paper.createAddress('default');

// Keyrings for script generation
const keyring_HSM = KeyRing.fromJSON(wallet_HSM_address);
const keyring_IC = KeyRing.fromJSON(wallet_IC_address);
const keyring_Paper = KeyRing.fromJSON(wallet_Paper_address);

//Get the pubkeys from each wallet
const pubKeys = [keyring_HSM.publicKey, keyring_HSM.publicKey, keyring_Paper.publicKey];

const multiSigScript = Script.fromMultisig(m, n, pubKeys);
const receivingAddress = multiSigScript.getAddress().toBase58(network); 

Tengo la sensación de que estoy dando este paso de forma indirecta, pero entiendes lo que estoy tratando de hacer.

Para reiterar, lo que quiero hacer ahora es crear direcciones de recepción individuales para mis usuarios y los scripts P2SH correspondientes.

Ahora, esto es lo que necesito ayuda para entender .

  • Según BIP32, no puede derivar claves públicas reforzadas con CDKpub. Necesita el xprv para derivar claves secundarias.
  • Sin embargo, a partir de lo que he hecho, puedo derivar claves públicas secundarias. He enviado monedas tesetnet a estas direcciones ( receivingAddressen el código de arriba) y funcionan. La billetera recibe monedas.
  • Entonces, ¿cómo fue que la billetera de solo reloj pudo crear claves públicas secundarias reforzadas? No ingresé xprva la billetera.
  • ¿O es que NO estoy creando claves públicas secundarias reforzadas cuando utilicé la ruta m/44'/0'/0'? ¿El que receivingAddressestoy creando en el código anterior no está reforzado? Lo que significa que si alguien puede encontrar las claves privadas secundarias de un usuario y el xpub, ¿podrá obtener todas las claves privadas de Chile?

Mis disculpas por la larga pregunta. Estoy un poco confundido en cuanto a cómo las billeteras pueden crear claves públicas secundarias sin tener ninguna clave privada en la billetera.

Gracias.

No veo en ninguna parte de su código donde está derivando claves secundarias. Todo lo que veo es que generó 3 pares de claves privadas/públicas e hizo un multisig con ellos. Eso no es nada especial.
Gracias Andrew ¿Cuál es la diferencia entre derivar claves secundarias y generar claves secundarias? Lo que intento hacer es generar claves secundarias para que los usuarios del sistema tengan una dirección de recepción. ¿Cuál es mi malentendido? Y luego, más adelante, necesito generar las claves privadas secundarias correspondientes para gastar las monedas recibidas en esas direcciones. Entonces quiero poder generar esas claves privadas desde el índice.
derivar claves secundarias y generar claves secundarias significan lo mismo. Pero, AFAICT, no estás haciendo eso en tu código en absoluto.
@AndrewChow Muchas gracias. ¿ Podría usted amablemente decirme lo que está sucediendo en createAddress()? ¿No está generando una clave secundaria? Cada vez que lo llamo createAddress(), genera una nueva dirección secundaria con un índice determinado. ¿Qué estoy malinterpretando aquí?
No sabía que createAddress()está creando una nueva dirección. Si ese es el caso, no está derivando direcciones reforzadas, especialmente si solo le dio un xpub.

Respuestas (1)

No está derivando claves secundarias reforzadas. No puede derivar claves reforzadas de un xpub. El hecho de que el propio xpub esté protegido no significa que sus hijos lo estén.

Gracias Andrew Esa es probablemente la razón. Si tiene una idea de cómo generar explícitamente claves secundarias reforzadas, compártala.