Contract-Development
簡單智能合約中的安全漏洞
我開發了一個簡單的智能合約來儲存使用者的兩個隱私偏好。我正在通過 Ganache 在私有區塊鏈上測試和評估這份合約。
我目前正在驗證它的安全性,但我有一些疑問。在我的研究中,我發現了三個可能影響該合約的缺陷:可重入性、前端執行和帶有塊填充的 DoS(可以在此處查看攻擊的詳細資訊)。
我的主要問題是:
- 如何評價已開發契約中的這些問題?
1)為了評估可重入性,我想同時多次呼叫合約的功能之一。這個想法有效嗎?如何同時多次呼叫此函式?
- 對於 Front-Running,我想監控記憶體池並檢查是否可以在執行之前觀察交易。問題是:如何通過 ganache 做到這一點?
3)對於DoS,我再次考慮重複呼叫一個函式,直到達到塊的gas限制。這個想法有效嗎?
下面是合約程式碼:
pragma solidity ^0.5.0; contractPrivacyPreferences { bool preference = false; bool monitoringType = false; mapping (address => bool) addresses; contructor () public { adresses [address(0x00281055afc982d96fab65b3a49cac8b878184cb16)] = true; } function changePreferences() public { if (addresses [msg.sender]) preference = true; } function changeMonitoringType () public { if (addresses [msg.sender]) { monitoringType = true; } function preferenceStatus() public view returns (bool) { return preference; } function monitoringStatus() public view returns (bool) { return monitoringType; } }
這是我在驗證智能合約時遵循的一些規則
- **可重入性:**一個函式可以在另一個函式沒有完成的情況下被第三方呼叫嗎?這需要一個函式將控制權轉移到另一個合約。
你的合約既不打電話也不轉移乙太幣,所以它不應該被重入問題所利用。 2. **前端執行:**事務排序會影響結果嗎?前端執行是指查看待處理事務的人可以通過在其他人前面插入自己的事務來改變預期行為。
如果其他人更改順序沒有問題,最終結果將是相同的。 3. **拒絕服務:**除了 O(1) 之外,合約是否有可以被廉價濫用的行為?
通常的行為是 O(1),因此不可能發生拒絕服務攻擊。
注意:你的合約非常簡單,易於分析,排除這些攻擊非常明確。在更複雜的契約中,有時結果可能不像這種情況下那麼清楚。