Bu çeviri makine öğrenimi kullanılarak oluşturulmuştur ve %100 doğru olmayabilir. İngilizce versiyonu görüntüle

Blockfile ve Hosts Veritabanı Spesifikasyonu

Blockfile Naming Service tarafından kullanılan I2P blockfile dosya biçimi ve hostsdb.blockfile içindeki tabloların belirtimi

Genel Bakış

Bu belge, I2P blockfile dosya biçimini ve Blockfile Naming Service NAMING tarafından kullanılan hostsdb.blockfile içindeki tabloları belirtir.

Blockfile, kompakt bir formatta hızlı Destination araması sağlar. Blockfile sayfa ek yükü önemli olsa da, destination’lar hosts.txt formatındaki gibi Base 64 yerine binary olarak saklanır. Ayrıca, blockfile her giriş için keyfi metadata depolama yeteneği (ekleme tarihi, kaynak ve yorumlar gibi) sağlar. Metadata gelecekte gelişmiş adres defteri özelliklerini sağlamak için kullanılabilir. Blockfile depolama gereksinimi hosts.txt formatına göre mütevazı bir artıştır ve blockfile arama sürelerinde yaklaşık 10 kat azalma sağlar.

Bir blockfile, basitçe birden fazla sıralanmış haritanın (anahtar-değer çiftleri) disk üzerinde depolanması olup, skiplist’ler olarak uygulanır. Blockfile formatı Metanotion Blockfile Database METANOTION formatından benimsenmiştir. Önce dosya formatını tanımlayacağız, ardından bu formatın BlockfileNamingService tarafından kullanımını açıklayacağız.

Blockfile Formatı

Orijinal blockfile özelliği her sayfaya sihirli numaralar eklemek için değiştirildi. Dosya 1024 baytlık sayfalar halinde yapılandırılmıştır. Sayfalar 1’den başlayarak numaralandırılır. “Superblock” her zaman sayfa 1’dedir, yani dosyada 0 baytından başlar. Metaindex skiplist her zaman sayfa 2’dedir, yani dosyada 1024 baytından başlar.

Tüm 2-byte tamsayı değerleri işaretsizdir. Tüm 4-byte tamsayı değerleri (sayfa numaraları) işaretlidir ve negatif değerler geçersizdir. Tüm tamsayı değerleri ağ byte sırasında (big endian) saklanır.

Veritabanı tek bir thread tarafından açılıp erişilecek şekilde tasarlanmıştır. BlockfileNamingService senkronizasyonu sağlar.

Superblock formatı

ByteContentsDescription
0-5Magic number0x3141de493250 ("1A" 0xde "I2P")
6Major version0x01
7Minor version0x02
8-15File lengthTotal length in bytes
16-19First free list page
20-21Mounted flag0x01 = yes
22-23Span sizeMax number of key/value pairs per span (16 for hostsdb). Used for new skip lists.
24-27Page sizeAs of version 1.2. Prior to 1.2, 1024 is assumed.
28-1023unused
### Skip list blok sayfa formatı
ByteContentsDescription
0-7Magic number0x536b69704c697374 "SkipList"
8-11First span page
12-15First level page
16-19SizeTotal number of keys - may only be valid at startup
20-23SpansTotal number of spans - may only be valid at startup
24-27LevelsTotal number of levels - may only be valid at startup
28-29Span sizeAs of version 1.2. Max number of key/value pairs per span. Prior to that, specified for all skiplists in the superblock. Used for new spans in this skip list.
30-1023unused
### Atlama seviyesi blok sayfa formatı

Tüm seviyelerin bir aralığı vardır. Tüm aralıkların seviyesi yoktur.

ByteContentsDescription
0-7Magic number0x42534c6576656c73 "BSLevels"
8-9Max height
10-11Current height
12-15Span page
16-Next level pages'current height' entries, 4 bytes each, lowest first
remainingunused
### Span blok sayfa formatını atla

Anahtar/değer yapıları her span içinde ve tüm span’lar boyunca anahtara göre sıralanır. Anahtar/değer yapıları her span içinde anahtara göre sıralanır. İlk span dışındaki span’lar boş olamaz.

ByteContentsDescription
0-3Magic number0x5370616e "Span"
4-7First continuation pageor 0
8-11Previous span pageor 0
12-15Next span pageor 0
16-17Max keys16 for hostsdb
18-19SizeCurrent number of keys
20-1023key/value structures
### Span Continuation blok sayfa formatı
ByteContentsDescription
0-3Magic number0x434f4e54 "CONT"
4-7Next continuation pageor 0
8-1023key/value structures
### Anahtar/değer yapısı formatı

