Ethereum Cüzdan Oluşturma Algoritması

Herkese selamlar,
Bugünkü makalede Ethereum adres oluşturma algoritmasını anlatacağım.

Günlük hayatta herhangi bir konuda işlem yaparken çeşitli kimlik bilgileri ve numaralar kullanırız. Kamusal işlerde TC kimlik numarası(her bir numaraya kişiye özel ve biriciktir), Uluslararası arenada pasaport numarası, banka işlerinde IBAN vs. Hepsinin ortak özelliği, belli bir yapıda olmasıdır. İşte, aynı şekilde Ethereum dünyasında da işlem yaparken hesap numaraları kullanırız. Hesap için kullandığımız bu numaralar aslında cüzdan adresleridir. İster MetaMask eklentisi olsun, ister MyEtherWallet uygulaması olsun hepsinde şu şekilde bir adres görürüz: 0x2C97b817517A417ee6483255BC093D6b08acFac2

Burdaki 0x bu karakterlerin Hexadecimal yani16’lık sayı sistemi olduğunu belirtiyor. Daha sonra 40 tane akrarkter var. 16’lık sayı siseminde karakter kümesi 0-9 arası rakamlar ve A-F arası İngilizce alfabetik karakterlerden oluşur.(daha fazla bilgi için Wikipedia sayfasına göz atabilirsiniz). 40 Hex karakter, Alfabede 20 karaktere(Byte) denk geldiğini de unutmayalım.

Peki, bu karakterler nasıl oluşuyor ve cüzdana nasıl erişiyoruz. Bunun için, Ethereum teknik açıklamalarının yer aldığı Yellow Paper‘ı incelediğimiz zaman, public key değerinin Keccak-256 ile hash’lenmesi sonucu ortaya çıkan değerin son 160 bit(yani 20 byte, yani 40 HEX) karakterden oluşturduğunu görürüz.

Public key, Keccak-256, Hash vs nedir? Şimdi burdaki kavramları inceleyelim:
Açık Anahtarlı Şifreleme, Kriptoloji dünyasında asimetrik anahtarlama olarak bilinen, açık(public) ve gizli(private) tutulan değerlerdir. Burada “private key” özel bir anahtar olup, saklanması gereken kritik bilgidir. Tüm bilgiler bu anahtar ile şifrelenir ve bununla erişilir. Daha sonra açık anahatar(public key) ile onaylanır.

Ethereum, asimetrik şifreleme olarak Elliptic Curve(Eliptik eğri) algoritması kullanır. Bu algoritmanın detayları için şu linki ve standartları için de şu linki inceleyebilirsiniz. Elliptic Curve algoritmasında, public key oluşturulması için 256 bitlik private key(anahtar) kullanılır. Bu da yaklaşık olarak 78 haneli bir sayıya denk geliyor(teorik olarak 1’den 2^256’a kadar olan bütün sayılar birer private key değeridir. Ancak, hem güvenlik açısından hem de algoritmadaki bazı işlemlerden dolayı hepsi kullanılmıyor).
Public Key = EC(Hex(2^256)) ile gösterebiliriz.

Daha sonra elde edilen public key değerinin Keccak-256 Hash değeri bulunur. Hashin algoritmaları, herhangi bir datayı geriye dönük olarak kırılamaz(teorik olarak) bir şekilde özetleyen algoritmalardır. Keccak-256, SHA3 ailesinin bir implementasyonudur(Etherum standart SHA3 değil, Keccak-256 versiyonunu kullanıyor). Ortaya çıkan yeni değer 64 Hex byte(32 ASCII byte) değerindedir.

Daha sonra, yellow paper’da gösterildiği üzere bu hex değerin son 40 karakteri alınır. İşte bu, ethereum cüzdan adresidir.

Şimdi pratik olarak gerçek değerler üzerinden örnek işleyelim.

Rastgele 77 hanelik bir sayı oluşturalım:
31334737451456268050498185842994455999554006395290392504114029053954839148697 sayısı bir private key değeridir.

Daha sonra bunun Hexadecimal değerini buluyoruz:
0x4546d538d9e65520b453069d48978efc0679d363e7f500e18d173fa3ef09f899

Burdaki 0x kısmı gösterim amaçlı olup, hesaplamalarda bunu kullanmıyoruz. Yani, 4546d538d9e65520b453069d48978efc0679d363e7f500e18d173fa3ef09f899 değerini kullanıyoruz. Şu an herhangi bir cüzdan uygulamasında bu değer ile giriş yapıp aşağıda gösterilen adresi yönetebilirsiniz.
(Önemli Not: burdaki adres ve dataları güvenliğiniz için gerçek dünyada kullanmayın. Herhangi bir kayıp ve sorun durumunda sorumluluk size aittir. Ayrıca, burada anlatılan bilgiler eğitim amaçlıdır. Herhangi bir kötü niyetli kullanımda tüm sorumluluklar size aittir)

