So erhalten Sie private Schlüssel für Truffle von Ganache-Konten

Bei einigen ERC-735-Tests mit Trüffel+Ganache blieb ich beim Erstellen von Claim-Signaturen hängen. Sie müssen von meinem Ganache-Konto signiert werden, aber ich kenne ihren privaten Schlüssel nicht. Der zu verwendende Code ist dieser:

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);

Wie unter Daten mit privatem Schlüssel in einer Truffle-Testdatei signieren erklärt , gab es eine Methode zum Signieren von Nachrichten von Truffle mit:

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

aber es ist jetzt veraltet, es löst den Fehler „Method personal_sign not supported“ aus, sodass eine Lösung eine explizite Signatur mit privatem Schlüssel zu sein scheint (Code oben).

Wie bekomme ich den privaten Schlüssel von Ganache? oder noch besser, kann ich den privaten Schlüssel von Truffle bekommen?

Das Signieren mit privatem Schlüssel ist eigentlich nicht der beste Ansatz bei der Entwicklung, nicht weil es nicht funktioniert, aber es ist riskant (erste Blockchain-Transaktionen wurden manuell durchgeführt), in jedem ETH-Knoten werden die privaten Schlüssel an einem sicheren Ort gespeichert und nur von gelesen der Node-Client selbst. Der Versuch, es zu lesen, jswird also wirklich nicht passieren. Suchen Sie einfach nach der neuen Signaturmethode von web3, wenn diese veraltet ist.
@KakiMasterOfTime , die einzige Möglichkeit, eine Transaktion zu signieren, ist die Verwendung eines privaten Schlüssels. Würde er also einen einfachen privaten Schlüssel oder einen verschlüsselten privaten Schlüssel verwenden, muss er sowieso einen von beiden (entweder den privaten Schlüssel oder das Passwort) im Code speichern.

Antworten (1)

Sie können ganachemit einer Mnemonik als Parameter beginnen ( -m 'jar boss sister abuse equal ....'). Dabei werden Sie:

  • garantiert, dass bei jedem Durchlauf die gleichen Adressen generiert werden
  • in der Lage sein, die privaten Schlüssel von dieser Mnemonik abzuleiten

    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();