Recuperar la clave privada/pública con web3js para una billetera específica proporcionada por truffle/hdwallet-provider

No puedo encontrar una manera de recuperar la clave privada/la clave pública/la dirección pública de una cuenta web3 cargada a través de un proveedor. Probé el web3.eth.accountscomando pero no obtengo la clave privada/la clave pública/la dirección pública.

const web3 = new Web3(provider);
web3.eth.accounts

En más detalles, me gustaría tener una billetera HD para recibir éteres en diferentes claves públicas (y luego venderlos). Siguiendo los consejos en el documento , estoy usando truffle/hdwallet-providerla billetera HD. Así que ahora estoy tratando de recuperar la clave privada, la clave pública y posiblemente la dirección pública a través de web3js para el proveedor creado a través detruffle/hdwallet-provider wallet

Este es mi código que ejecuto varias veces cada vez en una nueva consola de nodo en un archivo cmd.

Antes de iniciar la consola del nodo, empiezo cmdcon geth --rpc --rpcport 8545 mientras Internet está apagado para no tener que descargar/sincronizar la cadena de bloques.

const mnemonicPhrase = 'some words ... '

const HDWalletProvider = require("@truffle/hdwallet-provider");
Web3 = require('web3');


provider = new HDWalletProvider({
  mnemonic: mnemonicPhrase,
  providerOrUrl: "http://localhost:8545",
  numberOfAddresses: 1,
  shareNonce: true,
  derivationPath: "m/44'/0'/0'/0/"
});

const web3 = new Web3(provider);
web3.eth.accounts

Debería haber una forma de recuperar la clave privada/pública a través de web3.eth.accounts, pero solo obtengo una única dirección.

¡Muchas gracias por tu ayuda!

  • Sistema operativo: ventanas
  • Cliente de Ethereum:
  • Versión de trufa ( truffle version): @truffle/hdwallet-provider@1.4.0 (web3@1.3.6)
  • versión del nodo ( node --version): v14.16.1
  • versión npm ( npm --version): 6.14.12

Respuestas (2)

hd-wallet almacena todas las claves dentro de la variable de la billetera, puede acceder a ellas siguiendo el ejemplo.

provider = new HDWalletProvider({
  mnemonic: mnemonicPhrase,
  providerOrUrl: "http://localhost:8545",
  numberOfAddresses: 2,
  shareNonce: true,
  derivationPath: "m/44'/0'/0'/0/"
});
const web3 = new Web3(provider);
const wallets = provider.wallets;
var accounts = [];
for (const wallet in wallets) {
  let account = wallets[wallet];
  accounts.push({
    privateKey: account.privateKey.toString("hex"),
    publicKey: account.publicKey.toString("hex"),
    publicAddress: wallet,
  });
}

Resultado

[
  {
    privateKey: '8bdde4f02d6d6736bebd8s277ec89893be7be4c02e9ad5da38a8fca619986311',
    publicKey: '0414351013efd92a4aa932443548160bdeb1d56553efe5c50f8a75342ea2a71a96a12b5000a4b4ad3fe51d2075142cf8d7dce51a1a17b93eee447389ba0fc136d8',
    publicAddress: '0xE839836eC6Ef7Fac9f52e460B0A9DBD9342D806F'
  },
  {
    privateKey: '1745940f309220276d2e974415daf7ad08ca172ef3922bd241327b9cbc866f32',
    publicKey: '04ca9c29801acc74b5a9925efc47b590e1807f68c79eecacdc1f1c4e0e1b3af4717537f0ac7dbaa79569a4382943e03f8149f96a3198b18ce58593e132f399b659',
    publicAddress: '0xdB5C44A94705664904c2dB120A61345bEf76027e'
  },
]

Lo sentimos, web3 no recupera claves privadas/públicas

Sin embargo, puede generar un objeto de cuenta que contenga una clave privada/pública.

web3.eth.accounts.create();
> {
address: "0xb8CE9ab6943e0eCED004cDe8e3bBed6568B2Fa01",
privateKey: "0x348ce564d427a3311b6536bbcff9390d69395b06ed6c486954e971d960fe8709",
signTransaction: function(tx){...},
sign: function(data){...},
encrypt: function(password){...}

}

Gracias por tu respuesta. Sí, eso es posible, pero esta dirección no es parte de mi billetera/mnemónico de trufas. ¿Hay otra forma/paquete que pueda usar para recuperar la clave privada/pública de truffle?