ZYCORD belgeler
Türkçe
ZycordBelgelerHat protokolü

Hat protokolü

Zycord düğümlerinin birbirine ne söylediği ve bir eş protokolünün bir yükselticiye dönüşmesini engelleyen kurallar. Bağlayıcı belirtimin yerini almaz, ona bir kılavuzdur.

Bu sayfa bir rehberdir, belirtim değil

Belirtim spec/'tir: parametre dosyaları ve vektör derlemi. Bu sayfa ile ağaç çeliştiğinde haklı olan ağaçtır — bir gerçekleştirim, genesis id'sini yeniden üretip vektörleri geçtiğinde uyumludur ve buradaki hiçbir şey bunu değiştirmez. Aşağıdakiler, gerekliliklerin nerede durduğunun haritasıdır.

Taşıma#

Önce TCP, sonra TLS 1.3. Eş kimliği, her iki tarafça sunulan, kendinden imzalı bir X.509 sertifikasında taşınan bir Ed25519 anahtarıdır. Sertifika zincirleri doğrulanmaz — bir sertifika otoritesi ve onun tasdik edeceği bir şey yoktur — dolayısıyla doğrulama tam olarak bir sertifika ister, açık anahtarının Ed25519 olmasını ister ve o anahtarı eşin kimliği olarak çıkarır.

Elde edilen özellik yetkilendirme değil, bir anahtara kanal bağlamasıdır: TLS, el sıkışmayı tamamlayanın sunulan kimliğe ait özel anahtarı elinde tuttuğunu ve akışın aktarım sırasında okunamayacağını ya da değiştirilemeyeceğini güvence altına alır. O eşin dürüst olup olmadığı hakkında hiçbir şey söylemez. Protokolde hiçbir şey, kimliğe dayanarak yetki vermez.

Sertifika geçerlilik tarihleri, şimdiki zamanın çevresindeki bir pencere yerine bilerek sabit değerlerdir: göreli bir pencere, sertifikanın kabul edilmesini saat uyumuna bağımlı kılar ve saat sapması boyunca bölünen bir ağ, uzlaşıyla ilgisi olmayan bir nedenle bölünen bir ağdır.

Gerçekleştirimler, eş kimliği olarak başka herhangi bir katmandan bir anahtarı yeniden kullanmamalıdır. Düğüm her başlangıçta taze bir tane üretir ve onu asla diske yazmaz.

Çerçeveleme#

offset  size  field
0       4     length   uint32, little-endian - payload length, excluding this header
4       1     kind     uint8  - see below
5       n     payload
  • length, herhangi bir ayırmadan önce MaxMessageBytes = 8 MiB değerine ve kendi türünün tavanına karşı denetlenmek zorundadır. İddia edilen bir uzunluğa göre bellek ayıran bir alıcı, ardından ne gelirse gelsin uzaktan bellek tüketimi hatası taşır.
  • kind 0 reddedilir. Bir derlemenin bildiği en yüksek türün üzerindeki bir tür, daha yeni bir derlemenin eklediği bir türdür: yükü, bağlantı kapatılmak yerine, eş başına sınırlı bir hızla, MaxUnknownPayloadBytes = 64 KiB sınırı altında okunur ve atılır. O hız aşıldığında aşırı istek olarak puanlanır.

İleti türleri#

DeğerAdYönYük
1helloher ikisi, ilkEl sıkışma
2certificatededikodussz(Certificate)
3block-announcededikoduBaşlık artı sıralı sertifika örneği (exemplar) özetleri
4get-blockistek32 baytlık blok kimliği ‖ u32 parça dizini
5blockyanıtssz(Block)'un bir parçası
6get-headersistekKonumlayıcı
7headersyanıtBaşlık dizisi
8get-peersistekboş
9peersyanıtAdres listesi
10service-carddedikodu, yeteneğe göreİmzalı bir hizmet duyurusu
11block-unavailableyanıtBlok kimliği ‖ neden: göndericinin gövde tabanının altında ya da hiç tutulmamış
12open-intentdedikodu, yeteneğe göreZorunlu yol için bir açık intent

