Sådan oprettes en Ethereum-tegnebogadresse fra en privat nøgle

I den første artikel i denne serie, der genereres vi en Bitcoin privat nøgle: 60cf347dbc59d31c1358c8e5cf5e45b822ab85b79cb32a9f3d98184779a9efc2.

Her bruger vi den nøgle til at hente den offentlige adresse og derefter Ethereum-tegnebog-adressen på den private nøgle.

Oprettelse af Bitcoin-tegnebogadressen fra den private nøgle er lidt kompliceret. Her vil processen være meget enklere. Vi er nødt til at anvende en hash-funktion for at hente den offentlige nøgle og en anden for at få adressen.

Så lad os komme i gang.

Offentlig nøgle

Denne del er næsten identisk med det, vi diskuterede i Bitcoin-artiklen, så hvis du læser den, kan du springe den over (medmindre du har brug for en genopfriskning).

Den første ting, vi skal bruge, er at anvende ECDSA eller Elliptic Curve Digital Signature Algorithm på vores private nøgle. En elliptisk kurve er en kurve defineret af ligningen y² = x³ + ax + bmed valgt aog b. Der er en hel familie af sådanne kurver, der er kendt og brugt. Bitcoin bruger secp256k1- kurven. Hvis du vil lære mere om elliptisk kurvekryptografi, henviser jeg dig til denne artikel.

Ethereum bruger den samme elliptiske kurve, secp256k1 , så processen for at få den offentlige nøgle er identisk i begge kryptovalutaer.

Ved at anvende ECDSA på den private nøgle får vi et 64-byte heltal, der er to 32-byte heltal, der repræsenterer X og Y for punktet på den elliptiske kurve, sammenkædet sammen.

For vores eksempel fik vi 1e7bcc70c72770dbb72fea022e8a6d07f814d2ebe4de9ae3f7af75bf706902a7b73ff919898c836396a6b0c96812c3213b99372050853bd1678da0ead14487d7.

I Python ville det se sådan ud:

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

Bemærk: Som du kan se fra ovenstående kode, brugte jeg en metode fra ecdsamodulet, og jeg afkodede den private nøgle ved hjælp af codecs. Dette er mere relevant for Python og mindre for selve algoritmen, men jeg vil forklare, hvad vi laver her for at fjerne mulig forvirring.

I Python er der mindst to klasser, der kan beholde de private og offentlige nøgler: “str” og “bytes”. Den første er en streng, og den anden er en byte-array. Kryptografiske metoder i Python arbejder med en "bytes" -klasse, idet den tages som input og returneres som resultat.

Nu er der en lille fangst: En streng, siger, 4f3csvarer ikke til byte-arrayet 4f3c. Snarere svarer det til byte-arrayet med to elementer, O&lt ;. Og det er hvad t he codecs.decode-metoden gør: den konverterer en streng til et byte-array. Dette vil være det samme for alle kryptografiske manipulationer, som vi gør i denne artikel.

Wallet-adresse

Når vi har fået den offentlige nøgle, kan vi beregne adressen. I modsætning til Bitcoin har Ethereum nu de samme adresser på både hoved- og alle testnetværk. Brugere angiver det netværk, som de vil bruge senere i processen, når de foretager og underskriver en transaktion.

For at lave en adresse fra den offentlige nøgle er alt, hvad vi skal gøre, at anvende Keccak-256 på nøglen og derefter tage de sidste 20 byte af resultatet. Og det er det. Ingen andre hash-funktioner, ingen Base58 eller nogen anden konvertering. Det eneste du har brug for er at tilføje '0x' i starten af ​​adressen.

Her er Python-koden:

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

Kontrolsum

Nu, som du måske husker, opretter Bitcoin kontrolsummen ved at hashing den offentlige nøgle og tage de første 4 bytes af resultatet. Dette gælder for alle Bitcoin-adresser, så du kan ikke få den gyldige adresse uden at tilføje kontrolsumbyte.

I Ethereum er det ikke sådan, tingene fungerer. Oprindeligt var der ingen kontrolsummekanismer til at validere nøglens integritet. Imidlertid indførte Vitalik Buterin i 2016 en kontrolsummekanisme, som siden er blevet vedtaget af tegnebøger og børser.

Tilføjelse af et kontrolsum til Ethereum-tegnebogens adresse gør det store og små bogstaver.

Først skal du hente Keccak-256-hash af adressen. Bemærk, at denne adresse skal sendes til hash-funktionen uden 0xdelen.

For det andet gentager du tegnene i den oprindelige adresse. Hvis jeg th byte af hash er større end eller lig med 8, du konvertere den i th adresse karakter til store bogstaver, ellers du lader det små bogstaver.

Endelig tilføjer du 0xtilbage i starten af ​​den resulterende streng. Kontrolsumadressen er den samme som den oprindelige, hvis du ignorerer sagen. Men de store bogstaver lader nogen kontrollere, at adressen faktisk er gyldig. Du kan finde algoritmen til kontrolsumvalideringen på den side, der er linket her.

Som du vil læse i forslaget til denne kontrolsum,

"I gennemsnit vil der være 15 kontrolbits pr. Adresse, og nettosandsynligheden for, at en tilfældigt genereret adresse, hvis forkert indtastet ved et uheld vil passere en kontrol, er 0,0247%."

Og her er koden for at tilføje kontrolsum til Ethereum-adressen:

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)

Konklusion

Som du kan se, er det meget enklere at oprette en adresse til Ethereum end for Bitcoin. Alt hvad vi skal gøre er at anvende ECDSA på offentlig nøgle, derefter anvende Keccak-256 og endelig tage de sidste 20 bytes af den hash.

Hvis du vil lege med koden, offentliggjorde jeg den til GitHub-arkivet.

Jeg laver et kursus om kryptokurver her på freeCodeCamp News. Den første del er en detaljeret beskrivelse af blockchain.

Jeg sender også tilfældige tanker om krypto på Twitter, så du vil måske tjekke det ud.