広場
最新
注目
ニュース
プロフィール
ポスト
StakeWhisperer
2026-05-03 04:11:19
フォロー
私はリエントランシーについての分析記事を書き終えました - これは多くの開発者がスマートコントラクトを構築する際に見落としがちなセキュリティの問題です。
簡単に言えば、リエントランシーとは、最初の呼び出しが完了する前にスマートコントラクトが何度も呼び出される状態のことです。こう考えてください:ContractAが関数を実行しているとき、ContractAはContractBを呼び出し、ContractBはその間にContractAを再度呼び出す。これが脆弱性となり、攻撃者が悪用できるのです。
具体例を挙げると、EtherStoreには10 Etherがあり、ContractBに1 Etherを送ったとします。ContractBが引き出し関数を呼び出すとき、残高が0より大きいかどうかをチェックし、もしそうならEtherを返します。しかしここが危険なポイントです—残高の更新(0にする処理)は送金後に行われるためです。そのため、攻撃者はfallback関数を作成し、Etherを受け取ったときに再度引き出し関数を呼び出すことができるのです。このループは、Etherがなくなるまで続きます。
リエントランシーを防ぐための3つの方法を紹介します。
一つ目はnonReentrant修飾子を使うことです。この修飾子は関数が実行中の間、コントラクトをロックし、再入を防ぎます。シンプルですが、一つの関数に対して効果的です。
二つ目はChecks-Effects-Interactionsパターンを適用することです。送金後に残高を更新するのではなく、送金前に更新します。こうすれば、再呼び出しがあった場合でも、残高は既に0になっているため、チェックに引っかかります。
三つ目は、GlobalReentrancyGuardという独立したコントラクトを作成することです。これは共通の状態変数を使って複数のコントラクトのリエントランシーを一括管理します。特に、複数のコントラクトが相互に連携しているプロジェクトでは有効です。個別にチェックするのではなく、一箇所で集中管理できます。
リエントランシーの問題は新しいものではありませんが、依然として最も一般的な脆弱性の一つです。多くの開発者がこれらの対策を一貫して適用していないのを見かけます。もしSolidityを使っているなら、この問題を理解し、少なくとも上記の3つの方法のうち一つをあなたのプロジェクトに取り入れることを強くおすすめします。スマートコントラクトのセキュリティは任意ではなく、必須です。
原文表示
このページには第三者のコンテンツが含まれている場合があり、情報提供のみを目的としております(表明・保証をするものではありません)。Gateによる見解の支持や、金融・専門的な助言とみなされるべきものではありません。詳細については
免責事項
をご覧ください。
報酬
いいね
コメント
リポスト
共有
コメント
コメントを追加
コメントを追加
コメント
コメントなし
人気の話題
もっと見る
#
WCTCTradingKingPK
536.95K 人気度
#
USSeeksStrategicBitcoinReserve
58.75M 人気度
#
IsraelStrikesIranBTCPlunges
39.51K 人気度
#
BitcoinETFOptionLimitQuadruples
1.02M 人気度
#
#FedHoldsRateButDividesDeepen
42.73K 人気度
ピン
サイトマップ
私はリエントランシーについての分析記事を書き終えました - これは多くの開発者がスマートコントラクトを構築する際に見落としがちなセキュリティの問題です。
簡単に言えば、リエントランシーとは、最初の呼び出しが完了する前にスマートコントラクトが何度も呼び出される状態のことです。こう考えてください:ContractAが関数を実行しているとき、ContractAはContractBを呼び出し、ContractBはその間にContractAを再度呼び出す。これが脆弱性となり、攻撃者が悪用できるのです。
具体例を挙げると、EtherStoreには10 Etherがあり、ContractBに1 Etherを送ったとします。ContractBが引き出し関数を呼び出すとき、残高が0より大きいかどうかをチェックし、もしそうならEtherを返します。しかしここが危険なポイントです—残高の更新(0にする処理)は送金後に行われるためです。そのため、攻撃者はfallback関数を作成し、Etherを受け取ったときに再度引き出し関数を呼び出すことができるのです。このループは、Etherがなくなるまで続きます。
リエントランシーを防ぐための3つの方法を紹介します。
一つ目はnonReentrant修飾子を使うことです。この修飾子は関数が実行中の間、コントラクトをロックし、再入を防ぎます。シンプルですが、一つの関数に対して効果的です。
二つ目はChecks-Effects-Interactionsパターンを適用することです。送金後に残高を更新するのではなく、送金前に更新します。こうすれば、再呼び出しがあった場合でも、残高は既に0になっているため、チェックに引っかかります。
三つ目は、GlobalReentrancyGuardという独立したコントラクトを作成することです。これは共通の状態変数を使って複数のコントラクトのリエントランシーを一括管理します。特に、複数のコントラクトが相互に連携しているプロジェクトでは有効です。個別にチェックするのではなく、一箇所で集中管理できます。
リエントランシーの問題は新しいものではありませんが、依然として最も一般的な脆弱性の一つです。多くの開発者がこれらの対策を一貫して適用していないのを見かけます。もしSolidityを使っているなら、この問題を理解し、少なくとも上記の3つの方法のうち一つをあなたのプロジェクトに取り入れることを強くおすすめします。スマートコントラクトのセキュリティは任意ではなく、必須です。