Ethereum'ın karşılaştığı zorluklardan biri, varsayılan olarak herhangi bir blok zinciri protokolünün şişmesi ve karmaşıklığının zamanla artmasıdır. Bu iki yerde olur:
Ethereum'un kendisini uzun vadede sürdürebilmesi için, bu eğilimlerin her ikisine de karşı güçlü bir karşı baskıya ihtiyacımız var, bu da zaman içinde karmaşıklığı ve şişkinliği azaltıyor. Ancak aynı zamanda, blok zincirlerini harika yapan temel özelliklerden birini korumamız gerekiyor: kalıcılıkları. Bir NFT, işlem çağrı verilerine bir aşk notu veya zincir üzerinde bir milyon dolar içeren bir akıllı sözleşme koyabilir, on yıl boyunca bir mağaraya girebilir, dışarı çıkabilir ve hala orada okumanızı ve etkileşimde bulunmanızı beklerken bulabilirsiniz. DApp'lerin tamamen merkeziyetsiz hale gelme ve yükseltme anahtarlarını kaldırma konusunda kendilerini rahat hissetmeleri için, bağımlılıklarının onları bozacak şekilde yükseltilmeyeceğinden emin olmaları gerekir - özellikle L1'in kendisi.
Temizlik, 2023 yol haritası.
Bu iki ihtiyaç arasında denge kurmak ve sıkıntıyı en aza indirmek veya tersine çevirmek, karmaşayı ve çürümeyi azaltırken sürekliliği korumak kesinlikle mümkündür; zihinlerimizi buna odaklarsak. Canlı organizmalar bunu yapabilir: çoğu zamanla yaşlanırken de, şanslı birkaç kişi değil. Hatta sosyal sistemler bile yapabilir.aşırı uzun ömürlü olmakBirkaç kez Ethereum zaten başarılar gösterdi: proof of work ortadan kalktı, SELFDESTRUCT opcode genellikle yok oldu ve beacon zincir düğümleri zaten eski verileri sadece altı aya kadar saklıyor. Ethereum için bu yolun daha genelleştirilmiş bir şekilde belirlenmesi ve uzun vadeli istikrarlı bir sonuca doğru ilerlenmesi, Ethereum'un uzun vadeli ölçeklenebilirlik, teknik sürdürülebilirlik ve hatta güvenliğinin nihai zorluğudur.
Bu yazının yazıldığı sırada, tam senkronize bir Ethereum düğümü gerekmektedir.yaklaşık 1.1 terabaytdisk alanı içinyürütme istemcisi, artı konsensüs istemcisi için başka birkaç yüz gigabayt daha. Bunun büyük çoğunluğu geçmiş hakkındadır: tarihi bloklar, işlemler ve makbuzlar hakkındaki veriler, çoğu yıllardır. Bu, bir düğümün boyutunun her yıl yüzlerce gigabayt artmasına neden olur, hatta gaz limiti hiç artmazsa bile.
Tarih depolama sorununu basitleştiren bir ana özellik, her bloğun bir önceki bloğa bir karmalı bağlantı aracılığıyla işaret etmesidir (ve diğer yapılar) , şu an için uzlaşmaya sahip olmak, tarihte uzlaşmaya sahip olmaktan yeterlidir. Ağın en son blok üzerinde uzlaşmaya sahip olduğu sürece, herhangi bir tarihi blok veya işlem veya durum (hesap bakiyesi, nonce, kod, depolama) herhangi bir tek aktör tarafından bir Merkle kanıtı ile birlikte sağlanabilir ve kanıt, başkalarının doğruluğunu doğrulamasına izin verir. Uzlaşma bir N/2-of-N güven modelidir, tarih ise bir1-of-N güven modeli.
Bu, geçmişi nasıl saklayabileceğimize dair birçok seçenek sunar. Doğal seçeneklerden biri, her düğümün verilerin yalnızca küçük bir yüzdesini depoladığı bir ağdır. Torrent ağları onlarca yıldır bu şekilde çalışıyor: ağ milyonlarca dosyayı tamamen depolar ve dağıtırken, her katılımcı bunlardan yalnızca birkaçını depolar ve dağıtır. Belki de sezgisel olarak, bu yaklaşım verilerin sağlamlığını mutlaka azaltmaz. Düğüm çalışmasını daha uygun maliyetli hale getirerek, her düğümün geçmişin rastgele %10'unu depoladığı 100.000 düğümlü bir ağa ulaşabilirsek, her veri parçası 10.000 kez çoğaltılır - her düğümün her şeyi depoladığı 10.000 düğümlü bir ağ ile tam olarak aynı çoğaltma faktörü.
Bugün Ethereum, tüm geçmişi sonsuza kadar saklayan tüm düğümler modelinden uzaklaşmaya başladı bile. Konsensüs blokları (yani proof of stake konsensüsü ile ilgili kısımlar) yalnızca ~6 ay boyunca saklanır. Bloblar yalnızca ~18 gün boyunca depolanır. EIP-4444Ethereum, tarihi bloklar ve makbuzlar için bir yıllık depolama süresi getirmeyi amaçlıyor. Uzun vadeli bir hedef, her düğümün her şeyi depolamaktan sorumlu olduğu ve ardından Ethereum düğümlerinden oluşan eşler arası bir ağın eski verileri dağıtılmış bir şekilde depoladığı uyumlu bir süre (~18 gün olabilir) oluşturmaktır.
Silme kodları, çoğaltma faktörünü aynı tutarken sağlamlığı artırmak için kullanılabilir. Aslında, bloblar veri kullanılabilirliği örneklemesini desteklemek için zaten silme kodlu olarak gelir. En basit çözüm, bu silme kodlamasını yeniden kullanmak ve yürütme ve konsensüs blok verilerini bloblara da koymak olabilir.
Ana kalan iş, en azından yürütme geçmişi, ancak sonuçta uzlaşma ve bloklar için de beton bir dağıtılmış çözüm oluşturmak ve entegre etmektir. Bunun için en kolay çözümler, (i) mevcut bir torrent kütüphanesini basitçe tanıtmak ve (ii) Ethereum'a özgü bir çözüm olanPortal ağı. Her ikisi de tanıtıldığında, EIP-4444'ü açabiliriz. EIP-4444 kendisi için bir hard fork gerektirmez, ancak yeni bir ağ protokolü sürümü gerektirir. Bu nedenle, tüm istemciler için aynı anda etkinleştirilmesinde değer vardır, çünkü aksi takdirde tam geçmişi indirmeyi bekleyen diğer düğümlere bağlanan istemcilerin yanlış işlemesi riski vardır.
Ana ticaret dengesi, 'eski' tarihsel verilerin ne kadar kolaylıkla erişilebilir hale getirilmeye çalışılacağı arasında yapılır. En kolay çözüm, yarın eski tarihleri depolamayı durdurmak ve çeşitli merkezi sağlayıcılarla çoğaltma için mevcut arşiv düğümlerine güvenmektir. Bu kolaydır, ancak Ethereum'u kalıcı kayıtların yapıldığı bir yer olarak zayıflatır. Daha zor, ancak daha güvenli olan yol, önce tarihleri dağıtılmış bir şekilde depolamak için torrent ağını inşa etmek ve entegre etmektir. Burada 'ne kadar zorlukla denediğimizin' iki boyutu vardır:
(1) için maksimum düzeyde paranoyak bir yaklaşım, muhafaza kanıtı: aslında her bir proof of stake doğrulayıcısının geçmişin belirli bir yüzdesini saklamasını ve bunu yapıp yapmadıklarını düzenli olarak kriptografik olarak kontrol etmesini gerektirir. Daha ılımlı bir yaklaşım, her müşterinin geçmişin yüzde kaçını depoladığına dair gönüllü bir standart belirlemektir.
(2) için temel bir uygulama, zaten bugün yapılan işi almayı içerir: Portal zaten Ethereum tarihini içeren ERA dosyalarını depolar. Daha kapsamlı bir uygulama, bunu gerçekten senkronizasyon sürecine bağlamayı içerir, böylece biri tam tarih depolayan bir düğümü veya bir arşiv düğümünü senkronize etmek isteseydi, çevrimiçi başka arşiv düğümleri olmasa bile, Portal ağından doğrudan senkronize edebilirler.
Tarih depolama gereksinimlerinin azaltılması, bir düğümü çalıştırmayı veya hızlıca oluşturmayı son derece kolay hale getirmek istiyorsak, durumsuzluktan daha önemli olabilir: bir düğümün sahip olması gereken 1.1 TB'nin ~300 GB'si durum, kalan ~800 GB ise tarih. Bir Ethereum düğümünün akıllı bir saatte çalışması ve sadece birkaç dakika içinde kurulması vizyonu, hem durumsuzluk hem de EIP-4444'ün uygulanması durumunda gerçekleştirilebilir.
Geçmiş depolamanın sınırlanması, daha yeni Ethereum düğüm uygulamalarının sadece protokolün yeni sürümlerini desteklemesini ve böylece çok daha basit olmalarını mümkün kılar. Örneğin, 2016 DoS saldırıları sırasında oluşturulan boş depolama yuvaları artık tamamen kaldırıldığı için birçok satır kod güvenli bir şekilde çıkarılabilir.silindi. Artık proof of stake'e geçiş eski bir tarih olduğuna göre, müşteriler tüm proof-of-work ile ilgili kodları güvenle kaldırabilirler.
Müşterilerin geçmişi depolama ihtiyacını kaldırsak bile, bir müşterinin depolama gereksinimi devam edecektir ve bu, hesap bakiyeleri ve nonce'lar, sözleşme kodu ve sözleşme depolamasındaki sürekli büyüme nedeniyle yılda yaklaşık 50 GB artacaktır. Kullanıcılar, mevcut ve gelecekteki Ethereum müşterileri üzerinde sürekli bir yük getirmek için tek seferlik bir maliyet ödeyebilirler.
Durum, tarihden daha zor bir şekilde "süresiz" olur, çünkü EVM, bir durum nesnesi oluşturulduğunda, her zaman orada olacağı ve herhangi bir işlem tarafından her zaman okunabileceği varsayımı etrafında temel olarak tasarlanmıştır. Eğer durumsuzluk tanıtırsak, belki de bu sorunun o kadar da kötü olmadığı bir argümanı var: sadece uzmanlaşmış bir blok oluşturucu sınıfının gerçekten durumu depolaması gerekecektir ve diğer tüm düğümler (hattadahil edilme listesiÜretim!) durumsuz çalışabilir. Bununla birlikte, durumsuzluğa çok fazla güvenmek istemediğimiz ve Ethereum'u merkezi olmaktan çıkarmak için durumu sona erdirmek isteyebileceğimiz bir tartışma var.
Bugün, yeni bir durum nesnesi oluşturduğunuzda (bu üç farklı şekilde gerçekleşebilir: (i) ETH'yi yeni bir hesaba göndermek, (ii) kodla yeni bir hesap oluşturmak, (iii) daha önce dokunulmamış bir depolama yuvasını ayarlamak), o durum nesnesi sonsuza kadar durumda olur. Bunun yerine, nesnelerin zamanla otomatik olarak süresinin dolmasını istiyoruz. Temel zorluk, bunu üç hedefi gerçekleştiren bir şekilde yapmaktır:
Bu hedefleri yerine getirmeden sorunu çözmek kolaydır. Örneğin, her durum nesnesinin sona erme tarihi için bir sayaç depolamasını sağlayabilirsiniz (bu, her okunduğunda veya yazıldığında otomatik olarak gerçekleşebilen ETH yakılarak uzatılabilir) ve süresi dolmuş durum nesnelerini kaldırmak için durum arasında döngü yapan bir işleme sahip olabilirsiniz. Ancak bu, ekstra hesaplama (ve hatta depolama gereksinimleri) getirir ve kesinlikle kullanıcı dostu olma gereksinimini karşılamaz. Geliştiriciler de, bazen sıfıra sıfırlanan depolama değerlerini içeren uç durumlar hakkında akıl yürütmekte zorlanırlar. Sona erme zamanlayıcısını sözleşme çapında yaparsanız, bu, geliştiriciler için hayatı teknik olarak kolaylaştırır, ancak ekonomiyi daha da zorlaştırır: geliştiriciler, devam eden depolama maliyetlerini kullanıcılarına nasıl "aktaracaklarını" düşünmek zorunda kalırlar.
Bunlar, Ethereum çekirdek geliştirme topluluğunun yıllardır mücadele ettiği sorunlardır, bu arada ' gibi öneriler de yer almaktadır.blockchain kiralamaveyeniden doğuşSonunda, tekliflerin en iyi kısımlarını birleştirdik ve iki kategoriye 'en az kötü bilinen çözümler' olarak yaklaştık:
Kısmi durum süresi dolma önerileri, aynı prensibe göre çalışır. Durumu parçalara böleriz. Herkes, hangi parçaların boş veya dolu olduğunun 'üst düzey haritasını' kalıcı olarak saklar. Her bir parçadaki veriler, yalnızca bu verilere yakın zamanda erişildiyse saklanır. Bir parça artık saklanmıyorsa, herhangi biri, veriyi sağlayarak bu veriyi geri getirebilir.
Bu teklifler arasındaki temel farklılıklar: (i) "son zamanlarda"yı nasıl tanımlıyoruz ve (ii) "parça"yı nasıl tanımlıyoruz? Bir somut teklif EIP-7736, "sap ve yaprak" tasarımı üzerine inşa edilmiştir Verkle ağaçları için tanıtıldıBu tasarımda, birbirine bitişik olan başlık, kod ve depolama yuvaları aynı 'sap' altında depolanır (herhangi bir durumsuzluk biçimiyle uyumlu olmakla birlikte, örn. ikili ağaçlar). Bir sapın altında depolanan veriler en fazla 256 * 31 = 7.936 bayt olabilir. Birçok durumda, bir hesabın tüm başlık ve kodu ve birçok önemli depolama yuvası aynı sapın altında depolanır. Bir sapın altındaki veriler 6 ay boyunca okunmadıysa veya yazılmadıysa, veriler artık depolanmaz ve yalnızca veriye ait 32 bayt taahhüt ('bağlantı') depolanır. Bu veriye erişen gelecekteki işlemler, verinin, bağlantıya karşı kontrol edilen bir kanıtla 'dirilenmesi' gerekecektir.
Benzer bir fikri uygulamanın başka yolları da vardır. Örneğin, hesap düzeyi ayrıntısı yeterli değilse, her bir ağacın 1/232 kesri benzer bir gövde yaprağı mekanizması tarafından yönetilecek şekilde bir düzen yapabiliriz.
Bu, teşvikler nedeniyle daha zor; bir saldırgan, istemcileri, çok büyük miktarda veriyi tek bir alt ağaca yerleştirerek ve her yıl tek bir işlem göndererek 'ağacı yenilemek' için kalıcı olarak saklamaya zorlayabilir. Yenileme maliyetini ağaç boyutuna bağlı hale getirirseniz (veya yenileme süresini ters orantılı hale getirirseniz), o zaman biri, onları aynı alt ağaca çok büyük miktarda veri koyarak başka bir kullanıcıyı rahatsız edebilir. Alt ağaç boyutuna dayalı olarak granüliteyi dinamik hale getirerek her iki sorunu da sınırlamaya çalışabilirsiniz: örneğin, ardışık her 216 = 65536 durum nesnesi bir 'grup' olarak ele alınabilir. Bununla birlikte, bu fikirler daha karmaşıktır; gövde tabanlı yaklaşım basittir ve teşvikleri uyumlu hale getirir, çünkü genellikle bir gövde altındaki tüm veriler aynı uygulamaya veya kullanıcıya aittir.
Tüm kalıcı durum büyümesini tamamen önlemek isteseydik, hatta 32 baytlık kısayolları bile? Bu, bir zor problemdir çünkü...@vbuterin/state_size_management#Resurrection-conflicts">resurrection çatışmaları: bir durum nesnesi kaldırılırsa, daha sonra EVM yürütmesi tam olarak aynı konuma başka bir durum nesnesi koyarsa, ancak bundan sonra orijinal durum nesnesi ile ilgilenen birisi geri gelir ve onu kurtarmaya çalışırsa ne olur? Kısmi durum sona erme ile, "tutam" yeni veri oluşturulmasını engeller. Tam durum sona erme ile, hatta sadece tutamı saklamaya gücümüz yetmez.
Adres-dönemi tabanlı tasarımı çözmenin en iyi bilinen fikridir. Tüm durumu depolayan tek bir durum ağacı yerine, sürekli büyüyen bir durum ağacı listemiz var ve okunan veya yazılan herhangi bir durum en son durum ağacında kaydedilir. (düşünün: 1 yıl) her dönemde bir yeni boş durum ağacı eklenir. Eski durum ağaçları dondurulur. Tam düğümler yalnızca en son iki ağacı saklaması beklenir. Bir durum nesnesi iki dönem boyunca dokunulmadıysa ve böylece bir geçerliğini yitirmiş ağaca düştüyse, okunabilir veya yazılabilir, ancak işlem için Merkle kanıtı kanıtlamalıdır - ve bir kez yaptığında, bir kopyası en son ağaçta tekrar kaydedilecektir.
Tüm kullanıcılar ve geliştiriciler için kullanıcı dostu bir hale getirmek için önemli bir fikir, adres dönemleri kavramıdır. Bir adres dönemi, bir adresin bir parçası olan bir sayıdır. Ana kural, N adres dönemine sahip bir adresin, yalnızca N döneminden sonra okunabileceği veya yazılabileceğidir (yani durum ağacı listesi N uzunluğuna ulaştığında). Yeni bir durum nesnesi kaydediyorsanız (örneğin yeni bir sözleşme veya yeni bir ERC20 bakiyesi), durum nesnesini N veya N-1 olan bir sözleşmeye yerleştirmeyi sağlarsanız, öncesinde hiçbir şey olmadığına dair kanıtlar sunmanız gerekmeden hemen kaydedebilirsiniz. Öte yandan, eski adres dönemlerindeki durum eklemeleri veya düzenlemeleri bir kanıt gerektirir.
Bu tasarım, Ethereum'un mevcut özelliklerinin çoğunu korur, ekstra hesaplamada çok hafiftir, uygulamaların neredeyse bugün olduğu gibi yazılmasına izin verir (ERC20'lerin, N adres periyoduna sahip adreslerin bakiyelerinin, kendisi de N adres periyoduna sahip bir alt sözleşmede saklanmasını sağlamak için yeniden yazılması gerekecektir) ve "kullanıcı beş yıl boyunca bir mağaraya girer" sorununu çözer. Ancak, büyük bir sorunu var: adreslerin adres dönemlerine uyması için 20 baytın ötesine genişletilmesi gerekiyor.
Bir öneri, bir versiyon numarası, bir adres dönem numarası ve genişletilmiş bir hash içeren yeni bir 32 byte adres formatının tanıtılmasıdır.
0x01000000000157aE408398dF7E5f4552091A69125d5dFcb7B8C2659029395bdF
Kırmızı bir sürüm numarasıdır. Burada turuncu renkte boyanan dört sıfır gelecekte bir parça numarasını alabilecek boş alan olarak düşünülmüştür. Yeşil bir adres dönem numarasıdır. Mavi, 26 baytlık bir karma değeridir.
Buradaki temel zorluk, geriye dönük uyumluluktur. Mevcut sözleşmeler 20 bayt adresler etrafında tasarlanmıştır ve genellikle adreslerin tam olarak 20 bayt uzunluğunda olduğunu varsayan sıkı bayt-paketleme tekniklerini kullanır.@ipsilon/address-space-extension-exploration">Bunun çözümü için bir fikir, eski tarz sözleşmelerin yeni tarz adreslerle etkileşim kurduğu bir çeviri haritasıdır, bu durumda eski tarz adreslerin 20 baytlık bir yeni tarz adresin özetini görmesi gerekecektir. Bununla birlikte, bunu güvenli hale getirmek için önemli karmaşıklıklar bulunmaktadır.
Başka bir yaklaşım ise tam ters yönde ilerler: hemen 0xffffffff ile başlayan tüm adresleri içeren 2128 boyutlu alt aralığı yasaklarız ve ardından bu aralığı adres dönemleri ve 14 baytlık özetlerle tanıtırız.
0xfffffff000169125d5dFcb7B8C2659029395bdF
Bu yaklaşımın yaptığı temel fedakarlık, şudur ki,Karşı olgusal adresler için güvenlik riskleri oluşturur: varlıkları veya izinleri tutan ancak kodları henüz zincire yayınlanmamış olan adresler. Risk, birinin henüz yayınlanmamış bir kod parçasına sahip olduğunu iddia eden ancak aynı adrese karma yapmak için geçerli başka bir kod parçasına da sahip olan bir adres oluşturmasıyla ilgilidir. Böyle bir çarpışma hesaplamak için 2 gerektirir80bugün hashlar; adres alanı daraltılması bu sayıyı çok erişilebilir bir 2'ye düşürür56 hash'ler.
Anahtar risk alanı, tek bir sahibi tarafından tutulan cüzdanlar olmayan karşıt adreslerdir, bu bugün nispeten nadir bir durumdur, ancak çoklu L2 dünyasına girdiğimizde daha yaygın hale gelmesi muhtemeldir. Tek çözüm, bu riski basitçe kabul etmek, ancak bu durumun bir sorun olabileceği tüm ortak kullanım durumlarını belirlemek ve etkili çözümler bulmaktır.
Gelecek için dört uygulanabilir yol görüyorum:
Önemli bir nokta, adres alanı genişlemesi ve daralması etrafındaki zor konuların, adres formatı değişikliklerine bağlı durum süresi düzenlemelerine bağlı olup olmadığına bakılmaksızın, sonunda ele alınması gerekeceğidir. Bugün, yaklaşık 280bir adres çakışması oluşturmak için gereken karma sayısı, çok iyi kaynaklara sahip aktörler için zaten uygun olan bir hesaplama yüküdür: bir GPU yaklaşık olarak 2 yapabilir27hash'ler, bu yüzden bir yıl boyunca çalıştığında 2 hesaplayabilir52, bu yüzden tüm ~2^30 dünyadaki GPU'laryaklaşık 1/4 yıl içinde bir çakışmayı hesaplayabilirdi ve FPGAs ve ASIC'ler bunu daha da hızlandırabilirdi. Gelecekte, böyle saldırılar giderek daha fazla insanın erişimine açık hale gelecektir. Bu nedenle, tam durum sona erme uygulamanın gerçek maliyeti, çok zorlu bu adres sorununu çözmek zorunda olduğumuz için göründüğü kadar yüksek olmayabilir.
Devlet sona erme yapmak, bir devlet ağacı formatından başka birine geçişi kolaylaştırır, çünkü bir geçiş prosedürüne ihtiyaç olmayacak: yeni bir formatta yeni ağaçlar yapmaya başlayabilir ve daha sonra daha eski ağaçları dönüştürmek için sert bir çatal yapabilirsiniz. Bu nedenle, devlet sona erme karmaşık olsa da, yol haritasının diğer yönlerini basitleştirme konusunda faydaları vardır.
Güvenliğin, erişilebilirliğin ve güvenilir tarafsızlık basitliktir. Bir protokol güzel ve basitse, hata olma olasılığını azaltır. Yeni geliştiricilerin gelip herhangi bir bölümüyle çalışabilme şansını artırır. Özel çıkarlara karşı savunmanın adil ve daha kolay olması daha olasıdır. Ne yazık ki, protokoller, herhangi bir sosyal sistem gibi, varsayılan olarak zamanla daha karmaşık hale gelir. Ethereum'un sürekli artan karmaşıklığa sahip bir kara deliğe girmesini istemiyorsak, iki şeyden birini yapmamız gerekir: (i) değişiklik yapmayı bırakıp protokolü kemikleştirmek, (ii) özellikleri gerçekten kaldırabilmek ve karmaşıklığı azaltabilmek. Protokolde daha az değişiklik yapmak ve zaman içinde en azından biraz karmaşıklığı ortadan kaldırmak için bir ara yol da mümkündür. Bu bölüm, karmaşıklığı nasıl azaltabileceğimizi veya kaldırabileceğimizi konuşacaktır.
Protokol karmaşıklığını azaltabilecek büyük tek bir düzeltme yoktur; sorunun içsel doğası, birçok küçük düzeltmenin olmasıdır.
Zaten büyük ölçüde tamamlanmış olan ve diğerlerinin nasıl ele alınacağına dair bir mavi baskı olarak hizmet edebilecek bir örnek, @vbuterin/selfdestruct">SELFDESTRUCT opcode'unun kaldırılması. SELFDESTRUCT opcode, bir blok içinde sınırsız sayıda depolama yuvasını değiştirebilen tek opcode idi ve istemcilerin DoS saldırılarını önlemek için önemli ölçüde daha fazla karmaşıklık uygulamalarını gerektiriyordu. Orijinal amacı, gönüllü durum temizliğini etkinleştirmek ve zaman içinde durum boyutunu azaltmaktı. Uygulamada, bunu kullanan çok az kişi oldu. opcode zayıflatıldıDencun hardfork'ta yalnızca aynı işlemde oluşturulan kendini yok eden hesaplara izin vermek için değiştirildi. Bu, DoS sorununu çözer ve istemci kodunda önemli bir basitleştirmeye olanak tanır. Gelecekte, muhtemelen opkodu tamamen kaldırmak mantıklı olacaktır.
Şimdiye kadar tanımlanan protokol basitleştirme fırsatlarının bazı önemli örnekleri aşağıdakileri içerir. İlk olarak, EVM'nin dışında kalan bazı örnekler; Bunlar nispeten invaziv değildir ve bu nedenle daha kısa bir zaman diliminde fikir birliğine varmak ve uygulamak daha kolaydır.
Şimdi, EVM içinde bulunan bazı örnekler:
Bu tür özellik basitleştirmesini yaparken ana tercih şudur: (i) ne kadar basitleştirip ne kadar hızlı yapabiliriz ve (ii) geriye dönük uyumluluk. Ethereum'un değeri, bir uygulamayı dağıtabileceğiniz ve bundan yıllar sonra hala çalışacağından emin olabileceğiniz bir platform olmasından kaynaklanır. Aynı zamanda, bu idealizmi çok ileriye götürmek de mümkündür veWilliam Jennings Bryan'ın sözünü değiştirmek içinEthereum'ı geriye dönük uyumluluk haçında çarmıha germek. Ethereum'da belirli bir özelliği kullanan sadece iki uygulama varsa, biri yıllardır hiç kullanıcıya sahip değil ve diğeri neredeyse hiç kullanılmıyor ve toplamda 57 dolarlık bir değeri güvence altına alıyor, o zaman sadece özelliği kaldırmalı ve gerektiğinde mağdurlara cebimizden 57 dolar ödemeliyiz.
Daha geniş bir sosyal sorun, acil olmayan geriye dönük uyumsuzluk yaratan değişiklikler için standartlaştırılmış bir boru hattı oluşturmaktır. Bunun için bir yaklaşım, SELFDESTRUCT işlemi gibi mevcut örnekleri incelemek ve genişletmektir. Boru hattı aşağıdaki gibi görünmektedir:
Adım 1 ile adım 4 arasında çok yıllık bir boru hattı olmalı, hangi öğelerin hangi adımda olduğu hakkında net bilgiler bulunmalı. O noktada, özellik kaldırma boru hattının ne kadar güçlü ve hızlı olduğu ile diğer protokol geliştirme alanlarına daha fazla kaynak koymak konusunda daha temkinli olma arasında bir denge bulunmaktadır, ancak hala Pareto sınırından uzaktayız.
EVM'ye önerilen önemli bir değişiklik seti, EVM Nesne Biçimi (EOF). EOF, gaz gözleminin yasaklanması, kod gözleminin (yani CODECOPY yok) ve yalnızca statik atlama izin verme gibi birçok değişiklik getiriyor. Hedef, EVM'nin daha güçlü özelliklere sahip bir şekilde yükseltilmesine izin verirken, geriye dönük uyumluluğu korumaktır (çünkü EOF öncesi EVM hala var olacaktır).
Bu, yeni EVM özelliklerini eklemek için doğal bir yol yaratması ve daha kısıtlayıcı, daha güçlü garanti sağlayan bir EVM'ye göçü teşvik etmesi avantajına sahiptir. Eski EVM'yi sonunda kullanımdan kaldırıp kaldıramayacağımızı bulamazsak, protokol karmaşıklığını önemli ölçüde artırır. Bir ana soru şudur: EVM basitleştirme önerilerinde EOF'un rolü nedir, özellikle EVM'nin genel karmaşıklığını azaltma hedefi varsa?
Yol haritasının geri kalanındaki "geliştirme" önerilerinin çoğu, eski özelliklerin basitleştirilmesi için fırsatlardır. Yukarıdaki örneklerden bazılarını tekrarlamak gerekirse:
Daha radikal bir Ethereum basitleştirme stratejisi, protokolü olduğu gibi tutmak ancak büyük bir bölümünü protokol özelliklerinden sözleşme koduna taşımaktır.
Bunun en uç versiyonu, Ethereum L1'i "teknik olarak" sadece işaret zinciri yapmak ve minimal bir VM (örn. RISC-V, Kahire, veya kanıt sistemleri için daha da minimal bir şekilde özelleştirilmiş bir şey) herhangi birinin kendi rollup'ını oluşturmasına izin veren bir protokol) dönüşebilir. EVM daha sonra bu rollup'ların ilki haline gelir. Bu, ilginç bir şekilde tam olarak aynı sonuç olur. 2019-20 yılından yürütme ortamı önerileri, ancak SNARK'lar bunu gerçekten uygulamak için önemli ölçüde daha uygun hale getiriyor.
Daha ılımlı bir yaklaşım, işaret zinciri ile mevcut Ethereum yürütme ortamı arasındaki ilişkiyi olduğu gibi tutmak, ancak EVM'nin yerinde takasını yapmak olacaktır. Yeni "resmi Ethereum VM'si" olarak RISC-V, Cairo veya başka bir VM'yi seçebilir ve ardından tüm EVM sözleşmelerini orijinal kodun mantığını yorumlayan (derleyerek veya yorumlayarak) yeni VM koduna zorla dönüştürebiliriz. Teorik olarak bu, EOF'nin bir sürümü olan "hedef VM" ile bile yapılabilir.
Ethereum'ın karşılaştığı zorluklardan biri, varsayılan olarak herhangi bir blok zinciri protokolünün şişmesi ve karmaşıklığının zamanla artmasıdır. Bu iki yerde olur:
Ethereum'un kendisini uzun vadede sürdürebilmesi için, bu eğilimlerin her ikisine de karşı güçlü bir karşı baskıya ihtiyacımız var, bu da zaman içinde karmaşıklığı ve şişkinliği azaltıyor. Ancak aynı zamanda, blok zincirlerini harika yapan temel özelliklerden birini korumamız gerekiyor: kalıcılıkları. Bir NFT, işlem çağrı verilerine bir aşk notu veya zincir üzerinde bir milyon dolar içeren bir akıllı sözleşme koyabilir, on yıl boyunca bir mağaraya girebilir, dışarı çıkabilir ve hala orada okumanızı ve etkileşimde bulunmanızı beklerken bulabilirsiniz. DApp'lerin tamamen merkeziyetsiz hale gelme ve yükseltme anahtarlarını kaldırma konusunda kendilerini rahat hissetmeleri için, bağımlılıklarının onları bozacak şekilde yükseltilmeyeceğinden emin olmaları gerekir - özellikle L1'in kendisi.
Temizlik, 2023 yol haritası.
Bu iki ihtiyaç arasında denge kurmak ve sıkıntıyı en aza indirmek veya tersine çevirmek, karmaşayı ve çürümeyi azaltırken sürekliliği korumak kesinlikle mümkündür; zihinlerimizi buna odaklarsak. Canlı organizmalar bunu yapabilir: çoğu zamanla yaşlanırken de, şanslı birkaç kişi değil. Hatta sosyal sistemler bile yapabilir.aşırı uzun ömürlü olmakBirkaç kez Ethereum zaten başarılar gösterdi: proof of work ortadan kalktı, SELFDESTRUCT opcode genellikle yok oldu ve beacon zincir düğümleri zaten eski verileri sadece altı aya kadar saklıyor. Ethereum için bu yolun daha genelleştirilmiş bir şekilde belirlenmesi ve uzun vadeli istikrarlı bir sonuca doğru ilerlenmesi, Ethereum'un uzun vadeli ölçeklenebilirlik, teknik sürdürülebilirlik ve hatta güvenliğinin nihai zorluğudur.
Bu yazının yazıldığı sırada, tam senkronize bir Ethereum düğümü gerekmektedir.yaklaşık 1.1 terabaytdisk alanı içinyürütme istemcisi, artı konsensüs istemcisi için başka birkaç yüz gigabayt daha. Bunun büyük çoğunluğu geçmiş hakkındadır: tarihi bloklar, işlemler ve makbuzlar hakkındaki veriler, çoğu yıllardır. Bu, bir düğümün boyutunun her yıl yüzlerce gigabayt artmasına neden olur, hatta gaz limiti hiç artmazsa bile.
Tarih depolama sorununu basitleştiren bir ana özellik, her bloğun bir önceki bloğa bir karmalı bağlantı aracılığıyla işaret etmesidir (ve diğer yapılar) , şu an için uzlaşmaya sahip olmak, tarihte uzlaşmaya sahip olmaktan yeterlidir. Ağın en son blok üzerinde uzlaşmaya sahip olduğu sürece, herhangi bir tarihi blok veya işlem veya durum (hesap bakiyesi, nonce, kod, depolama) herhangi bir tek aktör tarafından bir Merkle kanıtı ile birlikte sağlanabilir ve kanıt, başkalarının doğruluğunu doğrulamasına izin verir. Uzlaşma bir N/2-of-N güven modelidir, tarih ise bir1-of-N güven modeli.
Bu, geçmişi nasıl saklayabileceğimize dair birçok seçenek sunar. Doğal seçeneklerden biri, her düğümün verilerin yalnızca küçük bir yüzdesini depoladığı bir ağdır. Torrent ağları onlarca yıldır bu şekilde çalışıyor: ağ milyonlarca dosyayı tamamen depolar ve dağıtırken, her katılımcı bunlardan yalnızca birkaçını depolar ve dağıtır. Belki de sezgisel olarak, bu yaklaşım verilerin sağlamlığını mutlaka azaltmaz. Düğüm çalışmasını daha uygun maliyetli hale getirerek, her düğümün geçmişin rastgele %10'unu depoladığı 100.000 düğümlü bir ağa ulaşabilirsek, her veri parçası 10.000 kez çoğaltılır - her düğümün her şeyi depoladığı 10.000 düğümlü bir ağ ile tam olarak aynı çoğaltma faktörü.
Bugün Ethereum, tüm geçmişi sonsuza kadar saklayan tüm düğümler modelinden uzaklaşmaya başladı bile. Konsensüs blokları (yani proof of stake konsensüsü ile ilgili kısımlar) yalnızca ~6 ay boyunca saklanır. Bloblar yalnızca ~18 gün boyunca depolanır. EIP-4444Ethereum, tarihi bloklar ve makbuzlar için bir yıllık depolama süresi getirmeyi amaçlıyor. Uzun vadeli bir hedef, her düğümün her şeyi depolamaktan sorumlu olduğu ve ardından Ethereum düğümlerinden oluşan eşler arası bir ağın eski verileri dağıtılmış bir şekilde depoladığı uyumlu bir süre (~18 gün olabilir) oluşturmaktır.
Silme kodları, çoğaltma faktörünü aynı tutarken sağlamlığı artırmak için kullanılabilir. Aslında, bloblar veri kullanılabilirliği örneklemesini desteklemek için zaten silme kodlu olarak gelir. En basit çözüm, bu silme kodlamasını yeniden kullanmak ve yürütme ve konsensüs blok verilerini bloblara da koymak olabilir.
Ana kalan iş, en azından yürütme geçmişi, ancak sonuçta uzlaşma ve bloklar için de beton bir dağıtılmış çözüm oluşturmak ve entegre etmektir. Bunun için en kolay çözümler, (i) mevcut bir torrent kütüphanesini basitçe tanıtmak ve (ii) Ethereum'a özgü bir çözüm olanPortal ağı. Her ikisi de tanıtıldığında, EIP-4444'ü açabiliriz. EIP-4444 kendisi için bir hard fork gerektirmez, ancak yeni bir ağ protokolü sürümü gerektirir. Bu nedenle, tüm istemciler için aynı anda etkinleştirilmesinde değer vardır, çünkü aksi takdirde tam geçmişi indirmeyi bekleyen diğer düğümlere bağlanan istemcilerin yanlış işlemesi riski vardır.
Ana ticaret dengesi, 'eski' tarihsel verilerin ne kadar kolaylıkla erişilebilir hale getirilmeye çalışılacağı arasında yapılır. En kolay çözüm, yarın eski tarihleri depolamayı durdurmak ve çeşitli merkezi sağlayıcılarla çoğaltma için mevcut arşiv düğümlerine güvenmektir. Bu kolaydır, ancak Ethereum'u kalıcı kayıtların yapıldığı bir yer olarak zayıflatır. Daha zor, ancak daha güvenli olan yol, önce tarihleri dağıtılmış bir şekilde depolamak için torrent ağını inşa etmek ve entegre etmektir. Burada 'ne kadar zorlukla denediğimizin' iki boyutu vardır:
(1) için maksimum düzeyde paranoyak bir yaklaşım, muhafaza kanıtı: aslında her bir proof of stake doğrulayıcısının geçmişin belirli bir yüzdesini saklamasını ve bunu yapıp yapmadıklarını düzenli olarak kriptografik olarak kontrol etmesini gerektirir. Daha ılımlı bir yaklaşım, her müşterinin geçmişin yüzde kaçını depoladığına dair gönüllü bir standart belirlemektir.
(2) için temel bir uygulama, zaten bugün yapılan işi almayı içerir: Portal zaten Ethereum tarihini içeren ERA dosyalarını depolar. Daha kapsamlı bir uygulama, bunu gerçekten senkronizasyon sürecine bağlamayı içerir, böylece biri tam tarih depolayan bir düğümü veya bir arşiv düğümünü senkronize etmek isteseydi, çevrimiçi başka arşiv düğümleri olmasa bile, Portal ağından doğrudan senkronize edebilirler.
Tarih depolama gereksinimlerinin azaltılması, bir düğümü çalıştırmayı veya hızlıca oluşturmayı son derece kolay hale getirmek istiyorsak, durumsuzluktan daha önemli olabilir: bir düğümün sahip olması gereken 1.1 TB'nin ~300 GB'si durum, kalan ~800 GB ise tarih. Bir Ethereum düğümünün akıllı bir saatte çalışması ve sadece birkaç dakika içinde kurulması vizyonu, hem durumsuzluk hem de EIP-4444'ün uygulanması durumunda gerçekleştirilebilir.
Geçmiş depolamanın sınırlanması, daha yeni Ethereum düğüm uygulamalarının sadece protokolün yeni sürümlerini desteklemesini ve böylece çok daha basit olmalarını mümkün kılar. Örneğin, 2016 DoS saldırıları sırasında oluşturulan boş depolama yuvaları artık tamamen kaldırıldığı için birçok satır kod güvenli bir şekilde çıkarılabilir.silindi. Artık proof of stake'e geçiş eski bir tarih olduğuna göre, müşteriler tüm proof-of-work ile ilgili kodları güvenle kaldırabilirler.
Müşterilerin geçmişi depolama ihtiyacını kaldırsak bile, bir müşterinin depolama gereksinimi devam edecektir ve bu, hesap bakiyeleri ve nonce'lar, sözleşme kodu ve sözleşme depolamasındaki sürekli büyüme nedeniyle yılda yaklaşık 50 GB artacaktır. Kullanıcılar, mevcut ve gelecekteki Ethereum müşterileri üzerinde sürekli bir yük getirmek için tek seferlik bir maliyet ödeyebilirler.
Durum, tarihden daha zor bir şekilde "süresiz" olur, çünkü EVM, bir durum nesnesi oluşturulduğunda, her zaman orada olacağı ve herhangi bir işlem tarafından her zaman okunabileceği varsayımı etrafında temel olarak tasarlanmıştır. Eğer durumsuzluk tanıtırsak, belki de bu sorunun o kadar da kötü olmadığı bir argümanı var: sadece uzmanlaşmış bir blok oluşturucu sınıfının gerçekten durumu depolaması gerekecektir ve diğer tüm düğümler (hattadahil edilme listesiÜretim!) durumsuz çalışabilir. Bununla birlikte, durumsuzluğa çok fazla güvenmek istemediğimiz ve Ethereum'u merkezi olmaktan çıkarmak için durumu sona erdirmek isteyebileceğimiz bir tartışma var.
Bugün, yeni bir durum nesnesi oluşturduğunuzda (bu üç farklı şekilde gerçekleşebilir: (i) ETH'yi yeni bir hesaba göndermek, (ii) kodla yeni bir hesap oluşturmak, (iii) daha önce dokunulmamış bir depolama yuvasını ayarlamak), o durum nesnesi sonsuza kadar durumda olur. Bunun yerine, nesnelerin zamanla otomatik olarak süresinin dolmasını istiyoruz. Temel zorluk, bunu üç hedefi gerçekleştiren bir şekilde yapmaktır:
Bu hedefleri yerine getirmeden sorunu çözmek kolaydır. Örneğin, her durum nesnesinin sona erme tarihi için bir sayaç depolamasını sağlayabilirsiniz (bu, her okunduğunda veya yazıldığında otomatik olarak gerçekleşebilen ETH yakılarak uzatılabilir) ve süresi dolmuş durum nesnelerini kaldırmak için durum arasında döngü yapan bir işleme sahip olabilirsiniz. Ancak bu, ekstra hesaplama (ve hatta depolama gereksinimleri) getirir ve kesinlikle kullanıcı dostu olma gereksinimini karşılamaz. Geliştiriciler de, bazen sıfıra sıfırlanan depolama değerlerini içeren uç durumlar hakkında akıl yürütmekte zorlanırlar. Sona erme zamanlayıcısını sözleşme çapında yaparsanız, bu, geliştiriciler için hayatı teknik olarak kolaylaştırır, ancak ekonomiyi daha da zorlaştırır: geliştiriciler, devam eden depolama maliyetlerini kullanıcılarına nasıl "aktaracaklarını" düşünmek zorunda kalırlar.
Bunlar, Ethereum çekirdek geliştirme topluluğunun yıllardır mücadele ettiği sorunlardır, bu arada ' gibi öneriler de yer almaktadır.blockchain kiralamaveyeniden doğuşSonunda, tekliflerin en iyi kısımlarını birleştirdik ve iki kategoriye 'en az kötü bilinen çözümler' olarak yaklaştık:
Kısmi durum süresi dolma önerileri, aynı prensibe göre çalışır. Durumu parçalara böleriz. Herkes, hangi parçaların boş veya dolu olduğunun 'üst düzey haritasını' kalıcı olarak saklar. Her bir parçadaki veriler, yalnızca bu verilere yakın zamanda erişildiyse saklanır. Bir parça artık saklanmıyorsa, herhangi biri, veriyi sağlayarak bu veriyi geri getirebilir.
Bu teklifler arasındaki temel farklılıklar: (i) "son zamanlarda"yı nasıl tanımlıyoruz ve (ii) "parça"yı nasıl tanımlıyoruz? Bir somut teklif EIP-7736, "sap ve yaprak" tasarımı üzerine inşa edilmiştir Verkle ağaçları için tanıtıldıBu tasarımda, birbirine bitişik olan başlık, kod ve depolama yuvaları aynı 'sap' altında depolanır (herhangi bir durumsuzluk biçimiyle uyumlu olmakla birlikte, örn. ikili ağaçlar). Bir sapın altında depolanan veriler en fazla 256 * 31 = 7.936 bayt olabilir. Birçok durumda, bir hesabın tüm başlık ve kodu ve birçok önemli depolama yuvası aynı sapın altında depolanır. Bir sapın altındaki veriler 6 ay boyunca okunmadıysa veya yazılmadıysa, veriler artık depolanmaz ve yalnızca veriye ait 32 bayt taahhüt ('bağlantı') depolanır. Bu veriye erişen gelecekteki işlemler, verinin, bağlantıya karşı kontrol edilen bir kanıtla 'dirilenmesi' gerekecektir.
Benzer bir fikri uygulamanın başka yolları da vardır. Örneğin, hesap düzeyi ayrıntısı yeterli değilse, her bir ağacın 1/232 kesri benzer bir gövde yaprağı mekanizması tarafından yönetilecek şekilde bir düzen yapabiliriz.
Bu, teşvikler nedeniyle daha zor; bir saldırgan, istemcileri, çok büyük miktarda veriyi tek bir alt ağaca yerleştirerek ve her yıl tek bir işlem göndererek 'ağacı yenilemek' için kalıcı olarak saklamaya zorlayabilir. Yenileme maliyetini ağaç boyutuna bağlı hale getirirseniz (veya yenileme süresini ters orantılı hale getirirseniz), o zaman biri, onları aynı alt ağaca çok büyük miktarda veri koyarak başka bir kullanıcıyı rahatsız edebilir. Alt ağaç boyutuna dayalı olarak granüliteyi dinamik hale getirerek her iki sorunu da sınırlamaya çalışabilirsiniz: örneğin, ardışık her 216 = 65536 durum nesnesi bir 'grup' olarak ele alınabilir. Bununla birlikte, bu fikirler daha karmaşıktır; gövde tabanlı yaklaşım basittir ve teşvikleri uyumlu hale getirir, çünkü genellikle bir gövde altındaki tüm veriler aynı uygulamaya veya kullanıcıya aittir.
Tüm kalıcı durum büyümesini tamamen önlemek isteseydik, hatta 32 baytlık kısayolları bile? Bu, bir zor problemdir çünkü...@vbuterin/state_size_management#Resurrection-conflicts">resurrection çatışmaları: bir durum nesnesi kaldırılırsa, daha sonra EVM yürütmesi tam olarak aynı konuma başka bir durum nesnesi koyarsa, ancak bundan sonra orijinal durum nesnesi ile ilgilenen birisi geri gelir ve onu kurtarmaya çalışırsa ne olur? Kısmi durum sona erme ile, "tutam" yeni veri oluşturulmasını engeller. Tam durum sona erme ile, hatta sadece tutamı saklamaya gücümüz yetmez.
Adres-dönemi tabanlı tasarımı çözmenin en iyi bilinen fikridir. Tüm durumu depolayan tek bir durum ağacı yerine, sürekli büyüyen bir durum ağacı listemiz var ve okunan veya yazılan herhangi bir durum en son durum ağacında kaydedilir. (düşünün: 1 yıl) her dönemde bir yeni boş durum ağacı eklenir. Eski durum ağaçları dondurulur. Tam düğümler yalnızca en son iki ağacı saklaması beklenir. Bir durum nesnesi iki dönem boyunca dokunulmadıysa ve böylece bir geçerliğini yitirmiş ağaca düştüyse, okunabilir veya yazılabilir, ancak işlem için Merkle kanıtı kanıtlamalıdır - ve bir kez yaptığında, bir kopyası en son ağaçta tekrar kaydedilecektir.
Tüm kullanıcılar ve geliştiriciler için kullanıcı dostu bir hale getirmek için önemli bir fikir, adres dönemleri kavramıdır. Bir adres dönemi, bir adresin bir parçası olan bir sayıdır. Ana kural, N adres dönemine sahip bir adresin, yalnızca N döneminden sonra okunabileceği veya yazılabileceğidir (yani durum ağacı listesi N uzunluğuna ulaştığında). Yeni bir durum nesnesi kaydediyorsanız (örneğin yeni bir sözleşme veya yeni bir ERC20 bakiyesi), durum nesnesini N veya N-1 olan bir sözleşmeye yerleştirmeyi sağlarsanız, öncesinde hiçbir şey olmadığına dair kanıtlar sunmanız gerekmeden hemen kaydedebilirsiniz. Öte yandan, eski adres dönemlerindeki durum eklemeleri veya düzenlemeleri bir kanıt gerektirir.
Bu tasarım, Ethereum'un mevcut özelliklerinin çoğunu korur, ekstra hesaplamada çok hafiftir, uygulamaların neredeyse bugün olduğu gibi yazılmasına izin verir (ERC20'lerin, N adres periyoduna sahip adreslerin bakiyelerinin, kendisi de N adres periyoduna sahip bir alt sözleşmede saklanmasını sağlamak için yeniden yazılması gerekecektir) ve "kullanıcı beş yıl boyunca bir mağaraya girer" sorununu çözer. Ancak, büyük bir sorunu var: adreslerin adres dönemlerine uyması için 20 baytın ötesine genişletilmesi gerekiyor.
Bir öneri, bir versiyon numarası, bir adres dönem numarası ve genişletilmiş bir hash içeren yeni bir 32 byte adres formatının tanıtılmasıdır.
0x01000000000157aE408398dF7E5f4552091A69125d5dFcb7B8C2659029395bdF
Kırmızı bir sürüm numarasıdır. Burada turuncu renkte boyanan dört sıfır gelecekte bir parça numarasını alabilecek boş alan olarak düşünülmüştür. Yeşil bir adres dönem numarasıdır. Mavi, 26 baytlık bir karma değeridir.
Buradaki temel zorluk, geriye dönük uyumluluktur. Mevcut sözleşmeler 20 bayt adresler etrafında tasarlanmıştır ve genellikle adreslerin tam olarak 20 bayt uzunluğunda olduğunu varsayan sıkı bayt-paketleme tekniklerini kullanır.@ipsilon/address-space-extension-exploration">Bunun çözümü için bir fikir, eski tarz sözleşmelerin yeni tarz adreslerle etkileşim kurduğu bir çeviri haritasıdır, bu durumda eski tarz adreslerin 20 baytlık bir yeni tarz adresin özetini görmesi gerekecektir. Bununla birlikte, bunu güvenli hale getirmek için önemli karmaşıklıklar bulunmaktadır.
Başka bir yaklaşım ise tam ters yönde ilerler: hemen 0xffffffff ile başlayan tüm adresleri içeren 2128 boyutlu alt aralığı yasaklarız ve ardından bu aralığı adres dönemleri ve 14 baytlık özetlerle tanıtırız.
0xfffffff000169125d5dFcb7B8C2659029395bdF
Bu yaklaşımın yaptığı temel fedakarlık, şudur ki,Karşı olgusal adresler için güvenlik riskleri oluşturur: varlıkları veya izinleri tutan ancak kodları henüz zincire yayınlanmamış olan adresler. Risk, birinin henüz yayınlanmamış bir kod parçasına sahip olduğunu iddia eden ancak aynı adrese karma yapmak için geçerli başka bir kod parçasına da sahip olan bir adres oluşturmasıyla ilgilidir. Böyle bir çarpışma hesaplamak için 2 gerektirir80bugün hashlar; adres alanı daraltılması bu sayıyı çok erişilebilir bir 2'ye düşürür56 hash'ler.
Anahtar risk alanı, tek bir sahibi tarafından tutulan cüzdanlar olmayan karşıt adreslerdir, bu bugün nispeten nadir bir durumdur, ancak çoklu L2 dünyasına girdiğimizde daha yaygın hale gelmesi muhtemeldir. Tek çözüm, bu riski basitçe kabul etmek, ancak bu durumun bir sorun olabileceği tüm ortak kullanım durumlarını belirlemek ve etkili çözümler bulmaktır.
Gelecek için dört uygulanabilir yol görüyorum:
Önemli bir nokta, adres alanı genişlemesi ve daralması etrafındaki zor konuların, adres formatı değişikliklerine bağlı durum süresi düzenlemelerine bağlı olup olmadığına bakılmaksızın, sonunda ele alınması gerekeceğidir. Bugün, yaklaşık 280bir adres çakışması oluşturmak için gereken karma sayısı, çok iyi kaynaklara sahip aktörler için zaten uygun olan bir hesaplama yüküdür: bir GPU yaklaşık olarak 2 yapabilir27hash'ler, bu yüzden bir yıl boyunca çalıştığında 2 hesaplayabilir52, bu yüzden tüm ~2^30 dünyadaki GPU'laryaklaşık 1/4 yıl içinde bir çakışmayı hesaplayabilirdi ve FPGAs ve ASIC'ler bunu daha da hızlandırabilirdi. Gelecekte, böyle saldırılar giderek daha fazla insanın erişimine açık hale gelecektir. Bu nedenle, tam durum sona erme uygulamanın gerçek maliyeti, çok zorlu bu adres sorununu çözmek zorunda olduğumuz için göründüğü kadar yüksek olmayabilir.
Devlet sona erme yapmak, bir devlet ağacı formatından başka birine geçişi kolaylaştırır, çünkü bir geçiş prosedürüne ihtiyaç olmayacak: yeni bir formatta yeni ağaçlar yapmaya başlayabilir ve daha sonra daha eski ağaçları dönüştürmek için sert bir çatal yapabilirsiniz. Bu nedenle, devlet sona erme karmaşık olsa da, yol haritasının diğer yönlerini basitleştirme konusunda faydaları vardır.
Güvenliğin, erişilebilirliğin ve güvenilir tarafsızlık basitliktir. Bir protokol güzel ve basitse, hata olma olasılığını azaltır. Yeni geliştiricilerin gelip herhangi bir bölümüyle çalışabilme şansını artırır. Özel çıkarlara karşı savunmanın adil ve daha kolay olması daha olasıdır. Ne yazık ki, protokoller, herhangi bir sosyal sistem gibi, varsayılan olarak zamanla daha karmaşık hale gelir. Ethereum'un sürekli artan karmaşıklığa sahip bir kara deliğe girmesini istemiyorsak, iki şeyden birini yapmamız gerekir: (i) değişiklik yapmayı bırakıp protokolü kemikleştirmek, (ii) özellikleri gerçekten kaldırabilmek ve karmaşıklığı azaltabilmek. Protokolde daha az değişiklik yapmak ve zaman içinde en azından biraz karmaşıklığı ortadan kaldırmak için bir ara yol da mümkündür. Bu bölüm, karmaşıklığı nasıl azaltabileceğimizi veya kaldırabileceğimizi konuşacaktır.
Protokol karmaşıklığını azaltabilecek büyük tek bir düzeltme yoktur; sorunun içsel doğası, birçok küçük düzeltmenin olmasıdır.
Zaten büyük ölçüde tamamlanmış olan ve diğerlerinin nasıl ele alınacağına dair bir mavi baskı olarak hizmet edebilecek bir örnek, @vbuterin/selfdestruct">SELFDESTRUCT opcode'unun kaldırılması. SELFDESTRUCT opcode, bir blok içinde sınırsız sayıda depolama yuvasını değiştirebilen tek opcode idi ve istemcilerin DoS saldırılarını önlemek için önemli ölçüde daha fazla karmaşıklık uygulamalarını gerektiriyordu. Orijinal amacı, gönüllü durum temizliğini etkinleştirmek ve zaman içinde durum boyutunu azaltmaktı. Uygulamada, bunu kullanan çok az kişi oldu. opcode zayıflatıldıDencun hardfork'ta yalnızca aynı işlemde oluşturulan kendini yok eden hesaplara izin vermek için değiştirildi. Bu, DoS sorununu çözer ve istemci kodunda önemli bir basitleştirmeye olanak tanır. Gelecekte, muhtemelen opkodu tamamen kaldırmak mantıklı olacaktır.
Şimdiye kadar tanımlanan protokol basitleştirme fırsatlarının bazı önemli örnekleri aşağıdakileri içerir. İlk olarak, EVM'nin dışında kalan bazı örnekler; Bunlar nispeten invaziv değildir ve bu nedenle daha kısa bir zaman diliminde fikir birliğine varmak ve uygulamak daha kolaydır.
Şimdi, EVM içinde bulunan bazı örnekler:
Bu tür özellik basitleştirmesini yaparken ana tercih şudur: (i) ne kadar basitleştirip ne kadar hızlı yapabiliriz ve (ii) geriye dönük uyumluluk. Ethereum'un değeri, bir uygulamayı dağıtabileceğiniz ve bundan yıllar sonra hala çalışacağından emin olabileceğiniz bir platform olmasından kaynaklanır. Aynı zamanda, bu idealizmi çok ileriye götürmek de mümkündür veWilliam Jennings Bryan'ın sözünü değiştirmek içinEthereum'ı geriye dönük uyumluluk haçında çarmıha germek. Ethereum'da belirli bir özelliği kullanan sadece iki uygulama varsa, biri yıllardır hiç kullanıcıya sahip değil ve diğeri neredeyse hiç kullanılmıyor ve toplamda 57 dolarlık bir değeri güvence altına alıyor, o zaman sadece özelliği kaldırmalı ve gerektiğinde mağdurlara cebimizden 57 dolar ödemeliyiz.
Daha geniş bir sosyal sorun, acil olmayan geriye dönük uyumsuzluk yaratan değişiklikler için standartlaştırılmış bir boru hattı oluşturmaktır. Bunun için bir yaklaşım, SELFDESTRUCT işlemi gibi mevcut örnekleri incelemek ve genişletmektir. Boru hattı aşağıdaki gibi görünmektedir:
Adım 1 ile adım 4 arasında çok yıllık bir boru hattı olmalı, hangi öğelerin hangi adımda olduğu hakkında net bilgiler bulunmalı. O noktada, özellik kaldırma boru hattının ne kadar güçlü ve hızlı olduğu ile diğer protokol geliştirme alanlarına daha fazla kaynak koymak konusunda daha temkinli olma arasında bir denge bulunmaktadır, ancak hala Pareto sınırından uzaktayız.
EVM'ye önerilen önemli bir değişiklik seti, EVM Nesne Biçimi (EOF). EOF, gaz gözleminin yasaklanması, kod gözleminin (yani CODECOPY yok) ve yalnızca statik atlama izin verme gibi birçok değişiklik getiriyor. Hedef, EVM'nin daha güçlü özelliklere sahip bir şekilde yükseltilmesine izin verirken, geriye dönük uyumluluğu korumaktır (çünkü EOF öncesi EVM hala var olacaktır).
Bu, yeni EVM özelliklerini eklemek için doğal bir yol yaratması ve daha kısıtlayıcı, daha güçlü garanti sağlayan bir EVM'ye göçü teşvik etmesi avantajına sahiptir. Eski EVM'yi sonunda kullanımdan kaldırıp kaldıramayacağımızı bulamazsak, protokol karmaşıklığını önemli ölçüde artırır. Bir ana soru şudur: EVM basitleştirme önerilerinde EOF'un rolü nedir, özellikle EVM'nin genel karmaşıklığını azaltma hedefi varsa?
Yol haritasının geri kalanındaki "geliştirme" önerilerinin çoğu, eski özelliklerin basitleştirilmesi için fırsatlardır. Yukarıdaki örneklerden bazılarını tekrarlamak gerekirse:
Daha radikal bir Ethereum basitleştirme stratejisi, protokolü olduğu gibi tutmak ancak büyük bir bölümünü protokol özelliklerinden sözleşme koduna taşımaktır.
Bunun en uç versiyonu, Ethereum L1'i "teknik olarak" sadece işaret zinciri yapmak ve minimal bir VM (örn. RISC-V, Kahire, veya kanıt sistemleri için daha da minimal bir şekilde özelleştirilmiş bir şey) herhangi birinin kendi rollup'ını oluşturmasına izin veren bir protokol) dönüşebilir. EVM daha sonra bu rollup'ların ilki haline gelir. Bu, ilginç bir şekilde tam olarak aynı sonuç olur. 2019-20 yılından yürütme ortamı önerileri, ancak SNARK'lar bunu gerçekten uygulamak için önemli ölçüde daha uygun hale getiriyor.
Daha ılımlı bir yaklaşım, işaret zinciri ile mevcut Ethereum yürütme ortamı arasındaki ilişkiyi olduğu gibi tutmak, ancak EVM'nin yerinde takasını yapmak olacaktır. Yeni "resmi Ethereum VM'si" olarak RISC-V, Cairo veya başka bir VM'yi seçebilir ve ardından tüm EVM sözleşmelerini orijinal kodun mantığını yorumlayan (derleyerek veya yorumlayarak) yeni VM koduna zorla dönüştürebiliriz. Teorik olarak bu, EOF'nin bir sürümü olan "hedef VM" ile bile yapılabilir.