📢 #Gate广场征文活动第三期# 正式啓動!
🎮 本期聚焦:Yooldo Games (ESPORTS)
✍️ 分享獨特見解 + 參與互動推廣,若同步參與 Gate 第 286 期 Launchpool、CandyDrop 或 Alpha 活動,即可獲得任意獎勵資格!
💡 內容創作 + 空投參與 = 雙重加分,大獎候選人就是你!
💰總獎池:4,464 枚 $ESPORTS
🏆 一等獎(1名):964 枚
🥈 二等獎(5名):每人 400 枚
🥉 三等獎(10名):每人 150 枚
🚀 參與方式:
在 Gate廣場發布不少於 300 字的原創文章
添加標籤: #Gate广场征文活动第三期#
每篇文章需 ≥3 個互動(點讚 / 評論 / 轉發)
發布參與 Launchpool / CandyDrop / Alpha 任一活動的截圖,作爲獲獎資格憑證
同步轉發至 X(推特)可增加獲獎概率,標籤:#GateSquare 👉 https://www.gate.com/questionnaire/6907
🎯 雙倍獎勵機會:參與第 286 期 Launchpool!
質押 BTC 或 ESPORTS,瓜分 803,571 枚 $ESPORTS,每小時發放
時間:7 月 21 日 20:00 – 7 月 25 日 20:00(UTC+8)
🧠 寫作方向建議:
Yooldo
Rust智能合約DoS攻擊防範實戰指南
Rust智能合約養成日記:拒絕服務攻擊防範
拒絕服務(DoS)攻擊可能會導致智能合約在一段時間內甚至永久無法正常使用。常見原因包括:
合約邏輯中的計算復雜度問題,導致 Gas 消耗超出限制。
跨合約調用時,對外部合約執行狀態的不當依賴,造成本合約被阻塞。
合約所有者私鑰丟失,導致特權函數無法調用,重要系統狀態無法更新。
下面通過幾個具體例子來分析 DoS 攻擊漏洞及其解決方案。
1. 循環遍歷可被外部更改的大型數據結構
以下是一個簡單的"分紅"合約,存在 DoS 風險:
rust #[near_bindgen] #[derive(BorshDeserialize, BorshSerialize)] pub struct Contract { pub registered: Vec, pub accounts: UnorderedMap<accountid, balance="">, }
impl Contract { pub fn register_account(&mut self) { if self.accounts.insert(&env::predecessor_account_id(), &0).is_some() { env::panic("The account is already registered".to_string().as_bytes()); } else { self.registered.push(env::predecessor_account_id()); } log!("Registered account {}", env::predecessor_account_id()); }
}
問題在於 registered 數組大小沒有限制,可被惡意用戶操控變得過大,導致 distribute_token 函數執行時 Gas 消耗超出限制。
建議解決方案:
限制 registered 數組的大小。
採用"提現"模式,讓用戶自行提取獎勵,而不是合約主動分發。
2. 跨合約狀態依賴導致合約阻塞
以下是一個"競價"合約示例:
rust #[near_bindgen] #[derive(BorshDeserialize, BorshSerialize)] pub struct Contract { pub registered: Vec, pub bid_price: UnorderedMap<accountid,balance>, pub current_leader: AccountId, pub highest_bid: u128, pub refund: bool }
impl Contract { pub fn bid(&mut self, sender_id: AccountId, amount: u128) -> PromiseOrValue { assert!(amount > self.highest_bid);
}
問題在於合約狀態更新依賴外部合約調用。如果前一個最高出價者的帳戶已注銷,後續出價者將無法更新狀態。
建議解決方案:
考慮外部調用可能失敗的情況,實現合理的錯誤處理機制。例如,將無法退回的代幣暫存在合約中,後續允許用戶主動提取。
3. 所有者私鑰丟失
許多合約存在僅所有者可執行的特權函數。如果所有者私鑰丟失,這些函數將無法調用,可能導致合約無法正常運作。
建議解決方案:
設置多個合約所有者共同管理。
採用多重籤名機制來替代單一所有者控制。
實現去中心化的合約治理機制。
通過以上措施,可以有效降低智能合約中拒絕服務攻擊的風險,提高合約的安全性和可靠性。