Bu çeviri Blockland DAO’nun, Andreas Antonopoulos tarafından hazırlanan Mastering Bitcoin kitabını çevirme inisiyatifi kapsamında yapılmıştır.
Her node bütün bir blokzinciri bünyesinde barındırma özelliğine sahip değildir. Birçok Bitcoin istemcisi, akıllı telefonlar, tabletler veya gömülü sistemler gibi alan ve güç kısıtlı cihazlarda çalışacak şekilde tasarlanmıştır. Bu tür cihazlar için, tam blokzinciri depolamadan çalışmasına izin vermek için Basitleştirilmiş Ödeme Doğrulaması (SPV) yöntemi kullanılır. Bu tür istemcilere SPV istemcileri veya hafif istemciler denir. Bitcoin yaygınlaştıkça, SPV node'u, özellikle Bitcoin cüzdanları için Bitcoin node'unun en yaygın biçimi haline geliyor.
SPV node'ları yalnızca blok başlıklarını indirir ve her bloğa dahil edilen işlemleri indirmez. İşlemsiz oluşan blokzinciri, tam blokzincirinden 1000 kat daha küçüktür. SPV node'ları, ağdaki tüm işlemler hakkında bilgi sahibi olmadıklarından, harcamaya uygun tüm UTXO'ların tam bir resmini oluşturamazlar. SPV node’ları, talep üzerine blokzincirinin ilgili bölümlerinin kısmi görünümlerini sağlamak için eşlere dayanan biraz farklı bir yöntem kullanarak işlemleri doğrular.
Bir benzetme yapmak gerekirse, tam bir node, her sokağın ve her adresin ayrıntılı bir haritasıyla donatılmış, garip bir şehirdeki bir turist gibidir. Karşılaştırıldığında, bir SPV node’u, garip bir şehirde rastgele yabancılardan adım adım yol tarifi isteyen ve yalnızca bir ana caddeyi bilen bir turist gibidir. Her iki turist de bir sokağın varlığını ziyaret ederek doğrulayabilmesine rağmen, haritası olmayan turist ara sokaklardan herhangi birinin altında ne olduğunu ve başka hangi sokakların olduğunu bilmiyor. Atatürk Caddesi'nın önünde konumlanan haritasız turist, şehirde bir düzine daha "Atatürk Caddesi" adresi olup olmadığını ve bunun doğru adres olup olmadığını bilemez. Haritasız turistin en iyi şansı, yeterince insana sormak ve AKPli esnafların onu soymaya çalışmadığını ummaktır.
SPV, işlemleri yükseklikleri yerine blokzincirindeki derinliklerine başvurarak doğrular. Tam blokzincir node'u, tam olarak doğrulanmış binlerce blok ve blokzincirine (zamanda geriye doğru) tüm yol boyunca uzanan işlemlerden oluşan tam olarak doğrulanmış bir zincir oluşturacakken, bir SPV node’u tüm blokların zincirini doğrulayacak (ancak tüm işlemleri değil) ve bu zinciri ilgili işlemle ilişkilendirecektir.
Örneğin, 300.000 bloğundaki bir işlemi incelerken tam bir node 300.000 bloğun tümünü genesis bloğuna bağlar ve UTXO'nun harcanmamış kaldığını onaylayarak işlemin geçerliliğini belirleyerek tam bir UTXO veritabanı oluşturur. Bir SPV node'u, UTXO'nun harcanmamış olup olmadığını doğrulayamaz. Bunun yerine, SPV node’u, bir merkle yolu kullanarak işlem ile onu içeren blok arasında bir bağlantı kurar. (Bkz: Merkle Tree) Ardından, SPV node'u, işlemi içeren bloğun üzerine yığılmış 300.001 ila 300.0006 arasındaki altı bloğu görene kadar bekler ve 300.0006 ila 300.001 numaralı bloklar altında derinliğini belirleyerek bunu doğrular. Ağdaki diğer node'ların 300.000 bloğu kabul etmesi ve ardından bunun üzerine altı blok daha üretmek için gerekli çalışmaları yapması, işlemin çifte harcama olmadığının proxy tarafından kanıtıdır.
Bir SPV node'u, işlem gerçekte mevcut olmadığında, bir blokta bir işlemin var olduğuna ikna edilemez. SPV node'u, bir merkle yolu kanıtı talep ederek ve blokzincirindeki İş İspatı'nı doğrulayarak bloktaki bir işlemin varlığını belirler. Ancak, bir işlemin varlığı bir SPV node'undan "gizlenebilir". Bir SPV node'u, bir işlemin var olduğunu kesinlikle kanıtlayabilir, ancak tüm işlemlerin bir kaydına sahip olmadığı için aynı UTXO'nun çift harcaması gibi bir işlemin mevcut olup olmadığını doğrulayamaz. Bu güvenlik açığı, hizmet reddi saldırısında (denial-of-service attack) veya SPV node'larına karşı çift harcama saldırısında kullanılabilir. Buna karşı savunmak için, bir SPV node'unun en az bir dürüst node’la temas halinde olma olasılığını artırmak için birkaç node'a rastgele bağlanması gerekir. Bu rastgele bağlanma ihtiyacı, SPV node'larının, sahte node'lara veya sahte ağlara bağlı oldukları, dürüst node’lara veya gerçek Bitcoin ağına erişimleri olmadığı ağ bölümleme (network partitioning) ve Sybil saldırılarına karşı da savunmasız olduğu anlamına gelir.
Çoğu pratik amaç için, iyi bağlanmış SPV node'ları yeterince güvenlidir ve kaynak ihtiyaçları, pratiklik ve güvenlik arasında bir denge sağlar. Ancak hatasız güvenlik için hiçbir şey tam bir blokzincir node'u çalıştırmanın yerini tutamaz.
Tam bir blokzinciri node’u, UTXO'nun harcanmadığından emin olmak için altındaki binlerce blokzincirinin tamamını kontrol ederek bir işlemi doğrularken, bir SPV node’u, bloğun üzerindeki bir avuç blok tarafından ne kadar derine gömüldüğünü kontrol eder.
Blok başlıklarını almak için SPV node’ları, getblock'lar yerine bir getheaders mesajı kullanır. Yanıt veren eş, tek bir başlık mesajı kullanarak 2.000'e kadar blok başlığı gönderir. İşlem, aksi takdirde tam bir sistem tarafından kullanılanla aynıdır.
Tam bir blokzinciri node'u, UTXO'nun harcanmadığından emin olmak için altındaki binlerce blokzincirinin tamamını kontrol ederek bir işlemi doğrularken, bir SPV node'u, bloğun üzerindeki bir avuç blok tarafından ne kadar derine gömüldüğünü kontrol eder.
Blok başlıklarını almak için SPV node'ları, getblock'lar yerine bir getheaders mesajı kullanır. Yanıt veren eş, tek bir başlık mesajı kullanarak 2.000'e kadar blok başlığı gönderir. Süreç, tam node'lar tarafından tam blokları almak için kullanılanla aynıdır. SPV node'ları ayrıca, eşler tarafından gönderilen gelecekteki blokların ve işlemlerin akışını filtrelemek için eşlerle bağlantı üzerinde bir filtre ayarlar. İlgili tüm işlemler, bir getdata isteği kullanılarak alınır. Eş, yanıt olarak işlemleri içeren bir tx mesajı oluşturur. Blok başlıklarını senkronize eden SPV node’u blok başlıklarının senkronizasyonunu gösterir.
SPV node'larının seçici olarak doğrulamak için belirli işlemleri alması gerektiğinden, ayrıca bir gizlilik riski oluştururlar. Her bloktaki tüm işlemleri toplayan tam blokzinciri node'larının aksine, SPV node'unun belirli veriler için istekleri, cüzdanlarındaki adresleri istemeden ortaya çıkarabilir. Örneğin, bir ağı izleyen üçüncü bir taraf, bir SPV node'unda bir cüzdan tarafından talep edilen tüm işlemleri takip edebilir ve bunları Bitcoin adreslerini o cüzdanın kullanıcısıyla ilişkilendirmek için kullanabilir ve kullanıcının gizliliğini bozabilir.
SPV/hafif node'ların kullanıma sunulmasından kısa bir süre sonra, bitcoin geliştiricileri, SPV node'larının gizlilik risklerini ele almak için bloom filter adı verilen bir özellik ekledi. Bloom filtreleri, SPV node'larının, sabit desenler yerine olasılıkları kullanan bir filtreleme mekanizması aracılığıyla, tam olarak hangi adreslerle ilgilendiklerini açıklamadan işlemlerin bir alt kümesini almasına izin verir.
Bloom filtresi, gizliliği korurken bir arama modelini ifade etmenin etkili bir yolunu sunan olasılıksal bir arama filtresidir. SPV node'ları tarafından, tam olarak hangi adresleri, anahtarları veya işlemleri aradıklarını açıklamadan, belirli bir modelle eşleşen işlemleri eşlerinden istemek için kullanılırlar.
Önceki benzetmemizde, haritası olmayan bir turist belirli bir adres olan "Atatürk Caddesi" için yol tarifi istiyor. Yabancılardan bu caddenin tarifini isterse, yanlışlıkla gideceği yeri açıklar. Bloom filtresi, "Bu mahallede adı Ü-R-K ile biten caddeler var mı?" diye sormak gibidir. Bunun gibi bir soru, istenen varış noktası hakkında "Atatürk Caddesi" sormaktan biraz daha az bilgi verir. Bu tekniği kullanarak, bir turist istenen adresi "T-Ü-R-K ile biten" gibi daha ayrıntılı veya "K ile biten" gibi daha az ayrıntıyı belirtebilir. Aramanın kesinliğini değiştirerek turist, az ya da çok spesifik sonuçlar elde etme pahasına az ya da çok bilgi ortaya çıkarır. Daha az spesifik bir desen sorarsa, çok daha fazla olası adres ve daha iyi gizlilik elde eder, ancak sonuçların çoğu alakasız olur. Çok spesifik bir model isterse, daha az sonuç alır ancak mahremiyetini kaybeder.
Bloom filtreleri, bir SPV node'unun kesinlik veya gizliliğe ayarlanabilen işlemler için bir arama modeli belirlemesine izin vererek bu işleve hizmet eder. Daha spesifik bir bloom filtresi, doğru sonuçlar üretecektir, ancak SPV node'unun hangi modellerle ilgilendiğini ortaya çıkarma pahasına kullanıcının cüzdanına ait adresleri ortaya çıkaracaktır. Daha az spesifik bir bloom filtresi, çoğu node’la ilgisi olmayan daha fazla işlem hakkında daha fazla veri üretecek, ancak node'un daha iyi gizliliği korumasını sağlayacaktır.
Bloom filtreleri, değişken boyutlu bir N ikili basamak dizisi (bir bit alanı) ve değişken sayıda M hash fonksiyonu olarak uygulanır. Hash fonksiyonları, her zaman ikili basamak dizisine karşılık gelen 1 ile N arasında bir çıktı üretecek şekilde tasarlanmıştır. Hash fonksiyonları deterministik olarak oluşturulur, böylece bir bloom filtresi uygulayan herhangi bir node her zaman aynı hash fonksiyonlarını kullanır ve belirli bir girdi için aynı sonuçları alır. Farklı uzunluktaki (N) bloom filtreleri ve farklı sayıda (M) hash fonksiyonu seçilerek, bloom filtresinin doğruluk ve dolayısıyla gizlilik seviyeleri ayarlanabilir.
16-bit alan ve üç hash fonksiyonlu basit bir bloom filtresi örneğinde bloom filtrelerinin nasıl çalıştığını göstermek için çok küçük bir 16-bitlik dizi ve üç hash fonksiyonlu bir set kullanırız.
Bloom filtresi, bit dizisinin tamamı sıfır olacak şekilde başlatılır. Bloom filtresine bir desen eklemek için, desen sırayla her bir hash fonksiyonu tarafından özetlenir. Girdiye ilk hash fonksiyonunun uygulanması 1 ile N arasında bir sayı ile sonuçlanır. 1’den N’ye indexlenen dizideki karşılık gelen bit bulunur ve 1'e ayarlanır, böylece hash fonksiyonunun çıktısı kaydedilir. Ardından, bir sonraki hash fonksiyonu başka bir bit ayarlamak için kullanılır ve bu böyle devam eder. Tüm M hash fonksiyonları uygulandıktan sonra, arama modeli 0'dan 1'e değiştirilen M bitleri olarak bloom filtresinde "kaydedilecektir".
İkinci bir desen eklemek, bu işlemi tekrarlamak kadar basittir. Desen, sırayla her bir hash fonksiyon tarafından özetlenir ve sonuç, bitler 1'e ayarlanarak kaydedilir. Ancak bir bloom filtresi daha fazla desenle doldukça, bir hash fonksiyonun sonucu halihazırda 1’e ayarlanmış bir bitle örtüşebilir, bu durumda bit değişmez. Özünde, üst üste binen bitlere daha fazla desen kaydettikçe, bloom filtresi 1'e ayarlanmış daha fazla bit ile doygun hale gelmeye başlar ve filtrenin doğruluğu azalır. Bu nedenle filtre olasılıksal bir veri yapısıdır—daha fazla model eklendikçe daha az doğru olur. Doğruluk, bit dizisinin boyutuna (N) ve hash fonksiyonlarının sayısına (M) karşı eklenen desen sayısına bağlıdır. Daha büyük bir bit dizisi ve daha fazla hash fonksiyonu, daha fazla deseni daha yüksek doğrulukla kaydedebilir. Daha küçük bir bit dizisi veya daha az hash fonksiyonu, daha az desen kaydedecek ve daha az doğruluk üretecektir.
Bir desenin bir bloom filtresinin parçası olup olmadığını test etmek için, desen her bir hash fonksiyonu tarafından özetlenir ve elde edilen bit kalıbı, bit dizisine karşı test edilir. Hash fonksiyonları tarafından dizine eklenen tüm bitler 1'e ayarlanırsa desen muhtemelen bloom filtresine kaydedilir. Bitler, birden fazla modelin örtüşmesi nedeniyle ayarlanabileceğinden, cevap kesin değil, daha çok olasılıklıdır. Basit bir ifadeyle, bir bloom filtresi pozitif eşleşmesi "Belki, Evet" anlamına gelir.
Bloom filtresinde "X" kalıbının varlığının test edilmesi. Sonuç, "Belki" anlamına gelen olasılıklı bir pozitif eşleşmedir. Karşılık gelen bitler 1'e ayarlanmıştır, bu nedenle desen muhtemelen bir eşleşmedir.
Aksine, bir desen, bloom filtresine karşı test edilirse ve bitlerden herhangi biri 0'a ayarlanırsa, bu, desenin bloom filtresine kaydedilmediğini kanıtlar. Olumsuz bir sonuç bir olasılık değil, bir kesinliktir. Basit bir ifadeyle, bir bloom filtresinde negatif bir eşleşme "Kesinlikle Hayır!" anlamına gelir.
Bloom filtresinde "Y" deseninin varlığının test edilmesi. Sonuç, "Kesinlikle Değil!" anlamına gelen kesin bir negatif eşleşmedir. Karşılık gelen bitlerden biri 0'a ayarlanır, bu nedenle desen kesinlikle eşleşmez.
👇