1. 何为重入攻击?
如果一个计算机程序或子程序在执行过程中被中断,然后在前一次调用完成之前可被安全地再次调用,则称之为可重入。 中断的原因可为:
- 内部动作,如jump 或 call;
- 外部动作,如interrupt 或 signal。
一旦重入调用完成后,之前的调用就将恢复执行。使用某些代码执行此操作将导致重入攻击。
智能合约在其正常执行过程中可能会通过:
- function call
- 或 simply transfer Ether
来调用其它合约。 这些合约可:
- 自己调用其它合约
- call back to the contract that called them
- call back to any other in the call stack
这样的合约可称为是可重入的。 重入本身不是问题,但当其会引起状态不一致时,就有问题了。
当合约的相关不变量为true时,可认为state是一致的。如ERC20中,其主要不变量为:所有的balance之和不会超过已知的总供应量。
通常情况下,函数假设其开始运行时合约状态是一致的,函数运行后的状态也仍然是保持一致的。而在函数执行过程中,只要没人发现,其状态是可能是不一致的。此时,就有可能存在重入攻击的问题。 因此,不仅应要求执行后的状态一致,还应要求在每一个可能的重入点都保持状态一致。
2. 重入攻击举例以下代码存在重入攻击问题:
function withdraw(uint _amount) public {
if (amount
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?