重入漏洞(Reentrancy Vulnerability)是一种常见的智能合约安全漏洞,它允许攻击者在调用某个函数时反复进入该函数并在每次进入时执行其他代码。这样可导致合约状态不一致、合约中的资产丢失或被盗。
以下是一个 Solidity 合约中的伪代码演示了一个可能存在重入漏洞的情况:
Copy Code
contract MyContract {
mapping(address => uint256) balances;
function withdraw(uint256 amount) public {
if (balances[msg.sender] >= amount) {
// 执行提现操作
msg.sender.transfer(amount);
// 更新账户余额
balances[msg.sender] -= amount;
}
}
function() payable {
// 收到以太币后更新账户余额
balances[msg.sender] += msg.value;
}
}
使用mutex锁解决重入攻击问题
contract MyContract {
mapping(address => uint256) balances;
bool private locked;
function withdraw(uint256 amount) public {
if (balances[msg.sender] >= amount && !locked) {
// 获取 Mutex 锁
locked = true;
// 执行提现操作
msg.sender.transfer(amount);
// 更新账户余额
balances[msg.sender] -= amount;
// 释放 Mutex 锁
locked = false;
}
}
function() payable {
// 收到以太币后更新账户余额
balances[msg.sender] += msg.value;
}
}
mutex锁: