Sözlük / Geliştirici başvuru kaynağı
CompactSize
Diğer adları: Compact size unsigned integer, VarInt.
- CompactSize nedir?
- CompactSize, Bitcoin'in serileştirilmiş verilerde adet ve uzunlukların önüne eklediği değişken uzunluklu tam sayıdır; 253 altındaki değerler için bir bayt, geri kalanı için en fazla dokuz bayt tutar.
Bitcoin'in ikili biçimlerinde alan adları yoktur, bu yüzden bir ayrıştırıcıya kaç giriş geldiği ve her scriptin ne kadar uzun olduğu söylenmelidir. CompactSize bunu tek bir baytla yanıtlayabilir: 0 ile 252 arası yalnızca o bayttır, daha büyük değerler ise bir işaretçi artı iki, dört veya sekiz bayt daha alır. Gönderdiğiniz her ödemenin içinde bunlardan en az dört tane vardır.
Nasıl çalışır
CompactSize, kendisinden ne kadar kaldığına karar vermek için kendi ilk baytını okur.
0xfd'nin altındaki bir ilk bayt değerin kendisidir, dolayısıyla 0 ile 252 arasındaki adetler bir bayt tutar ve başka bir şey tutmaz. İlk bayt 0xfd ise değer sonraki iki bayttadır, 0xfe ise sonraki dört bayttadır ve 0xff ise sonraki sekiz bayttadır. Bu devam eden sayıların hepsi little endian'dır. Mümkün olan en uzun kodlama dokuz bayttır ve 18 kentilyonun üzerinde bir değeri ifade edebilir; hiçbir gerçek yapı buna yakın bir şeye ihtiyaç duymaz.
Kodlamalar asgari olmalıdır. 5 sayısını 0xfd 0x05 0x00 olarak yazmak, 0x05 yazmakla aritmetik olarak aynıdır ve Bitcoin Core bunu reddeder, serileştirmeyi çözerken kanonik olmayan bir hata verir. Bu kural olmasaydı aynı işlem birkaç farklı şekilde, her biri farklı bir tanımlayıcıyla yazılabilirdi; bu bir düzen meselesi değil, bir değiştirilebilirlik (malleability) sorunudur.
Aritmetik sınırın çok altında pratik bir tavan vardır. Bitcoin Core, 0x02000000 bayttan, yani yaklaşık 33,5 megabayttan daha büyük olduğunu iddia eden serileştirmesi çözülmüş hiçbir nesne için bellek ayırmayı reddeder ve eşler arası protokol ayrıca tek bir mesajı 4.000.000 baytla sınırlar. Bu nedenle düşmanca davranan bir eş, kentilyon girişli bir işlem duyurarak düğümünüzün gigabaytlarca bellek ayırmasını sağlayamaz.
Bir adlandırma tuzağını belirtmek gerekir. Ağ belgeleri buna var_int der, cüzdan kütüphaneleri genellikle VarInt der ve Bitcoin Core yazılımının kendi kaynak kodu VarInt adını yalnızca kendi veritabanında ve geri alma dosyalarında görünen, tamamen farklı ve ilgisiz bir kodlama için kullanır. Kod okurken ikisinden hangisine baktığınızı kontrol edin.
Nerede görülür
CompactSize, Bitcoin içinde kullanıcıya dönük hiçbir adı olmayan yapılar arasında en sık karşılaşılanıdır.
Ham bir işlemde dört baytlık sürümün hemen ardından, ya da SegWit işaretçisi ve bayrağı varsa bunların ardından gelir ve giriş sayısını tutar. Her scriptin önünde uzunluğunu vermek için yeniden görünür ve çıkış sayısının önünde yine görünür. Serileştirilmiş bir blokta işlem sayısını taşır. Eşler arası protokolde inv, getdata, addr ve headers mesajlarının yükünü açar.
headers mesajı kodlamayı en tuhaf haliyle gösterir. Her 80 baytlık blok başlığının ardından sıfır değerinde bir CompactSize işlem sayısı gelir, böylece bir kayıt 80 yerine 81 bayt tutar ve 2.000 başlıktan oluşan tam bir grup ağ üzerinde 162.000 bayta ulaşır. Sayı her zaman sıfırdır çünkü bir headers mesajı hiçbir zaman işlem taşımaz. Alan, aynı ayrıştırma kodunun bir blok gövdesi gelsin gelmesin bir başlığı okuyabilmesi için vardır.
Ham bir işlemin kodunu elle çözerseniz ve alanlar yolun ortasında anlamını yitirirse, bunun nedeni neredeyse her zaman yanlış okunan bir CompactSize'dir. Bir bayt eksik tüketirseniz ondan sonraki her şey kayar.