Diamond Temsilcilik Sözleşmeleri için En İyi Güvenlik Uygulamaları

Proxy sözleşmeleri, akıllı sözleşme geliştiricileri için önemli bir araçtır. Bugün, sözleşme sisteminde birçok proxy modu ve bunlara karşılık gelen kullanım kuralları bulunmaktadır. Daha önce yükseltilebilir proxy sözleşmesi güvenlik en iyi uygulamalarını ana hatlarıyla belirtmiştik.

Bu yazıda, geliştirici topluluğunda popüler olan başka bir proxy modelini, elmas proxy modelini tanıtacağız.

"Elmas" olarak da bilinen elmas proxy sözleşmeleri, Ethereum İyileştirme Önerisi (EIP) 2535 tarafından tanıtılan Ethereum akıllı sözleşmeleri için bir tasarım modelidir.

Elmas modu, bir sözleşmenin işlevselliğini daha küçük sözleşmelere (uygun bir şekilde "yönler" olarak da adlandırılır) bölerek sınırsız işlevselliğe sahip olmasını sağlar. Diamond bir vekil görevi görür, işlev çağrılarını uygun yöne yönlendirir.

Elmas modelinin tasarımı, Ethereum ağının maksimum sözleşme boyutu sınırlaması sorununu çözebilir. Elmas modeli, büyük bir sözleşmeyi daha küçük boyutlara bölerek, geliştiricilerin boyut kısıtlamalarından etkilenmeden daha karmaşık ve zengin özelliklere sahip akıllı sözleşmeler oluşturmasına olanak tanır.

Diamond Brokerage, geleneksel yükseltilebilir sözleşmelere kıyasla muazzam bir esneklik sunar. Diğer parçalara dokunmadan sözleşme parçalarının yükseltilmesine, işlevlerin seçilen bölümlerinin eklenmesine, değiştirilmesine veya çıkarılmasına olanak tanırlar.

Bu makale, yaygın olarak kullanılan şeffaf proxy modu ve UUPS proxy modu ile bir karşılaştırma ve geliştirici topluluğu için güvenlik hususları dahil olmak üzere EIP-2535'e genel bir bakış sağlar.

EIP-2535 bağlamında, bir "elmas", işlevsel uygulaması "aspects" adı verilen farklı mantıksal sözleşmeler tarafından sağlanan bir vekalet sözleşmesidir.

Gerçek bir elmasın faset adı verilen farklı tarafları olduğunu ve ilgili Ethereum elmas sözleşmelerinin de farklı yönleri olduğunu hayal edin. Elmas ödünç alma işlevinin her sözleşmesi farklı bir taraf veya yöndür.

Elmas standardı, "elmas kesim"in fasetleri ve özellikleri eklemek, değiştirmek veya silmek için yeteneklerini genişletmek için bir benzetme kullanır.

Ek olarak, Elmas Standardı, elmasın fasetleri ve mevcudiyeti hakkında bilgi veren "Elmas Büyüteç" adlı bir özellik sağlar.

Geleneksel vekalet modeliyle karşılaştırıldığında, "elmas" vekalet sözleşmesine eşdeğerdir ve farklı "yönler" sözleşmenin gerçekleşmesine karşılık gelir. Bir elmas aracının farklı yönleri dahili işlevleri, kitaplıkları ve durum değişkenlerini paylaşabilir. Bir pırlantanın ana bileşenleri şunlardır:

Proxy görevi gören merkezi bir sözleşme, yönlendirme işlevini uygun bir şekilde çağırır. İşlev seçicilerin "aspect" adreslerine eşlenmesini içerir.

Belirli bir işlevi uygulayan tek bir sözleşme. Her faset, elmas tarafından çağrılabilen bir dizi işlev içerir.

elmaslarda kullanılan faset ve işlev seçiciler hakkında bilgi sağlayan, EIP-2535'te tanımlanan bir dizi standart işlevdir. Elmas Büyüteç, geliştiricilerin ve kullanıcıların elmasların yapısını incelemesine ve anlamasına olanak tanır.