Anahtar ve değer uzunlukları sayfalar arasında bölünmemelidir, yani tüm 4 bayt aynı sayfada olmalıdır. Yeterli yer yoksa, bir sayfanın son 1-3 baytı kullanılmaz ve uzunluklar devam sayfasında offset 8’de yer alır. Anahtar ve değer verileri sayfalar arasında bölünebilir. Maksimum anahtar ve değer uzunlukları 65535 bayttır.

ByteContents
0-1key length in bytes
2-3value length in bytes
4-key data
value data
### Serbest liste blok sayfa formatı
ByteContentsDescription
0-7Magic number0x2366724c69737423 "#frList#"
8-11Next free list blockor 0 if none
12-15Number of valid free pagesin this block (0 - 252)
16-1023Free pages4 bytes each, only the first (valid number) are valid
### Serbest sayfa blok formatı
ByteContentsDescription
0-7Magic number0x7e2146524545217e "~!FREE!~"
8-1023unused
Metaindex (sayfa 2'de bulunur), US-ASCII dizelerini 4-byte tam sayılarla eşleştiren bir haritadır. Anahtar, skiplist'in adıdır ve değer, skiplist'in sayfa dizinidir.

Blockfile İsimlendirme Servisi Tabloları

BlockfileNamingService tarafından oluşturulan ve kullanılan tablolar aşağıdaki gibidir. Span başına maksimum giriş sayısı 16’dır.

Özellikler Atlama Listesi

%%__INFO__%%, yalnızca bir girdi içeren String/Properties anahtar/değer girişleri ile ana veritabanı skiplist’idir:

info - bir Properties (UTF-8 String/String Map), Mapping olarak serileştirilmiş:

  • version - “4”
  • created - Java long time (ms)
  • upgraded - Java long time (ms) (veritabanı sürüm 2 itibariyle)
  • lists - Aramalar için sırayla aranacak host veritabanlarının virgülle ayrılmış listesi. Neredeyse her zaman “privatehosts.txt,userhosts.txt,hosts.txt”.
  • listversion_* - lists içindeki her veritabanının sürümü, örneğin: listversion_hosts.txt=4. Bireysel listelerin kısmi veya yarıda kalan yükseltmelerini tanımlamak için kullanılır. (veritabanı sürüm 4 itibariyle)

Ters Arama Skiplist

%%__REVERSE__%%, Integer/Properties anahtar/değer girişleri içeren ters arama skiplist’idir (veritabanı sürüm 2 itibariyle):

  • Skiplist anahtarları 4-byte Integer’lardır, Destination hash’inin ilk 4 byte’ıdır.
  • Skiplist değerleri, her biri bir Mapping olarak serileştirilen Properties’tir (bir UTF-8 String/String Map)
    • Properties’te birden fazla giriş olabilir, her biri ters eşleme olduğundan, belirli bir destination için birden fazla hostname olabilir veya hash’in aynı ilk 4 byte’ı ile çakışmalar olabilir.
    • Her property anahtarı bir hostname’dir.
    • Her property değeri boş string’dir.

hosts.txt, userhosts.txt ve privatehosts.txt Atlama Listeleri

Her host veritabanı için, o veritabanındaki hostları içeren bir skiplist bulunur. Sürüm 4 formatının hostname başına birden fazla Destination’ı desteklediğini unutmayın. Bu format I2P sürümü 0.9.26’da tanıtıldı. Sürüm 3 veritabanları otomatik olarak sürüm 4’e geçirilir.

Bu skiplists’lerdeki anahtar/değer çiftleri şu şekildedir:

key - bir UTF-8 String (hostname)

değer - - Veritabanı sürüm 4: Bir DestEntry, takip edecek Properties/Destination çiftlerinin sayısını belirten tek baytlık bir sayıdır. O sayı kadar çift: Bir Properties (UTF-8 String/String Map) Mapping olarak serileştirilmiş ve ardından ikili Destination (her zamanki gibi serileştirilmiş). - Veritabanı sürüm 3: bir DestEntry, Mapping olarak serileştirilmiş Properties (UTF-8 String/String Map) ve ardından ikili Destination (her zamanki gibi serileştirilmiş).

DestEntry Properties genellikle şunları içerir:

  • “a” - Eklenme zamanı (Java long time ms cinsinden)
  • “m” - Son değiştirilme zamanı (Java long time ms cinsinden)
  • “notes” - Kullanıcı tarafından sağlanan yorumlar
  • “s” - Girişin orijinal kaynağı (genellikle dosya adı veya abonelik URL’si)
  • “v” - Girişin imzası doğrulandıysa, “true” veya “false”

Hostname anahtarları küçük harflerle saklanır ve her zaman “.i2p” ile biter.

Referanslar

Was this page helpful?