Bir uzlaşı nesnesinin ağa özgü bir kodlaması yoktur; "aldığım şeyin kimliği"ni denetlenebilir bir ifade hâline getiren de budur.

Protokol sürümü 3'tür ve el sıkışma tam eşleşme ister. hello bunu; ağ kimliğini — her uzlaşı parametresine taahhüt eden genesis kimliğini —, göndericinin yüksekliğini ve işini, dinleme adresini, bir yetenek sözcüğünü ve gövdesini sunduğu en düşük yükseklik olan gövde tabanını birlikte taşır. Bir yetenekle kapılanmış bir tür, onu ilan etmemiş bir eşe asla gönderilmez ve bir derlemenin tanımlamadığı bir yetenek biti yok sayılır, asla reddedilmez. Alıcının sunmayacağı bir get-block, isteyenin süre sınırına bırakılmak yerine block-unavailable ile yanıtlanır.

Bir open-intent, zorunlu yolun tek trafiğidir: hiçbir sıralayıcı belirtilmemiş, herhangi bir üreticinin kendi bloğunun sonunda yürütebileceği bir kullanıcı intent'i. Ortaya çıkan zorunlu sertifika asla bir sertifika olarak dedikodu yoluyla yayılmaz; blokta doğar ve her düğüm onu orada denetler.

Gelen her ileti göndericisine bir bedele mal olur#

Belirtimin baştan sona okunmaya en değer bölümü budur, çünkü bir eş protokolünün genellikle sızdırdığı yer burasıdır. Onu iki kural yönetir.

Maliyet sıralaması kuralı#

İş, artan maliyet sırasıyla yapılır ve bir ileti, kendisinden sonra gelen pahalı adımdan önce ücretlendirilir. Önce doğrulayıp sonra puanlayan bir alıcı bir yükseltici kurmuştur: gönderilmesi ucuz olan şey, denetlenmesi pahalı olan şeydir.

Her sonuç ücretlendirilir#

Adı konmamış bir Free yoktur. Her ileti türü, üretebileceği her sonuçla çaprazlanarak, kendisine iliştirilmiş bir puanla bir tabloda yer alır. Ücretlendirilmeden tablonun içinden düşüp giden bir sonuç, bu kuralın önlemek için var olduğu kusurdur — ve uygulamada, ücretlendirilmemiş bir satırdan daha dar yollardan buna ulaşıldı: hatalı biçimli bir çerçeveyi tek puanlayıcısından uzaklaştıran bir gerçekleştirim, hiçbir tabloya satır eklemeden, bir istek beklemede olduğu sürece o çerçeveyi bedava hâle getirdi.

Hizmet vermek de ölçülür. Blok baytları, kendisini isteyen istekten kat kat büyük olan tek yanıttır; dolayısıyla istek sayısının üstüne kendi bayt bütçelerini de taşırlar.

Puanlar bir eşin kimliğine iliştirilir: geçersiz bir ileti 20, bir protokol ihlali 50, sunulmayan bir gövde 10 ve aşırı bir istek 5 puana mal olur; yararlı bir ileti 1 puan kazandırır ve bir eş −100'de yasaklanır. Pahalı denetimler — anahtar epoch'ları ve proof of work değerlendirmeleri — eş başına bütçelenir ve blok yararlı çıktığında iade edilir; böylece hiçbir yere varmayan bir duyuru, bir düğüme boşuna iş öğütemez.

Aktarma ve eşitleme#

Aktarma önce özetle yapılır. Sertifikalar kendi başlarına dedikodu yoluyla yayılır ve varışta, durumsuz ve paralel olarak geçerlilik açısından denetlenir; bir aktarıcının spam'i süzmek için duruma ihtiyacı yoktur. Bloklar, alıcının mempool'una karşı, bir başlık artı sıralı örnek (exemplar) özetleri olarak yol alır ve alıcı herhangi bir gövdeyi getirmeden önce başlığın işini doğrular. Bir gövde, her biri kendi isteği ve yanıtı olan 4 MiB'lık parçalar hâlinde yol alır; böylece çerçeve sınırı bir iletiyi sınırlar, asla bir bloğu değil. Gövdeler zincir verisidir: bir blok ancak gövdeleri alınabiliyorsa geçerlidir ve budama yapan bir düğüm tabanının nerede olduğunu el sıkışmada söyler.

