paint-brush
Akıllı Sözleşmeler için Erişim Kontrolü Nasıl Ayarlanırile@dansierrasam79
877 okumalar
877 okumalar

Akıllı Sözleşmeler için Erişim Kontrolü Nasıl Ayarlanır

ile Daniel Chakraborty6m2023/02/13
Read on Terminal Reader
Read this story w/o Javascript

Çok uzun; Okumak

İlk NFT'nizi bastığınız gün, blok zincirinin değişmezliği sayesinde bunu Web3'te sahip olarak yaptığınız gündür. Sahiplik kavramı, erişilebilir işlevler ve izin verilen durum değişikliği açısından akıllı sözleşmeler için de aynı derecede önemlidir. Hem setPrice hem de setPackageDelivered fonksiyonlarının erişilebilir olması sayesinde herkes mali kayıpla sonuçlanabilecek değişiklikler yapabilir.
featured image - Akıllı Sözleşmeler için Erişim Kontrolü Nasıl Ayarlanır
Daniel Chakraborty HackerNoon profile picture
0-item


Web2 ve Web3 arasında ayrım yapmak istendiğinde, ikisini ayıran temel değer sahiplik kavramıdır.


Basitçe söylemek gerekirse, yarattığınız şey, sahip olduğunuz ve para kazanabileceğiniz şeydir. Tam da olması gerektiği gibi. Daha azı değil, daha fazlası değil. Aslında, ilk NFT'nizi bastığınız gün, blok zincirinin değişmezliği sayesinde, onu Web3'te sahip olarak yaptığınız gündür. Aksine korunma hissi paha biçilemez.


Bahsi geçmişken, bu sahiplik kavramı, erişilebilir işlevler ve izin verilen durum değişikliği açısından akıllı sözleşmeler için de aynı derecede önemlidir.

Akıllı Sözleşmelerle Mülkiyete İlk Bakışınız

Peki yazdığınız akıllı sözleşmenin 'sahibi olmanız' neden önemli?


Bir düşünün: Eğer bir bisikletiniz olsaydı mülkiyet kayıtlarını tutmakta tereddüt eder miydiniz? Birisinin onu çalıp kötü amaçlarla kullanması ihtimaline karşı mı? Tabii ki değil.


Bir NFT'ye veya akıllı sözleşmeye sahip olduğunuzu kanıtlamak istemenizle aynı sebepten dolayıdır. Birisi yetkisiz erişime sahip olabilir ve bundan maddi olarak faydalanabilir, değil mi?

Diyelim ki Dunzo ile çalışıyorsunuz ve paket fiyatı artı teslimat ücretlerini ve bunun alıcı tarafından ödenip ödenmediğini belirleyebileceğiniz bu akıllı sözleşmeyi yazdınız.


Dunzo paket teslimatı akıllı sözleşmesi


İdeal senaryoda alıcının adını, paketin toplam fiyatını ve teslimatını belirli bir tutara ayarlayıp setPackageDelivered değerini true olarak ayarlayabilirsiniz. Elbette paketi teslim etmeyi bitirdikten sonra.


Ancak hepimizin bildiği gibi hiçbir şey planlandığı gibi gitmez.


Peki, alıcının sözleşme işlevlerine erişimi olsaydı ve packageDelivered değerini false olarak sıfırlama veya packageDeliveryPrice değerini daha düşük bir değere değiştirme olanağı olsaydı ne olurdu? Sadece ürün için daha az ödeme yapmakla kalmayıp, hiçbir şey ödememekten de kurtulabilirler.


Açıkçası, Dunzo dışında hiç kimsenin bu tür değişiklikleri yapma erişimi olmamalıdır ve bu nedenle erişim kontrolünün ayarlanması önemlidir.

Akıllı Sözleşmede Doğru Erişim Kontrolünü Ayarlamak Neden Önemlidir?

Şimdi bu akıllı sözleşmeyi dağıtalım ve bir davetsiz misafirin durum değişkenlerindeki değerleri değiştirmesinin ne kadar kolay olduğunu görelim.


Dunzo paket teslimatı akıllı sözleşmesi


