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ı
| Byte | Contents | Description |
|---|---|---|
| 0-5 | Magic number | 0x3141de493250 ("1A" 0xde "I2P") |
| 6 | Major version | 0x01 |
| 7 | Minor version | 0x02 |
| 8-15 | File length | Total length in bytes |
| 16-19 | First free list page | |
| 20-21 | Mounted flag | 0x01 = yes |
| 22-23 | Span size | Max number of key/value pairs per span (16 for hostsdb). Used for new skip lists. |
| 24-27 | Page size | As of version 1.2. Prior to 1.2, 1024 is assumed. |
| 28-1023 | unused |
| Byte | Contents | Description |
|---|---|---|
| 0-7 | Magic number | 0x536b69704c697374 "SkipList" |
| 8-11 | First span page | |
| 12-15 | First level page | |
| 16-19 | Size | Total number of keys - may only be valid at startup |
| 20-23 | Spans | Total number of spans - may only be valid at startup |
| 24-27 | Levels | Total number of levels - may only be valid at startup |
| 28-29 | Span size | As 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-1023 | unused |
Tüm seviyelerin bir aralığı vardır. Tüm aralıkların seviyesi yoktur.
| Byte | Contents | Description |
|---|---|---|
| 0-7 | Magic number | 0x42534c6576656c73 "BSLevels" |
| 8-9 | Max height | |
| 10-11 | Current height | |
| 12-15 | Span page | |
| 16- | Next level pages | 'current height' entries, 4 bytes each, lowest first |
| remaining | unused |
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.
| Byte | Contents | Description |
|---|---|---|
| 0-3 | Magic number | 0x5370616e "Span" |
| 4-7 | First continuation page | or 0 |
| 8-11 | Previous span page | or 0 |
| 12-15 | Next span page | or 0 |
| 16-17 | Max keys | 16 for hostsdb |
| 18-19 | Size | Current number of keys |
| 20-1023 | key/value structures |
| Byte | Contents | Description |
|---|---|---|
| 0-3 | Magic number | 0x434f4e54 "CONT" |
| 4-7 | Next continuation page | or 0 |
| 8-1023 | key/value structures |
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.
| Byte | Contents |
|---|---|
| 0-1 | key length in bytes |
| 2-3 | value length in bytes |
| 4- | key data |
| value data |
| Byte | Contents | Description |
|---|---|---|
| 0-7 | Magic number | 0x2366724c69737423 "#frList#" |
| 8-11 | Next free list block | or 0 if none |
| 12-15 | Number of valid free pages | in this block (0 - 252) |
| 16-1023 | Free pages | 4 bytes each, only the first (valid number) are valid |
| Byte | Contents | Description |
|---|---|---|
| 0-7 | Magic number | 0x7e2146524545217e "~!FREE!~" |
| 8-1023 | unused |
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.