Erweiterter privater Schlüssel vs. privater Schlüssel

Ich versuche, eine hd walletBasis zu erstellen nodejs. Um also eine sichere Brieftasche zu haben, habe ich eine Brieftasche auf meinem Offline-Computer erstellt

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

xpubAls ich nutze , generiere ich Adressen für Benutzer.

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, jetzt möchte ich Münzen von diesen Adressen mit erweitertem privaten Schlüssel an meine eigene Adresse senden -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}`); }
    }
);

Beim Versuch zu signieren erhalte ich eine Fehlermeldung, dass der private Schlüssel ungültig ist. Welchen privaten Schlüssel muss ich zum Signieren von Transaktionen verwenden?

Darf ich Ihnen vorschlagen, Ihren privaten Schlüssel aus dem obigen Code zu entfernen?
Ich werde es nicht verwenden)

Antworten (1)

Sie signieren die Transaktion nicht mit dem Master Private Key. Sie signieren es mit dem privaten Schlüssel, der der Adresse des Absenders entspricht:

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();
Aber was ist, wenn ich in meinem Online-Dienst keinen privaten Schlüssel verwenden möchte? Es ist nicht sicher, und wenn jemand meinen Server gehackt hat, kann ich mit diesem privaten Schlüssel Münzen abheben
Sie erstellen die Transaktion auf dem Online-Computer, signieren sie jedoch auf dem Offline-Computer. Ich dachte, Ihr Problem in dieser speziellen Frage war, wie Sie den privaten Schlüssel für die Signaturadresse erhalten, und dafür ist meine Antwort.
kannst du mir den Code geben, damit ich es verstehe?
vielleicht in einer separaten Frage, sobald Sie die Fragen, die ich Ihnen bereits beantwortet habe, positiv bewerten und akzeptieren. Lassen Sie uns versuchen, dieses Forum so zu nutzen, wie es beabsichtigt ist: eine punktuelle Frage/Thread.
Die Antwort hat mir nicht geholfen, das Problem zu lösen
Dies waren Antworten auf spezifische Fragen (obwohl ich einige Ihrer Folgefragen in der vorherigen beantwortet habe ). Dieses Forum dient der Hilfestellung bei konkreten Problemen. Es geht nicht darum, die ganze Arbeit für Sie zu erledigen. Dafür sollten Sie vielleicht besser einen Berater beauftragen.