Hem setPrice hem de setPackageDelivered fonksiyonlarının erişilebilir olması sayesinde herkes, Dunzo teslimatı için mali kayıpla sonuçlanabilecek değişiklikler yapabilir.


Dunzo, ürünün orijinal fiyatını 5 ETH olarak belirlediyse müşteri artık bu değeri 3 ETH olarak değiştirebilir. Elbette müşteri setPackageDelivered fonksiyonuna da erişip boolean değerini false olarak değiştirebildiği için aynı ürünün başka bir teslimatını da alabilir. Yani her iki durumda da Dunzo para kaybedecek ve çok geç olana kadar bunun farkına bile varmayabilir.


Örneğin teslim edilen ürünün aşağıda gösterildiği gibi 5 ETH değerinde olduğunu varsayalım:

Dağıtımın ardından Dunzo dışında hiç kimse sözleşme şartlarını değiştirememelidir. Yine de Remix'te adres değiştirip fiyatı 3'e sıfırladığımızda, koruma olmadığı için bu mümkün oluyor.

SetPackageDelivered durumunu bile true'dan false'a çevirebiliriz. Paket müşteriye teslim edilmiş olsa bile.


Anlayabileceğiniz gibi, söz konusu akıllı sözleşme için sahip ile diğer kullanıcılar arasında ayrım yapmak önemlidir. Öyleyse bu akıllı sözleşme için uygun erişim kontrolünü ayarlayacak ve bunun sonucunda güvenliğini sağlayacak 4 düzeltmeye bakalım.

Akıllı Sözleşmeniz için Erişim Kontrollerini Güvenli Bir Şekilde Ayarlamanın 4 Yolu

Peki akıllı sözleşmeler yazarken sahip ile diğer kullanıcılar arasında nasıl ayrım yapılabilir?

Göz ardı edilmesi halinde yaşanabilecek maddi kayıp nedeniyle bunun gerekli olduğu açıktır.


Yöntem #1: Bir require ifadesi kullanın

Aşağıdaki kodda görebileceğiniz gibi 'require' ifadesi ile birlikte adres tipine yeni bir durum değişkeni sahibi eklenmiştir. Yapıcıda sahip durumu değişkeni, sözleşmeyi dağıtırken kullanılan adresi saklar. Bildiğiniz gibi akıllı sözleşmelerdeki yapıcılar yalnızca bir kez çağrılır, dolayısıyla adres değiştirilemez.


'require' ifadesini içeren dunzo Delivery akıllı sözleşmesi


Artık setPrice işlevini daha düşük bir değerle ve farklı bir adresle çağırdığınızda, işlem aşağıdaki mesaja çok benzer şekilde başlangıç durumuna geri döndürülür:

Hatayı geri al


Gördüğünüz gibi sözleşmede belirtilen sebep, 'require' ifadesine eklediğimiz hata mesajını içeriyor. Bununla birlikte, sözleşmenin sahibi - bu durumda Dunzo - dışında hiç kimse satış koşullarını değiştiremez.


Yöntem #2: Bir işlev değiştirici kullanın

Doğru koşula sahip bir 'require' ifadesi eklemek ne kadar basit olursa olsun, değiştirici tekrar tekrar kullanabileceğiniz bir kod bloğudur. Bu kesinlikle böyle bir çek için çok sayıda 'gerekli' ifadesi yazmaktan çok daha anlamlıdır.


Daha önce paylaşılan kodda sadece setPrice fonksiyonu 'require' deyimiyle korunuyor ancak burada setPackageDelivered fonksiyonu için herhangi bir şey yapılmadı. Aşağıdaki Sağlamlık kodunda gösterildiği gibi bir değiştirici kullanmak işe yarayacaktır:

onlyOwner değiştiricili Dunzo akıllı sözleşmesi


Şimdi, setPrice veya setPackageDelivered işlevlerine erişmeye çalışırsanız, daha önce aldığınız hata iletisinin aynısını ve aşağıda gösterildiği gibi alırsınız:

Hatayı geri al


Yöntem #3: Sahiplenilebilir

