Πώς να δημιουργήσετε μια διεύθυνση πορτοφολιού Ethereum από ένα ιδιωτικό κλειδί

Στο πρώτο άρθρο αυτής της σειράς, δημιουργήσαμε ένα bitcoin ιδιωτικού κλειδιού: 60cf347dbc59d31c1358c8e5cf5e45b822ab85b79cb32a9f3d98184779a9efc2.

Εδώ, θα χρησιμοποιήσουμε αυτό το κλειδί για να λάβουμε τη δημόσια διεύθυνση και στη συνέχεια τη διεύθυνση πορτοφολιού Ethereum αυτού του ιδιωτικού κλειδιού.

Η δημιουργία της διεύθυνσης πορτοφολιού Bitcoin από το ιδιωτικό κλειδί είναι λίγο περίπλοκη. Εδώ, η διαδικασία θα είναι πολύ πιο απλή. Πρέπει να εφαρμόσουμε μια συνάρτηση κατακερματισμού για να πάρουμε το δημόσιο κλειδί και μια άλλη για να λάβουμε τη διεύθυνση.

Ας ξεκινήσουμε λοιπόν.

Δημόσιο κλειδί

Αυτό το μέρος είναι σχεδόν πανομοιότυπο με αυτό που συζητήσαμε στο άρθρο του Bitcoin, οπότε αν το διαβάσετε, μπορείτε να το παραλείψετε (εκτός εάν χρειάζεστε επανάληψη).

Το πρώτο πράγμα που πρέπει να ακολουθήσουμε είναι να εφαρμόσουμε το ECDSA ή τον αλγόριθμο ψηφιακής υπογραφής Elliptic Curve στο ιδιωτικό μας κλειδί. Μια ελλειπτική καμπύλη είναι μια καμπύλη που ορίζεται από την εξίσωση y² = x³ + ax + bμε επιλεγμένο aκαι b. Υπάρχει μια ολόκληρη οικογένεια τέτοιων καμπυλών που είναι ευρέως γνωστές και χρησιμοποιούνται. Το Bitcoin χρησιμοποιεί την καμπύλη secp256k1 . Εάν θέλετε να μάθετε περισσότερα σχετικά με την κρυπτογραφία ελλειπτικής καμπύλης, θα σας παραπέμψω σε αυτό το άρθρο.

Το Ethereum χρησιμοποιεί την ίδια ελλειπτική καμπύλη, secp256k1 , οπότε η διαδικασία λήψης του δημόσιου κλειδιού είναι ίδια και στα δύο κρυπτονομίσματα.

Εφαρμόζοντας το ECDSA στο ιδιωτικό κλειδί, λαμβάνουμε έναν ακέραιο αριθμό 64 byte, που είναι δύο ακέραιοι αριθμοί 32 byte που αντιπροσωπεύουν το X και το Y του σημείου στην ελλειπτική καμπύλη, που συνδυάζονται μαζί.

Για το παράδειγμά μας, έχουμε 1e7bcc70c72770dbb72fea022e8a6d07f814d2ebe4de9ae3f7af75bf706902a7b73ff919898c836396a6b0c96812c3213b99372050853bd1678da0ead14487d7.

Στο Python, θα μοιάζει με αυτό:

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

Σημείωση: όπως μπορείτε να δείτε από τον παραπάνω κώδικα, χρησιμοποίησα μια μέθοδο από τη ecdsaμονάδα και αποκωδικοποίησα χρησιμοποιώντας το ιδιωτικό κλειδί codecs. Αυτό σχετίζεται περισσότερο με την Python και λιγότερο με τον ίδιο τον αλγόριθμο, αλλά θα εξηγήσω τι κάνουμε εδώ για να εξαλείψουμε την πιθανή σύγχυση.

Στην Python, υπάρχουν τουλάχιστον δύο τάξεις που μπορούν να κρατήσουν τα ιδιωτικά και δημόσια κλειδιά: "str" ​​και "bytes". Το πρώτο είναι μια συμβολοσειρά και το δεύτερο είναι ένας πίνακας byte. Οι κρυπτογραφικές μέθοδοι στο Python λειτουργούν με τάξη "bytes", λαμβάνοντας την ως είσοδο και επιστρέφοντας ως αποτέλεσμα.

Τώρα, υπάρχει μια μικρή σύλληψη: μια συμβολοσειρά, ας πούμε, 4f3cδεν ισούται με τον πίνακα byte 4f3c. Αντίθετα, ισούται με τον πίνακα byte με δύο στοιχεία, O&lt ;. Και αυτό κάνει η he codecs.decμέθοδος t ode: μετατρέπει μια συμβολοσειρά σε έναν πίνακα byte. Αυτό θα είναι το ίδιο για όλους τους κρυπτογραφικούς χειρισμούς που θα κάνουμε σε αυτό το άρθρο.

Διεύθυνση πορτοφολιού

