Tengo una tienda en línea donde los usuarios pueden recibir ETH
y hacer compras. Entonces, para tener una billetera segura, he creado un servicio fuera de línea que genera xpub
y xpriv
uso para generar direcciones en mi servicio en línea.
Lo estoy usando xpub
en mi servicio en línea para generar direcciones para los usuarios y lo estoy usando xpriv
en 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 xpub
en 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 xpriv
como clave privada. Esta bien ? o donde mi error? ¿Qué necesito agregar/cambiar para enviar transacciones?
Cualquier sugerencia sería muy apreciada.
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()
WBT
Yur Gasparyan