市值: $2.641T 0.40%
成交额(24h): $98.8166B 16.07%
恐惧与贪婪指数:

68 - 贪婪

  • 市值: $2.641T 0.40%
  • 成交额(24h): $98.8166B 16.07%
  • 恐惧与贪婪指数:
  • 市值: $2.641T 0.40%
加密货币
话题
百科
资讯
加密话题
视频
热门加密百科

选择语种

选择语种

选择货币

加密货币
话题
百科
资讯
加密话题
视频

了解智能合约中的重入攻击(DAO 黑客解释)

A reentrancy attack exploits Ethereum’s execution model by recursively calling a vulnerable function before state updates, as seen in The DAO hack—where $50M was drained due to updating balances after external calls.

2026/01/16 01:40

什么是重入攻击?

1. 当外部合约在初始执行完成之前回调当前合约时,就会发生重入攻击。

2. 此漏洞是由于不正确的状态管理而产生的,具体来说,当状态变量在外部调用之后而不是之前更新时。

3. 攻击者部署包含回退函数的恶意合约,该函数会递归调用目标合约中的易受攻击函数。

4. 每个递归调用都会重新进入相​​同的逻辑路径,反复耗尽资金,而不会更新余额,直到整个调用堆栈展开。

5. 此类攻击利用以太坊的同步、单线程执行模型,其中外部调用在调用上下文中保留控制流。

DAO 事件:历史崩溃

1. DAO 是 2016 年在以太坊上推出的去中心化自治组织,旨在作为受智能合约规则管理的风险投资基金。

2.其代码允许代币持有者从 DAO 中分离出来,并通过调用splitDAO函数来回收以太币。

3. 该函数在更新内部余额之前将以太币转移到请求者的地址,创建一个经典的可重入窗口。

4. 攻击者部署了具有后备功能的合约,在收到资金后再次触发splitDAO

5. 在多次嵌套调用中,超过 360 万 ETH(当时价值超过 5000 万美元)在交易恢复或停止之前被抽走。

以太坊的执行模型如何实现可重入

1. Solidity 中的每个外部调用都在相同的事务上下文中执行,保留内存、存储和调用堆栈的可见性。

2. 除非通过“检查-效果-交互”等模式显式实现,否则不存在自动重入防护。

3. Gas limit 并不能阻止递归;它们仅限制总计算量,并且回退函数需要最少的 Gas 来执行。

4. EVM 不强制调用者和被调用者之间的隔离——被调用者所做的状态更改在其持续执行期间对调用者是可见的。

5. 开发人员经常低估合约交互的相互依赖程度,尤其是在涉及第三方代币或预言机时。

需要重入的常见代码模式

1. 在发送以太币或调用外部合约(而不是之前)之后更新余额或标志。

2. 使用call.value()()而不验证返回值或限制递归深度。

3.依靠this.balance进行记账,而不是跟踪存储变量中的余额。

4. 实现没有锁、互斥体或重入修饰符(例如 OpenZeppelin 的ReentrancyGuard)的撤回模式。

5. 未能审核继承逻辑——尤其是在使用代理模式或可升级合约(其中 delegatecall 保留上下文)时。

常见问题解答

问:ERC-20 转账会发生重入吗?答:标准 ERC-20 传输函数不会触发外部调用,因此无法实现原生重入。然而,像transferFrom这样的扩展与钩子相结合(例如,在ERC-777中)引入了可能发生重入的回调表面。

问:DAO 黑客攻击是否会因为硬分叉而可逆?答:是的。以太坊社区执行了硬分叉,通过重写链历史来恢复被盗资金,导致以太坊和以太坊经典分裂。

问:现代 Solidity 版本默认情况下会阻止重入吗?答:不会。Solidity v0.8.x 包括更安全的算术和恢复行为,但不会自动注入重入保护。开发人员仍然必须手动应用防御模式。

问:使用require(msg.sender.call{value: amount}(''))address.send()更安全吗?答:两者本质上都不是安全的。如果在状态更新之前使用,两者都允许重入。关键因素是交互顺序,而不是特定的调用机制。

免责声明:info@kdj.com

所提供的信息并非交易建议。根据本文提供的信息进行的任何投资,kdj.com不承担任何责任。加密货币具有高波动性,强烈建议您深入研究后,谨慎投资!

如您认为本网站上使用的内容侵犯了您的版权,请立即联系我们(info@kdj.com),我们将及时删除。

相关百科

如何查看DOGE期货成交量及持仓量?

如何查看DOGE期货成交量及持仓量?

2026-09-12 08:39:38

了解 DOGE 期货交易量1. 期货交易量是指在特定时间范围内交易的DOGE份期货合约的总数,通常以每天或每小时计算。 2. 高成交量通常表明市场参与度较高,并且可以表明潜在的趋势延续或逆转,具体取决于价格走势背景。 3. 交易者监控交易量峰值以及突破或崩溃,以评估合法性——交易量上升支持的持续价格...

如何查看BTC期货交易量和持仓量?

如何查看BTC期货交易量和持仓量?

2026-09-12 15:19:55

BTC期货指标的数据源1. CoinGlass API v4 提供 30 多个交易所的实时融资利率、清算热图和精细的未平仓合约细分。 2. 币安期货 API 提供对买卖深度、合约特定交易量历史记录和保证金比率快照的本机访问。 3. OKX 数据门户提供可下载的 CSV 档案,其中包含每日结算价格、按...

如何看懂DOGEUSDT永续合约图表?

如何看懂DOGEUSDT永续合约图表?

2026-09-11 19:19:48

了解 DOGEUSDT 永续图表上的价格走势1. 蜡烛图的形成揭示了直接的市场情绪——绿色蜡烛表示买盘占主导地位,而红色蜡烛则反映该区间内的抛售压力。 2. 实体上方和下方的灯芯信号拒绝更高或更低的价格;在波动较大的模因币市场中,长上影线通常先于短期反转。 3. 接近关键水平的连续小实体蜡烛表明在突...

如何在币安查看BTC合约资金费用?

如何在币安查看BTC合约资金费用?

2026-09-10 08:00:06

找到资金费率显示1. 进入币安合约交易界面,选择BTCUSDT永续合约。 2. 观察价格图表正下方或订单簿附近的区域——该区域包含一个标有资金费率的标签框。 3. 显示值实时更新,反映当前每小时的资金费率,无论是正数还是负数。 4. 单击资金费率框将打开一个弹出窗口,显示多个结算周期的历史资金价值。...

如何计算SOLUSDT期货盈亏?

如何计算SOLUSDT期货盈亏?

2026-09-10 19:19:37

了解 SOLUSDT 期货合约规格1、每张SOLUSDT期货合约均以USDT报价,以USDT结算,为线性永续合约。 2.基础资产为SOL,报价资产为USDT——所有盈亏计算均直接以USDT计价。 3. 价格变动的最小变动单位为0.01 USDT,合约乘数固定为每张合约1 SOL。 4. Bitget...

如何计算XRPUSDT期货盈亏?

如何计算XRPUSDT期货盈亏?

2026-09-09 17:40:21

了解 XRPUSDT 期货合约规格1、每张XRPUSDT永续合约以USDT报价,以USDT结算,每张合约面值为1XRP。 2. 对于包括 Binance 和 Bybit 在内的大多数主要交易所,最小价格增量(报价单位)为 0.0001 美元。 3. 杠杆范围从 1 倍到 75 倍不等,具体取决于头寸...

如何查看DOGE期货成交量及持仓量?

如何查看DOGE期货成交量及持仓量?

2026-09-12 08:39:38

了解 DOGE 期货交易量1. 期货交易量是指在特定时间范围内交易的DOGE份期货合约的总数,通常以每天或每小时计算。 2. 高成交量通常表明市场参与度较高,并且可以表明潜在的趋势延续或逆转,具体取决于价格走势背景。 3. 交易者监控交易量峰值以及突破或崩溃,以评估合法性——交易量上升支持的持续价格...

如何查看BTC期货交易量和持仓量?

如何查看BTC期货交易量和持仓量?

2026-09-12 15:19:55

BTC期货指标的数据源1. CoinGlass API v4 提供 30 多个交易所的实时融资利率、清算热图和精细的未平仓合约细分。 2. 币安期货 API 提供对买卖深度、合约特定交易量历史记录和保证金比率快照的本机访问。 3. OKX 数据门户提供可下载的 CSV 档案,其中包含每日结算价格、按...

如何看懂DOGEUSDT永续合约图表?

如何看懂DOGEUSDT永续合约图表?

2026-09-11 19:19:48

了解 DOGEUSDT 永续图表上的价格走势1. 蜡烛图的形成揭示了直接的市场情绪——绿色蜡烛表示买盘占主导地位,而红色蜡烛则反映该区间内的抛售压力。 2. 实体上方和下方的灯芯信号拒绝更高或更低的价格;在波动较大的模因币市场中,长上影线通常先于短期反转。 3. 接近关键水平的连续小实体蜡烛表明在突...

如何在币安查看BTC合约资金费用?

如何在币安查看BTC合约资金费用?

2026-09-10 08:00:06

找到资金费率显示1. 进入币安合约交易界面,选择BTCUSDT永续合约。 2. 观察价格图表正下方或订单簿附近的区域——该区域包含一个标有资金费率的标签框。 3. 显示值实时更新,反映当前每小时的资金费率,无论是正数还是负数。 4. 单击资金费率框将打开一个弹出窗口,显示多个结算周期的历史资金价值。...

如何计算SOLUSDT期货盈亏?

如何计算SOLUSDT期货盈亏?

2026-09-10 19:19:37

了解 SOLUSDT 期货合约规格1、每张SOLUSDT期货合约均以USDT报价,以USDT结算,为线性永续合约。 2.基础资产为SOL,报价资产为USDT——所有盈亏计算均直接以USDT计价。 3. 价格变动的最小变动单位为0.01 USDT,合约乘数固定为每张合约1 SOL。 4. Bitget...

如何计算XRPUSDT期货盈亏?

如何计算XRPUSDT期货盈亏?

2026-09-09 17:40:21

了解 XRPUSDT 期货合约规格1、每张XRPUSDT永续合约以USDT报价,以USDT结算,每张合约面值为1XRP。 2. 对于包括 Binance 和 Bybit 在内的大多数主要交易所,最小价格增量(报价单位)为 0.0001 美元。 3. 杠杆范围从 1 倍到 75 倍不等,具体取决于头寸...

查看所有文章

User not found or password invalid

Your input is correct