Daha sonra bu değer ile Elliptic Curve algoritmasına göre public key(açık anahtar) oluşturulur. Yukarıdaki özel anahtar(Hex değeri) için public key değeri:
0x46454399998223bdb3771f08341844c485cd6b0e35383635cbc56940a755e5b6986ef0dbd1381267575bf290843540d3061f089fbab1b8f60cfe3d3d0d6aef52

Görüldüğü üzere buradaki public key 128 Hex byte(64 ASCII byte) değerindedir(0x dikkate alınmaz).

Şu ana kadar elimizde özel anahtar ve açık anahtarımız oldu.

Son işlem olarak, adres oluşturma kısmına geçiyoruz. Bunun için, açık anahtarımızı Keccak-256 ile Hash işleminden geçireceğiz:
f1352aa70dc3becd9201dabc2c97b817517a417ee6483255bc093d6b08acfac2

Hash değerimiz 64 Hex byte(32 ASCII byte) bir değerdir. Bu değerin son 40 karakterini Ethereum adres olarak kullanıyoruz:
2c97b817517a417ee6483255bc093d6b08acfac2

Hex olduğunu belirtmek için de başına 0x ekliyoruz: 0x2c97b817517a417ee6483255bc093d6b08acfac2 Adresimiz hayırlı olsun 🙂

Günün sonunda bizim adresimiz 0x2c97b817517a417ee6483255bc093d6b08acfac2 oluyor ve erişim için gerekli özel anahtarımız da 4546d538d9e65520b453069d48978efc0679d363e7f500e18d173fa3ef09f899 oluyor.

Not: Ethereum dünyasında adres, private ve public key değerleri case insensitive’dir yani büyük-küçük harf duyarlılığı yoktur.

Şimdi gelin bunu koda dökelim. Bunun için Python programlama dilini kullanacağız(bu örnekte Python version 3.9 kullanıldı)

import ecdsa
from Crypto.Hash import keccak

random_number_for_private_key = 31334737451456268050498185842994455999554006395290392504114029053954839148697
private_key_hex = hex(random_number_for_private_key)[2:]
print(“It is your private key and keep in secret(Never share to anyone/anywhere): \n” + str(private_key_hex))

private_key_bytes = bytes.fromhex(private_key_hex)
private_key_object=ecdsa.SigningKey.from_string(private_key_bytes, curve=ecdsa.SECP256k1)

public_key = private_key_object.get_verifying_key().to_string()
public_key_hex = private_key_object.get_verifying_key().to_string().hex()
print(“It is public key. No problem to share: \n”+str(public_key_hex))

public_key_as_bytes = bytes.fromhex(str(public_key_hex))
keccak_hash = keccak.new(digest_bits=256)
keccak_hash.update(public_key_as_bytes)
full_keccak_hash= str(keccak_hash.hexdigest())

wallet_address = full_keccak_hash[24:]
print(“Your public wallet address: 0x”+ wallet_address)

Kodu çalıştırdığınzı zaman şu çıktıyı göreceksiniz:

It is your private key and keep in secret(Never share to anyone/anywhere):
4546d538d9e65520b453069d48978efc0679d363e7f500e18d173fa3ef09f899
It is public key. No problem to share:
46454399998223bdb3771f08341844c485cd6b0e35383635cbc56940a755e5b6986ef0dbd1381267575bf290843540d3061f089fbab1b8f60cfe3d3d0d6aef52
Your public wallet address: 0x2c97b817517a417ee6483255bc093d6b08acfac2 

Bu kodlara Github’dan şurdan erişebilirsiniz

Ayrıca, sıfırdan private key ve cüzdan oluşturma kodlarına da şurdan erişebilirsiniz.

Bunun çalışıp çalışmadığını başka bir kaynaktan inceleyelim. Bunun için en popüler web tabanlı Ethereum cüzdan uygulaması olan myetherwallet sitesini kullanalım:
1. https://www.myetherwallet.com/ sitesine açalım

2. Access Wallet linkine tıklayalım

 

 

 

 

 

 

 

3. Metod olarak “Software” seçelim

 

 

 

 

 

4. Private Key seçeneği olarak “Private” seçelim

 

 

 

 

 

 

5. “Private Key” alanına 4546d538d9e65520b453069d48978efc0679d363e7f500e18d173fa3ef09f899 değerini girelim. Şartları okudum seöeneği de seçilir.

6. Access Wallet butonuna tıklanır.

 

 

 

 

 

Görüldüğü üzere, adres değeri 0x2C97b817517A417ee6483255BC093D6b08acFac2’dir. Bu da bizim bulduğumuz adres ile eşleşiyor.

 

 

 

 

 

 

İster yazılım tabanlı bir cüzdan kullanın, ister donanım tabanlı, hepsinin çalışma mantığı bu şekildedir.

Başka bir makalede görüşmek üzere.