Cüzdanlar, kullanıcıların blok zinciri hesaplarını yönetmelerini, varlıklarını güvenli şekilde saklamalarını ve blok zinciri durumunu değiştirmek için işlemleri imzalamalarını sağlayan temel araçlardır.
Bu yazıda, cüzdanın ne olduğunu, nasıl oluşturulduğunu ve eliptik eğri kriptografisi kullanarak özel-genel anahtar çiftlerini nasıl ürettiğini ve güvence altına aldığını, anahtar kelimeleri nasıl türettiğini ve güvenli blok zinciri etkileşimlerini nasıl kolaylaştırdığını ele alacağız.
Cüzdan, blok zinciri hesabınızı (veya hesaplarınızı) görüntülemenizi ve onlarla etkileşimde bulunmanızı sağlayan bir uygulamadır; bu hesaplar, token gönderme veya akıllı sözleşmelerle etkileşim gibi işlemler yapmanıza olanak tanır.
Blok zincirindeki her hesap, birbirine bağlı iki anahtardan oluşan kriptografik bir anahtar çiftinden oluşur. Blok zinciri bağlamında, bu tür hesaplara genellikle Harici Sahipli Hesap (EOA) denir ve bir genel anahtar ile bir özel anahtardan oluşur:
Bu anahtar çifti, “trapdoor function” (tuzak kapısı fonksiyonu) adı verilen güçlü bir özelliğe sahiptir; bu özellik:

