Kako iz privatnog ključa stvoriti adresu Ethereum novčanika

U prvom članku ove serije, generira smo Bitcoin privatni ključ: 60cf347dbc59d31c1358c8e5cf5e45b822ab85b79cb32a9f3d98184779a9efc2.

Ovdje ćemo taj ključ upotrijebiti za dobivanje javne adrese, a zatim adrese novčanika Ethereum tog privatnog ključa.

Stvaranje adrese Bitcoin novčanika iz privatnog ključa pomalo je složeno. Ovdje će postupak biti puno jednostavniji. Moramo primijeniti jednu hash funkciju da bismo dobili javni ključ, a drugu da bismo dobili adresu.

Pa krenimo.

Javni ključ

Ovaj je dio gotovo identičan onome o čemu smo raspravljali u članku o Bitcoinima, pa ako ga pročitate, možete ga preskočiti (osim ako vam nije potrebno osvježavanje).

Prvo što trebamo ići je primijeniti ECDSA, odnosno algoritam digitalnog potpisa eliptičke krivulje, na naš privatni ključ. Eliptička krivulja je krivulja definirana jednadžbom y² = x³ + ax + bs izabranim ai b. Postoji cijela obitelj takvih krivulja koje su nadaleko poznate i koriste se. Bitcoin koristi krivulju secp256k1 . Ako želite saznati više o kriptografiji eliptičke krivulje, uputit ću vas na ovaj članak.

Ethereum koristi istu eliptičnu krivulju, secp256k1 , pa je postupak dobivanja javnog ključa identičan u obje kriptovalute.

Primjenom ECDSA-e na privatni ključ dobivamo 64-bajtni cijeli broj, a to su dva 32-bajtna cijela broja koja predstavljaju X i Y točke na eliptičnoj krivulji, spojene zajedno.

Za naš primjer smo dobili 1e7bcc70c72770dbb72fea022e8a6d07f814d2ebe4de9ae3f7af75bf706902a7b73ff919898c836396a6b0c96812c3213b99372050853bd1678da0ead14487d7.

U Pythonu bi to izgledalo ovako:

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

Napomena: kao što možete vidjeti iz gornjeg koda, koristio sam metodu iz ecdsamodula i dešifrirao privatni ključ pomoću codecs. To je relevantnije za Python, a manje za sam algoritam, ali objasnit ću što radimo ovdje kako bismo uklonili moguću zabunu.

U Pythonu postoje najmanje dvije klase koje mogu zadržati privatni i javni ključ: "str" ​​i "bytes". Prvi je niz, a drugi je bajtni niz. Kriptografske metode u Pythonu rade s klasom "bytes", uzimajući je kao ulaz i vraćajući je kao rezultat.

Eto, tu je malo zamke: string, recimo, 4f3cnije jednak bajt polju 4f3c. Umjesto toga, jednači je bajtni niz s dva elementa, O&lt ;. I to čini he codecs.decmetoda t ode: pretvara niz u bajtni niz. To će biti isto za sve kriptografske manipulacije koje ćemo napraviti u ovom članku.

Adresa novčanika

Nakon što dobijemo javni ključ, možemo izračunati adresu. Sada, za razliku od Bitcoina, Ethereum ima iste adrese i na glavnoj i na svim testnim mrežama. Korisnici određuju mrežu koju žele koristiti kasnije u procesu kada izvrše i potpišu transakciju.

Da bismo napravili adresu iz javnog ključa, sve što trebamo učiniti je primijeniti Keccak-256 na ključ i zatim uzeti posljednjih 20 bajtova rezultata. I to je to. Nema drugih hash funkcija, nema Base58 niti bilo koje druge pretvorbe. Jedino što trebate je dodati '0x' na početku adrese.

Evo Python koda:

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

Kontrolna suma

Kao što se možda sjećate, Bitcoin stvara kontrolnu sumu raspršivanjem javnog ključa i uzimanjem prvih 4 bajta rezultata. To vrijedi za sve Bitcoin adrese, tako da ne možete dobiti važeću adresu bez dodavanja bajtova kontrolne sume.

U Ethereumu stvari ne funkcioniraju tako. U početku nisu postojali mehanizmi kontrolne sume za provjeru cjelovitosti ključa. Međutim, 2016. godine Vitalik Buterin uveo je mehanizam kontrolne sume, koji su od tada novčanici i burze usvojili.

Dodavanjem kontrolne sume na adresu Ethereum novčanika razlikuje se velika i mala slova.

Prvo morate dobiti hash adrese Keccak-256. Imajte na umu da bi ovu adresu trebalo proslijediti hash funkciji bez 0xdijela.

Drugo, prelazite preko znakova početne adrese. Ako je i- ti bajt hasha veći ili jednak 8, pretvorite znak i -e adrese u velika slova, u suprotnom ga ostavljate malim slovom.

Konačno, dodajte 0xnatrag na početku rezultirajućeg niza. Adresa kontrolne sume jednaka je početnoj ako zanemarite slučaj. Ali velikim slovima neka svatko provjeri je li adresa doista valjana. Algoritam provjere provjere kontrolne sume možete pronaći na ovdje povezanoj stranici.

Kao što ćete pročitati u prijedlogu, za ovu shemu kontrolne sume,

"U prosjeku će biti 15 kontrolnih bitova po adresi, a neto vjerojatnost da će nasumično generirana adresa ako pogrešno unese slučajno proći provjeru je 0,0247%."

I evo koda za dodavanje kontrolne sume na Ethereum adresu:

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)

Zaključak

Kao što vidite, stvaranje adrese za Ethereum mnogo je jednostavnije nego za Bitcoin. Sve što trebamo učiniti je primijeniti ECDSA na javni ključ, zatim primijeniti Keccak-256 i na kraju uzeti posljednjih 20 bajtova tog hasha.

Ako se želite igrati s kodom, objavio sam ga u spremištu GitHub.

Održavam tečaj o kriptovalutama ovdje na vijestima freeCodeCamp. Prvi dio je detaljan opis blockchaina.

Također objavljujem slučajna razmišljanja o kripto na Twitteru, pa biste ga možda htjeli provjeriti.