În primul articol din această serie, am generat o cheie privată bitcoin: 60cf347dbc59d31c1358c8e5cf5e45b822ab85b79cb32a9f3d98184779a9efc2
.
Aici vom folosi acea cheie pentru a obține adresa publică și apoi adresa portofelului Ethereum a acelei chei private.
Crearea adresei portofelului Bitcoin din cheia privată este cam complicată. Aici, procesul va fi mult mai simplu. Trebuie să aplicăm o funcție hash pentru a obține cheia publică și alta pentru a obține adresa.
Deci sa începem.
Cheie publică
Această parte este aproape identică cu ceea ce am discutat în articolul Bitcoin, așa că, dacă o citiți, o puteți sări peste (dacă nu aveți nevoie de o reîmprospătare).
Primul lucru pe care trebuie să-l facem este să aplicăm ECDSA, sau algoritmul de semnătură digitală Elliptic Curve, la cheia noastră privată. O curbă eliptică este o curbă definită de ecuație y² = x³ + ax + b
cu ales a
și b
. Există o întreagă familie de astfel de curbe care sunt cunoscute și utilizate pe scară largă. Bitcoin folosește secp256k1 curba. Dacă doriți să aflați mai multe despre criptografia Elliptic Curve, vă voi referi la Acest articol.
Ethereum folosește aceeași curbă eliptică, secp256k1, deci procesul de obținere a cheii publice este identic în ambele criptomonede.
Prin aplicarea ECDSA la cheia privată, obținem un număr întreg de 64 de octeți, care reprezintă două numere întregi de 32 de octeți care reprezintă X și Y ale punctului de pe curba eliptică, concatenate împreună.
Pentru exemplul nostru, avem 1e7bcc70c72770dbb72fea022e8a6d07f814d2ebe4de9ae3f7af75bf706902a7b73ff919898c836396a6b0c96812c3213b99372050853bd1678da0ead14487d7
.
În Python, ar arăta astfel:
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’)
Notă: după cum puteți vedea din codul de mai sus, am folosit o metodă din ecdsa
și am decodat cheia privată folosind codecs
. Acest lucru este relevant mai mult pentru Python și mai puțin pentru algoritmul în sine, dar voi explica ce facem aici pentru a elimina o posibilă confuzie.
În Python, există cel puțin două clase care pot păstra cheile private și publice: „str” și „octeți”. Primul este un șir, iar al doilea este un tablou de octeți. Metodele criptografice din Python funcționează cu o clasă „octeți”, luându-l ca intrare și returnându-l ca rezultat.
Acum, există o mică captură: un șir, să spunem, 4f3c
nu este egal cu matricea de octeți 4f3c
. Mai degrabă, este egal cu matricea de octeți cu două elemente, O&
lt ;. Și asta e the codecs.dec
metoda odei face: convertește un șir într-o matrice de octeți. Acest lucru va fi același pentru toate manipulările criptografice pe care le vom face în acest articol.
Adresa portofelului
Odată ce am obținut cheia publică, putem calcula adresa. Acum, spre deosebire de Bitcoin, Ethereum are aceleași adrese atât pe rețeaua principală, cât și pe toate rețelele de testare. Utilizatorii specifică rețeaua pe care doresc să o folosească mai târziu în proces atunci când fac și semnează o tranzacție.
Pentru a face o adresă din cheia publică, tot ce trebuie să facem este să aplicăm Keccak-256 la cheie și apoi să luăm ultimii 20 de octeți ai rezultatului. Si asta e. Fără alte funcții hash, fără Base58 sau orice altă conversie. Singurul lucru de care aveți nevoie este să adăugați „0x” la începutul adresei.
Iată codul 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:]
Suma de control
Acum, după cum vă amintiți, Bitcoin creează suma de control prin hashing cheia publică și luând primii 4 octeți ai rezultatului. Acest lucru este valabil pentru toate adresele Bitcoin, deci nu puteți obține adresa validă fără a adăuga octetii sumelor de control.
În Ethereum, nu așa funcționează lucrurile. Inițial, nu existau mecanisme de sumă de verificare pentru a valida integritatea cheii. Cu toate acestea, în 2016, Vitalik Buterin introdus un mecanism de sumă de control, care a fost adoptat de atunci de către portofele și schimburi.
Adăugarea unei sume de verificare la adresa portofelului Ethereum o face să fie sensibilă la majuscule.
Mai întâi, trebuie să obțineți hash-ul Keccak-256 al adresei. Rețineți că această adresă ar trebui transmisă funcției hash fără 0x
parte.
În al doilea rând, iterați peste caracterele adresei inițiale. Dacă euoctetul hashului este mai mare sau egal cu 8, convertiți eucaracterul adresei este scris cu majuscule, altfel îl lăsați cu litere mici.
În cele din urmă, adăugați 0x
înapoi la începutul șirului rezultat. Adresa sumelor de verificare este aceeași cu cea inițială, dacă ignorați cazul. Dar literele majuscule permit oricui să verifice dacă adresa este într-adevăr validă. Puteți găsi algoritmul validării sumelor de verificare la pagină legată aici.
După cum veți citi în propunere, pentru această schemă de sumă de control,
„În medie, vor exista 15 biți de verificare pe adresă, iar probabilitatea netă ca o adresă generată aleatoriu dacă este greșit să treacă accidental o verificare este de 0,0247%”.
Și iată codul pentru a adăuga suma de control la adresa 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)
Concluzie
După cum puteți vedea, crearea unei adrese pentru Ethereum este mult mai simplă decât pentru Bitcoin. Tot ce trebuie să facem este să aplicăm ECDSA la cheia publică, apoi să aplicăm Keccak-256 și să luăm în cele din urmă ultimii 20 de octeți din acel hash.

Dacă vrei să te joci cu codul, l-am publicat pe Depozitul GitHub.
Fac un curs despre criptomonede aici pe Routech News. Prima parte este o descriere detaliată a blockchain-ului.
De asemenea, postez gânduri aleatorii despre cripto pe Stare de nervozitate, deci este posibil să doriți să o verificați.