Avalanche Ağında Yaşanan Hatanın Detaylı Analizi Yayınlandı

Önemli Gelişmeler

Son güncelleme: 2 hafta önce

Avalanche ağı bu haftanın başlarında ciddi bir sorunla karşılaştı. Bu makale hataya neyin sebep olduğunu, geliştiricilerden ve topluluk üyelerinden oluşan bir ekibin bunu nasıl ele aldığını ve bundan çıkarılacak dersleri açıklamaktadır.

Özet

Sistemdeki ağır yük, durum doğrulamayla ilgili deterministik olmayan bir hatayı tetikledi. Bu, bazı doğrulayıcıların bazı geçersiz mint işlemlerini kabul etmesine neden olurken, ağın geri kalanı bu işlemleri reddetti ve neticede C-zincirini durdurdu.

Bu geçersiz bir mint işlemiydi, çifte harcama değildi. X-zincirindeki bağımsız işlemler işlemeye devam etti. Ağ durmadı.

Sorun belirlendikten sonra, gelecekte gerekli kontrolleri fon kaybı olmaksızın uygulamak için kod hızla düzeltildi. Düzeltilen kod topluluğa dağıtıldı ve ağa uygulandı. Avalanche ağı öncekinden daha güçlü durumda.

Ancak hikayenin tamamı bundan çok daha renkli

Herşey Avalanche’ın akıllı sözleşme zincirinde (C-chain) önemli bir hareketlilik oluşturan Pangolin lansmanı ile başladı. Avalanche’ın 3 varsayılan zinciri olduğunu hatırlayalım: sözleşmeler için C-zinciri, varlık transferleri için X-zinciri ve stake etme ve alt ağ yönetimi için P-zinciri. Her biri, kendi amaçlarına hizmet etmek için tasarlanmış ve aynı doğrulayıcılar grubu tarafından doğrulanan farklı bir sanal makine (EVM) çalıştırır.

AVAX ve diğer dijital varlıklar bu zincirler arasında aktarılabilir. Bu zincirler birbirinden ayrı ve izole olduklarından, birbirlerinin işlemlerini bilmiyor veya ayrıştırmıyorlar. Birisi sahip olduğu AVAX’ı bir zincirden diğerine taşırsa, sistem kaynak zincirdeki AVAX’ı yok eder ve hedef zincirde onu mint eder. Bu tasarım, yüksek performanslı, DAG tabanlı X zincirinin, herhangi bir zaman veya veri yapısı senkronizasyonu gerektirmeden daha yavaş, tümüyle sıralı, doğrusal C ve P zincirlerine bağlanmasını sağlar.

Avalanche dahil tüm blok zincirleri, her işlem ve blok üzerinde geçerlilik kontrolleri gerçekleştirir. AvalancheGo v1.1.5’te C-zincirinde mint işlemlerine ilişkin geçerlilik kontrolleri buradaki kod parçacığında gerçekleştiriliyordu.

Bu kodun amacı, tüm import işlemlerinin geçerli olmasını sağlamaktır. Örneğin, C-zinciri genesis bloğunun temel durum olarak alındığını ve diğer tüm mint işlemlerinin bir blok önbelleği aracılığıyla doğrulandığını görebilirsiniz. Yaşananları örnekleyecek olursak, ağın B0 ← B1 ← B2 ← B3 ← B4 blokları yayınladığını varsayalım, burada ← ebeveyn ilişkisini gösterir.

B1 ve B4, çakışan bir mint işlemi içeriyorsa, B1 geçerli olarak işaretlenmeli ve B4 geçersiz olduğu için reddedilmelidir. B4 için geçerlilik kontrolü, ata düğümlerinden B1’den B3’e kadar hiçbirinin çakışan bir mint işlemi yapmamasını sağlamalıdır. Şimdi, yüksek yük altında, birden fazla bloğun aynı anda işlenebileceğini ve yalnızca bir prefix kabul edildiğini aklınızda tutun.

B0 bloğunun kabul edildiğini ve B1, B2, B3 ve B4 bloklarının şu anda eşzamanlı olarak teklif aşamasında olduğunu varsayalım, dolayısıyla henüz kabul edilmemişlerdir (kararsız veya sonlandırılmamış olarak da bilinir, yani blok zincirine henüz kaydedilmemişlerdir). Mint işlemlerini kontrol etmek için kullanılan bu kod parçacığının, çok özel, zamanlamaya bağlı bir koşul altında ortaya çıkan ince bir hata içerdiği ortaya çıktı.

