Reentrant-Attacks

檢查-效果-互動和不變數

  • November 6, 2021

請檢查論文的以下連結(第 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
}

將不變數理解為在程式碼中前進所需的條件更簡單。

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