a
a
Weather:
city not found
HomeBitcoinComment créer une adresse de portefeuille Ethereum à partir d’une clé privée

Comment créer une adresse de portefeuille Ethereum à partir d’une clé privée

Dans le premier article de cette série, nous avons généré une clé privée bitcoin: 60cf347dbc59d31c1358c8e5cf5e45b822ab85b79cb32a9f3d98184779a9efc2.

Ici, nous utiliserons cette clé pour obtenir l’adresse publique, puis l’adresse du portefeuille Ethereum de cette clé privée.

Créer l’adresse du portefeuille Bitcoin à partir de la clé privée est un peu délicat. Ici, le processus sera beaucoup plus facile. Nous avons besoin d’une fonction de hachage pour obtenir la clé publique et une autre pour obtenir l’adresse.

Alors, commençons.

Clé publique

Cette partie est presque identique à celle dont nous avons discuté dans l’article Bitcoin, donc si vous la lisez, vous pouvez la sauter (sauf si vous avez besoin d’une mise à jour).

La première chose que nous devons faire est d’appliquer l’ECDSA, ou algorithme de signature numérique à courbe elliptique, à notre clé privée. Une courbe elliptique est une courbe définie par l’équation y² = x³ + ax + b avec choisi a est b. Il existe toute une famille de ces courbes largement connues et utilisées. Bitcoin utilise l’extension secp256k1 courbe. Si vous souhaitez en savoir plus sur la cryptographie à courbe elliptique, je vous renvoie à cet article.

Ethereum utilise la même courbe elliptique, secp256k1, le processus d’obtention de la clé publique est donc identique dans les deux crypto-monnaies.

En appliquant ECDSA à la clé privée, nous obtenons un entier de 64 octets, c’est-à-dire deux entiers de 32 octets représentant le X et le Y du point sur la courbe elliptique, concaténés ensemble.

Pour notre exemple, nous avons 1e7bcc70c72770dbb72fea022e8a6d07f814d2ebe4de9ae3f7af75bf706902a7b73ff919898c836396a6b0c96812c3213b99372050853bd1678da0ead14487d7.

En Python, cela ressemblerait à ceci:

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

Remarque: comme vous pouvez le voir dans le code ci-dessus, j’ai utilisé une méthode du ecdsa module et déchiffré la clé privée en utilisant codecs. C’est plus pertinent pour Python et moins pour l’algorithme lui-même, mais je vais vous expliquer ce que nous faisons ici pour éliminer toute confusion possible.

En Python, il existe au moins deux classes qui peuvent contenir des clés privées et publiques: « str » ​​et « bytes ». Le premier est une chaîne et le second est un tableau d’octets. Les méthodes cryptographiques en Python fonctionnent avec une classe « bytes », la prenant comme entrée et la renvoyant comme résultat.

Maintenant, il y a un petit problème: une chaîne, disons, 4f3c il n’est pas égal au tableau d’octets 4f3c. Il est plutôt égal au tableau d’octets avec deux éléments, O&lt ;. Et c’est ce que the codecs.decLa méthode ode fa: convertit une chaîne en un tableau d’octets. Ce sera la même chose pour toutes les manipulations cryptographiques que nous ferons dans cet article.

Adresse du portefeuille

Une fois que nous avons la clé publique, nous pouvons calculer l’adresse. Désormais, contrairement à Bitcoin, Ethereum a les mêmes adresses sur le réseau principal et sur tous les réseaux de test. Les utilisateurs spécifient le réseau qu’ils souhaitent utiliser plus tard dans le processus lors de la réalisation et de la signature d’une transaction.

Pour créer une adresse à partir de la clé publique, il suffit d’appliquer Keccak-256 à la clé, puis de prendre les 20 derniers octets du résultat. Et c’est tout. Pas d’autres fonctions de hachage, pas de Base58 ou d’autres conversions. La seule chose dont vous avez besoin est d’ajouter « 0x » au début de l’adresse.

Voici le code Python:

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:]

Somme de contrôle

Maintenant, comme vous vous en souvenez peut-être, Bitcoin crée la somme de contrôle en hachant la clé publique et en prenant les 4 premiers octets du résultat. Cela est vrai pour toutes les adresses Bitcoin, vous ne pouvez donc pas obtenir l’adresse valide sans ajouter les octets de somme de contrôle.

Dans Ethereum, ce n’est pas ainsi que les choses fonctionnent. Au départ, il n’existait aucun mécanisme de somme de contrôle pour valider l’intégrité de la clé. Cependant, en 2016, Vitalik Buterin a introduit un mécanisme de somme de contrôle, qui a depuis été adopté par les portefeuilles et les bourses.

L’ajout d’une somme de contrôle à l’adresse du portefeuille Ethereum est sensible à la casse.

Tout d’abord, vous devez obtenir le hachage Keccak-256 de l’adresse. Notez que cette adresse doit être transmise à la fonction de hachage sans l’extension 0x partie.

Deuxièmement, répétez les caractères de l’adresse de départ. Si la jele octet du hachage est supérieur ou égal à 8, convertissez le fichier jele caractère d’adresse en majuscules, sinon laissez-le en minuscules.

Enfin, ajoutez 0x au début de la chaîne résultante. L’adresse de la somme de contrôle est la même que celle de départ si vous ignorez la casse. Mais les majuscules permettent à quiconque de vérifier que l’adresse est réellement valide. Vous pouvez trouver l’algorithme de validation de la somme de contrôle sur la page liée ici.

Comme vous le lirez dans la proposition, pour ce système de somme de contrôle,

« En moyenne, il y aura 15 bits de contrôle par adresse, et la probabilité nette qu’une adresse générée aléatoirement si elle est mal orthographiée passera accidentellement une vérification est de 0,0247%. »

Et voici le code pour ajouter la somme de contrôle à l’adresse Ethereum:

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)

Conclusion

Comme vous pouvez le voir, créer une adresse pour Ethereum est beaucoup plus facile que pour Bitcoin. Tout ce que nous avons à faire est d’appliquer ECDSA à la clé publique, puis d’appliquer Keccak-256, et enfin de prendre les 20 derniers octets de ce hachage.

Si vous voulez jouer avec le code, je l’ai posté dans le référentiel GitHub.

Je suis en train de suivre un cours sur les crypto-monnaies ici sur freeCodeCamp News. La première partie est une description détaillée de la blockchain.

Je publie également des pensées aléatoires sur le cryptage sur Twitter, vous voudrez peut-être le vérifier.


https://www.freecodecamp.org/news/how-to-create-an-ethereum-wallet-address-from-a-private-key-ae72b0eee27b/

No comments

leave a comment