if atx != nil {
    inputs.Union(atx.UnsignedTx.(UnsignedAtomicTx).InputUTXOs())
    inputsCopy.Union(*inputs)
}

Spesifik olarak, bu kod parçası inputsCopy adlı bir değişkeni doldurur, ancak mevcut blok bir mint veya yok etme işlemi içermiyorsa, inputsCopy ile hiçbir zaman bir giriş birleşimi gerçekleştirmez. Bu boş girdi kümesi daha sonra önbelleğe alınır ve bu, önbelleğe alınmış bir kümenin ata düğümünün mint ve yok etme işlemlerinin tüm girdi kimliklerini içeren değişmezliğini bozar. Bu, eşzamanlı olarak henüz kabul edilmemiş bir ana işlem nedeniyle bir anda yapılan geçersiz bir önbellek güncellemesinin, gelecekteki bir işlemin hatalı olarak geçerli olarak işaretlenmesini sağlayacağı anlamına geliyordu.

Hata, normal işlemleri, para transferlerini, varlık transferlerini, koin imhasını veya akıllı sözleşme çağrılarını etkilemedi. Avalanche hiçbir kullanıcının aynı parayı iki alıcıya başarıyla göndermesine asla izin vermedi. Bu kesinlikle çift harcama olmadığı anlamına gelir.

Bunun yerine, hata, bir üst blok ile bir çakışmayı kaydetmeyi başaramayarak C-zincirinde geçersiz bir mint işlemine izin verdi ve bunu ancak ve ancak bu üst bloğun yeterince büyük sayıda düğüm üzerinde aynı anda kararsız kalması durumunda yaptı.

Hatanın yalnızca üç üst blok kararsız kaldığında tetiklenebilmesi, hatanın deterministik olmadığı anlamına geliyordu. Yani, yalnızca belirli aralıklı ağ koşullarında gerçekleşebilir. Tüm düğümler biraz farklı oranlarda ilerlediğinden, bir düğüm B4’ün geçerliliğini kontrol ederken başarılı bir şekilde doğrulamış ve B1’i kabul etmiş olabilir, bu durumda B4’ü geçersiz olarak işaretlerken bir diğeri B4’ü kontrol ettiği sırada B1’i sonlandırmamış olabilir.

11 Şubat’ta, Pangolin’in piyasaya sürülmesinden dolayı ağ trafiğindeki artış, eşzamanlı olarak işlenen blokların sayısının artmasına neden oldu. Bu, sistemdeki eşzamanlı blokların sayısını artırdı ve hatayı tetikledi.

Sonuç olarak, bazı doğrulayıcılar geçersiz import işlemleri içeren blokları kabul ederken, diğerleri kabul etmedi. Sonunda, geçersiz mint’leri kabul eden onaylayıcılar, ağın yapısındaki non-determinizmden dolayı için kendi aralarında da anlaşmazlığa başladılar, bu da onların bu sorunlar çözülene kadar güvenliği sağlamak için C-zincirinde ilerlemeyi bırakmalarına neden oldu.

X ve P zincirleri mint hatasını içermediğinden, Avalanche ağı C-zinciri ile ilgisi olmayan işlemleri işlemeye devam etti. C-zinciri işlemeyi durdurdu, ancak Avalanche ağındaki diğer bağımsız işlemler hiçbir zaman durmadı. X-Chain, geliştiriciler sistemde hata ayıklarken bile işlemleri işlemesini sağlayan doğrusal bir zincir değil, bir DAG’dir.

Avalanche protokolüne göre, hiçbir iki düğüm aynı yükseklikte farklı blokları kabul etmedi veya başka türlü çelişen işlemler içermedi. Özellikle, bazı Avalanche düğümleri doğru kanonik zincir üzerinde ilerleme kaydetmeye devam ederken, hatayla karşılaşmayan diğerleri sadece durduruldu. Belirleyici olmayan hataya duyarlı olmayan doğrulayıcılar, bir doğrulayıcılar topluluğu geçersiz olduğunu düşündükleri bir bloğu kabul ettiğinde herhangi bir ilerleme kaydetmeyi reddettiler. Doğrulayıcıların çoğunluğu bloğu kabul ettiğinden, kalan doğrulayıcılar, geçersiz mint hatasını içermeyen bu yükseklikte diğer bloklar üzerinde ilerleme sağlayamadı.

Çözüm

