Rust akıllı sözleşmeler güvenliği: Yetki kontrolü ve erişim yönetimi ayrıntılı açıklaması

robot
Abstract generation in progress

Rust akıllı sözleşmeler yetiştirme günlüğü (7) Sözleşme güvenliği ve yetki kontrolü

Bu makale, Rust akıllı sözleşmelerindeki yetki kontrolü ile ilgili konuları iki açıdan inceleyecektir:

  1. Sözleşme yöntemlerinin (fonksiyonların) erişilebilirlik/çağrılabilirlik durumu
  2. Ayrıcalık fonksiyonlarının erişim kontrolü/sorumlulukların belirlenmesi

1. Sözleşme fonksiyonları (yöntemleri) görünürlüğü

Akıllı sözleşmeler yazarken, sözleşme fonksiyonlarının görünürlüğünü belirleyerek fonksiyon çağrı yetkisini kontrol edebilir ve böylece sözleşmedeki kritik kısımların yanlışlıkla erişilmesini veya manipüle edilmesini koruyabilirsiniz.

Bancor Network borsasını örnek olarak alırsak, bu borsa 18 Haziran 2020'de sözleşme anahtar fonksiyon erişim kontrol izinlerinin yanlış ayarlanması nedeniyle bir varlık güvenliği olayı yaşadı. Bu sözleşme Solidity dili ile yazılmıştır, sözleşme fonksiyonlarının görünürlüğü public/external ve private/internal olmak üzere ikiye ayrılır. İlki, sözleşme fonksiyonlarının dışarıdan çağrılmasına izin verir ve sözleşme arayüzünün bir parçası olarak görülebilir.

Bancor Ağı, bir güvenlik açığını düzeltirken, sözleşmedeki bazı önemli transfer fonksiyonlarını public özelliği olarak ayarladı ve bu da herkesin bu fonksiyonları dışarıdan çağırarak transfer işlemleri yapabilmesine neden oldu. Bu kritik açık, kullanıcılarının 590.000 $ değerindeki varlıklarını ciddi bir riskle karşı karşıya bıraktı.

Rust akıllı sözleşmelerinde, sözleşme fonksiyonlarının görünürlük kontrolüne de dikkat edilmesi gerekir. NEAR SDK tarafından tanımlanan #[near_bindgen] makrosu, Rust akıllı sözleşme fonksiyonlarını süslemek için kullanılabilir ve aşağıdaki farklı görünürlük özelliklerine sahiptir:

  • pub fn: Bu metodun public olduğunu, sözleşme arayüzünün bir parçası olduğunu ve dışarıdan çağrılabileceğini gösterir.
  • fn: pub olarak açıkça belirtilmemişse, dışarıdan sözleşmeye doğrudan erişim yapılamaz, yalnızca sözleşme içinde çağrılabilir.
  • pub(crate) fn: Yöntemi crate içindeki alanla sınırlı olarak çağrılacak şekilde ayarlayın.

Başka bir yöntem, sözleşme yöntemini internal olarak ayarlamak için, sözleşme içinde #[near_bindgen] ile süslenmemiş bağımsız bir impl Contract kod bloğu tanımlamaktır.

(Callbacks) fonksiyonu için, tanımlanırken public özelliği olarak ayarlanmalıdır, böylece function call ile çağrılabilir. Ayrıca, geri çağırma fonksiyonunun başkaları tarafından rastgele çağrılmadığından emin olunmalıdır, yani çağıran kişi sözleşmenin kendisi olmalıdır. NEAR SDK, bu işlevselliği sağlamak için #[private] makrosunu sunar.

Dikkat edilmesi gereken nokta, Rust dilinde varsayılan olarak tüm içeriklerin private olduğudur; yalnızca pub Trait içindeki alt öğeler ve pub Enum içindeki Enum değişkenleri varsayılan olarak public'tir.

2. Ayrıcalık fonksiyonlarının erişim kontrolü( beyaz liste mekanizması)

Fonksiyon görünürlüğünün yanı sıra, sözleşme anlamı açısından eksiksiz bir erişim kontrol beyaz liste mekanizması oluşturmak gerekir. Bazı ayrıcalıklı fonksiyonlar (, sözleşme başlangıcı, açma/durdurma, toplu transfer gibi ) yalnızca sözleşme sahibi ( owner ) tarafından çağrılabilir; bu fonksiyonlar genellikle "only owner" fonksiyonları olarak adlandırılır.

Bu anahtar işlevlerin dışardan çağrılabilmesi için public özellik olarak ayarlanması gerektiği doğru, ancak bunlar için erişim kontrol kuralları tanımlanabilir; sadece ilgili kurallara uyanlar tam olarak yürütülebilir. Örneğin, aşağıdaki özel Trait'i uygulanabilir:

pas pub trait Sahiplenebilir { fn assert_owner(&self) { assert_eq!(env::predecessor_account_id(), self.get_owner()); } AccountId; fn set_owner(&mut self, owner: AccountId); }

Bu trait kullanılarak sözleşmedeki ayrıcalıklı işlevlere erişim kontrolü sağlanabilir, çağrının sözleşmenin sahibi olması gerekmektedir. Bu prensipten hareketle, birden fazla kullanıcı veya birden fazla beyaz liste ayarlamak için daha karmaşık bir modifier veya trait özelleştirilebilir, böylece hassas grup erişim kontrolü sağlanabilir.

BNT0.99%
GET1.76%
View Original
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
  • Reward
  • 6
  • Share
Comment
0/400
ContractTestervip
· 9h ago
Yine solidity başarısız oldu, Rust dünyada bir numara
View OriginalReply0
ApeEscapeArtistvip
· 10h ago
Rust'ın kanlı gözyaşları dersi
View OriginalReply0
AllTalkLongTradervip
· 10h ago
Yetki yönetimi neden bu kadar karmaşık hale geldi?
View OriginalReply0
defi_detectivevip
· 10h ago
Bancor bu hata gerçekten oldukça basit, artık söylemek bile istemiyorum.
View OriginalReply0
GasWastingMaximalistvip
· 11h ago
Yetki bu çukura düştüm, direkt çatladı.
View OriginalReply0
CryptoAdventurervip
· 11h ago
Yine bir borsa mı devrildi? Risk kontrolü her zaman zeka vergisi insanları enayi yerine koymak!
View OriginalReply0
Trade Crypto Anywhere Anytime
qrCode
Scan to download Gate app
Community
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)