Solidity智能合约的重入攻击 |
您所在的位置:网站首页 › 智能合约的作用 › Solidity智能合约的重入攻击 |
1. 何为重入攻击?
如果一个计算机程序或子程序在执行过程中被中断,然后在前一次调用完成之前可被安全地再次调用,则称之为可重入。 中断的原因可为: 内部动作,如jump 或 call;外部动作,如interrupt 或 signal。一旦重入调用完成后,之前的调用就将恢复执行。使用某些代码执行此操作将导致重入攻击。 智能合约在其正常执行过程中可能会通过: function call或 simply transfer Ether来调用其它合约。 这些合约可: 自己调用其它合约call back to the contract that called themcall back to any other in the call stack这样的合约可称为是可重入的。 重入本身不是问题,但当其会引起状态不一致时,就有问题了。 当合约的相关不变量为true时,可认为state是一致的。如ERC20中,其主要不变量为:所有的balance之和不会超过已知的总供应量。 通常情况下,函数假设其开始运行时合约状态是一致的,函数运行后的状态也仍然是保持一致的。而在函数执行过程中,只要没人发现,其状态是可能是不一致的。此时,就有可能存在重入攻击的问题。 因此,不仅应要求执行后的状态一致,还应要求在每一个可能的重入点都保持状态一致。 2. 重入攻击举例以下代码存在重入攻击问题: function withdraw(uint _amount) public { if (amount |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |