Sıfır Bilgi Kanıtı: zk-STARK Nedir ve Nasıl Çalışır?

Yayımlama Zamanı: 10 May 2023Güncelleme Zamanı: 4 Nis 2024Okuma Süresi: 16 dk78

1. Nedir?

zk-STARK Rezerv Kanıtı (PoR) sistemi, karmaşık bir matematiksel çözüm olan STARK teorisinden yararlanır. zk-STARK, İngilizce “Zero-Knowledge Scalable Transparent Argument of Knowledge” (Sıfır Bilgi Ölçeklenebilir Şeffaf Bilgi Argümanı) teriminin kısaltmasıdır ve Vitalik’in blok zincirlerindeki hesaplamaların bütünlüğünü ve gizliliğini sağlamaya yönelik fikrine (https://vitalik.eth.limo/general/2022/11/19/proof_of_solvency.html) dayanan bir kriptografik kanıt teknolojisidir. Bu makalede nasıl çalıştığına bakacağız ve genel matematik kavramını açıklayacağız ama daha da detaylı bilgi almak isterseniz buradan veya buradan başlayabilirsiniz.

Nasıl Çalışır?

Şekil 1. zk-STARK rezerv kanıtı için oluşturulan gerçekleştirme izleme tablosu ve Merkle ağacı.

1. Adım: Oluşturma Kısıtlamaları

Borsamızın borcunu kanıtlamak için üç iddiada bulunmaktayız:

1. İddia: Her kriptonun değeri ve her kullanıcının net değeri dâhil olmak üzere her kullanıcının değerlerini doğru bir şekilde topluyoruz.

2. İddia: Borsa, toplam borcunu azaltmak için net değeri negatif olan sanal bir kullanıcı yaratmamıştır (Bireysel kullanıcının negatif bakiyeye sahip olması, yalnızca kullanıcının net değeri 0’ın üzerindeyse kabul edilebilir).

3. İddia: Borsanın iddia ettiği toplam değerde her bir kullanıcı hesaba katılır; dolayısıyla, her kullanıcının, kendi net değerinin toplam değere dâhil edildiğini doğrulayabilmesi gerekir.

Yukarıdaki iddiaları test etmek ve doğrulamak için aşağıdakiler gibi kısıtlamalar oluşturmamız gerekir:

1. İddia: Toplam Bakiye Kısıtlaması (Doğru bir toplam bakiye kısıtlaması)

uts: her bir kullanıcının verilerine dâhil edilen izleme satırlarının sayısı olan kullanıcı izleme boyutu (user trace size).

sum: toplam kullanıcı bakiyesi.

N: kullanıcı sayısı.

2. İddia: Negatif Olmayan Kısıtlama (Pozitif net varlık kısıtlaması)

3. İddia: Dâhil Etme Kısıtlaması (Tüm müşteri hesap bakiyesini dâhil etme kısıtlaması)

Yukarıdaki kısıtlamalara göre, denetimlerden örnekler alarak toplam bakiyeleri ve negatif olmama durumunu taahhüt etmek ve doğrulamak için bir izleme tablosu oluşturuyoruz. İzleme tablosu şu şekilde oluşturulur (basit bir örnek için, maksimum USD değeri 4^6 = 4096’dan küçük olan 3 kullanıcı):

  1. 32 satır ve 5 sütun içeren bir tablo ile başlıyoruz ve kullanıcının değerlerini ve kimliklerini 21.png satırına giriyoruz; burada k % 8 = 6 ve 23.png şeklindedir. Her 8 satır bir bloktur ve kullanıcı varlık bilgileri artık her blokun 22.png gerisindedir. İlk kullanıcıya sanal 0 bakiye verilir, böylece değer birikiminin negatif bir değerden başlamadığını kanıtlamak için bunu yayımlayabiliriz.

  1. Kullanıcı varlık değerlerini birer birer toplarız ve sonucu, her blokun son satırları olan 21.png satırlara gireriz; burada k % 8 = 7 ve 23.png şeklindedir.

  1. Her kullanıcının toplam değerini, her blokta geriye doğru 22.png satırdan başlayarak satır satır 4’e bölerek tabanı tutarız. Bunu, her blok için ilk satırların sıfır olup olmadığını kontrol ederek kullanıcının net değerinin negatif olmamasını sağlamak için yapıyoruz. Birinin net değerinin negatif olması hâlinde, blokunun ilk satırı sıfır olmayacaktır çünkü negatif bir değer (-x) sonlu alan 24.png içinde (p - x) olacaktır ki bu çok büyük bir pozitif değerdir.

  1. Her bir kullanıcı için rastgele sayılar giriyoruz ve tablodaki boşlukları 0 ile dolduruyoruz.

2. Adım: Düşük dereceli polinom uzantısı Yukarıdaki polinom kısıtlamalarını kullanarak *uts N uzunluğunda bir hesaplama izleme polinomu elde edebiliriz. Güvenlik nedenleriyle, polinoma daha geniş bir değerlendirme alanında taahhüt gerçekleştiriyoruz ve alan yükseltme faktörünü extension_faktör (uzantı faktörü) olarak alıyoruz.

Yukarıdaki durumda, I(x)’ten bir p(x) polinomu hesaplayabiliriz. Extension_factor'ı 8 olarak kullandığımızda, p(x) üzerinde 32(8-1)* puan daha hesaplayacağız.

D dereceli iki farklı polinom en fazla D nokta paylaşacağından, geçerli bir polinom (yukarıdaki kısıtlamaları karşılayan) ve D dereceli sahte bir polinom (yukarıdaki kısıtlamaları karşılamayan) içeren örnek bir polinom çifti en fazla D nokta paylaşacaktır. Bu, sahte bir polinomun rastgele bir örnekleme denetiminden geçme şansının 25.png olduğu anlamına gelir. Örnekleme incelemesini n kez yaparsak, şans 26.png seviyesine düşecektir.

Extension_factor varsayılan değerini 16 ve örnekleme denetimi varsayılan süresi 16 olarak ayarlıyoruz; böylece, güvenlik düzeyi 80 bit oluyor.

3. Adım: Polinom taahhüdü Hesaplama izinin hash değerini ve karşılık gelen kullanıcı bakiyesini, kullanıcı kimliğini ve karşılık gelen kısıtlama polinomunun değerini her bir satır için hesaplayıp bir Merkle ağacı oluşturuyoruz. Merkle kökü, polinomunun taahhüt değeridir.

4. Adım: Örnekleme kanıtı oluşturma Merkle kökünü rastgele bir kaynak olarak kullanarak verileri örnekliyoruz. Hesaplama izi verilerinin sızmasını önlemek için, örnekleme sırasında *k ** extension_factor dizinine sahip verilerden kaçınıyoruz ve örnekleme dizinine karşılık gelen Merkle kanıt yolunu oluşturuyoruz.

Taahhüt edilen polinomun 1. Adım’da listelenen kısıtlamaları karşılayan geçerli bir polinom olup olmadığını kontrol etmek için örnekleme denetimleri yapıyoruz. 2. Adım’da belirtildiği gibi, örnekleme denetimlerinin süreleri kurcalama veya manipülasyonun başarılı olma şansını etkileyecektir.

5. Adım: Düşük dereceli kanıt oluşturma

Örnekleme denetimi yoluyla kurcalama veya manipülasyonun başarılı olma olasılığını kontrol edebiliriz. Ancak, 2. Adım’da bahsedildiği gibi, doğrulanan polinom derecesinin geçerli bir polinom derecesinden fazla olmamasını sağlamamızı gerektiren bir koşul vardır. Kanıt verimliliğini artırmak için, tüm kısıtlama polinomlarını doğrusal olarak tek bir polinomda birleştiriyor ve bunun için düşük dereceli bir kanıt üretiyoruz. Kombinasyon katsayıları da rastgele bir kaynak olarak Merkle kökü kullanılarak üretilir.

Örneğin, p0(x), p1(x) ve p2(x)’in D dereceden büyük olmadığını kanıtlamak istersek, 3. Adım’da oluşturulan Merkle kökünden 2 rastgele katsayı üretebilir ve doğrusal polinom l(x)’i şu şekilde hesaplayabiliriz:

Bash
k0 = hash(kök + "0")
k1 = hash(kök + "1")
l(x) = k0 * p0(x) + k1 * p1(x) + p2(x)

l(x)’in D dereceden fazla olmadığı kanıtlanabilirse p0(x), p1(x) ve p2(x) içinden herhangi birinin derecesinin D’den fazla olma şansı 0’a yakın olur.

6. Adım: toplam bakiye doğrulama İlk olarak, 5. Adım’da oluşturulan düşük dereceli kanıtı doğrularız.

Ardından, 4. Adım’da oluşturulan örneklem verileri üzerinden ilave açık doğrulama gerçekleştirilir. İlk olarak, verilerin polinom taahhüdü ile tutarlı olduğu doğrulanır ve ardından verilerin 1. Adım’da oluşturulan kısıtlamaları karşıladığı doğrulanır. Son olarak, düşük dereceli test polinomunun kombinasyon katsayıları doğrulanır.

7. Adım: kullanıcı dâhil etme kanıtı oluşturma Belirli bir kullanıcının borsa tarafından iddia edilen toplam tutara dâhil olduğunu kanıtlamak için, kullanıcının hesaplanan izini, kullanıcı bakiyesini, kullanıcı kimliğini ve kullanıcı dizinine karşılık gelen rastgele bir sayıyı sağlarız. Ayrıca, bu verilere karşılık gelen Merkle yolunu da sağlarız.

8. Adım: dâhil etme kanıtının kullanıcı tarafından doğrulanması Kullanıcı kendi bakiyesini, kimliğini kontrol eder; kendi dizinine karşılık gelen verilerin hash değerini hesaplar ve sağlanan Merkle yolunu kullanarak Merkle ağacının yaprak düğümündeki hash değerini doğrular.

2. Rezerv Kanıtı (PoR) için Kendi Kendine Doğrulama Nasıl Yapılır?

2.1 zk-STARK Dâhil Etme Kısıtlamasını Doğrulayın

Doğrulama Teorisi

STARK prosedürünü izleyerek, tüm kullanıcı varlıklarının gerçekleştirme izleme tablosunu aşağıdaki gibi hesaplayacağız ve her kullanıcının bilgilerini bir Merkle ağacı yaprağına dönüşen bir izleme tablosu olarak hash’leyeceğiz, ardından yaprakları her PoR denetim turu sırasında yayımlanacak bir Merkle köküne bağlayacağız.

Varlıklarınızın köke dâhil olup olmadığını doğrulamak adına size doğrulama için Merkle yolunu sağlayacağız. Öncelikle, varlık bilgilerinizi hash’leyerek yaprağınızı hesaplayabilir, ardından yaprağınızın yayımladığımız Merkle ağacında ve kökünde geçerli bir yaprak olup olmadığını doğrulayabilirsiniz.

Örneğin, Şekil 1’de, id_k kimliğine sahip kullanıcı hashk = hash("20" + "15" + "5" + "id_k" + "99821") hesabını yapacak ve kırmızı kare çerçeve içindeki diğer veriler Merkle yolu doğrulaması olacaktır. Kullanıcıların bu doğrulamayı yapması için açık kaynaklı bir araç sağlanmaktadır.

Merkle ağacının yaprakları hash olduğundan, hiçbir özel bilginiz başkalarına sızdırılmaz.

Doğrulama Nasıl Yapılır?

  1. Hesabınızın varlık bakiyesinin bir zk-STARK Merkle yaprağı olarak dâhil edilip edilmediğini doğrulamak için, OKX hesabınıza giriş yapın, son denetimleri görüntülemek için “Denetimler” kısmını ziyaret edin ve denetim verilerinizi görüntülemek için “Ayrıntılar” üzerine tıklayın.

  1. “Verileri kopyala” üzerine tıklayarak manuel doğrulama için ihtiyacınız olan verileri alın.

3)”Verileri Kopyala” üzerine tıkladıktan sonra, metin düzenleyiciyi açıp (ör. not defterini kullanarak) yapıştırın ve JSON dizesini dosya olarak kaydedin. Dosyanın “_inclusion_proof.json” adı ile sona ermesi gerekir. JSON dizesi, hesap bakiyenizi ve Merkle yolunun anlık görüntüsünü içerir ve dosyayı yeni bir klasöre kaydeder.

