So generieren Sie einen privaten Schlüssel, einen öffentlichen Schlüssel und eine Adresse

Ich kann online keine Dokumentation darüber finden, wie Sie dies in Javascript tun, außer dieser .

Ich möchte wissen, wie die Authentifizierung in einer Ethereum-dApp funktioniert. Nach meinem Verständnis wird der Benutzer-Seed irgendwie in einen privaten Schlüssel generiert, der dann diesen privaten Schlüssel verwendet, um den öffentlichen Schlüssel abzuleiten, und daraus leitet man die Adresse ab. Hat jemand Weitere Informationen darüber, wie dies mit Javascript erreicht wurde oder wie die Architektur für diese Art von Setup aussieht. Jede Hilfe zum Verständnis wäre großartig.

Ich weiß, wie man die Seed-Phrase usw. mit der js bip39-Bibliothek generiert, danach bin ich ein bisschen festgefahren.

das ist im Grunde das, was ich bisher versuche:

    const mnemonic = "vacant element sleep harsh stick else salt great kitten clutch salad subway"
    const privateKey = new Buffer( mnemonic )
    const publicKey = ethUtil.privateToPublic(privateKey).toString('hex')
    const address = ethUtil.privateToAddress(privateKey).toString('hex')
Gibt es ein bestimmtes Tool, das Sie abgleichen möchten? Das heißt, möchten Sie die gleiche(n) Adresse(n) erstellen wie ein anderes Tool mit der gleichen Seed-Phrase?
Oder ist Ihr Ziel nur, einen zufälligen privaten Schlüssel (und Adresse) zu erzeugen?

Antworten (3)

Ich habe diesen Code von HD Wallet Provider extrahiert

const bip39 = require('bip39');
const hdkey = require('ethereumjs-wallet/hdkey');

const mnemonic = '..';
const hdwallet = hdkey.fromMasterSeed(bip39.mnemonicToSeed(mnemonic));
const path = "m/44'/60'/0'/0/0";
const wallet = hdwallet.derivePath(path).getWallet();
const address = `0x${wallet.getAddress().toString('hex')}`;

console.log(`Address: ${address}`);
Hübsch! Hatte gehofft, jemand würde eine bessere Antwort finden als meine :-) +1

Wenn Sie bereits einen Seed generiert haben, der einem privaten Schlüssel entspricht, können Sie den Rest wahrscheinlich aus dem GitHub-Repo von Ethereum abrufen . (Die gleiche Funktionalität wird wahrscheinlich im BIP-39 JS-Code bereitgestellt .)

Etwas in der Art von:

var utils = require('ethereumjs-util')
var privateKey = new Buffer(<from_seed>)
var publicKey = utils.privateToPublic(privateKey).toString('hex')
var address = utils.privateToAddress(privateKey).toString('hex')

Bearbeiten:

Das Obige geht davon aus, dass Sie bereits einige abgeleitete private Schlüssel aus Ihrer Mnemonik generiert haben. Um von der rohen BIP-39-Mnemonik zum obigen zu gelangen, ist ein bisschen komplizierter. (Ich bin wahrscheinlich nicht am besten qualifiziert, um eine anständige Antwort auf JS-Code zu geben ... Jemand hat möglicherweise eine bessere Methode als die folgende. Wie @smarx sagt, ist auch nicht klar, was Ihre ultimativen Ziele sind.)

Kurz gesagt - aus index.jsdem BIP-39 JS-Code - müssen Sie Folgendes tun:

  • Holen Sie sich den Ableitungspfad ( getDerivationPath())
  • Berechnen Sie den erweiterten BIP32-Schlüssel ( calcBip32ExtendedKey())
  • Holen Sie sich den Schlüssel ( bip32ExtendedKey.derive())
  • Holen Sie sich daraus das Schlüsselpaar ( key.keyPair)

Dann können Sie Ihre Werte direkt abrufen :

var privKeyBuffer = keyPair.d.toBuffer(32);
privkey = privKeyBuffer.toString('hex');
var addressBuffer = ethUtil.privateToAddress(privKeyBuffer);
var hexAddress = addressBuffer.toString('hex');
var checksumAddress = ethUtil.toChecksumAddress(hexAddress);
address = ethUtil.addHexPrefix(checksumAddress);
privkey = ethUtil.addHexPrefix(privkey);
pubkey = ethUtil.addHexPrefix(pubkey);

Das Obige könnte Ihnen zumindest eine Vorstellung davon geben, wo Sie suchen müssen, um weiter zu kommen.

Okay, das ist im Grunde diese Antwort ...: ethereum.stackexchange.com/a/1063/52
Es gibt mir den Fehler, dass die Länge des privaten Schlüssels ungültig ist.
Was fütterst du in den privateKeyPuffer? (Sie müssen einen der abgeleiteten privaten Schlüssel verwenden.)
Ich füttere die mneumonische Seed-Phrase, ich dachte, der private Schlüssel wurde davon abgeleitet? Das ist also im Grunde das, was ich in den Puffer einfüge: "Leeres Element, Schlaf, harter Stock, sonst, Salz, tolles Kätzchen, Kupplung, Salat, U-Bahn".
Ich verwende bip39 zum Generieren des Seeds

Wenn Sie es im Browser oder React Native with Expo verwenden, versuchen Sie es mit ethers.js . Andernfalls werden Sie hier viele Arbeiten einführen, da Sie auf nativen Code zugreifen müssen, um React-native-randomBytes zu verwenden

mit ethers.js, führen Sie einfach aus:

const wallet = Wallet.fromMnemonic(mnemonic);