Estoy tratando de generar direcciones y crear transacciones usando nodejs y @emurgo/cardano-serialization-lib-nodejs lib (CardanoWasm). Siguiendo los documentos, estoy intentando esto:
const rootkey = CardanoWasm.Bip32PrivateKey.from_bip39_entropy( Buffer.from(someEntropy, 'hex'), // entropy is generated from mnemonic Buffer.from('') ); const account = rootkey .derive(harden(1852)) // harden is a function returning 0x80000000+arg .derive(harden(1815)) .derive(harden(0)); const utxokey = account .derive(0) .derive(0) .to_public(); const stake1 = account .derive(2) .derive(0) .to_public(); const address = CardanoWasm.BaseAddress.new( CardanoWasm.NetworkInfo.mainnet().network_id(), CardanoWasm.StakeCredential.from_keyhash(utxokey.to_raw_key().hash()), CardanoWasm.StakeCredential.from_keyhash(stakekey.to_raw_key().hash()) ); const addressBech32 = address.to_address().to_bech32();Entonces, en mi ejemplo, addressBech32 es una dirección pública real de una billetera. Cuando importo la billetera al guarda (por ejemplo) por mnemotécnico funciona bien. Pero, ¿qué es realmente rootkey y cuenta? ¿Qué es la clave privada y la clave de firma en mi ejemplo? ¿Qué clave debo usar para firmar la transacción y cómo obtener esa clave usando cardano wasm? ¿Qué clave privada debo usar para importar la billetera (si no quiero usar mnemónico por alguna razón)?
Cuando importo la billetera al guarda (por ejemplo) por mnemotécnico funciona bien. Pero, ¿qué es realmente rootkey y cuenta?
rootKey es una representación de su xpriv , su clave privada maestra a partir de la cual se generan todas las claves privadas y públicas de inversión y gasto.
El proceso para generar claves de replanteo y firma se describe en CIP-0003, básicamente aprovechando el estándar Bitcoin BIP32 y BIP44 .
En resumen, el esquema permite que se use una clave maestra para generar una cantidad de 'cuentas' de billetera separadas. En tu ejemplo:
const account = rootkey .derive(harden(1852)) // harden is a function returning 0x80000000+arg .derive(harden(1815)) .derive(harden(0));genera la clave privada para la cuenta cero de Cardano.
Ir más lejos:
account .derive(0) # external chain (designated for receive addresses) .derive(0); # index (the first address)generaría una clave privada para recibir la dirección cero en esa cuenta.
¿Qué es la clave privada y la clave de firma en mi ejemplo? ¿Qué clave debo usar para firmar la transacción y cómo obtener esa clave usando cardano wasm?
Su ejemplo crea una dirección bech32 para (cuenta Cardano 0) dirección de recepción 0. Entonces, la clave privada para gastar desde esta dirección sería la misma que la anterior:
const utxo_privkey = account .derive(0) .derive(0);¿Qué clave privada debo usar para importar la billetera (si no quiero usar mnemónico por alguna razón)?
Puede proporcionar la entropía como bytes, como lo hizo en su ejemplo para rootKey , o puede usar una clave privada codificada en bech32 de esta manera:
const rootKey = CardanoWasm.BIP32PrivateKey.from_bech32("xprv17qx9vxm6060qjn5fgazfue9nwyf448w7upk60c3epln82vumg9r9kxzsud9uv5rfscxp382j2aku254zj3qfx9fx39t6hjwtmwq85uunsd8x0st3j66lzf5yn30hwq5n75zeuplepx8vxc502txx09ygjgx06n0p");Puede consultar la documentación de estilo de dirección de Cardano Shelley https://input-output-hk.github.io/cardano-addresses/haddock/cardano-addresses-3.2.0/Cardano-Address-Style-Shelley.html#g:2