-
bitcoin $77709.100515 USD
1.62% -
ethereum $2492.425806 USD
1.87% -
tether $0.999129 USD
0.01% -
bnb $757.919161 USD
4.46% -
xrp $1.326644 USD
1.83% -
usd-coin $0.999883 USD
0.00% -
solana $105.801069 USD
5.74% -
tron $0.336062 USD
0.26% -
zcash $1493.817548 USD
9.92% -
hyperliquid $87.820963 USD
10.59% -
dogecoin $0.084335 USD
3.93% -
monero $532.699812 USD
7.43% -
chainlink $11.814085 USD
5.52% -
unus-sed-leo $8.892918 USD
-0.42% -
cardano $0.214025 USD
7.76%
如何防止固体重新进入?
Reentrancy in Solidity occurs when an external call allows a malicious contract to recursively execute the same function, potentially draining funds or corrupting state.
2025/07/20 08:49
了解坚固的重新注入
重新输入是固体智能合约中的关键安全漏洞,当功能在完成内部状态变更之前对不受信任的合同进行外部呼叫时,就会发生。这使外部合同可以递归地回到原始功能,可能耗尽资金或破坏合同的逻辑。
2016年臭名昭著的DAO黑客是如何利用重新进入的一个典型例子。攻击者使用恶意的后备功能在合同更新其余额之前反复触发撤离,从而导致数百万的以太币损失。
为了防止此类漏洞,开发人员必须实施最佳实践和设计模式,以确保外部呼叫并确保在任何外部互动之前发生状态变化。
使用检查效应互动模式
防止重新进入的最有效方法之一是遵循检查效应互动模式。此模式可确保在执行任何外部呼叫之前进行所有内部状态更改。
- 检查:验证输入和条件。
- 效果:更新合同的状态变量。
- 互动:致电外部合同或发送以太。
通过遵守此订单,您可以确保即使发生重新输入尝试,内部状态也已被更新,以防止双人支出或未经授权的余额访问。
例如,考虑一个简单的提款功能:
function withdraw(uint amount) public {require(balances[msg.sender] >= amount); balances[msg.sender] -= amount; (bool success, ) = msg.sender.call{value: amount}(''); require(success);
}
在这种情况下,余额将在外部呼叫之前进行更新,从而使其免受重新输入。
实现Mutex锁
防止重新进入的另一种有效方法是使用MUTEX锁定,这是一种防止执行过程中重新进入的状态变量。
一个简单的示例涉及使用布尔标志来阻止重新进入:
bool private locked;函数提取(UINT金额)public {require(!locked); locked = true; require(balances[msg.sender] >= amount); balances[msg.sender] -= amount; (bool success, ) = msg.sender.call{value: amount}(''); require(success); locked = false;}
这样可以确保该函数在仍在执行时无法重新输入,从而有效地阻止了递归调用。但是,开发人员在使用静音时必须谨慎,以免产生僵局或意外行为。
使用openzeppelin的重新进入守卫
开发人员无需手动实施Mutex逻辑,而是使用OpenZeppelin提供的重新进入守卫合同,该合同提供了安全且经过测试的解决方案。
使用重新输入守卫:
- 导入合同:
import '@openzeppelin/contracts/security/ReentrancyGuard.sol'; - 您的合同中继承它:
contract MyContract is ReentrancyGuard - 将
nonReentrant修饰符应用于容易重新进入的功能。
pragma solidity ^0.8.0;导入'@openzeppelin/contracts/security/recentrancyguard.sol';合同securewithDrawal是重新进入guart {
mapping(address => uint) public balances; function deposit() external payable { balances[msg.sender] += msg.value; } function withdraw(uint amount) external nonReentrant { require(balances[msg.sender] >= amount, 'Insufficient balance'); balances[msg.sender] -= amount; (bool success, ) = msg.sender.call{value: amount}(''); require(success, 'Transfer failed'); }}
这种方法抽象了静音处理的复杂性,并降低了引入错误的风险,使其成为许多开发人员的首选方法。
避免原始呼叫并安全使用转移
在坚固的情况下,使用address.call{value: ...}('')比transfer()或send()更灵活,但它也消除了气体限制,使其容易受到重新进入。
-
transfer()和send()仅向前转发2300天气,这不足以进行任何有意义的执行,从而防止重新进入。 - 但是,
call()转发所有可用的气体,使攻击者可以在后备或接收功能期间执行复杂的恶意逻辑。
为此缓解:
- 对于简单的以太转移,更喜欢
transfer()或send()。 - 如果需要使用
call(),请确保状态变化发生在呼叫之前发生,并将重新进入警卫队进行。
常见问题解答:常见问题
问:什么是固体攻击是什么?答:当外部合同完成执行之前,外部合同回到呼叫功能时,会发生重新进入攻击,通常会导致未经授权的基金提款或州腐败。
问:我可以在不使用Openzeppelin的重新进入守卫的情况下防止重新进入吗?答:是的,通过手动实现检查效应互动模式或使用静音锁定在执行功能期间的重新输入。
问:在现代固体版本中使用address.transfer()安全吗?答:虽然transfer()限制气体并防止重新进入,但如果收件人合同用尽了气体,则可能意外失败。对于简单的传输,它仍然比call()更安全。
问:所有外部呼叫的坚固性是否容易被重新进入?答:不是全部,但是对用户控制合同的任何外部呼叫都可以是潜在的向量。当状态变化遵循外部呼叫而不是呼叫本身时,就会出现漏洞。
免责声明:info@kdj.com
所提供的信息并非交易建议。根据本文提供的信息进行的任何投资,kdj.com不承担任何责任。加密货币具有高波动性,强烈建议您深入研究后,谨慎投资!
如您认为本网站上使用的内容侵犯了您的版权,请立即联系我们(info@kdj.com),我们将及时删除。
- Binance 新上市、SWIFT 17 家银行和 Pepeto 100x 入门:加密货币金融的下一波浪潮
- 2026-09-19 09:00:02
- 拉加德、币安和希腊策略:一场高风险的欧盟监管僵局
- 2026-09-19 08:55:01
- MemeToro 加密货币预售审查:公共代码旨在获得信任,但执行是 $MT 代币的关键
- 2026-09-19 08:35:01
- 随着 Avalanche Chain 拥抱代币化基金和机构增长,AVAX 价格飙升
- 2026-09-18 16:50:01
- 日本央行加息:日元、比特币和套利交易的平仓
- 2026-09-18 12:50:01
- XRP Ledger 通过重大更新拥抱原生借贷和交易捆绑
- 2026-09-18 12:30:01
相关百科
如何查看SOL期货成交量和持仓量?
2026-09-14 00:40:03
访问 SOL 期货市场数据1. 前往SOL永续合约或季度合约上市的官方交易平台,例如Bybit、OKX或Bitget。 2. 找到SOL/USDT或SOL/USD期货交易对页面,切换到“合约概览”或“市场数据”选项卡。 3. 识别标记为“交易量(24 小时)”和“未平仓合约”的实时字段,这两个字段通...
如何查看XRP期货交易量和持仓量?
2026-09-15 05:00:12
访问实时 XRP 期货数据1. 访问列出 XRP 永续合约和季度期货合约的主要衍生品交易所,包括 Binance、Bybit、OKX 和 Bitget。 2. 导航至XRP/USDT或XRP/USD交易对页面,找到实时显示交易量和持仓量数据的市场深度面板。 3. 确认显示的持仓量是否反映了多头/空头...
如何查看DOGE期货成交量及持仓量?
2026-09-12 08:39:38
了解 DOGE 期货交易量1. 期货交易量是指在特定时间范围内交易的DOGE份期货合约的总数,通常以每天或每小时计算。 2. 高成交量通常表明市场参与度较高,并且可以表明潜在的趋势延续或逆转,具体取决于价格走势背景。 3. 交易者监控交易量峰值以及突破或崩溃,以评估合法性——交易量上升支持的持续价格...
如何查看ETH期货交易量和持仓量?
2026-09-16 19:00:18
访问实时 ETH 期货数据1. Binance、Bybit和OKX等主要中心化交易所提供实时仪表板,显示ETH永续和季度期货交易量和持仓量。这些指标每 5-10 秒更新一次,无需登录其公开市场页面即可访问。 2. Glassnode、CryptoQuant 和 Coinglass 等链上分析平台可以...
如何查看BTC期货交易量和持仓量?
2026-09-12 15:19:55
BTC期货指标的数据源1. CoinGlass API v4 提供 30 多个交易所的实时融资利率、清算热图和精细的未平仓合约细分。 2. 币安期货 API 提供对买卖深度、合约特定交易量历史记录和保证金比率快照的本机访问。 3. OKX 数据门户提供可下载的 CSV 档案,其中包含每日结算价格、按...
如何看懂DOGEUSDT永续合约图表?
2026-09-11 19:19:48
了解 DOGEUSDT 永续图表上的价格走势1. 蜡烛图的形成揭示了直接的市场情绪——绿色蜡烛表示买盘占主导地位,而红色蜡烛则反映该区间内的抛售压力。 2. 实体上方和下方的灯芯信号拒绝更高或更低的价格;在波动较大的模因币市场中,长上影线通常先于短期反转。 3. 接近关键水平的连续小实体蜡烛表明在突...
如何查看SOL期货成交量和持仓量?
2026-09-14 00:40:03
访问 SOL 期货市场数据1. 前往SOL永续合约或季度合约上市的官方交易平台,例如Bybit、OKX或Bitget。 2. 找到SOL/USDT或SOL/USD期货交易对页面,切换到“合约概览”或“市场数据”选项卡。 3. 识别标记为“交易量(24 小时)”和“未平仓合约”的实时字段,这两个字段通...
如何查看XRP期货交易量和持仓量?
2026-09-15 05:00:12
访问实时 XRP 期货数据1. 访问列出 XRP 永续合约和季度期货合约的主要衍生品交易所,包括 Binance、Bybit、OKX 和 Bitget。 2. 导航至XRP/USDT或XRP/USD交易对页面,找到实时显示交易量和持仓量数据的市场深度面板。 3. 确认显示的持仓量是否反映了多头/空头...
如何查看DOGE期货成交量及持仓量?
2026-09-12 08:39:38
了解 DOGE 期货交易量1. 期货交易量是指在特定时间范围内交易的DOGE份期货合约的总数,通常以每天或每小时计算。 2. 高成交量通常表明市场参与度较高,并且可以表明潜在的趋势延续或逆转,具体取决于价格走势背景。 3. 交易者监控交易量峰值以及突破或崩溃,以评估合法性——交易量上升支持的持续价格...
如何查看ETH期货交易量和持仓量?
2026-09-16 19:00:18
访问实时 ETH 期货数据1. Binance、Bybit和OKX等主要中心化交易所提供实时仪表板,显示ETH永续和季度期货交易量和持仓量。这些指标每 5-10 秒更新一次,无需登录其公开市场页面即可访问。 2. Glassnode、CryptoQuant 和 Coinglass 等链上分析平台可以...
如何查看BTC期货交易量和持仓量?
2026-09-12 15:19:55
BTC期货指标的数据源1. CoinGlass API v4 提供 30 多个交易所的实时融资利率、清算热图和精细的未平仓合约细分。 2. 币安期货 API 提供对买卖深度、合约特定交易量历史记录和保证金比率快照的本机访问。 3. OKX 数据门户提供可下载的 CSV 档案,其中包含每日结算价格、按...
如何看懂DOGEUSDT永续合约图表?
2026-09-11 19:19:48
了解 DOGEUSDT 永续图表上的价格走势1. 蜡烛图的形成揭示了直接的市场情绪——绿色蜡烛表示买盘占主导地位,而红色蜡烛则反映该区间内的抛售压力。 2. 实体上方和下方的灯芯信号拒绝更高或更低的价格;在波动较大的模因币市场中,长上影线通常先于短期反转。 3. 接近关键水平的连续小实体蜡烛表明在突...
查看所有文章














