Solidity
是否可以截獲發送到智能合約的消息(即測驗的猜測)並在原始消息到達之前將其作為您自己的消息發送?
我正在嘗試編寫一個智能合約,該合約可以由個人生成的 ETH/ERC-20 值鎖定和一個秘密密碼(散列)。然後,假設另一個人將密碼以明文形式發送給合約,並且所述密碼與秘密的雜湊值匹配,則讓該合約將指定的值存入他們的地址。我接受暴力破解的可能性(這不是生產應用程序),但想知道,如果
msg.sender
是公開可用的資訊,惡意行為者是否有可能攔截正確答案(或任何答案)並將其發送為他們自己的,然後將資金存入惡意演員的地址?
是的,如果你經常觀看公共乙太坊記憶體池,這是完全可能的。您執行的任何交易都必須首先放置在記憶體池中,然後它會在那裡徘徊,直到被競爭開採下一個區塊的礦工選中。要了解更多資訊,請查找 Blocknative 的Mempool Explorer。執行攻擊攻擊的最小步驟如下:
- 查看任何傳入 TX 的目標合約地址,並可能將搜尋範圍縮小到僅查找通過拼圖解決方案送出方法呼叫生成的傳入 TX。
- 模擬這些 TX 中的每一個,看看它們的執行是否會導致將代幣存入發送者的地址。
- 如果您發現了頭獎 TX,您可以搶先執行它來獲得獎品(重播 TX 並支付更高的 gas 以確保它會被首先考慮)。
有很多方法可以防止此類攻擊:
- 通過將您的 TX 直接發送到暗池節點或 Flashbots 等 API 來避免公共記憶體池。
- 方法輸入需要更多數據,例如發送者是解決難題的人的密碼證明。這樣,只有從那個特定的發送者地址發送 TX 才會被執行。此外,最好避免以明文形式發送任何內容(即,僅發送零知識證明)。