Sözlük / Düğümler ve yazılım
Envanter
Diğer adları: Inv mesajı.
- Envanter nedir?
- Envanter, bir düğümün eşlerine duyurduğu nesne tanımlayıcılarının listesidir; bu liste hangi işlemleri ve blokları elinde tuttuğunu söyler, ancak henüz hiçbirini göndermez.
Önce duyuru, istendiğinde teslim. Ağın kopya yığınına boğulmamasının nedeni bu düzendir: her kayıt 36 bayt tutar, dört baytlık bir tür etiketi artı 32 baytlık bir hash, ve tek bir inv mesajı bunlardan en fazla 50.000 tanesini taşıyabilir. Nesneyi zaten elinde tutan bir eş hiç istemez, ve bant genişliği hiç harcanmaz.
Nasıl çalışır
Bir envanter kaydı bir çifttir: bunun ne tür bir şey olduğunu söyleyen bir sayı ve onu tanımlayan hash.
Tür kodları küçük tam sayılardır. 1 bir işlemdir, 2 bir bloktur, 3 eski bloom filtresi düzenindeki filtrelenmiş bir bloktur, 4 kompakt bir bloktur, 5 ise tanık hash'iyle tanımlanan bir işlemdir. Bir türün üzerine 0x40000000 bitini kurmak tanık taşıyan varyantı işaretler, böylece segwit destekli bir eş, eski bir eşin düz blok isteyeceği yerde MSG_WITNESS_BLOCK ister.
Takas üç adımda yürür. Bir düğüm yeni olanları listeleyen inv gönderir. Eş listeyi tarar, tanıdığı her şeyi yok sayar ve yalnızca eksik olanları adlandıran getdata ile yanıt verir. Düğüm bu nesneleri, her biri bir mesaj olacak şekilde gönderir veya o sırada bir şey atılmışsa notfound gönderir. 50.000 sınırının arkasındaki aritmetiği fark etmekte yarar var: 36 baytlık 50.000 kayıt 1.800.000 bayt eder, tek bir mesajdaki 4.000.000 baytlık tavanın rahatça içindedir, ve Bitcoin Core bu iki sabiti birbiriyle tutarlı tutan derleme zamanı denetimi taşır.
Zamanlama, bir uygulama ayrıntısı değil bir gizlilik denetimidir. Bitcoin Core bir işlemi öğrendiği anda duyurmaz. Duyurular toplanır ve giden eşlere ortalama iki saniye, gelen eşlere beş saniye olan rastgele bir zamanlayıcıyla salınır, böylece çok sayıda düğüme bağlı bir gözlemci bir ödemenin nereden başladığını varış sırasından çıkaramaz. Bloklar gecikmeyi tamamen atlar, çünkü saklayacak bir şey yoktur ve saniyelerin bir maliyeti vardır.
Her hash'i her eşe bağırmak pahalıdır, ve Erlay önerilen çaredir: eşler tanımlayıcıları her yöne akıtmak yerine, birbirlerinde ne olduğuna dair kısa taslakları düzenli olarak uzlaştırır.
Nerede görürsünüz
Envanterler bir düğümün ağ arayüzündeki en gürültülü şeydir ve gözlemlenmesi en kolay olanıdır.
getpeerinfo çağrısı trafiği mesaj türüne göre böler, ve inv neredeyse her zaman en büyük sayaçlar arasındadır. İyi bağlanmış bir düğüm, bant genişliğinin gerçek bir payını kimsenin ihtiyaç duymadığı ortaya çıkan hash'leri duyurmaya harcar. Bir ödemenin bir blok gezgininde diğerinden saniyeler önce görünmesinin nedeni de budur: bunlar, ağın farklı yerlerinden farklı duyurular duyan ayrı gözlemcilerdir.
Bırakılması gereken bir alışkanlık: bir inv bir taahhüt değildir. Bir düğüm bir işlemi duyurup mempool'u dolduğunda onu dakikalar sonra çıkarabilir, ve kimseye bir düzeltme borçlu değildir.
Envanter vs mempool
Bir envanter bir mesajdır; bir mempool bir depodur, ve ikisinden yalnızca biri o anı atlatır. inv, bir eşe bir hash'in bir yerde var olduğunu söyler. Mempool, bir düğümün gerçekten doğruladığı, bellekte tuttuğu ve iletmeye ya da madencilikte kullanmaya razı olduğu onaysız işlemler kümesidir; varsayılan olarak 300 MB boyutundadır ve en ucuzu önce atan bir çıkarma politikası vardır. İşlem kimliğinizin inv duyurularıyla yayıldığını görmek, ağın ödemenizi duyduğunu söyler. Bir saat sonra hâlâ onu elinde tutan biri olduğunu söylemez.