No puedo enviar transacciones

Tengo una tienda en línea donde los usuarios pueden recibir ETHy hacer compras. Entonces, para tener una billetera segura, he creado un servicio fuera de línea que genera xpuby xprivuso para generar direcciones en mi servicio en línea.

Lo estoy usando xpuben mi servicio en línea para generar direcciones para los usuarios y lo estoy usando xpriven mi segundo servicio fuera de línea para enviar transacciones.

Aquí hay un código que generaxpub

const hdkey = require('ethereumjs-wallet/hdkey');
const bip39 = require('bip39');

var seed = bip39.mnemonicToSeed('my_mnemonic_phrase', 'my_password');

var chain = hdkey.fromMasterSeed(seed);

var xpub = chain.publicExtendedKey();

var xpriv = chain.privateExtendedKey();

Que usando xpuben mi servicio en línea estoy generando direcciones para usuarios

const generate = async (index) => {

    const xpub = process.env.ETH_XPUB;

    const hdk = hdkey.fromExtendedKey(xpub);

    index = index || 0;

    const child = hdk.deriveChild(index);
    const w = wallet.fromExtendedPublicKey(child.publicExtendedKey());

    return w.getAddressString();
};

Así que todo está bien, pero en mi servicio fuera de línea también tengo un servicio que debería enviar todas las monedas a mi propia cuenta desde las direcciones generadas.

Aquí está mi segundo servicio.

onst ethTx = require('ethereumjs-tx');
const Web3 = require('web3');


const web3 = new Web3(
    new Web3.providers.HttpProvider('http://localhost:8545')
);

//Verify connection is successful
web3.eth.net.isListening()
    .then(() => console.log('is connected'))
    .catch(e => console.log('Wow. Something went wrong'));


const params = {
    nonce: 0,
    to: my_address,
    value: '0.1',
    gasPrice: 5000000000,
    gasLimit: 21000,
    chainId: 3
};


const privKey = new Buffer('xprv_MY_XPRIV_KEY','hex');

const tx = new ethTx(params);
//Signing the transaction with the correct private key
tx.sign(privKey);

const serializedTx = tx.serialize();


Web3.eth.sendSignedTransaction(
    `0x${serializedTx.toString('hex')}`,
    (error, result) => {
        if (error) { console.log(`Error: ${error}`); }
        else { console.log(`Result: ${result}`); }
    }
);

Pero en este caso recibo un error como este

la longitud de la clave privada no es válida

Estoy usando xprivcomo clave privada. Esta bien ? o donde mi error? ¿Qué necesito agregar/cambiar para enviar transacciones?

Cualquier sugerencia sería muy apreciada.

Intente registrar la clave privada en la consola, solo para realizar pruebas, y vea si la longitud coincide con lo esperado.
la longitud de la clave privada es 111. ¿Puedo usar xpriv como clave privada?

Respuestas (1)

Con su clave privada no puede firmar transacciones para la dirección del niño. Primero debe derivar una billetera para la dirección del niño.

const privKey = new Buffer('xprv_MY_XPRIV_KEY','hex')

const wal = hdkey.fromExtendedPrivateKey(privKey)
const w = wal.deriveChild(index).getWallet()

const childPK = w.getPrivateKey()