JSON metni aşağıdaki gibi gösterilir:

JSON
{
"batch_inclusion_proof": {
"batch_mtree_root": "34d4e17e0071f180736bae075f632845ded76262d19970c47cabb8d88046e9c5",
"user_id": "47db1d296a7c146eab653591583a9a4873c626d8de47ae11393edd153e40f1ed",
"total_value": 138312291,
"BTC": 2152907,
"ETH": 909757,
"USDT": 2319557,
"random_number": "e7b7a5a6fdba87a58559aed4fca66fb63d3d9395ce0d51bda40fcd35893391ac",
"merkle_path": [
"5e3dd0ad776b15743076405d53e12af8fdac85c446bcc6c2eb8cab0e0e0c24f9",
"9dd5fcb0f3835b10772a7baabe7a074ed0b6947f7284e2d7ce5a84c3b5b394da",
"973186c5ea69bdc06c0c786cfae76173a89e0989bd759e1b2c37fdd317c70fe2",
"0c7ea3dd9bc0a15019b9ace6cf003befa31133ee84728d21bf67aa984ef1b60a",
"2adf4a58ccec7a44ed3a3f8bd365c61eac7d25c55524e69a31c6665769b7962a",
"4cddf667adbfa51e1b999e39a2009dcc9786385d9f3e240919f763e4db6f3609",
"4e841f9b5c2641759572fdfaf66c518b191e89b7a4745f179c046fef1eb9c374",
"cc12d77e7d13ee3c57064697dfef230064efaaf5b6ccf22a5ef5b7a2602632ab",
"ead6745e91b88021aeecddd8d014ea26ba26f42c4d5286ef8e196085d3757f62",
"1a583279e243ddc0a36bf870b5af70f2e52f059faeb5f3757d0d1903770371e8",
"5c1729384a2f2c8c434f3b34e99d6152aab42093c4f68aab638eaa212e799933",
"e154c1011883b2cea377c6bc820a21ac01d9d792ce3e1f376f35c1b29df04167"
]
},
"trunk_inclusion_proof": {
"trunk_mtree_root": "9b61d44f4f3de6b284d95a844dee9327d5e2091ac7e6b6f67ca10bd866617290",
"batch_id": "34d4e17e0071f180736bae075f632845ded76262d19970c47cabb8d88046e9c5",
"total_value": 2007657936,
"BTC": 18915744,
"ETH": 21522734,
"USDT": 21268768,
"random_number": "c93d3517d691564f3cc8e1eee6634ba7e0f59125aa89cd6984677459ac5f8164",
"merkle_path": [
"1082ec62ad0bd2b2b2c38a08f4b0de2f9aa77b387c611b927d203deb9bc97376",
"a57a391c137877993cd61ca4ad57bb1754bf8776fd207e630c362b8560fbb34b",
"413cba43d7f7236b5ce21fe951583660277507250ecbabca6a1ac6e9ac66bb5b",
"d87e2c64c34700195e322967ebbbb282810671320d083029fb9e46f92474d47b",
"85438a308f8d668779dbdb462437434f8f9d551229e8ebb2235605fe18cf97f6",
"d1cbf91c33b4cb0366877c4c805548401887f2a428c7297d0c4d97fa0f936cec",
"147fccf20ff7010d2ba162333f62200dce116d337230ee73f7c8bc2abcba148e",
"0901034401e6b6fa7de911d658ebc9b10c6a64c16a5450a22e390859ae87e1c4",
"b2e3525d853749ca2edfa718cd4f12ba26a0f645dfb0d5512d42c67fc74d0a1a",
"ad34d5acf98f7e6234d132d578f823e7bd8410d1850db76a55dd794ce388b2c2",
"7e81326a45550eea02398a8459dbd5d73d6d90b58268ce4453231cf3077f4fdf",
"239263d4cf31258c7910fe7abe8cc23d1b71cf73e796a958e60d3fafe095e49d",
"bb44ebaed47333c967f79c48cb3e0106fe64f55411f94181daa4c55f2a563e43"
]
}
}

