Rust akıllı sözleşmeler DoS saldırılarına karşı savunma uygulama kılavuzu

Rust akıllı sözleşmelerindeki hizmet reddi saldırısı

hizmet reddi saldırısı ( DoS ) saldırıları, akıllı sözleşmelerin bir süre boyunca normal bir şekilde kullanılamamasına neden olabilir. Başlıca birkaç nedeni şunlardır:

  1. Sözleşme mantığında, hesaplama karmaşıklığının çok yüksek olduğuna ve gaz tüketiminin limiti aştığına dair bir kusur vardır.

  2. Sözleşmeler arasında çağrı yapılırken, sözleşmenin yürütülmesi güvenilmez harici sözleşme durumuna dayanır ve bu da tıkanıklığa neden olur.

  3. Sözleşme sahibi özel anahtarı kaybeder ve bu da temel ayrıcalıklı işlevlerin yürütülememesine neden olur.

Aşağıda bu DoS açıklarını analiz etmek için somut örnekler verilmektedir.

1. Harici olarak değiştirilebilen büyük veri yapılarında geçiş yapın

Aşağıdakiler, DoS riski içeren basit bir "temettü" sözleşmesidir:

pas #[near_bindgen] #[derive(BorshDeserialize, BorshSerialize)] pub struct Sözleşme { pub kayıtlı: Vec, pub accounts: UnorderedMap\u003caccountid, balance=""\u003e, }

pub fn register_account(&mut self) { eğer self.accounts.insert(&env::predecessor_account_id(), &0).is_some() { env::panic("Hesap zaten kayıtlı".to_string().as_bytes()); } else { self.registered.push(env::p redecessor_account_id()); } log!("Kayıtlı hesap {}", env::önceki_hesap_id()); }

pub fn distribute_token(&mut öz, miktar: u128) { assert_eq!(env::predecessor_account_id(), DAĞITICI, "ERR_NOT_ALLOWED");

for cur_account in self.registered.iter() {
    let balance = self.accounts.get(&cur_account).expect("ERR_GET");
    self.accounts.insert(&cur_account, &balance.checked_add(amount).expect("ERR_ADD" ));
    log!("Hesap {} dağıtmaya çalış" , &cur_account);
    
    ext_ft_token::ft_transfer(
        cur_account.clone(),
        miktar,
        &FTTOKEN,
        0,
        GAS_FOR_SINGLE_CALL  
    );
}

}

Burada self.registered sonsuz bir şekilde genişletilebilir, bu da dolaşım sırasında Gas'ın yetersiz olmasına neden olur.

"Çekim" modunun kullanılması gerektiği, kullanıcıların ödülleri aktif olarak çekmelerini sağlamalı:

pas pub fn withdraw(&mut self) { let account_id = env::predecessor_account_id(); let amount = self.accounts.get(&account_id).expect("No reward");

self.accounts.insert(&account_id, &0);

ext_ft_token::ft_transfer(
    hesap_id,
    miktar, 
    &FTTOKEN,
    0,
    GAS_FOR_SINGLE_CALL
);

}

2. Akıllı sözleşmeler arası durum bağımlılıkları nedeniyle tıkanma

Aşağıda bir "teklif" akıllı sözleşmesi bulunmaktadır:

pas #[near_bindgen] #[derive(BorshDeserialize, BorshSerialize)] pub struct Sözleşme { pub kayıtlı: Vec, pub bid_price: UnorderedMap<accountid, balance="">, mevcut_lider: HesapId, en yüksek teklif: u128, pub iade: bool }

