So erstellen Sie eine Ethereum-Brieftaschenadresse aus einem privaten Schlüssel

Im ersten Artikel dieser Serie haben wir einen privaten Bitcoin-Schlüssel generiert : 60cf347dbc59d31c1358c8e5cf5e45b822ab85b79cb32a9f3d98184779a9efc2.

Hier verwenden wir diesen Schlüssel, um die öffentliche Adresse und dann die Ethereum-Brieftaschenadresse dieses privaten Schlüssels abzurufen.

Das Erstellen der Bitcoin-Brieftaschenadresse aus dem privaten Schlüssel ist etwas kompliziert. Hier wird der Prozess viel einfacher. Wir müssen eine Hash-Funktion anwenden, um den öffentlichen Schlüssel zu erhalten, und eine andere, um die Adresse zu erhalten.

Also lasst uns anfangen.

Öffentlicher Schlüssel

Dieser Teil ist fast identisch mit dem, was wir im Bitcoin-Artikel besprochen haben. Wenn Sie diesen lesen, können Sie ihn überspringen (es sei denn, Sie benötigen eine Auffrischung).

Als erstes müssen wir den ECDSA-Algorithmus (Elliptic Curve Digital Signature Algorithm) auf unseren privaten Schlüssel anwenden. Eine elliptische Kurve ist eine Kurve, die durch die Gleichung y² = x³ + ax + bmit gewähltem aund definiert ist b. Es gibt eine ganze Familie solcher Kurven, die weithin bekannt sind und verwendet werden. Bitcoin verwendet die Kurve secp256k1 . Wenn Sie mehr über Elliptic Curve Cryptography erfahren möchten, verweise ich Sie auf diesen Artikel.

Ethereum verwendet dieselbe elliptische Kurve, secp256k1 , sodass der Prozess zum Abrufen des öffentlichen Schlüssels in beiden Kryptowährungen identisch ist.

Durch Anwenden des ECDSA auf den privaten Schlüssel erhalten wir eine 64-Byte-Ganzzahl, dh zwei 32-Byte-Ganzzahlen, die X und Y des Punkts auf der elliptischen Kurve darstellen, die miteinander verkettet sind.

Für unser Beispiel haben wir 1e7bcc70c72770dbb72fea022e8a6d07f814d2ebe4de9ae3f7af75bf706902a7b73ff919898c836396a6b0c96812c3213b99372050853bd1678da0ead14487d7.

In Python würde es so aussehen:

private_key_bytes = codecs.decode(private_key, ‘hex’) # Get ECDSA public key key = ecdsa.SigningKey.from_string(private_key_bytes, curve=ecdsa.SECP256k1).verifying_key key_bytes = key.to_string() key_hex = codecs.encode(key_bytes, ‘hex’)

Hinweis: Wie Sie dem obigen Code entnehmen können, habe ich eine Methode aus dem ecdsaModul verwendet und den privaten Schlüssel mit dekodiert codecs. Dies ist mehr für Python und weniger für den Algorithmus selbst relevant, aber ich werde erklären, was wir hier tun, um mögliche Verwirrung zu beseitigen.

In Python gibt es mindestens zwei Klassen, die den privaten und den öffentlichen Schlüssel behalten können: "str" ​​und "bytes". Der erste ist eine Zeichenfolge und der zweite ist ein Byte-Array. Kryptografische Methoden in Python arbeiten mit einer "Byte" -Klasse, nehmen sie als Eingabe und geben sie als Ergebnis zurück.

Jetzt gibt es einen kleinen Haken: Ein String 4f3centspricht beispielsweise nicht dem Byte-Array 4f3c. Vielmehr entspricht es dem Bytearray mit zwei Elementen, O<. Und he codecs.decgenau das macht die Tode-Methode: Sie konvertiert einen String in ein Byte-Array. Dies gilt auch für alle kryptografischen Manipulationen, die wir in diesem Artikel durchführen.

Brieftaschenadresse

Sobald wir den öffentlichen Schlüssel erhalten haben, können wir die Adresse berechnen. Im Gegensatz zu Bitcoin hat Ethereum jetzt sowohl im Haupt- als auch im Testnetzwerk die gleichen Adressen. Benutzer geben das Netzwerk an, das sie später im Prozess verwenden möchten, wenn sie eine Transaktion durchführen und signieren.

