-
bitcoin $77560.422694 USD
1.38% -
ethereum $2487.453153 USD
1.65% -
tether $0.999055 USD
0.00% -
bnb $754.929766 USD
3.97% -
xrp $1.325914 USD
1.70% -
usd-coin $0.999829 USD
-0.01% -
solana $105.756375 USD
5.69% -
tron $0.335859 USD
0.15% -
zcash $1491.934575 USD
9.81% -
hyperliquid $87.784577 USD
10.62% -
dogecoin $0.084281 USD
3.81% -
monero $531.066198 USD
7.27% -
chainlink $11.802944 USD
5.34% -
unus-sed-leo $8.892769 USD
-0.44% -
cardano $0.213660 USD
7.72%
堅牢性の再所属を防ぐ方法は?
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
堅実さでの再所属を理解する
再発は、内部状態の変更を完了する前に関数が信頼されていない契約に外部呼び出しを行うときに発生するSolidity Smart Contractsの重大なセキュリティの脆弱性です。これにより、外部契約は元の機能に再帰的に呼び戻すことができ、潜在的に資金を排出したり、契約のロジックを破壊したりすることができます。
2016年の悪名高いダオハックは、再発をどのように活用できるかの代表的な例でした。攻撃者は、契約がバランスを更新する前に、悪意のあるフォールバック関数を使用して引き出しを繰り返し引き起こし、数百万のエーテルを失いました。
このような脆弱性を防ぐために、開発者は外部呼び出しを確保するベストプラクティスと設計パターンを実装し、外部の相互作用の前に状態の変更が発生するようにする必要があります。
Checks-effects-interactionsパターンを使用します
再発を防ぐ最も効果的な方法の1つは、チェック効果のインタラクションパターンに従うことです。このパターンにより、外部呼び出しが実行される前に、すべての内部状態の変更が行われます。
- チェック:入力と条件を検証します。
- 効果:契約の状態変数を更新します。
- 相互作用:外部契約を呼び出すか、エーテルを送信します。
この命令を順守することにより、再発の試みが発生したとしても、内部状態がすでに更新されており、二重の支出または不正なバランスアクセスを防止していることを確認します。
たとえば、単純な引き出し関数を考えてみましょう。
function withdraw(uint amount) public {require(balances[msg.sender] >= amount); balances[msg.sender] -= amount; (bool success, ) = msg.sender.call{value: amount}(''); require(success);
}
この場合、バランスは外部呼び出しの前に更新され、再発から安全になります。
Mutexロックを実装します
再発を防ぐためのもう1つの効果的な方法は、 Mutex Lockを使用することです。これは、実行中の再発を防ぐ状態変数です。
簡単な例には、ブールフラグを使用して再入国をブロックすることが含まれます。
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のReentrancyGuardを使用します
Mutexロジックを手動で実装する代わりに、開発者は、安全でテストされたソリューションを提供するOpenzePpelinが提供するReentrancyGuard契約を使用できます。
ReentrancyGuardを使用するには:
- 契約のインポート:
import '@openzeppelin/contracts/security/ReentrancyGuard.sol'; - あなたの契約でそれから継承する:
contract MyContract is ReentrancyGuard -
nonReentrant修飾子を再発の影響を受けやすい関数に適用します。
pragma solidity ^0.8.0;'@openzeppelin/contracts/security/reintrancyguard.sol'をインポートします。契約securewithdrawalはreintrancyguardです{
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'); }}
このアプローチは、ミューテックスの取り扱いの複雑さを抽象化し、バグを導入するリスクを減らし、多くの開発者にとって好ましい方法になります。
生の通話を避け、安全に転送してください
Solidityでは、 address.call{value: ...}('')を使用すると、 transfer()またはsend()よりも柔軟性がありますが、ガス制限も削除され、再発に対して脆弱になります。
-
transfer()およびsend()は2300ガスのみを転送します。これは意味のある実行には不十分であり、それにより再発を防ぎます。 - ただし、
call()は利用可能なすべてのガスを転送し、攻撃者がフォールバック中に複雑な悪意のあるロジックを実行したり、機能を受け取ったりすることができます。
これを軽減するには:
- 単純なエーテル転送の場合は
transfer()またはsend()選択します。 -
call()を使用する必要がある場合は、コールの前に状態の変更が発生し、その再発ガードが配置されていることを確認してください。
FAQ:よくある質問
Q:堅実さの再発攻撃とは何ですか? A:再発攻撃は、外部契約が処刑を完了する前に呼び出し関数に呼び戻し、しばしば許可されていないファンドの撤回または州の腐敗につながるときに発生します。
Q:openzeppelinのReintrancyguardを使用せずに再所属を防ぐことはできますか? A:はい、チェックエフェクトインタラクションパターンを手動で実装するか、ミューテックスロックを使用して関数実行中の再発をブロックします。
Q:現代の堅牢性バージョンでaddress.transfer()を使用しても安全ですか? A: transfer()がガスを制限し、再発を防ぎますが、受信者契約がガスがなくなった場合、予期せずに失敗する可能性があります。単純な転送の場合call()よりも安全であると考えられています。
Q:すべての外部呼び出しは、堅牢性のすべての再所属に対して脆弱ですか? A:すべてではありませんが、ユーザー制御契約への外部呼び出しは潜在的なベクトルになる可能性があります。脆弱性は、状態がコール自体ではなく、外部呼び出しに続くと発生します。
免責事項:info@kdj.com
提供される情報は取引に関するアドバイスではありません。 kdj.com は、この記事で提供される情報に基づいて行われた投資に対して一切の責任を負いません。暗号通貨は変動性が高いため、十分な調査を行った上で慎重に投資することを強くお勧めします。
このウェブサイトで使用されているコンテンツが著作権を侵害していると思われる場合は、直ちに当社 (info@kdj.com) までご連絡ください。速やかに削除させていただきます。
- Binance 新規上場、SWIFT 17 銀行、Pepeto 100x 参入: 暗号通貨金融の次の波
- 2026-09-19 09:00:02
- ラガルド、バイナンス、そしてギリシャの策略:一か八かのEU規制対立
- 2026-09-19 08:55:01
- MemeToro 暗号のプレセールレビュー: パブリックコードは信頼を目指すが、$MT トークンは実行が鍵となる
- 2026-09-19 08:35:01
- アバランチチェーンがトークン化された資金と機関の成長を受け入れるにつれて、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. Bybit、OKX、Bitget など、SOL 永久先物または四半期先物がリストされている公式取引所プラットフォームに移動します。 2. SOL/USDT または SOL/USD 先物取引ペアのページに移動し、「契約概要」または「市場データ」タブに切り替えます...
XRP先物の出来高と建玉を確認するにはどうすればよいですか?
2026-09-15 05:00:12
リアルタイムのXRP先物データへのアクセス1. Binance、Bybit、OKX、Bitget など、XRP 無期限および四半期先物契約をリストしている主要なデリバティブ取引所にアクセスします。 2. XRP/USDT または XRP/USD 取引ペアのページに移動し、出来高と建玉の数値がリアルタ...
DOGE 先物の出来高と建玉を確認するにはどうすればよいですか?
2026-09-12 08:39:38
DOGE 先物ボリュームを理解する1. 先物取引高とは、特定の時間枠内で取引される DOGE 件の先物契約の総数を指し、通常は 1 日または 1 時間ごとに測定されます。 2. 出来高が多いということは、多くの場合、市場への参加が強力であることを示しており、価格変動の状況に応じてトレンドの継続または...
ETH先物の出来高と建玉を確認するにはどうすればよいですか?
2026-09-16 19:00:18
リアルタイムの ETH 先物データへのアクセス1. Binance、Bybit、OKX などの主要な集中取引所は、ETH の無期限および四半期先物の出来高と建玉を表示するライブ ダッシュボードを提供します。これらの指標は 5 ~ 10 秒ごとに更新され、公開市場ページからログインせずにアクセスできま...
BTC先物の出来高と建玉を確認するにはどうすればよいですか?
2026-09-12 15:19:55
BTC先物指標のデータソース1. CoinGlass API v4 は、30 以上の取引所にわたるリアルタイムの資金調達レート、清算ヒートマップ、および詳細な建玉の内訳を提供します。 2. Binance Futures API は、ビッドアスク深度、契約固有の出来高履歴、マージン率スナップショット...
DOGEUSDT 無期限契約チャートの見方
2026-09-11 19:19:48
DOGEUSDT 無期限チャートの価格アクションを理解する1. ローソク足の形成は、当面の市場センチメントを明らかにします。緑のローソクは買い優勢を示し、赤のローソクはその期間中の売り圧力を示します。 2. 本体の上下の芯は、価格の高値または低値の拒否を示します。不安定なミームコイン市場では、長い上...
SOL先物の出来高と建玉を確認するにはどうすればよいですか?
2026-09-14 00:40:03
SOL 先物市場データへのアクセス1. Bybit、OKX、Bitget など、SOL 永久先物または四半期先物がリストされている公式取引所プラットフォームに移動します。 2. SOL/USDT または SOL/USD 先物取引ペアのページに移動し、「契約概要」または「市場データ」タブに切り替えます...
XRP先物の出来高と建玉を確認するにはどうすればよいですか?
2026-09-15 05:00:12
リアルタイムのXRP先物データへのアクセス1. Binance、Bybit、OKX、Bitget など、XRP 無期限および四半期先物契約をリストしている主要なデリバティブ取引所にアクセスします。 2. XRP/USDT または XRP/USD 取引ペアのページに移動し、出来高と建玉の数値がリアルタ...
DOGE 先物の出来高と建玉を確認するにはどうすればよいですか?
2026-09-12 08:39:38
DOGE 先物ボリュームを理解する1. 先物取引高とは、特定の時間枠内で取引される DOGE 件の先物契約の総数を指し、通常は 1 日または 1 時間ごとに測定されます。 2. 出来高が多いということは、多くの場合、市場への参加が強力であることを示しており、価格変動の状況に応じてトレンドの継続または...
ETH先物の出来高と建玉を確認するにはどうすればよいですか?
2026-09-16 19:00:18
リアルタイムの ETH 先物データへのアクセス1. Binance、Bybit、OKX などの主要な集中取引所は、ETH の無期限および四半期先物の出来高と建玉を表示するライブ ダッシュボードを提供します。これらの指標は 5 ~ 10 秒ごとに更新され、公開市場ページからログインせずにアクセスできま...
BTC先物の出来高と建玉を確認するにはどうすればよいですか?
2026-09-12 15:19:55
BTC先物指標のデータソース1. CoinGlass API v4 は、30 以上の取引所にわたるリアルタイムの資金調達レート、清算ヒートマップ、および詳細な建玉の内訳を提供します。 2. Binance Futures API は、ビッドアスク深度、契約固有の出来高履歴、マージン率スナップショット...
DOGEUSDT 無期限契約チャートの見方
2026-09-11 19:19:48
DOGEUSDT 無期限チャートの価格アクションを理解する1. ローソク足の形成は、当面の市場センチメントを明らかにします。緑のローソクは買い優勢を示し、赤のローソクはその期間中の売り圧力を示します。 2. 本体の上下の芯は、価格の高値または低値の拒否を示します。不安定なミームコイン市場では、長い上...
すべての記事を見る














