前置知识
- 回退函数(fallback function):每一个合约有且仅有一个没有名字的函数,无参数,无返回值
function() public payable{
...
}
回退函数在以下几种情况中被执行:
- 调用合约时没有匹配到任何一个函数
- 没有传数据
- 智能合约收到以太币
(为了接受以太币,fallback函数必须标记为payable)
- 硬分叉:添加无法向下兼容的新规则,使得以太坊网络存在两条链:运行新规则的新链和运行旧规则的旧链
第一次硬分叉:调整了未来挖矿的难度,确保未来的用户会有转换至权益证明的动机。
第二次硬分叉:2016年春季发布了第一个稳定版本,称作“家园”(Homestead)。
第三次硬分叉:DAO和区块链分叉。
第四次硬分叉:减重和防DDoS2016年11月底进行了第四次的分叉。这次分叉为区块链减重(de-bloat),并加入一些避免网络攻击的设计。
漏洞介绍
重入是以太坊早期最著名、最危险的攻击方式,在2016年的The DAO事件中造成了以太坊硬分叉。
重入攻击本质上与编程的递归调用相似,攻击合约利用fallback函数可以使受攻击合约在任意位置重新执行,绕过原设计者的限制,从而完成一些不允许的行为。
简要来说,含有.call.value()函数的智能合约都具有重入漏洞