4)OKX açık kaynaklı doğrulama aracını zk-STARKValidator indirin.

5)OKX açık kaynaklı doğrulama aracını zk-STARKValidator ve JSON dize dosyasını 3. Adım’daki yeni klasöre kaydedin. Biz burada aracı ve “İndirilenler” klasöründeki "proof-of-reserves" adlı veri dosyasını aşağıda gösterilen şekilde koyuyoruz:

6)zk-STARKValidator’ı açın; klasöre kaydettiğiniz JSON dize dosyasını otomatik olarak çalıştıracaktır.

  1. Sonucu kontrol edin.
  • Doğrulama başarılı olursa “Inclusion constraint validation passed” (Dâhil etme kısıtlaması doğrulandı) sonucu gösterilecektir:

  • Doğrulama başarısız olursa, “Inclusion constraint validation failed” (Dâhil etme kısıtlaması doğrulanamadı) sonucu gösterilecektir:

2.2 zk-STARK Toplam Bakiyesini ve Negatif Olmayan Kısıtlamayı Doğrulayın

Doğrulama Nasıl Yapılır?

Elimizde tuttuğumuzu iddia ettiğimiz varlıkların gerçek olduğunu ve hiçbir kullanıcının negatif net değere sahip olmadığını doğrulamak ve kanıtlamak için “Denetim Dosyaları” sayfamızı ziyaret edin ve Yükümlülük raporu altındaki "zk-STARK" dosyalarını indirip yeni bir klasöre kaydedin.

