İçeriğe geçin
buybitcoinsmart

Sözlük / Madencilik ve konsensüs

Serileştirilmiş blok

Serileştirilmiş blok nedir?
Serileştirilmiş blok, bir bloğun ağ üzerinde veya diskte aldığı tam bayt dizisidir: 80 baytlık başlık, bir işlem sayısı ve ardından sırayla her işlem.

Tanımlandığı belge: BIP-144.

Serileştirme, soyut bir bloğun hash'i hesaplanabilen, gönderilebilen ve saklanabilen bir şeye dönüşme biçimidir. Genesis bloğu 285 bayta serileşir: 80 bayt başlık, 1 bayt işlem sayısı ve 204 bayt tek coinbase işlemi. Daha önce bir blok gezginine ham hex yapıştırdıysanız veya getblock komutunu verbosity 0 ile çalıştırdıysanız, baktığınız şey tam olarak buydu.

Nasıl çalışır

Serileştirilmiş bir blokta uç uca üç parça bulunur ve yalnızca birincisinin uzunluğu sabittir.

Başlık her zaman 80 bayttır ve şu sıradadır: 4 baytlık sürüm, önceki başlığın 32 baytlık hash'i, 32 baytlık merkle kökü, 4 baytlık zaman damgası, 4 baytlık nBits hedef kodlaması ve 4 baytlık nonce. Ardından işlem sayısı gelir; compactSize ile yazılır, bu değişken uzunluklu bir tam sayıdır ve 253 altındaki sayımlarda 1 bayt, çok büyük değerlerde 9 bayta kadar yer kaplar. Sonra işlemlerin kendisi gelir; her biri tam olarak serileştirilmiştir ve coinbase işlemi başta yer alır.

BIP144 ile birlikte aynı bloğun iki geçerli serileştirmesi vardır. Soyulmuş biçim tanık verilerini tamamen dışarıda bırakır ve 2017 öncesi yazılımların beklediği biçimdir. Tam biçim bunları içerir ve tanık verisi taşıyan her işlemi, girdi sayısının normalde yer alacağı yerde bir 0x00 baytı ve ardından bir 0x01 işaretçisiyle belirtir. İkisi de aynı bloğu kodlar ve ikisi de aynı blok hash'ini üretir, çünkü hash yalnızca o 80 başlık baytını kapsar ve bunların içindeki merkle kökü, soyulmuş kodlamadan hesaplanan işlem kimliklerini taahhüt eder. Bu ayrım, segregated witness ifadesinin gerçek anlamıdır.

En az bir kez herkesin başına gelen bir alışkanlık vardır: çok baytlı tam sayılar küçük sonlu (little endian) yazılır, bu yüzden 0x495FAB29 zaman damgası ağ üzerinde 29 ab 5f 49 olarak görünür ve hash'ler serileştirilmiş bayt sıralarının tersiyle gösterilir. Bir gezginden kopyaladığınız blok hash'i, dosyada duran bayt dizisi değildir.

Nerede görülür

Serileştirilmiş bloklar eşler arası ağda bir block mesajının içinde dolaşır. Her mesajın önünde 24 baytlık bir zarf bulunur: 4 baytlık başlangıç dizesi (mainnet'te f9beb4d9), 12 baytlık komut adı, 4 baytlık yük uzunluğu ve yük üzerinde hesaplanan çift SHA-256 sonucunun ilk dört baytından alınan 4 baytlık sağlama toplamı. Bitcoin Core tek bir mesaj yükünü 4.000.000 baytla sınırlar; bu bir mutabakat sınırı değil, ağ sınırıdır.

Aynı baytlar diskinize de iner. Bitcoin Core blokları blk00000.dat ve sonraki adlarla dosyalara ekler, her dosya 128 MiB ile sınırlıdır ve dosyanın doğrusal taranabilmesi için aynı başlangıç dizesi ve her bloktan önce bir uzunluk öneki bulunur. Genesis bunun istisnasıdır: indirilmek yerine yazılıma bir sabit olarak derlenir, bu da onu eşitleme yapan bir düğümün her şeyi ölçtüğü çıpa yapar.

Günlük kullanımda serileştirme, getblock RPC'sinde verbosity 0 ile, çoğu gezginin ham veya hex sekmesinde ve bir bloğu elle çözmenize olanak tanıyan araçlarda karşınıza çıkar. Bir gezginin kendisine doğruyu söylediğini doğrulayan herkes buraya gelir, çünkü hex kimsenin yeniden biçimlendirmediği tek gösterimdir.

Serileştirilmiş blok vs blok

Blok nesnedir; serileştirilmiş blok ise onun bir kodlamasıdır. Bu ayrım 2017 yılına kadar yalnızca biçimseldi; SegWit her bloğa farklı uzunlukta iki geçerli kodlama verdiğinden beri bir bloğun boyutu, nitelendirilmesi gereken bir soru hâline geldi. Bitcoin Core bunu tek bir RPC yanıtında üç şekilde yanıtlar: tam serileştirme için size, tanık verisi içermeyen biçim için strippedsize ve kuralların gerçekte uyguladığı sayı için weight.

Karıştırılmaması gerekenler

Sık sorulan sorular

Bir bloğun neden iki farklı boyutu var?

Çünkü SegWit her bloğa iki geçerli serileştirme verdi. Soyulmuş biçim tanık verilerini dışarıda bırakır, tam biçim ise içerir; bu yüzden Bitcoin Core aynı blok için size, strippedsize ve weight alanlarını ayrı ayrı bildirir.

Blok hash'i, serileştirilmiş bloğun tamamının hash'i mi?

Hayır. Yalnızca 80 baytlık başlığın çift SHA-256 değeridir. İşlemler, o başlığın içinde taahhüt edilen merkle kökü aracılığıyla dolaylı olarak kapsanır.

İlgili terimler

Daha fazlası: Madencilik ve konsensüs

Bu sayfayı İngilizce okuyun