Bir elmasta yüzey ekleme, değiştirme veya kaldırma işlevleri ve bunlara karşılık gelen özellik seçiciler. Yalnızca yetkili adresler (örneğin, elmasın sahibi veya çoklu imzalı bir sözleşme) elmas kesimi yapabilir.

Geleneksel aracılara benzer şekilde, elmas aracı üzerinde bir işlev çağrısı yapıldığında aracının geri dönüş işlevi (geri dönüş işlevi) tetiklenir. Elmas proxy'den temel farkı, geri dönüş işlevinde, hangi mantıksal sözleşme adresinin çağrılan işlevin uygulanmasına sahip olduğunu depolayan ve belirleyen bir selektörToFacet eşlemesi olmasıdır. Daha sonra, tıpkı geleneksel bir proxy gibi, işlevi yürütmek için bir temsilci çağrısı kullanır.

Tüm proxy'ler, işlev çağrılarını harici adreslere devretmek için fallback() işlevini kullanır. Aşağıda, elmas proxy'nin uygulanması ve geleneksel proxy'nin uygulanması yer almaktadır.

Derleme kod bloklarının çok benzer olduğunu belirtmekte fayda var, bu nedenle tek fark, elmas vekil temsilci çağrısındaki en boy adresi ve geleneksel vekil temsilci çağrısındaki impl adresidir.

Temel fark, elmas proxy'de, yönün adresinin hashmap tarafından arayanın msg.sig'sinden (işlev seçici) yönün adresine kadar belirlenmesi, geleneksel proxy'de ise impl adresinin bağlı olmamasıdır. arayan girer.

Elmas aracı geri dönüş işlevi

Geleneksel proxy geri dönüş işlevi

SelectorToFacet eşlemesi, hangi sözleşmenin her işlev seçicinin uygulanmasını içerdiğini belirler. Proje çalışanlarının genellikle bu işlev seçiciden uygulamaya sözleşme eşlemesini eklemesi, değiştirmesi veya kaldırması gerekir. EIP-2535 şunu şart koşar: Bu amaca ulaşmak için bir diamondCut() işlevi olmalıdır. Aşağıda örnek bir arayüz bulunmaktadır.

Her FacetCut yapısı, elmas proxy sözleşmesinde güncellenecek bir model adresi ve dört baytlık bir özellik seçici dizisi içerir. FaceCutAction, özellik seçicilerin eklenmesine, değiştirilmesine ve kaldırılmasına olanak tanır. diamondCut() işlevinin uygulanması, yeterli erişim denetimi, slot çakışmalarını önleme, arıza durumunda kurtarma vb. içermelidir.

Bir elmas aracının hangi işlevlere ve yönlere sahip olduğunu sorgulamak için "elmas büyüteç" kullanıyoruz. "Diamond Büyüteç", EIP-2535'te tanımlanan aşağıdaki arayüzü uygulayan özel bir özelliktir:

facets() işlevi, tüm yönlerin adreslerini ve bunların dört baytlık işlev seçicilerini döndürmelidir. facetFunctionSelectors() işlevi, belirli bir özellik tarafından desteklenen tüm işlev seçicileri döndürmelidir. facetAddresses() işlevi, elmas tarafından kullanılan tüm model adreslerini döndürmelidir.

facetAddress() işlevi, verilen seçiciyi destekleyen bir özellik veya bulunmazsa adres(0) döndürmelidir. Aynı özellik seçiciye sahip birden fazla en boy adresi olmaması gerektiğini unutmayın.

Elmas proxy'lerin farklı uygulama sözleşmelerine farklı işlev çağrıları devrettiği göz önüne alındığında, çakışmaları önlemek için depolama yuvalarını uygun şekilde yönetmek çok önemlidir. EIP-2535, birkaç depolama yuvası yönetim yönteminden bahseder.