İndirilen sıkıştırılmış dosyayı açtığınızda, binlerce alt klasörü ve bir ana klasörü (trunk adlı) olan bir “sum proof data” (toplam kanıt verileri) klasörünü bulacaksınız. Her bir klasör, “sum_proof.json” ve “sum_value.json” adlı iki JSON dosyası içerir.

OKX açık kaynaklı doğrulama aracını zk-STARKValidator indirin.

OKX açık kaynaklı doğrulama aracını zk-STARKValidator ve “toplam kanıt verisini” (sum proof data) 1. Adım’daki yeni oluşturulan klasöre kaydedin. Biz burada aracı ve “İndirilenler” klasöründeki “proof-of-reserves” adlı veri dosyasını aşağıda gösterilen şekilde koyuyoruz:

zk-STARKValidator’ı açtığınızda, klasöre kaydettiğiniz “toplam kanıt verisi” otomatik olarak çalıştırılacaktır.

Sonucu kontrol edin.

Doğrulama başarılı olursa, “Total sum and non-negative constraint validation passed” (Genel toplam ve negatif olmama kısıtlaması doğrulandı) sonucu gösterilecektir:

Doğrulama başarısız olursa, “Total sum and non-negative constraint validation failed” (Genel toplam ve negatif olmama kısıtlaması doğrulanamadı) sonucu gösterilecektir: