Reentrant-Attacks
檢查-效果-互動和不變數
請檢查論文的以下連結(第 2.1.5 節):
SmartCheck 論文 來自論文:
Use the “checks – effects – interactions“ pattern: (a)first check the invariants, (b)then update the internal state, (c)then communicate with external entities (see also Section 2.1.4): 1.function withdraw () public { 2.uint balance = balances [ msg . sender ]; 3.balances [ msg . sender ] = 0; 4.msg . sender . transfer ( balance ); // state reverted , balance restored if transfer fails }
上面程式碼中的不變數是什麼?如果餘額
$$ msg.sender $$是不變數,那麼它的值在第 3 行發生變化。有人,請指導我檢查 - 效果 - 互動模式的步驟 (a)。
我認為這個稍作修改的範例可能更通用,因為 CHECK 步驟顯然存在(我相信他們省略了它,因為有人撤回 0 對系統來說不是問題……只是為呼叫者浪費了 gas)。
function withdraw () public { // CHECK require(balances[msg.sender] > 0); // EFFECT uint256 balance = balances[msg.sender]; balances[msg.sender] = 0; // INTERACTION payable(msg.sender).transfer(balance); // state reverted , balance restored if transfer fails }
將不變數理解為在程式碼中前進所需的條件更簡單。