Zero Knowledge Protokolleri (zk-SNARKs zk-STARKs )
Bir şeyi bildiğinizi, neyi bildiğinizi göstermeden nasıl kanıtlarsınız?
Selamlar, bir önceki yazımda blockchainde gizlilikle alakalı Cryptonote ve Cryptonight Kavramları’nı anlamaya ve anlatmaya çalışmıştım. Bu yazıda da yine blockchainde gizlilik için farklı bir yöntem olan zero-knowledge protokolleri nedir onu inceleyip sonuçları sizlere aktarmaya çalışacağım.
Zero Knowledge
Zero knowledge kavramı ilk olarak 1985 yılında birkaç bilim insanı tarafından bir çalışmada bahsedildi, ayrıca bu çalışma 1993 yılında Gödel ödülüne layık görüldü.
Zero Knowledge Proof/Protocol bir tarafın bilginin doğruluğunu karşıya başka bir bilgi vermeden kanıtlayabileceği yöntemdir. Yani diğer protokollerin aksine veriler ifşa olmadan bilgilerin doğru olup olmadığı kanıtlanacaktır. Aktarılan tek bilgi kanıtlayıcı tarafın verileri bildiğini onaylayıcı tarafa aktarmasıdır. Bunun dışında bir bilgi aktarılırsa bu işlem zero-knowledge protokolünün dışına çıkmış olur.
Zero-knowledge nasıl çalıştığını anlamak adına yaygın bilinen örneklerden birinin üzerinde durabiliriz.
İki adet top ve renk körü bir arkadaş
Elinizde bir adet mavi ve bir adet yeşil top olduğunu düşünün, bu topların rengi dışındaki bütün özellikleri aynı. Karşınızdaki arkadaşınızın da renk körü olduğunu varsayalım. Arkadaşınız topları aynı renkte görür ve birbirlerinden ayırt edilemez haldedirler. Sizinse bu topların farklı olduğunu kanıtlamanız gerekmektedir.
Kanıt yönteminiz ise şöyle çalışacak, arkadaşınız topları alıp arkasına saklayacak, topları diğer elindekiyle değiştirme hakkına sahip. Ardından topları size gösterip “Yerlerini değiştirdim mi?” diye size soracak. Tabii ki siz topları değiştirip değiştirmediğini fark ederek ona doğru cevabı vereceksiniz. Öncelikle arkadaşınız %50 şansınız olduğu için bunu bir tesadüf olarak değerlendirebilir ama uygulama sayısı arttıkça doğru söylediğiniz ortaya çıkacak(20 deneme itibariyle her birinde doğru söylemiş olma ihtimaliniz 1048576'da 1). Böylelikle arkadaşınıza topların renklerini söylemeden birbirlerinden farklı olduğunu kanıtlamış oldunuz. Ayrıca bir başka örnek olarak graph-coloring probleminde zero knowledge proof mantığıyla üretilen çözümü, bu adres üzerindeki demodan inceleyebilirsiniz.
İşte bilginin ne olduğunu karşı tarafa söylemeden doğru olduğunu kanıtlatabileceğiniz yöntem zero-proof. Bu yöntem doğrulama sistemleri, nükleer silahsızlanma ve blokchain ağlarında kullanılabiliyor. Biz de tabii ki blockchain üzerindeki uygulamalarını inceleyeceğiz.
zk-snarks
zk-snarks zero knowledge mantığının blockchain üzerinde çalışabilmesi için geliştirilen ve Zcash isimli coinin kullandığı protokol. Ne anlama geldiğini, ne ifade ettiğini ve çalışma prensibini açıklamak için öncelikle isminden başlayalım.
zk-snarks, zero knowledge succint non interactive argument knowledge, ifadesinin kısaltılmış hali bu ifadedeki terimler ise,
Zero-knowledge: ifade doğruysa, doğrulayıcı ifadenin doğru olduğu gerçeğinin dışında bir şey öğrenmez.
Succint: İspat boyutunun kısa(öz) olduğu anlamına gelir. Girdi boyutundan bağımsız olarak ispat, 288byte boyutunda üretilir.
Non-interactive: İspatlayan tarafın bilgiyi doğrulamak için doğrulayan taraf ile etkileşime girmek zorunda olmadığı anlamına gelir. Bunun yerine, ispatlayan taraf kanıtlarını önceden ağda yayınlayabilir ve ilerleyen süreçte bir doğrulayıcı bilginin doğruluğunu sağlayabilir. Yani anlık olarak iletişime ihtiyaç duyulmaz.
Argument: Hesaplama işlemleri sonlandıktan, sonuçlandıktan sonra ortaya çıkan ifadeyi argument(argüman) olarak düşünebilirsiniz.
Knowledge: Kanıtın, ispatlayan tarafın erişimi olmaksızın yapılamayacağı anlamına gelir(ifadeyi kanıtlamak için private input gereklidir).
şeklinde açıklanabilir.
Kısa(öz) zero knowledge kanıtları birkaç milisaniye içinde doğrulanabilir, program boyutu çok büyük olsa dahi yalnızca birkaç yüz baytlık uzunlukta ispatlar üretilir. Önceki bölümde bahsettiğim zero knowledge protokolünde, ispatlayan taraf ve doğrulayan taraf birden fazla sayıda karşılıklı iletişim kurmak zorundaydılar, fakat non-interactive(etkileşimsiz) yapılarda kanıt, ispatlayıcıdan doğrulayıcıya gönderilen tek bir mesajdan ibarettir.
Bir zk-snarks ispatının etkileşimsiz olması da blokchainde gerçekleşebilmesi için önemlidir. Bu ifadeyi biraz daha açıklamak gerekirse, ispatımızı etkileşimsiz olarak gerçekleştirerek transfer edilebilmesini sağlamış oluyoruz. Yanı yukarıdaki top örneğiyle düşünürsek, ispatımız sadece arkadaşınız için değil tüm ağdaki onaylayıcılar için geçerli oluyor. Böylelikle her bir doğrulayıcı için tekrardan ispatlama ihtiyacı duymamış oluyoruz.
Şu anda, non-interactive ve bir blok zincirinde yayınlanacak kadar kısa olan zero knowledge ispatları üretmek için bilinen en etkili yol, ispatlayıcı ile doğrulayıcı arasında paylaşılan ortak bir referans ifadesi(reference string) -bu ifade aslında public ve private keyleri eş olarak üretip private keyi ortadan kaldırmak anlamına geliyor- oluşturan bir başlangıç kurulum aşamasına(setup phase) sahip olmaktır. Bu ortak referans ifadeyi sistemin genel parametreleri olarak kabul ederiz.
Eğer birisi bu parametreleri üretmek için kullanılan gizli rastgele üretim algoritmasına erişebilseydi-yani başta yok edilen private keylere erişim sağlayabilirse-, doğrulayıcı tarafa geçerli görünecek yanlış kanıtlar oluşturabilirdi. Zcash için bu, kötü niyetli tarafın sahte paralar oluşturabileceği anlamına geliyor-diğer insanların Zcashlarini çalma veya bilgileri ortaya çıkartma gibi bir durum söz konusu değil-. Zcash bunun olmasını engellemek için, multi-party ceremony’ler adı verilen bir sistem geliştirdi. Bu sistemde parametre olarak kullanılacak public keyler farklı konumlarda bulunan kişilerce parça parça üretiliyor. En sonunda bu parçalar birleştiriliyor ve tek bir public key elde ediliyor. Yine aynı kişiler oluşturdukları private keyleri ise siliyorlar. Bu konuda detaylı bilgi almak isterseniz https://z.cash/technology/paramgen sayfasını inceleyebilirsiniz.
zk-SNARK’ta ispat nasıl oluşturulur?
Bu kısımda zk-SNARK ispatlarının oluşturulmasındaki bir kaç adımı açıklayacağım, devamı için daha teknik bilgiler gerektiği için belirteceğim kaynaklardan faydalanabilirsiniz.
Zcash’da zero-knowledge gizliliğini sağlayabilmek için, bir işlemin geçerliliğini ağın konsensüs kurallarına göre belirleyen fonksiyon, hesaplamaları yapabilmek için kullanılan bilgileri ifşa etmeden, işlemin geçerli olup olmadığını saptayabilmelidir.
Bu işlem verilerin bazı hesaplamalar ve kurallarla kodlanmasıdır. Bunun için, zk-SNARKs ilk olarak kanıtlamak istediğiniz bilgileri cebirsel denklemlere-algebraic equations- çevirir. Ardından bu denklemlere göre aritmetik devreler oluşturulur. Aşağıdaki örnekte, geçerli bir işlemin gerçekleşmesi için belirlenmiş adımların, eşitliklerin doğrulayıcı taraflara herhangi bir bilgiyi açıklamadan aday bir çözüm üzerinde değerlendirilebilecek denklemlere nasıl dönüştürüldüğüne dair kısa bir genel bakış sunuluyor.
Hesaplama → Aritmetik Mantık Devresi → R1CS → QAP → zk-SNARK
Devre şemasının nasıl oluşturulduğunu ve devam eden adımların nasıl gerçekleştirildiğini incelemek isterseniz Zcash’in sitesinden veya Vitalik Buterin’in medium yazılarından yararlanabilirsiniz.
dipnot: Zcash’in shielded işlemleri gerçekleştirirken işlemci gücünü çok fazla kullanması en büyük problemlerden biri. Bu sebeple default Zcash işlemleri görünebilir olarak gerçekleşmekte. İşlemlerinizi yaparken bu detaya dikkat etmenizi tavsiye ederim. Doğru kullanım örneği için adrese bakabilirsiniz.
zk-SNARKs’la ilgili problemler
Öncelikle zk-SNARKs’ın güvenilir kişiler tarafından başlangıcının yapılması zorunluluğu oldukça rahatsız edici bir problem. Zcash’in kurulumunu örnek alırsak, dünya genelinden 6 geliştirici bir DVD’den yönergeleri takip ederek zk-SNARKs’ı Zcash blockchainine ekledi. Yani her üye Zcash’i kontrol etmek için kullanılacak şifrenin bir parçasını üretmiş oldu. Tüm bunlar da blockchain mottosuna ters olarak belirli kişilere yetki vermek anlamına geliyor. Tabii bu durumda herhangi bir açığın ortaya çıkması için 6 kişinin de birlikte hareket etmesi gerektiğini hatırlatayım. Bir sonraki üretim seremonisinde ise 100 ile 1000 kişi arasındaki bir topluluk bu görevi üstlenecek. Her ne kadar kişi sayısı artsa da bu bir problem oluşabileceği gerçeğini ortadan kaldırmıyor ve potansiyel tehdidi yok etmiyor. Böyle bir problemin olması uygulanabilirlik için yeni çözümlere de yol açmış oluyor(zk-STARKs).
zk-STARKs
zk-STARKs, zk-SNARKs’ın daha hızlı ve daha az maliyetli hali olmak için geliştirilmiş bir protokol. zk-SNARKs’a göre en büyük avantajı ise kurulum sırasında güvenilir kişilere-trusted setup- ihtiyaç duymaması(reference stringlerin üretimi sırasındaki tehlikeden bahsetmiştik).
Daha hızlı ve daha az maliyetli olmasını sağlayan etkenleri detaylıca incelemek isterseniz zk-STARKs whitepaperı’na göz atabilirsiniz. Ayrıca bu medium postunda da detaylı incelemeler mevcut.
zk-STARKs ispatının oluşturulması
zk-SNARKs’taki gibi burada da ispatın oluşturulması karmaşık bir süreçle gerçekleştiriliyor.
buradaki işlemlerin nasıl yapıldığını teknik detayları ile incelemek isterseniz,
https://eprint.iacr.org/2018/046.pdf adresinden zk-STARKs whitepaperına bakabilirsiniz.
Blockchainde gizliliği sağlamayı amaçlayan zero-proof, zk-SNARKs ve zk-STARKs protokollerinin ne anlama geldiğini, nasıl çalıştığını elimden geldiğince anlatmaya çalıştım. Zamanınızı ayırdığınız için teşekkür ederim, sonraki yazılarda görüşmek üzere.