Cüzdanlar, işlem imzasından işlem gönderenin genel anahtarı elde edilebildiği için, hangi mesaj veya işlemleri onayladığınızı bilmenin bir yolunu sağlar. Bu, sahte/kötü niyetli işlemlerin blok zincirinde kabul edilmesini önlemek açısından gereklidir.
Örneğin, Jarrod, Abril’in kendisine 5 ETH gönderdiğini iddia eden bir işlem gönderebilir, oysa Abril bu işlemi asla onaylamamıştır. Ancak blok zinciri her işlemin imzasını doğruladığı için, imzadan elde edilen adres işlemin “göndereni” ile (yani Abril) eşleşmediğinde, bu işlemi hızlıca reddedecektir.
Ethereum gibi blok zincirleri, işlem imzasından elde edilen genel anahtarın ağı gönderen kişinin genel anahtarıyla eşleşip eşleşmediğini kontrol etmek için ECDSA (Eliptik Eğri Dijital İmza Algoritması) kullanır.
Bir cüzdan oluşturmak için genel-özel anahtar çifti oluşturmanız gerekir. Ancak bu anahtar çiftinin değerleri, blok zincirinde çalışabilmesi için birkaç kurala uymalıdır.
Bu üç adımlı süreç, blok zincirinde hesapların nasıl oluşturulduğunun temel akışıdır.
Sonraki adımda, bir genel anahtarın eliptik eğri ve özel anahtar kullanılarak nasıl türetildiğine değineceğiz. Ancak bundan önce, cüzdanlar hakkında aklınıza gelebilecek birkaç soruyu yanıtlayacağız, örneğin:
Az önce gösterdiğimiz gibi rastgele 64 onaltılık değer üretmek mümkün olsa da, genellikle özel anahtarlar Bitcoin’den doğan belirli standartlar kullanılarak üretilir. Bu standartlar, kullanıcıların 12-24 kelimelik bir anahtar kelime hatırlamasını sağlar; bu ifade ile ilişkili herhangi sayıda yeni hesap oluşturulabilir.
Bu, kullanıcıların tüm hesaplarına erişmek için yalnızca tek bir anahtar kelime grubunu hatırlamasını sağlar; her biri kendine ait bir genel-özel anahtar çiftine sahiptir. Tek bir anahtar kelimden, belirli bir anahtar türetme fonksiyonu (KDF) kullanılarak istenilen sayıda yeni özel anahtar türetilebilir.
O hâlde önce, anahtar kelimelerin rastgele entropi ile nasıl üretildiğini ve bir anahtar kelimelerin özel anahtarların nasıl türetildiğini ele alalım, ardından genel anahtarların özel anahtarlardan nasıl türetildiğine tekrar değineceğiz.
Bir cüzdan uygulamasını ilk yüklediğinizde, genellikle sizden bir anahtar kelime yazmanızı ve güvenli bir yerde saklamanızı ister; bu genelde 12 veya 24 kelimeden oluşur. Olası İngilizce kelimeler listesinin bir örneğini burada görebilirsiniz; bu listenin 2048 kelimeden oluştuğunu fark edeceksiniz (bu sayıya birazdan tekrar değineceğiz).
Mnemonic anahtar kelimeleri saklama fikri, 2013 yılında BIP (Bitcoin İyileştirme Teklifi) olan BIP-39 ile ortaya çıktı. Bu teklif, rastgele entropi üretmenin ve bunu kolay hatırlanabilir bir dizi kelimeye dönüştürmenin standartlaştırılmış bir yolunu sunar.
Öncelikle anahtar kelimemizin rastgele üretildiğinden emin olmamız gerekir; sonuçta bir başkasının yanlışlıkla cüzdanımıza girip fonlarımıza erişmesini istemeyiz.
Bunu yapmak için, tarayıcınızda da çalıştırabileceğiniz CSPRNG (Kriptografik olarak Güvenli Sahte Rastgele Sayı Üretici) kullanılarak rastgele bir sayı üretilir:
Bu rastgele sayıya entropi denir. Bu entropi, anahtar kelimeyi oluşturan kelime grubunu yaratmak için kullanılır. Bizim örneğimizde, 128 bit 12 kelimeye karşılık gelir, ancak farklı uzunluklar da kullanılabilir, örneğin:
Peki, bu bitleri anahtar kelime oluşturmak için nasıl kullanırız? Bitler ile kelimeler arasındaki ilişki nedir? Önce, entropi için bir checksum (doğrulama kodu) oluşturulur ve 128 bite eklenir; bu, bütünlüğünü sağlamak amacıyla entropinin oluşturulan 4 bitlik bir hash’idir.
Böylece elimizde 128 bit entropi + 4 bit checksum ile toplam 132 bit olur. Ardından bu 132 bit ikili sisteme dönüştürülür; özel olarak, 11 bitlik parçalara bölünür.
Artık her biri 11 bit uzunluğunda olan 12 ikili sayı grubumuz var. İpucu: 12 sayımız var ve anahtar kelimemiz 12 kelime olacak!
Unutmayın, listemizde 2048 kelime var ve 2048 sayısı, 11 bit ile oluşturulabilecek 2048 farklı ikili sayı olduğu için (2^11) seçildi.
Şimdi bu ikili sayıları kelime listemizdeki kelimelere dönüştürmemiz yeterli. Bu işlem, ikili sayıyı kelime listesinde bir kelimeyi bulmak için indeks olarak kullanarak yapılır. Yani, ikili sayı 10 ise, listedeki 9. kelimeyi kullanırız (çünkü indeks 0’dan başlar), örneğin:
11 bitlik her sayı için bu işlemi 12 kez tekrarlayarak 12 kelimeden oluşan bir anahtar kelime elde edilir.
Rastgele bir entropi değeri üreterek, bunu ikili parçalara bölerek ve bu ikili değerleri kelime listesinde kelimeleri bulmak için indeks olarak kullanarak, rastgele bir anahtar kelime elde ederiz.
İlk tepkiniz şu olabilir: “Eğer sadece 2048 olası kelime varsa, birisi anahtar kelimemi tahmin edemez mi?” Teknik olarak evet, ama bunun olasılığı gerçekten çok düşüktür. Ne kadar düşük diye sorarsanız:
128 bit rastgele üretim adımını unuttuğumuzu ve listeden 12 kelimeyi manuel olarak seçtiğimizi hayal edin. Her kelime seçtiğimizde, 2048 kelimelik bir havuzdan bir seçenek seçiyoruz.
Dolayısıyla, bir başkasının aynı kelime dizisini tahmin etmesi için, 1/2048 olasılıkla 12 kez üst üste bizimle aynı kelimeyi doğru tahmin etmesi gerekir. Şu anda muhtemelen “tamam, kulağa o kadar da zor gelmiyor…” diye düşünüyorsunuz?” Ama hadi bunu biraz hesaplayalım:
Bu, 2048 x 2048 x 2048 … 12 kez çarpılması demektir. Yani, 2048^12. Bu… akıl almaz derecede büyük bir sayı. Yaklaşık olarak 5 septilyon, yani 5 katrilyon milyar. Bu, kavrayamayacağımız kadar büyük bir sayı, ama hadi denemeye çalışalım…
Şu anda, saniyede 1 trilyon anahtar kelime tahmin edebilen aşırı güçlü bir bilgisayar kullandığınızı hayal edin. Bu makinenin bir anahtar kelimeyi tahmin etmesi 159 trilyon yıl sürerdi. Ya da (inancınıza bağlı olarak) bu, evrenin mevcut yaşının yaklaşık 11.000 katı daha uzun bir süre demektir.
24 kelimelik anahtar kelimeler 12 kelimelik olanlardan daha mı iyi?
Bazı cüzdanlar 128 bitlik (12 kelime) seçerken, daha modern cüzdanlar anahtar kelimeniz için 24 kelime hatırlamanızı ister! Bu da yine, inanılmaz derecede büyük bir sayı anlamına gelir.
Artık 12 kelimelik bir anahtar kelimemiz var; peki bu, hesaplar için özel anahtarlar oluşturmakta nasıl kullanılır? Bunu yapmak için anahtar kelimemizi, cüzdan oluşturmakta kullanılabilecek ikili (binary) bir tohuma dönüştürmemiz gerekir. Bu süreç şu adımları içerir:
Bu süreç (anahtar türetme fonksiyonu olarak adlandırılır), HMAC-SHA512 adlı başka bir algoritmayı sahte rastgele fonksiyon olarak kullanarak, ikili tohum (binary seed) adı verilen 64 baytlık bir hash değeri üretir.
Ortaya çıkan 64 baytlık hash değeri, Bitcoin standartlarından türeyen mantıkla (BIP-32 ve isteğe bağlı olarak BIP-32’nin bir uzantısı olan BIP-44) hesaplar oluşturmak için kullanılabilir.
BIP-32, hiyerarşik deterministik (HD) cüzdanları tanıtır; burada tek bir anahtar kelimeden birçok cüzdan türetilebilir ve bu cüzdanlardan daha fazla cüzdan türetilebilir, böylece bir “cüzdan ağacı” oluşturulur.
BIP-44, tek bir ikili tohumdan cüzdan yapıları için bir hiyerarşi oluşturmanın standart bir yolunu sunar; bu, şu yapıyı izleyen belirli bir türetme yolu uygulanarak yapılır: m / purpose’ / coin_type’ / account’ / change / address_index:
Her cüzdan BIP-44 kullanmaz, ancak hesapların ikili tohumdan nasıl türetileceğini standartlaştırmak için yaygın bir yöntemdir.
Daha önce belirttiğimiz gibi, özel anahtarlar 64 onaltılık karakterden oluşur, bu da 32 bayttır. Ve biz PBKDF2 süreciyle 64 baytlık bir ikili tohum ürettik; peki bu 64 baytlık hash değerini özel anahtarlar oluşturmak için nasıl kullanırız?
Öncelikle hash iki parçaya bölünür; her biri 32 bayt boyutundadır:
Artık özel anahtarların nasıl göründüğünü, nasıl rastgele üretildiğini ve tek bir anahtar kelimeden birden fazla anahtarın nasıl türetilebileceğini anladık. Şimdi de genel anahtarların özel anahtarlardan nasıl türetildiğini inceleyelim.
Eliptik eğri kriptografisi (ECC) kullanarak, belirli bir özel anahtara karşılık gelen genel anahtarı elde edebiliriz. Farklı eliptik eğri türleri vardır, ancak hem Bitcoin hem de Ethereum’un kullandığı eğri secp256k1 olarak adlandırılır.
Bu eliptik eğrinin teknik tanımı, eğri üzerinde başka noktalar oluşturmak için başlangıç noktası olarak kullanılan G taban noktasını içerir. Bu başlangıç noktasından, özel anahtarımızın belirlediği sayıda ve belirli bir yöntemle eğri üzerinde “hareket ederiz”. Bu süreci durdurduğumuzda ulaştığımız eğri üzerindeki nokta, bizim genel anahtarımız olur.
Eğri üzerinde “hareket etme” yöntemine skaler çarpma denir. Eliptik eğrilerle çalışırken, skaler, eğri üzerindeki bir noktayı ölçeklendirmek için kullanılan sayıyı ifade eder. G taban noktasını alırız ve skaler sayıyı ona uygularız; bu noktayı “uzatarak” eğri üzerinde yeni bir noktaya ulaşırız.
Taban noktasına uyguladığımız skaler sayı bizim özel anahtarımızdır; basitçe söylemek gerekirse, başlangıç noktası G’yi alırız ve onu özel anahtarımızla skaler olarak çarparız, böylece genel anahtarımıza ulaşırız.
Gerçekte, eğri asal sayı alanı ℤp üzerinde tanımlandığı için, daha çok dağınık noktalar kümesi gibi görünür… ancak eliptik eğrinin aynı özelliklerine sahiptir.
Bu skaler çarpma işleminin sonunda (<özel anahtar> sayısı kadar adım atarak), eğri üzerinde yeni bir noktaya ulaşırız; bu bizim genel anahtarımız olur. Bu süreci aşağı yukarı şöyle hayal edebilirsiniz:
Genel anahtarlar, adından da anlaşılacağı gibi, herkesle açıkça paylaşılabilir. Şu amaçlarla kullanılırlar:
Bununla birlikte, Abstract gibi bazı blok zincirleri, daha fazla özellik sunan, daha güçlü güvenlik, kurtarma mekanizmaları ve daha fazlasını mümkün kılan akıllı sözleşme hesapları adı verilen yeni tür cüzdanları da destekler.


