智能合约安全与代币开发全解析
1. 智能合约重入攻击及解决方案
智能合约的安全性至关重要,其中重入攻击是一个常见且危险的漏洞。以 EtherPot 合约为例,在其 Withdraw
函数中,进行 Ether 转移时会自动调用黑客合约的 receive
函数,而 receive
函数又会再次调用 EtherPot 的 Withdraw
函数,如此循环,直到 EtherPot 合约中的 Ether 被耗尽。
为解决重入问题,可采用以下安全最佳实践:
- 检查合约账户 :这是一个可选方案,若不希望其他合约与当前合约交互,可使用 Solidity 的 extcodesize
汇编操作码来判断地址是否为合约账户。若代码长度大于 0,则为合约账户,可选择拒绝调用。示例代码如下:
/*uint length;
assembly {
length := extcodesize(sender)
}
if (length > 0) {
revert("contract addresses are not allowed!");
} */
- 采用 Checks - Effects - Interactions 范式 :该模式包含三个阶段:
- 检查阶段 :验证传入参数的正确性以及合约