📢 #Gate广场征文活动第二期# 正式啓動!
分享你對 $ERA 項目的獨特觀點,推廣ERA上線活動, 700 $ERA 等你來贏!
💰 獎勵:
一等獎(1名): 100枚 $ERA
二等獎(5名): 每人 60 枚 $ERA
三等獎(10名): 每人 30 枚 $ERA
👉 參與方式:
1.在 Gate廣場發布你對 ERA 項目的獨到見解貼文
2.在貼文中添加標籤: #Gate广场征文活动第二期# ,貼文字數不低於300字
3.將你的文章或觀點同步到X,加上標籤:Gate Square 和 ERA
4.徵文內容涵蓋但不限於以下創作方向:
ERA 項目亮點:作爲區塊鏈基礎設施公司,ERA 擁有哪些核心優勢?
ERA 代幣經濟模型:如何保障代幣的長期價值及生態可持續發展?
參與並推廣 Gate x Caldera (ERA) 生態周活動。點擊查看活動詳情:https://www.gate.com/announcements/article/46169。
歡迎圍繞上述主題,或從其他獨特視角提出您的見解與建議。
⚠️ 活動要求:
原創內容,至少 300 字, 重復或抄襲內容將被淘汰。
不得使用 #Gate广场征文活动第二期# 和 #ERA# 以外的任何標籤。
每篇文章必須獲得 至少3個互動,否則無法獲得獎勵
鼓勵圖文並茂、深度分析,觀點獨到。
⏰ 活動時間:2025年7月20日 17
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. 所有者私鑰丟失
許多合約存在僅所有者可執行的特權函數。如果所有者私鑰丟失,這些函數將無法調用,可能導致合約無法正常運作。
建議解決方案:
設置多個合約所有者共同管理。
採用多重籤名機制來替代單一所有者控制。
實現去中心化的合約治理機制。
通過以上措施,可以有效降低智能合約中拒絕服務攻擊的風險,提高合約的安全性和可靠性。