solidity 重入攻击解释

solidity re-entrancy attack explanation

嘿,我有一个关于重新进入的问题,我明白了逻辑,但考虑到交易时间以及 A 和 B 中的两个函数都是在下一行

re-entrancy

假设我们有 2 份合同。持有一些以太币的目标合约属于攻击者合约。现在攻击者合约想要取钱

攻击者合约有两个函数:fallbackwithdraw

// this gets triggered when ether is receive
fallback(){
  A.withdraw()
}

attack(){
  A.withdraw()
}

假设攻击者合约调用 attack 函数。这将调用 withdraw 内部目标合约:

目标合约:

withdraw(){
  require balance>0
  send ether
  // before balance gets updated attacker's fallback triggers another withdraw
  // send function will give the control to the attacker's contract
  set balance of attacker =0
}

现在目标合约会将 ether 发送到攻击者的合约。当它发生时,攻击者的合约内部 fallback 函数被触发。 fallback 每次收到以太币时都会执行。我解释了

现在攻击者的合约收到以太币并立即在目标合约中调用withdraw。所以目标合约的withdraw函数一直在循环,直到目标合约的余额达到0

如果合同使用 call, send or transfer 这可能会导致 控制流到攻击者合约,因为这些函数为回退函数委托了足够的气体。一旦控制权传递给攻击者的合约,目标合约的状态将不完整。目标合约失去控制权。

Prevent reentrancy attacks