Senkronizasyon doğrulanmış işe göre seçer. Başlıklar, gövdeler getirilmeden önce bir zincir olarak doğrulanır ve bir düğüm, en büyük yüksekliği iddia eden eşe değil, başlıkları en çok işi kanıtlamış olan eşe öncelik verir. Rakip bir dal yalnızca 1.024 blokluk geri alma ufku içinde bağlanıyor ve daha çok iş taşıyorsa benimsenir. Sürümde sabitlenmiş, yalnızca en az bir epoch yaşındaki bloklar için kabul edilen kontrol noktaları, çelişen bir zinciri ne kadar ağır olursa olsun reddeder; bir işletmeci bir bayrakla sabitleme ekleyebilir. Era 2'de proof of stake'e geçişten itibaren seçim bunun yerine uzunluğa göre yapılır: en çok slot'u dolduran zincir kazanır (teknik doküman §11); geri alma ufku ve sabitlemeler ise o zamandan beri bağı çözülmüş anahtarlarla yeniden yazmaya karşı savunma olarak kalır.

Bağlantı yönetimi ve tutulma savunması#

Bu bölüm, başka herhangi bir bölümden daha fazla ölçülmüş başarısızlık taşır ve aşağıdaki her gereklilik, onsuz bir gerçekleştirimin bir ölçümde tutulmaya uğradığı için vardır.

  • Giden hedefler adres çeşitliliğiyle seçilmelidir; böylece tek bir barındırma aralığı bir düğümün giden yuvalarını dolduramaz.
  • Giden hedefler ayrıca dedikodu kaynağı başına sınırlanmalıdır. Adres çeşitliliği tek başına yeterli değildir; bunun nedeni yargı değil, aritmetiktir: bir adres grubu, bir saldırganın sahip olduğu bir adresin özelliğidir, ama bir eşin iddia ettiği bir adres, onun uydurduğu baytlardır ve herhangi dört bayt geçerli bir IPv4 konağıdır. Hiç adresi olmayan bir saldırgan, tek bir çerçeve karşılığında dizi başına taze bir çeşitlilik grubu basar. Uyduramayacağı şey, iddianın üzerinden geldiği bağlantıdır.
  • Gelen bir bağlantının üzerinden geldiği soket, giden bir hedef hâline gelmemelidir. Bu, eşin kaynak adresidir — işletim sisteminin seçtiği geçici bir port, onun dinlediği bir şey değil — dolayısıyla onu aramak için harcanan bir yuva, yanıt veremeyecek bir adrese harcanmış bir yuvadır.
  • Her iki sınır da bir düğümün tuttuğu bağlantılara karşı sayılmalıdır, tek bir seçim çağrısına karşı değil. Aksi hâlde, zaten bağlı eşleri dışarıda bırakan bir arama döngüsü her turda iki bütçeyi de baştan doldurur ve sınır, bir saldırganı sınırlamak yerine ödenek başına bir tur geciktirir. Ölçüldü: bir anlatıcı, dört tur boyunca 8 giden yuvanın önce 2'sini, sonra 4'ünü, 6'sını ve 8'ini aldı.
  • Eş deposu kalıcı kılınmalı ve sınırlı olmalıdır. Her yeniden başlatmadan sonra boş başlayan bir düğüm, saldırgana her yeniden başlatmada taze bir fırsat verir; saldırganın listesiyle başlayan bir düğüm ise ona aynı fırsatı kalıcı olarak verir.
  • Sınırlı bir depo, dolu olduğu için iyi biçimli bir adresi geri çevirmemeli; onun için yer açmalıdır. Hiç bağlantı kurulmamış dürüst bir adres, hiç bağlantı kurulmamış uydurma bir adresten hiçbir zaman daha iyi değildir; dolayısıyla depoyu önce dolduran bir saldırgan, sonradan sunulan her şeye kapısını kilitler — işletmecinin kendi önyükleme listesi dahil.
  • Tahliyenin neyi seçtiği, tahliyenin gerçekleşmesinden daha çok önemlidir. "Kurbanı en büyük topluluktan al" kuralı bir sel kendini yerinden eder gibi okunur ve ancak sel depodaki en büyük şey olduğu sürece öyledir. Yardımsever tek bir eşten önyüklenen bir düğümde en büyük topluluk, o eşin adres defteridir. Böyle sıralanmış bir gerçekleştirimde ölçüldü: tek bir kaynaktan gelen 200 uydurma adres, saldırgana hiçbir maliyeti olmadan 200 dürüst adresi tahliye etti.
  • Birbirinden ayırt edilemeyen girdiler arasında son eşitlik bozucu, dedikoduyu yapan eşin seçtiği hiçbir şey olmamalıdır — adres de dahil — ve bu, tahliye için geçerli olduğu ölçüde seçim için de geçerlidir. Seçicisi adres dizisine kadar düşen bir gerçekleştirimde ölçüldü: 8 uydurmaya karşı 8 dürüst adres, 8'de 8 uydurma döndürdü ve on tur boyunca sıfır dürüst giden bağlantı verdi.