İlk bakışta, böyle bir sorunu çözmenin en kolay yolu, blok zincirini yeniden yazmak ve kabul edilen işlemleri geri almak gibi görünebilir. Ancak, Avalanche ağını tek bir varlık kontrol etmediğinden veya bunu yapmak için düğümlerin yeterli bir yüzdesini kontrol etmediğinden, böyle bir yaklaşım gerçekte mümkün değildi. Bu iyi bir şey, çünkü Avalanche ağının gerçekten ademi merkeziyetçi olduğunu gösteriyor.

Bunun yerine, en iyi uygulanabilir düzeltme, aşamalı olarak devreye alınabilen, yani sert veya yumuşak bir “çatal” gerektirmeyen, ağın yasaklayıcı çoğunluğu üzerinde kontrol gerektirmeyen ve onu dağıtan herkese fayda sağlayan bir çözümdür. Geliştiriciler, ağın kabul ettiği tüm blokları kabul eden bir yama oluşturdular ve ağı aynı ortak noktaya yönlendirdiler. Yamanın kritik kısmı, önbelleği devre dışı bırakan ve geçersiz mint’leri tanıyan özel bloklar kavramını tanıtan aşağıdaki kod parçacığıdır.

Eski kod ile yeni kod arasındaki fark buradan görülebilir.

Yamanın dezavantajı, 790.2160157 ek AVAX üretimine izin vermesiydi. Hiçbir zaman 720 milyondan fazla AVAX’ın olmamasına ilişkin protokol değişmezliğini korumak için Avalanche Vakfı, yaratılan AVAX miktarının aynısını yakmaya karar verdi.

Yamanın dağıtılması, tüm doğru düğümlerin en yüksek geçerli ipucu üzerinde anlaşmasına ve birlikte ilerlemeye devam etmesine olanak sağladı.

Sonuç

Hemen hemen her büyük blok zincirinde, bir hatanın sistemin güvenliğini veya canlılığını tehdit eden bir soruna neden olduğu dönemler olmuştur. Bunlar istenmeyen ama kaçınılmaz olaylardır ve sistemi güçlendirmek için fırsatlar sunar.

Hata, Avalanche’ın konsensüs mekanizması, ağ veya sistemle ilgili temel bir sorundan kaynaklanmadı.

Avalanche ekosistemi, yaşananlara toplu olarak hızlı tepki verdi. Mevcut kod ve dağıtılan yama, tüm fonların güvende kalmasını sağladı ve sistemin zarif bir şekilde kurtarılmasına izin verdi. Ağ sağlıklıdır ve herkes işlemleri gerçekleştirerek veya ağ ölçümlerini gözlemleyerek doğrulayabilir.

Borsalar, bu tür olaylardan sonra yaptıkları gibi kendi iç kontrollerini yapmaktadırlar. Hata, hizmetlerin yeniden etkinleştirilmesinde gecikmelere neden olan Çin Yeni Yılı ile aynı zamana denk geldi. Hiçbir fon kaybedilmedi veya kaybedilemezdi.

Değişimlerin ağ ile tekrar senkronize olması zaman alacaktır. Ağın yavaşladığı sırada bir borsadan para çekme işlemi yapıyorsanız, borsanın para çekme işleminizi yeniden yayınlaması gerekebilir. Bir para yatırma işlemi yapıyorsanız ve explorer’lar işlemin gerçekleştiğini gösteriyorsa, borsalar ağ ile senkronize olduklarında hesabınıza kredi vermelidir.

Bu sorun karmaşık bir hatayı ortaya çıkardı ve giderdi ve aynı zamanda Avalanche Network’ün gerçekten ademi merkeziyetçi olduğunu dünyaya gösterdi. Sonuç olarak hem Avalanche ağı daha güçlü hale geldi ve topluluğu her zamanki gibi inanılmaz derecede destekleyici olmaya devam etmektedir.

Haberlerimizi Telegram kanalımızdan, Twitter, Facebook, Instagram ve Reddit hesaplarımızdan takip edebilirsiniz.

Bu haberle ilgili ne düşünüyorsunuz?

Güncel Haberler

Dogecoin’den Yüklü Miktarda Kâr Eden Goldman Sachs Yöneticisi İstifa Etti

Pazartesi günü yayılan haberlere göre, Goldman Sachs’ın departman müdürlerinden biri Dogecoin’den milyonlarca dolar kazandıktan sonra istifa etti.Söz konusu müdür...

Haberlerimizi Telegram kanalımızdan, Twitter, Facebook, Instagram ve Reddit hesaplarımızdan takip edebilirsiniz.

Send this to a friend