Um eine Adresse aus dem öffentlichen Schlüssel zu erstellen, müssen wir lediglich Keccak-256 auf den Schlüssel anwenden und dann die letzten 20 Bytes des Ergebnisses nehmen. Und das ist es. Keine anderen Hash-Funktionen, keine Base58 oder andere Konvertierung. Das einzige, was Sie brauchen, ist, '0x' am Anfang der Adresse hinzuzufügen.

Hier ist der Python-Code:

public_key_bytes = codecs.decode(public_key, ‘hex’) keccak_hash = keccak.new(digest_bits=256) keccak_hash.update(public_key_bytes) keccak_digest = keccak_hash.hexdigest() # Take the last 20 bytes wallet_len = 40 wallet = ‘0x’ + keccak_digest[-wallet_len:]

Prüfsumme

Wie Sie sich vielleicht erinnern, erstellt Bitcoin die Prüfsumme, indem es den öffentlichen Schlüssel hasht und die ersten 4 Bytes des Ergebnisses verwendet. Dies gilt für alle Bitcoin-Adressen, sodass Sie die gültige Adresse nicht erhalten können, ohne die Prüfsummenbytes hinzuzufügen.

In Ethereum funktionieren die Dinge nicht so. Anfangs gab es keine Prüfsummenmechanismen zur Überprüfung der Integrität des Schlüssels. Im Jahr 2016 führte Vitalik Buterin jedoch einen Prüfsummenmechanismus ein, der inzwischen von Geldbörsen und Börsen übernommen wurde.

Durch Hinzufügen einer Prüfsumme zur Ethereum-Brieftaschenadresse wird zwischen Groß- und Kleinschreibung unterschieden.

Zunächst müssen Sie den Keccak-256-Hash der Adresse abrufen. Beachten Sie, dass diese Adresse ohne das 0xTeil an die Hash-Funktion übergeben werden sollte .

Zweitens iterieren Sie über die Zeichen der Anfangsadresse. Wenn das i- te Byte des Hash größer oder gleich 8 ist, konvertieren Sie das Zeichen der i- ten Adresse in Großbuchstaben, andernfalls lassen Sie es in Kleinbuchstaben.

Schließlich fügen Sie 0xam Anfang der resultierenden Zeichenfolge wieder hinzu. Die Prüfsummenadresse ist dieselbe wie die ursprüngliche, wenn Sie den Fall ignorieren. Mit den Großbuchstaben kann jedoch jeder überprüfen, ob die Adresse tatsächlich gültig ist. Den Algorithmus der Prüfsummenvalidierung finden Sie auf der hier verlinkten Seite.

Wie Sie im Vorschlag lesen werden, gilt für dieses Prüfsummenschema Folgendes:

"Im Durchschnitt gibt es 15 Prüfbits pro Adresse, und die Nettowahrscheinlichkeit, dass eine zufällig generierte Adresse, wenn sie falsch eingegeben wird, versehentlich eine Prüfung besteht, beträgt 0,0247%."

Und hier ist der Code zum Hinzufügen einer Prüfsumme zur Ethereum-Adresse:

checksum = ‘0x’ # Remove ‘0x’ from the address address = address[2:] address_byte_array = address.encode(‘utf-8’) keccak_hash = keccak.new(digest_bits=256) keccak_hash.update(address_byte_array) keccak_digest = keccak_hash.hexdigest() for i in range(len(address)): address_char = address[i] keccak_char = keccak_digest[i] if int(keccak_char, 16) >= 8: checksum += address_char.upper() else: checksum += str(address_char)

Fazit

Wie Sie sehen, ist das Erstellen einer Adresse für Ethereum viel einfacher als für Bitcoin. Alles, was wir tun müssen, ist, die ECDSA auf den öffentlichen Schlüssel anzuwenden, dann Keccak-256 anzuwenden und schließlich die letzten 20 Bytes dieses Hashs zu verwenden.

Wenn Sie mit dem Code spielen möchten, habe ich ihn im GitHub-Repository veröffentlicht.

Ich mache hier in den freeCodeCamp News einen Kurs über Kryptowährungen. Der erste Teil ist eine detaillierte Beschreibung der Blockchain.

Ich poste auch zufällige Gedanken über Krypto auf Twitter, also solltest du es dir ansehen.