Bu yön, yapıdaki durum değişkenlerini bildirebilir. Bu yön, her biri farklı bir depolama konumuna sahip herhangi bir sayıda yapıyı kullanabilir. Sözleşmeli depolamada her yapının belirli bir konumu vardır. Özellikler kendi durum değişkenlerini bildirebilir, ancak diğer yönler tarafından bildirilen durum değişkenlerinin depolama konumlarıyla çelişemezler. Aşağıdaki şekilde gösterildiği gibi EIP-2535'te örnek bir kitaplık ve elmas depolama sözleşmesi sağlanmıştır:

Uygulama depolama, elmas depolamanın daha özel bir versiyonudur. Bu model, yönlerin durum değişkenlerini daha rahat ve kolay bir şekilde paylaşmak için kullanılır. Bir Uygulama mağazası yapısı, bir uygulamanın gerektirdiği herhangi bir sayıda ve türde durum değişkeni içerecek şekilde tanımlanır. Bir özellik, AppStorage yapısını her zaman depolama yuvasının 0 konumunda ilk ve tek durum değişkeni olarak bildirir. Farklı yönler daha sonra bu yapıdaki değişkenlere erişebilir.

Diamond Storage ve AppStorage'ın bir karışımı da dahil olmak üzere başka depolama alanı yönetimi stratejileri de vardır. Örneğin, bazı yapılar farklı yönler arasında paylaşılır ve bazıları belirli bir yöne özeldir. Her durumda, kazara yuva çarpışmalarını önlemek çok önemlidir.

Şeffaf Proxy ve UUPS Proxy ile Karşılaştırma

Şu anda Web3 geliştirici topluluğu tarafından kullanılan iki ana proxy modu, şeffaf proxy modu ve UUPS proxy modudur. Bu bölümde, elmas proxy modunu şeffaf proxy ve UUPS proxy modları ile kısaca karşılaştırıyoruz.

1.EPI-2535:

2.EPI-1967:

3.Diamond proxy referans uygulaması:

4.OpenZeppelin uygulaması:

Proxy ve ölçeklenebilir çözümler daha karmaşık sistemlerdir ve OpenZeppelin, UUPS, Transparent ve Beacon ölçeklenebilir proxy'ler için kod tabanları ve kapsamlı belgeler sağlar. Bununla birlikte, elmas proxy modu için, OpenZeppelin faydalarını doğrulasa da, yine de EIP-2535 elmas uygulamasını kitaplıklarına dahil etmemeye karar verdiler.

Bu nedenle, mevcut üçüncü taraf kitaplıklarını kullanan veya bu çözümü kendileri uygulayan geliştiriciler, onu son derece dikkatli bir şekilde uygulamalıdır. Burada, geliştirici topluluğunun göz önünde bulundurması için en iyi güvenlik uygulamalarının bir kontrol listesini derledik.

Geliştiriciler, sözleşme mantığını daha küçük, daha yönetilebilir modüllere bölerek kodlarını daha kolay test edebilir ve denetleyebilir.

Ek olarak bu yaklaşım, geliştiricilerin karmaşık, yekpare bir kod tabanını yönetmek yerine sözleşmeler oluşturmanın ve sürdürmenin belirli yönlerine odaklanmasına olanak tanır. Nihai sonuç, sözleşmenin diğer bölümlerini etkilemeden kolayca güncellenebilen ve değiştirilebilen daha esnek ve modüler bir kod tabanıdır.

Kaynak: Aavegotchi Github

Diamond proxy sözleşmesi dağıtıldığında DiamondCutFacet sözleşmesinin adresini diamond proxy sözleşmesine eklemeli ve diamondCut() işlevini uygulamalıdır. diamondCut() işlevi, yüzleri ve işlevleri eklemek, silmek veya değiştirmek için kullanılır, DiamondCutFacet ve diamondCut() olmadan elmas aracı düzgün çalışamaz.

Kaynak: Mugen's Diamond-3-Hardhat

