広場
最新
注目
ニュース
プロフィール
ポスト
HalfBuddhaMoney
2026-05-14 15:11:42
フォロー
自分は、あなたがあまりよく理解していないかもしれない重要なことを共有したいです。それは、スマートコントラクトのリエントランシー(再入)脆弱性です。もしあなたがdAppを開発していたり、ブロックチェーンに関わっているなら、これは必須知識です。
リエントランシーの基本的な問題は何ですか?それは、あるスマートコントラクトが別のコントラクトを呼び出し、そのコントラクトが元のコントラクトを再度呼び出すことができる場合に発生します。攻撃者はこの間の時間を利用して資金を盗むことができます。
想像してみてください。ContractAに10 Etherがあり、ContractBがそこに1 Etherを送ったとします。ContractBが引き出し関数を呼び出すと、ContractAは残高が0より大きいかどうかを確認し、もしそうならEtherを返します。しかしここに問題があります。ContractAは送金後に残高を更新します。つまり、送金中に、もしContractBにfallback関数があれば、ContractAの引き出し関数を再度呼び出すことができてしまいます。残高がまだ更新されていないため、再度のチェックは成功し、さらに1 Etherを受け取ってしまいます。このループは、ContractAの残高がなくなるまで続きます。
ここから、リエントランシー攻撃からコントラクトを守るための3つの方法を紹介します。
1つ目は、nonReentrant修飾子を使うことです。これは非常にシンプルなアイデアで、関数が実行中の間、コントラクトをロックします。誰かがその関数を再度呼び出そうとすると、ロックされているため拒否されます。関数の処理が完了してからロックを解除し、その後に再呼び出しを許可します。
2つ目は、Checks-Effects-Interactionsパターンを採用することです。資金を送る前に残高を更新し、送金後に更新しないのではなく、残高のチェックの直後に更新します。こうすれば、他のコントラクトが再度呼び出してきても、既に残高は0になっているため、チェックに失敗します。この順序が非常に重要です。まずチェックを行い、その後に状態を更新し、最後に外部コントラクトとやり取りします。
3つ目は、GlobalReentrancyGuardという独自のガードコントラクトを作ることです。これは特に複数のコントラクトが連携している場合に有効です。個々の関数を守るのではなく、共通のガードコントラクトを作り、ロック状態を一元管理します。どのコントラクトもこのガードを参照し、もしロックされていれば取引を拒否します。これにより、複数のコントラクト間でもリエントランシーを防止できます。
私は、状況に応じてこれら3つの技術を併用することを推奨します。特に資金の引き出しや資産の送信を行う関数には、常にnonReentrantやChecks-Effects-Interactionsを使うべきです。また、複雑なシステムを構築している場合は、GlobalReentrancyGuardを追加の保護層として検討してください。
これは最も一般的な脆弱性の一つで、多額の資金を失う原因となるため、リエントランシーについてしっかり理解して、安全なスマートコントラクトを書くことが非常に重要です。
XCH
-3.5%
TRA
0.22%
XEM
-1.09%
原文表示
このページには第三者のコンテンツが含まれている場合があり、情報提供のみを目的としております(表明・保証をするものではありません)。Gateによる見解の支持や、金融・専門的な助言とみなされるべきものではありません。詳細については
免責事項
をご覧ください。
報酬
いいね
コメント
リポスト
共有
コメント
コメントを追加
コメントを追加
コメント
コメントなし
人気の話題
もっと見る
#
TradfiTradingChallenge
245.05K 人気度
#
PlatinumCardCreatorExclusive
60.44K 人気度
#
IsraelStrikesIranBTCPlunges
48.62K 人気度
#
#DailyPolymarketHotspot
1.02M 人気度
#
GateSquarePizzaDay
1.72M 人気度
ピン留め
サイトマップ
自分は、あなたがあまりよく理解していないかもしれない重要なことを共有したいです。それは、スマートコントラクトのリエントランシー(再入)脆弱性です。もしあなたがdAppを開発していたり、ブロックチェーンに関わっているなら、これは必須知識です。
リエントランシーの基本的な問題は何ですか?それは、あるスマートコントラクトが別のコントラクトを呼び出し、そのコントラクトが元のコントラクトを再度呼び出すことができる場合に発生します。攻撃者はこの間の時間を利用して資金を盗むことができます。
想像してみてください。ContractAに10 Etherがあり、ContractBがそこに1 Etherを送ったとします。ContractBが引き出し関数を呼び出すと、ContractAは残高が0より大きいかどうかを確認し、もしそうならEtherを返します。しかしここに問題があります。ContractAは送金後に残高を更新します。つまり、送金中に、もしContractBにfallback関数があれば、ContractAの引き出し関数を再度呼び出すことができてしまいます。残高がまだ更新されていないため、再度のチェックは成功し、さらに1 Etherを受け取ってしまいます。このループは、ContractAの残高がなくなるまで続きます。
ここから、リエントランシー攻撃からコントラクトを守るための3つの方法を紹介します。
1つ目は、nonReentrant修飾子を使うことです。これは非常にシンプルなアイデアで、関数が実行中の間、コントラクトをロックします。誰かがその関数を再度呼び出そうとすると、ロックされているため拒否されます。関数の処理が完了してからロックを解除し、その後に再呼び出しを許可します。
2つ目は、Checks-Effects-Interactionsパターンを採用することです。資金を送る前に残高を更新し、送金後に更新しないのではなく、残高のチェックの直後に更新します。こうすれば、他のコントラクトが再度呼び出してきても、既に残高は0になっているため、チェックに失敗します。この順序が非常に重要です。まずチェックを行い、その後に状態を更新し、最後に外部コントラクトとやり取りします。
3つ目は、GlobalReentrancyGuardという独自のガードコントラクトを作ることです。これは特に複数のコントラクトが連携している場合に有効です。個々の関数を守るのではなく、共通のガードコントラクトを作り、ロック状態を一元管理します。どのコントラクトもこのガードを参照し、もしロックされていれば取引を拒否します。これにより、複数のコントラクト間でもリエントランシーを防止できます。
私は、状況に応じてこれら3つの技術を併用することを推奨します。特に資金の引き出しや資産の送信を行う関数には、常にnonReentrantやChecks-Effects-Interactionsを使うべきです。また、複雑なシステムを構築している場合は、GlobalReentrancyGuardを追加の保護層として検討してください。
これは最も一般的な脆弱性の一つで、多額の資金を失う原因となるため、リエントランシーについてしっかり理解して、安全なスマートコントラクトを書くことが非常に重要です。