Transaktionen können nicht gesendet werden

Ich habe einen Online-Shop, in dem Benutzer Waren empfangen ETHund einkaufen können. Um also eine sichere Brieftasche zu haben, habe ich einen Offline-Dienst erstellt, der Adressen in meinem Online-Dienst generiert xpubund mit xprivdem ich Adressen generiere.

Ich verwende xpubin meinem Online-Dienst, um Adressen für Benutzer zu generieren, und verwende xprivin meinem zweiten Offline-Dienst, um Transaktionen zu senden.

Hier ist ein Code, der generiertxpub

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

Als ich in meinem Online-Dienst nutze xpub, generiere ich Adressen für Benutzer

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

Also alles ok, aber ich habe in meinem Offline-Dienst auch einen Dienst, der alle Coins von generierten Adressen an mein eigenes Konto senden soll.

Hier ist mein zweiter Dienst

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

Aber in diesem Fall bekomme ich einen Fehler, der so aussieht

Die Länge des privaten Schlüssels ist ungültig

Ich verwende xprivals privaten Schlüssel . Ist das ok ? oder wo mein fehler ? Was muss ich hinzufügen/ändern, um Transaktionen zu senden?

Irgendwelche Vorschläge würden viel schätzen.

Versuchen Sie, den privaten Schlüssel nur zu Testzwecken in der Konsole zu protokollieren, und prüfen Sie, ob die Länge den Erwartungen entspricht.
die Länge des privaten Schlüssels ist 111. Darf ich xpriv als privaten Schlüssel verwenden?

Antworten (1)

Mit Ihrem privaten Schlüssel können Sie keine Transaktion für die untergeordnete Adresse signieren. Sie müssen zuerst eine Brieftasche für die untergeordnete Adresse ableiten.

const privKey = new Buffer('xprv_MY_XPRIV_KEY','hex')

const wal = hdkey.fromExtendedPrivateKey(privKey)
const w = wal.deriveChild(index).getWallet()

const childPK = w.getPrivateKey()