Bilerek yok olanlar#

Yok olanNeden
NAT geçişiMaliyet açıkça belirtiliyor ve yeniden açılma koşulu varsayılmak yerine ölçülüyor: açık testnet'teki aranabilir düğümlerin payı, kararın yeniden açılması için ilk koşuldur.
SıkıştırmaSaldırganın denetimindeki bir akış üzerindeki bir sıkıştırıcı, kimsenin ihtiyacını ölçmediği bir bant genişliği tasarrufu uğruna bir saldırı yüzeyidir.
İleti düzeyinde imzalarTaşıma kanalın kimliğini doğrular; uzlaşı nesneleri kendi imzalarını taşır. Üçüncü bir katman aktarıcının kimliğini doğrulardı ki hiçbir karar buna bağlı değildir.
İstek kimlikleriİstek ve yanıt bağlantı ve sıraya göre eşleştirilir, dolayısıyla eşitleme kendi bağlantısı üzerinde çalışır — bu da bir durum makinesini ortadan kaldırır. Bir eşin aranamadığı yerde eşitleme mevcut bir dedikodu bağlantısı üzerinden çalışabilir ve o zaman yanıtları içeriğe göre eşleştirmek zorundadır.
Sürüm müzakeresiEl sıkışma tam bir protokol sürümü ister ve uyuşmazlıkta bağlantıyı keser. Sürüm artırılmadan evrilebilen şey dar ve sınırlıdır: bir yetenek bitinin arkasındaki yeni bir ileti türü; daha eski bir derleme onu sınırlı bir hızla, 64 KiB altında okur ve atar.

Bir sertifika kimliğinin kapsamadıkları#

Bir aktarma kuralını belirlediği için burada yinelenmeye değer. Bir sertifikanın kimliği, yetkilendirdiği şeye taahhüt eder, yalnızca gösterdiği şeye asla; dolayısıyla imzalar kimliğin ön görüntüsünün dışında durur. Bu da kanıtı, aktarım sırasındaki herhangi birinin değiştirebileceği bir şey hâline getirir: bir sertifika alın, imzasının yerine çöp koyun ve yayın — aynı kimlik, artık geçersiz bir örnek (exemplar).

İki kural bunu kapatır. Bir blok, taşıdığı kanıta taahhüt eder; bunu kimlikler üzerinden değil, örnek (exemplar) özetleri üzerinden bir kökle yapar. Ve aktarma kimliklere değil, örneklere işlem yapar: kanıtı doğrulanamayan bir örnek alan bir düğüm, kimliğe halel getirmeden o örneği atar — kimlik işaretlenmez, geçersiz olarak önbelleğe alınmaz ve doğrulanan sonraki bir örnek olağan biçimde aktarılır. Sakatlanmış bir kopya, sakatlayana onu göndermenin bant genişliğine mal olur ve sertifikaya hiçbir şeye mal olmaz.

Bunu sıfırdan gerçekleştirmek#

Altın vektörleri geçen bağımsız bir gerçekleştirim bir çatallanma değil, bir eştir — belirtimin böyle yapılmasının bütün amacı da budur. Uzlaşı nesneleri için spec/README.md ile başlayın, sonra işinizi zcd vectors ile denetleyin.