pub fn bid(&mut self, sender_id: AccountId, amount: u128) -> PromiseOrValue { assert!(miktar > self.en yüksek teklif);

eğer self.current_leader == DEFAULT_ACCOUNT {
    self.current_leader = sender_id;
    self.highest_bid = miktar;
} başka {
    ext_ft_token::account_exist(
        self.current_leader.clone(),
        &FTTOKEN,
        0,
        env::p repaid_gas() - GAS_FOR_SINGLE_CALL * 4,
    ).then(ext_self::account_resolve(
        sender_id,
        miktar,
        &env::current_account_id(),
        0,
        GAS_FOR_SINGLE_CALL * 3,
    ));
}

log!(
    "current_leader: {} highest_bid: {}",
    self.current_leader,
    self.highest_bid
);

PromiseOrValue::Value(0)

}

#[private] pub fn account_resolve(&mut self, sender_id: AccountId, amount: u128) { maç env::p romise_result(0) { PromiseResult::NotReady => ulaşılmaz!(), PromiseResult::Başarılı(_) => { ext_ft_token::ft_transfer( self.current_leader.clone(), self.highest_bid, &FTTOKEN, 0, GAS_FOR_SINGLE_CALL * 2, ); self.current_leader = sender_id; self.highest_bid = miktar; } PromiseResult::Başarısız => { ext_ft_token::ft_transfer( sender_id.clone(), miktar &FTTOKEN, 0, GAS_FOR_SINGLE_CALL * 2, ); log!("Şimdi Geri Dön"); } }; }

Eğer önceki teklif sahibinin hesabı yok edildiyse, yeni teklif engellenecektir.

Harici aramaların başarısızlığı göz önüne alındığında, iade edilemeyen jetonlar daha sonra çekilmek üzere sahnelenebilir:

pas pub fn withdraw_lost_funds(&mut self) { let account_id = env::predecessor_account_id(); let miktarı = self.lost_funds.get(&account_id).expect("Kayıp para yok");

self.lost_funds.remove(&account_id);

ext_ft_token::ft_transfer(
    hesap_id,
    miktar,
    &FTTOKEN,
    0,
    TEKÇAĞRI İÇİN GAZ
);

}

!

3. Sahibinin özel anahtarı kayboldu

Bazı anahtar fonksiyonlar yalnızca sözleşme sahibi tarafından çağrılabilir. Eğer sahibi özel anahtarını kaybederse, bu fonksiyonlar yürütülemez.

Sözleşmeyi yönetmek için çoklu imza çözümü kullanılmalı, tek nokta arızasından kaçınılmalıdır:

pas pub struct MultiSigContract { sahipler: Vec\u003caccountid\u003e, gerekli_onaylar: u32, }

pub fn submit_transaction(&mut self, transaction: Transaction) { assert!(self.owners.contains(&env::predecessor_account_id())); // İşlemi onay bekleyen listeye ekle }

pub fn confirm_transaction(&mut self, transaction_id: u64) { assert!(self.owners.contains(&env::predecessor_account_id())); // Onay sayısını artır // Eğer onay sayısı gereksinimleri karşılıyorsa, işlemi gerçekleştir }

Yukarıdaki yöntemler, akıllı sözleşmelerdeki hizmet reddi saldırısı riskini etkili bir şekilde önleyebilir.

</accountid,></accountid,>

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
  • 7
  • Share
Comment
0/400
ConsensusDissentervip
· 07-19 04:59
değerli öngörüler值得收藏学习
View OriginalReply0
MEVHunterZhangvip
· 07-18 23:52
Gerçekten deneyimden gelen bir söz.
View OriginalReply0
PumpBeforeRugvip
· 07-18 15:28
Gaz ücretini kim ödüyor, bir göz atalım
View OriginalReply0
GmGnSleepervip
· 07-17 00:43
Güvenlik her şeyden önemlidir.
View OriginalReply0
ImpermanentPhilosophervip
· 07-17 00:41
Zorla yeniden başlatmak işte bu kadar.
View OriginalReply0
GasFeePhobiavip
· 07-17 00:23
Gaz ücreti büyük bir sorun
View OriginalReply0
AllInAlicevip
· 07-17 00:21
Gaz optimizasyonu önemlidir
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)