Clave privada extendida vs clave privada

Estoy tratando de hacer un hd walletbasado en nodejs. Entonces, para tener una billetera segura, he creado una billetera en mi máquina fuera de línea

const hdkey = require('ethereumjs-wallet/hdkey');
const bip39 = require('bip39');
var seed = bip39.mnemonicToSeed('my_mnemonic', 'my_password');
var chain = hdkey.fromMasterSeed(seed);
var xpub = chain.publicExtendedKey();
var xpriv = chain.privateExtendedKey();

Que usando xpubestoy generando direcciones para los usuarios.

const wallet = require('ethereumjs-wallet');
const hdkey = require('ethereumjs-wallet/hdkey');
const _____ = require('dotenv').config();

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();
};
generate().then(v => {
    console.log(v);
}).catch(error => {
    console.log(error);
});

Ok, ahora quiero enviar monedas desde estas direcciones a mi propia dirección usando una clave privada extendida:xpriv

const 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: '0x4584158529818ef77D1142bEeb0b6648BD8eDb2f',
    value: '0.1',
    gasPrice: 5000000000,
    gasLimit: 21000,
    chainId: 3
};
const privKey = new Buffer('xprv9s21ZrQH143K36eJpjZxNPYbNjzzUMvqLSG6P6Sex1unL8meREsNkcMNRw4ntv3WjJ2tJJX3CrdxkCJdyo7zLnjqdFppov2BAvY4iXYuMCY','base64');
const tx = new ethTx(params);

//Signing the transaction with the correct private key
tx.sign(privKey); //ERROR HERE


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

Cuando intento iniciar sesión, recibo un error de que la clave privada no es válida. Qué clave privada necesito usar para firmar transacciones.

¿Puedo sugerirle que elimine su clave privada del código anterior?
no lo voy a usar)

Respuestas (1)

No firma la transacción con la clave privada maestra. Lo firmas con la clave privada que corresponde a la dirección del remitente:

const hdkey = require('ethereumjs-wallet/hdkey');
const bip39 = require('bip39');
var seed = bip39.mnemonicToSeed('my_mnemonic', 'my_password');
var chain = hdkey.fromMasterSeed(seed);
var addr_node = chain.derivePath(senders_derivation_path);
//if addr is the same with the address you want to send from, then its corresponding private_key will also be valid. Otherwise, most probably the senders_derivation_path is wrong
var addr = addr_node.getWallet().getAddressString();
var private_key = addr_node.getWallet().getPrivateKey();
Pero, ¿qué pasa si no quiero usar una clave privada en mi servicio en línea? No es seguro, y si alguien pirateó mi servidor, puede retirar monedas usando esta clave privada.
crea la transacción en la computadora en línea, pero la firma en la fuera de línea. Pensé que su problema en esta pregunta en particular era cómo obtener la clave privada para la dirección de firma, y ​​para eso es mi respuesta.
¿Puede proporcionar el código, para que pueda entender?
tal vez, en una pregunta separada, una vez que vote y acepte las preguntas que ya le respondí. Intentemos usar este foro como está destinado a ser usado: una pregunta/hilo puntual.
la respuesta no me ayudo a resolver el problema
Estas fueron respuestas a preguntas específicas (aunque respondí algunas de sus preguntas de seguimiento en la anterior ). Este foro es para ayudar a problemas específicos . No es por hacer todo el trabajo por ti. Para eso, tal vez sería mejor contratar a un consultor.