Μόλις λάβουμε το δημόσιο κλειδί, μπορούμε να υπολογίσουμε τη διεύθυνση. Τώρα, σε αντίθεση με το Bitcoin, το Ethereum έχει τις ίδιες διευθύνσεις τόσο στα κύρια όσο και σε όλα τα δοκιμαστικά δίκτυα. Οι χρήστες καθορίζουν το δίκτυο που θέλουν να χρησιμοποιήσουν αργότερα στη διαδικασία όταν πραγματοποιούν και υπογράφουν μια συναλλαγή.

Για να κάνουμε μια διεύθυνση από το δημόσιο κλειδί, το μόνο που χρειάζεται να κάνουμε είναι να εφαρμόσουμε το Keccak-256 στο κλειδί και μετά να πάρουμε τα τελευταία 20 bytes του αποτελέσματος. Και αυτό είναι. Δεν υπάρχουν άλλες λειτουργίες κατακερματισμού, χωρίς Base58 ή άλλη μετατροπή. Το μόνο που χρειάζεστε είναι να προσθέσετε το "0x" στην αρχή της διεύθυνσης.

Εδώ είναι ο κωδικός 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:]

Checksum

Τώρα, όπως ίσως θυμάστε, το Bitcoin δημιουργεί το άθροισμα ελέγχου κατακερματισμού του δημόσιου κλειδιού και λαμβάνοντας τα πρώτα 4 bytes του αποτελέσματος. Αυτό ισχύει για όλες τις διευθύνσεις Bitcoin, επομένως δεν μπορείτε να λάβετε την έγκυρη διεύθυνση χωρίς να προσθέσετε το bytes checksum.

Στο Ethereum, έτσι δεν λειτουργούν τα πράγματα. Αρχικά, δεν υπήρχαν μηχανισμοί ελέγχου για την επικύρωση της ακεραιότητας του κλειδιού. Ωστόσο, το 2016, η Vitalik Buterin εισήγαγε έναν μηχανισμό ελέγχου, ο οποίος έκτοτε έχει υιοθετηθεί από πορτοφόλια και ανταλλαγές.

Η προσθήκη αθροίσματος ελέγχου στη διεύθυνση πορτοφολιού Ethereum το καθιστά ευαίσθητο στην υπόθεση.

Αρχικά, πρέπει να λάβετε τον κατακερματισμό Keccak-256 της διεύθυνσης. Σημειώστε ότι αυτή η διεύθυνση πρέπει να μεταβιβάζεται στη συνάρτηση κατακερματισμού χωρίς το 0xτμήμα.

Δεύτερον, επαναλαμβάνετε τους χαρακτήρες της αρχικής διεύθυνσης. Αν το i ου byte του κατακερματισμού είναι μεγαλύτερη ή ίση με 8, μπορείτε να μετατρέψετε το i χαρακτήρα Θ διεύθυνση για κεφαλαία, αλλιώς αφήστε το πεζούς χαρακτήρες.

Τέλος, προσθέτετε 0xπίσω στην αρχή της συμβολοσειράς που προκύπτει. Η διεύθυνση αθροίσματος ελέγχου είναι η ίδια με την αρχική, εάν αγνοήσετε την υπόθεση. Αλλά τα κεφαλαία γράμματα επιτρέπουν σε οποιονδήποτε να ελέγξει ότι η διεύθυνση είναι πράγματι έγκυρη. Μπορείτε να βρείτε τον αλγόριθμο της επικύρωσης checksum στη σελίδα που συνδέεται εδώ.

Όπως θα διαβάσετε στην πρόταση, για αυτό το σχήμα αθροίσματος ελέγχου,

"Κατά μέσο όρο θα υπάρχουν 15 bit ελέγχου ανά διεύθυνση και η καθαρή πιθανότητα ότι μια διεύθυνση που δημιουργείται τυχαία εάν πληκτρολογηθεί εσφαλμένα θα περάσει κατά λάθος μια επιταγή είναι 0,0247%."

Και εδώ είναι ο κωδικός για την προσθήκη αθροίσματος ελέγχου στη διεύθυνση 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)

συμπέρασμα

Όπως μπορείτε να δείτε, η δημιουργία διεύθυνσης για το Ethereum είναι πολύ απλούστερη από ό, τι για το Bitcoin. Το μόνο που πρέπει να κάνουμε είναι να εφαρμόσουμε το ECDSA στο δημόσιο κλειδί, μετά να εφαρμόσουμε το Keccak-256 και τελικά να πάρουμε τα τελευταία 20 bytes αυτού του κατακερματισμού.

Αν θέλετε να παίξετε με τον κωδικό, τον δημοσίευσα στο αποθετήριο GitHub.

Κάνω ένα μάθημα για τα κρυπτονομίσματα εδώ στο FreeCodeCamp News. Το πρώτο μέρος είναι μια λεπτομερής περιγραφή του blockchain.

Δημοσιεύω επίσης τυχαίες σκέψεις σχετικά με το crypto στο Twitter, οπότε ίσως θελήσετε να το δείτε.