Sözlük / Geliştirici başvuru kaynağı
MSG_CMPCT_BLOCK
- MSG_CMPCT_BLOCK nedir?
- MSG_CMPCT_BLOCK, bir envanter türü olan 4 numaralı tür, yalnızca istek üzerine kullanılan bir koddur: hiçbir zaman bir duyuruda yer almaz ve yalnızca önce bunu kabul etmiş bir eşe gönderilen getdata mesajı içinde geçerlidir.
Tanımlandığı belge: BIP-152.
Kompakt bloklar duyurulmaz, müzakere edilir. Bir eş, bunları kabul edeceğini bildirmek için sendcmpct mesajını bir kez gönderir ve ancak bundan sonra karşı taraf yeni bir bloğa 2 numaralı tür yerine 4 numaralı türle yanıt verebilir. BIP152, Ağustos 2016'da Bitcoin Core 0.13.0 sürümüyle geldi ve tasarruf işin bütün amacıdır: alıcının zaten elinde tuttuğu bir işlemi adlandırmak için, onu iki kez göndermenin gerektirdiği iki yüz veya daha fazla bayt yerine altı bayt.
Nasıl çalışır
MSG_CMPCT_BLOCK, bloğun kendisi yerine bloğun bir açıklamasını ister ve bu açıklama yalnızca iki düğüm benzer mempool'lar tutuyorsa değerlidir.
Önce müzakere gelir. sendcmpct mesajı bir bayrak ve bir sürüm numarası taşır: 1 numaralı sürüm işlemleri txid ile tanımlar, 2 numaralı sürüm witness txid ile tanımlar ve SegWit'ten beri kullanımda olan tek sürüm budur. Bir düğüm, sendcmpct göndermemiş bir eşe getdata içinde 4 numaralı türü asla koymamalıdır, çünkü o eşin bunu anlama yükümlülüğü yoktur.
Yanıt, 80 baytlık başlığı, sekiz baytlık bir nonce'u, her işlem için altı baytlık bir kısa tanımlayıcıyı ve her zaman coinbase işlemi dahil olmak üzere tam olarak verilen birkaç işlemi içeren bir cmpctblock mesajıdır; coinbase'i alıcının daha önce görmüş olması mümkün değildir. Kısa tanımlayıcılar, başlık ve o nonce ile anahtarlanan SipHash ile üretilir, böylece her blok ve her istek için farklıdır. Rastgeleleştirme bir savunmadır: sabit bir şema, bir saldırganın çakışan iki işlemi önceden hesaplamasına ve yeniden oluşturmayı aynı anda tüm ağda tıkamasına imkan verirdi.
Alıcı, tanımlayıcıları mempool'uyla eşleştirir, eksik olanı getblocktxn ile ister ve bloğu yerel olarak yeniden oluşturur. Sonrasındaki doğrulama olağandır ve hiçbir konsensüs kuralına dokunulmaz.
Derinlik sınırlıdır. Bitcoin Core kompakt bloğu yalnızca en son beş blok için sunar ve daha eski herhangi bir blok isteğine tam blokla yanıt verir, çünkü bu kadar geride kalmış bir alıcının işe yarar bir mempool'u yoktur ve sonunda içindeki her işlemi istemek zorunda kalırdı.
Nerede görülür
MSG_CMPCT_BLOCK'un en net görünümü, her yeniden oluşturmanın ne kadar iyi gittiğini bildiren Bitcoin Core düğümünün kendi günlük kaydıdır.
Düğümü -debug=cmpctblock ile başlatın; her yeni blok, kaç işlemin önceden doldurulduğunu, kaçının mempool'da bulunduğunu ve kaçının indirilmesi gerektiğini belirten bir satır üretir. Saatlerdir çalışan bir makinede indirilen işlem sayısı genellikle sıfırdır ve blok bir buçuk megabayt yerine onlarca kilobayt olarak gelir. 3.000 işlem taşıyan bir blok, başlık ve coinbase'e ek olarak 18.000 bayt kısa tanımlayıcı gerektirir.
Bu aritmetik yeni başlatılmış bir düğümde çöker. Boş bir mempool her tanımlayıcının ıskalaması demektir, ardından gelen istek bloğun tamamını ister ve ek gidiş dönüş kompakt yolu doğrudan bloğu istemekten daha yavaş hale getirir. Bu kodun neden zincirin ucundaki düğümlere ait olduğu ve ilk eşitleme sırasında neden hiç görünmediği de budur.
Evinde düğüm çalıştıran biri için bu, sıradan bir bağlantının ağın hızına yetişip yetişmeyeceğine veya her blok bulunduğunda geride kalıp kalmayacağına karar veren özelliktir.