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.
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 önceMaxMessageBytes= 8 MiB değerine 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,[1, 9]aralığında olmak zorundadır. Sıfır ve bilinen en yüksek türün üzerindeki her şey, bilinmeyen bir uzantı değil, bir protokol ihlalidir: protokol 1'de ileriye dönük uyumluluk için bir kaçış kapağı yoktur, çünkü el sıkışmada denetlenen bir sürüm alanı bunu gereksiz kılar.
İleti türleri#
| Değer | Ad | Yön | Yük |
|---|---|---|---|
| 1 | hello | her ikisi, ilk | El sıkışma |
| 2 | certificate | dedikodu | ssz(Certificate) |
| 3 | block-announce | dedikodu | Başlık artı sertifika kimlikleri |
| 4 | get-block | istek | 32 baytlık blok kimliği ‖ u32 parça dizini |
| 5 | block | yanıt | ssz(Block)'un bir parçası |
| 6 | get-headers | istek | Konumlayıcı |
| 7 | headers | yanıt | Başlık dizisi |
| 8 | get-peers | istek | boş |
| 9 | peers | yanıt | Adres listesi |
Bir uzlaşı nesnesinin ağa özgü bir kodlaması yoktur; "aldığım şeyin kimliği"ni denetlenebilir bir ifade hâline getiren de budur.
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.
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 olan | Neden |
|---|---|
| NAT geçişi | Maliyet 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ırma | Saldı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 imzalar | Taşı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. |
| İleriye dönük uyumlu bir uzantı düzeneği | Protokol 1, sürümünü el sıkışmada denetler ve uyuşmazlıkta bağlantıyı keser. Uzantılar protokol 2 olarak gelir. |
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.