Security
帶還原的 Dos
當我閱讀智能合約安全指南(由consensys 提供)時,我發現了這一點:
// INSECURE contract Auction { address currentLeader; uint highestBid; function bid() payable { require(msg.value > highestBid); require(currentLeader.send(highestBid)); // Refund the old leader, if it fails then revert currentLeader = msg.sender; highestBid = msg.value; } }
這裡的漏洞(引自指南):
當它嘗試給舊的領導者退款時,如果退款失敗,它會恢復。這意味著惡意競標者可以成為領導者,同時確保向其地址的任何退款將始終失敗。通過這種方式,他們可以阻止其他任何人呼叫 bid() 函式,並永遠保持領先地位。
某人如何使所有傳入交易(退款)到他們的地址失敗?如果是契約,我猜答案是
revert
在fallback
函式內部。在簡單地址的情況下,有人怎麼能做到呢?我在問,因為它真的讓我大吃一驚,因為我以前從未聽說過這個(因為我猜這有點毫無意義)。乾杯!
地址也可以是另一個合約,當拍賣試圖向它發送資金時執行。另一個合約可以執行非法指令或用盡所有 gas 以使退款交易失敗。
據我所知,向賬戶地址發送資金不會失敗(至少在發件人有足夠資金的情況下)。
只是在正確的現有答案之後添加更多資訊。只要您提供足夠的氣體,我就沒有辦法讓 EOA(外部擁有地址)的交易失敗。
當您將 Ether 發送到一個地址時,您可能不知道它是合約地址還是 EOA。或者,也許它是一個全新的地址,但(還)都不是。
如果您將 Ether 發送到未使用的地址,則交易不會失敗,但仍會保留在該地址中。之後,有人甚至可以創建一個使用該地址並具有備份恢復功能的合約,但乙太坊已經在該地址中,因此無法恢復。這是將 Ether 發送到合約中的一種方法,該合約沒有拒絕 Ether 的選項。