Sözlük / Madencilik ve konsensüs
nBits
Diğer adları: Compact target.
- nBits nedir?
- nBits, her blok başlığındaki, madencilik hedefini bir üs ve üç baytlık bir katsayıdan oluşan kompakt, kayan nokta tarzı bir kodlamaya sıkıştıran dört baytlık alandır.
Bitcoin, başlığında 32 bayt ayıramayacağı 256 bitlik bir hedefe ihtiyaç duyar, bu yüzden bunun yuvarlatılmış bir sürümünü dört baytta saklar. İlk bayt bir üstür, kalan üç bayt bir katsayıdır ve hedef, katsayının 256 sayısının üs eksi üç kuvvetiyle çarpımıdır. Her düğüm beklediği değeri yeniden hesaplar, bu yüzden kuralların izin verdiğinden daha kolay bir hedef bildiren bir başlık doğrudan reddedilir.
Nasıl çalışır
nBits, bir üs baytı ve ardından gelen üç baytlık bir katsayı olarak okunur ve ikisi tam bir 256 bitlik sayıda birleştirilir.
Genesis bloğunun taşıdığı değeri, yani 0x1d00ffff değerini ele alın. Üs 0x1d'dir, bu da 29 eder; katsayı ise 0x00ffff'tir, bu da 65.535 eder. Dolayısıyla hedef, 65.535 sayısının 2 sayısının 208 kuvvetiyle çarpımıdır; bu sayı sekiz onaltılık sıfır, ardından ffff ve ardından 64 haneye tamamlayacak sıfırlarla yazılır. Bu, ana ağın izin verdiği en kolay hedeftir ve 1 zorluk değerinin tanımıdır.
İnsanları iki tuhaflık yanıltır. İlki hassasiyettir. Yalnızca 24 bitlik bir katsayı keyfi bir 256 bitlik sayıyı ifade edemez, bu yüzden kodlanan hedef her zaman yuvarlatılmış bir hedeftir ve hedeften nBits'e ve geri hedefe giden bir gidiş dönüş her zaman başladığınız değeri döndürmez. İkincisi işaret bitidir. Katsayının en üst biti ayarlanmışsa değer negatif olarak ele alınır, bu yüzden kodlayıcılar katsayıyı bir bayt aşağı kaydırır ve telafi etmek için üssü artırır. Genesis değerinin daha belirgin olan 0x1cffff00 yerine 0x1d00ffff olarak okunmasının ve katsayı içindeki baştaki sıfır baytın hata değil normal olmasının nedeni budur.
Serileştirilmiş başlıkta alan 72 bayt ofsetinde yer alır ve küçük sonlu (little endian) olarak yazılır, bu yüzden bu dört bayt diskte ve ağda ff ff 00 1d olarak görünür.
Nerede görülür
nBits birkaç farklı ad altında dolaşır ve etrafındaki karışıklığın büyük kısmı bundan kaynaklanır.
Blok gezginleri bunu "bits" olarak etiketler ve onaltılık değeri daha anlaşılır bir zorluk rakamının yanında yazdırır. Bitcoin Core RPC çağrısı getblock bunu "bits" olarak döndürür ve getblocktemplate bunu, aday bir başlığın geçmesi gereken gereksinim olarak madencilik yazılımına verir. Kaynak kodunda bu, CBlockHeader'ın nBits üyesidir ve arith_uint256::SetCompact ile GetCompact tarafından dönüştürülür. Madencilik havuzları bunu nadiren ortaya çıkarır: Stratum aynı dört baytı bir iş bildirimi içinde makinelere gönderir ve aygıt yazılımı bunların ne anlama geldiğini hiç düşünmek zorunda kalmaz.
Ayrıca alan sürekli değil, bir takvime göre değişir. 2.016 bloktan oluşan bir pencerenin tamamı boyunca sabit kalır ve yalnızca bir yeniden hedeflemede yeni bir değer alır, bu yüzden aralarında bir yeniden hedefleme olmadıkça bir saat arayla çıkarılan iki blok aynı nBits alanını taşır.
nBits vs hedef eşiği
nBits kodlamadır; hedef eşiği ise onun kodladığı sayıdır. Bir düğüm bir başlık hash'ini hiçbir zaman doğrudan nBits ile karşılaştırmaz. Önce dört baytı tam bir 256 bitlik hedefe açar, sonra hash'in o değere eşit veya ondan küçük olduğunu kontrol eder. nBits'i hedefin kendisi olarak görmek sohbette sorun değildir ama kodda yanlıştır, çünkü tek bir birim farkla ayrılan iki nBits değeri, aralarında devasa bir mutlak fark bulunan hedeflere çözülür.