Cómo obtener claves privadas en Truffle desde cuentas de Ganache

Al hacer algunas pruebas ERC-735 en trufa+ganache, me quedé atascado al crear firmas de reclamo. Deben estar firmados desde mi cuenta de ganache, pero no conozco su clave privada. El código a utilizar es este:

const messageToSign = "hello world";
const privateKey = "43f2ee33c522046e80b67e96ceb84a05b60b9434b0ee2e3ae4b1311b9f5dcc46";
var msgHash = EthUtil.hashPersonalMessage(new Buffer(messageToSign));
var sig = EthUtil.ecsign(msgHash, new Buffer(privateKey, 'hex')); 
var signatureRPC = EthUtil.toRpcSig(sig.v, sig.r, sig.s)
console.log(signatureRPC);

Como se explicó en Firmar datos con clave privada dentro de un archivo de prueba de truffle, había un método para firmar mensajes de Truffle usando:

let signedMessage = await web3.personal.sign("data", accounts[0])

pero ahora está en desuso, arroja el error "Método personal_sign no compatible", por lo que una solución parece ser una firma explícita usando una clave privada (código anterior).

¿Cómo puedo obtener la clave privada de ganache? o mejor aún, ¿puedo obtener la clave privada de truffle?

firmar usando una clave privada en realidad no es el mejor enfoque cuando se desarrolla, no porque no funcione, sino porque es arriesgado (las primeras transacciones de blockchain se realizaron manualmente), en cualquier nodo ETH, las claves privadas se almacenan en un lugar seguro y solo las lee el propio cliente del nodo. así que tratar de leerlo jsrealmente no va a suceder, solo busque el nuevo método de firma de web3 si está obsoleto.
@KakiMasterOfTime, la única forma de firmar una transacción es usar una clave privada, por lo que usaría una clave privada simple o una clave privada encriptada, de todos modos, tiene que almacenar uno de ambos (ya sea la clave privada o la contraseña) en el código.

Respuestas (1)

Puede comenzar ganachecon un mnemotécnico como parámetro ( -m 'jar boss sister abuse equal ....'). Al hacer esto, usted:

  • tener la garantía de tener las mismas direcciones generadas con cada ejecución
  • ser capaz de derivar las claves privadas de ese mnemotécnico

    const bip39 = require('bip39');
    const hdkey = require('ethereumjs-wallet/hdkey');
    const wallet = require('ethereumjs-wallet');
    
    const seed = bip39.mnemonicToSeed(mnemonic); // mnemonic is the string containing the words
    const hdk = hdkey.fromMasterSeed(seed);
    const addr_node = hdk.derivePath("m/44'/60'/0'/0/0"); //m/44'/60'/0'/0/0 is derivation path for the first account. m/44'/60'/0'/0/1 is the derivation path for the second account and so on
    const addr = addr_node.getWallet().getAddressString(); //check that this is the same with the address that ganache list for the first account to make sure the derivation is correct
    const private_key = addr_node.getWallet().getPrivateKey();