Bu düzeltme, OpenZeppelin tarafından sağlanan Sahip olunabilir akıllı sözleşmeyi kullanmanızı gerektirir. Öncelikle, Ownable akıllı sözleşmesini içe aktarmanız ve ardından korumak istediğiniz işlevlere onlyOwner değiştiricisini eklemeniz gerekir. Aşağıda gösterildiği gibi, hem setPrice hem de setPackageDelivered işlevleri aşağıdaki onlyOwner değiştiricisine sahiptir.


Artık dunzoDelivery akıllı sözleşmesi Ownable.sol'daki bazı fonksiyonları kullanacağından, sözleşme adına da "Sahip olunabilir" ibaresi eklendi.

Ownable.sol akıllı sözleşmesini kullanma


Bununla birlikte, Sahip olunabilir akıllı sözleşmeyi kullanırken erişebileceğiniz iki işlev daha vardır: Sahiplikten vazgeçme ve Sahipliği aktarma. Sözleşmeyi dağıtmak için kullanılan hesap genellikle sahip olarak kabul edilse de bu işlevler kullanılarak değiştirilebilir.


Sahibin adresini ve diğer sözleşme ayrıntılarını görmenin yanı sıra, aşağıda kullanım için reounceOwnership ve transferOwnership işlevlerini görebilirsiniz:

Beklendiği gibi, başka bir adres kullanarak setPrice işlevini çağırmaya çalıştığınızda işlem gerçekleşmez. Bunun yerine, aşağıda belirtilen nedenle orijinal durumuna geri döner:

Ownable'ı kullanarak hatayı geri alın


Diğer kullanıcılar arasında yalnızca tek bir sahipe ihtiyacınız varsa, Sahip olunabilir akıllı sözleşmeyi kullanmak iyidir. Daha fazla hiyerarşi arıyorsanız AccessControl.sol akıllı sözleşmesi kullanılmalıdır.


Yöntem #4: Erişim Kontrolü

Bu son düzeltme, Open Zeppelin tarafından AccessControl akıllı sözleşmesine erişmenizi gerektirir.

Yeni başlayanlar için, içe aktarma beyanına Erişim Kontrolü köprüsünü eklemeniz ve ayrıca sözleşme beyanına "Erişim Kontrolüdür" ifadesini eklemeniz gerekir.


Daha önce de belirtildiği gibi, bu akıllı sözleşme, aşağıda gösterilen akıllı sözleşmenin ilk iki satırında olduğu gibi, bir hiyerarşi içinde beyan etmeniz gereken bir dizi rol eklemenize olanak tanır:

AccessControl akıllı sözleşmesini kullanma


Bu sözleşmede Dunzo ve Müşteri olmak üzere iki rol vardır. Artık sözleşmeyi dağıttığınızda, kimin neye erişebileceğini belirlemek için yukarıda belirtilen beyan edilen rolleri söz konusu adreslere atamanız gerekecektir. Ayrıca setPrice ve setPackageDelivered fonksiyonlarına iki adet 'require' ifadesi eklendi.


Anlayabileceğiniz gibi, dağıtım sırasında belirtilen satış koşullarını yalnızca Dunzo rolüne atanmış hesap değiştirebilecek, başka hesap değiştiremeyecek. Bununla birlikte, AccessControl.sol'u kullanarak bir akıllı sözleşmenin işlevlerine farklı erişim düzeylerine sahip bir dizi rol atayabilirsiniz; ancak Ownable.sol bu kadar derine inmeyecektir.

Ethereum Akıllı Sözleşmeleri için Diğer Erişim Kontrolü Düzeltmeleri Hakkında Bir Not

Akıllı sözleşmelerde erişim kontrolünü uygulamak için mevcut tek çözüm bunlar değil. RBAC.sol ve WhitelistCrowdSale.sol da geçmişte mevcuttu ve AccessControl.sol ve Ownable.sol gibi rolleri de adreslerle ilişkilendirebiliyordu.


Dolayısıyla, erişim kontrolünün uygulanmasının evrimi hakkında kapsamlı bir anlayışa sahip olmak istiyorsanız, bu iki akıllı sözleşmedeki kodun üzerinden geçmek de zaman ayırmanıza değecektir.


Burada da yayınlandı.


Bu makalenin ana görseliHackerNoon'un Yapay Zeka Görüntü Oluşturucusu tarafından "erişim reddedildi biyometrik tarama" istemi aracılığıyla oluşturuldu.