Bir akıllı sözleşmede bir depolama yapısına yeni bir durum değişkeni eklerken, yapının sonuna eklenmesi gerekir. Bir yapının başına veya ortasına yeni bir durum değişkeni eklemek, yeni durum değişkeninin mevcut durum değişkeni verilerinin üzerine yazılmasına neden olur ve yeni durum değişkeninden sonraki herhangi bir durum değişkeni, yanlış bellek konumuna işaret edebilir.

AppStorage modeli, elmas proxy için bir ve yalnızca bir yapının bildirilmesini ve bu yapının tüm yönler tarafından paylaşılmasını gerektirir. Birden fazla yapı gerekiyorsa, DiamondStorage modeli kullanılmalıdır.

İç yapıya daha fazla durum değişkeni eklemeyi düşünmediğiniz sürece, bir yapıyı doğrudan başka bir yapının içine koymayın. Yapıdan sonra bildirilen değişken depolama yuvalarının üzerine yazmadan, bir yükseltmede dahili yapılara yeni durum değişkenleri eklemek mümkün değildir.

Geçici çözüm, "yapıyı" doğrudan "yapıya" yerleştirmek yerine, bellek eşlemeli yapıya yeni durum değişkenleri eklemektir. Bir haritadaki değişken depolama yuvaları farklı şekilde hesaplanır ve depolamada bitişik değildir.

Dizinin boyutu, yapının boyutundan etkilenecektir. Bir yapıya yeni bir durum değişkeni eklendiğinde, o yapının boyutunu ve düzenini değiştirir.

Yapı bir dizide bir öğe olarak kullanılıyorsa, bu sorunlara neden olabilir. Yapının boyutu ve düzeni değişirse, dizinin boyutu ve düzeni de değişir, bu da yapının tutarlı boyutuna ve düzenine dayanan indeksleme veya diğer işlemlerde sorunlara neden olabilir.

Diğer proxy modellerine benzer şekilde, her değişkenin benzersiz bir depolama yuvası olmalıdır. Aksi takdirde aynı lokasyondaki iki farklı yapı birbirinin üzerine yazacaktır.

Initialize() işlevi genellikle ayrıcalıklı rollerin adresleri gibi önemli değişkenleri ayarlamak için kullanılır. Sözleşme dağıtıldığında başlatılmazsa, kötü niyetli bir aktör sözleşmeyi arayabilir ve kontrol edebilir.

Başlatma/ayar işlevine uygun erişim kontrolünün eklenmesi veya sözleşme dağıtıldığında işlevin çağrıldığından ve tekrar çağrılamayacağından emin olunması önerilir.

Sözleşmenin herhangi bir yönü selfdestruct() işlevini çağırabiliyorsa, tüm sözleşmeyi yok etme potansiyeline sahiptir ve bu da fon veya veri kaybına neden olur. Elmas proxy modunda bu son derece tehlikelidir, çünkü birden fazla yön proxy sözleşmesinin depolama ve verilerine erişebilir.

Şu anda, akıllı sözleşmelerinde elmas proxy modelini benimseyen daha fazla proje görüyoruz. Geleneksel proxy'lere göre esneklik ve başka avantajlar sunar.

Ancak ekstra esneklik, saldırganlar için daha geniş bir saldırı yüzeyi anlamına da gelebilir. Bu makalenin, geliştirici topluluğunun elmas proxy modelinin mekaniğini ve güvenlik hususlarını anlamasına yardımcı olacağını umuyoruz.

Aynı zamanda proje ekibi, elmas ajansı sözleşmelerinin uygulanmasıyla ilgili güvenlik açıkları riskini azaltmak için sıkı testler ve üçüncü taraf denetimleri gerçekleştirmelidir.

View Original
The content is for reference only, not a solicitation or offer. No investment, tax, or legal advice provided. See Disclaimer for more risks disclosure.
  • Reward
  • Comment
  • Share
Comment
0/400
No comments
  • Pin