隠された所有者特権: '検証済み'コントラクト内の危険な管理者機能

— By Tony Rabbit in Tutorials

隠された所有者特権: '検証済み'コントラクト内の危険な管理者機能

検証済みのソースコードがトークンの安全性を意味するわけではありません。あらゆるコントラクトのWrite-functionリストを監査し、blacklist()やpause()のような所有者のみの特権を見つけ、無害な管理者ツールとホルダーを罠にかけるバックドアを区別する方法を学びましょう。

スマートコントラクトに隠された所有者特権とは、トークンデプロイヤーがあなたが購入した後にルールを変更できる管理者のみの機能であり、ブロックエクスプローラー上では完全にクリーンに見えるコントラクトにも日常的に存在します。危険な点は、ソースコードの検証は公開されたコードがオンチェーンのバイトコードと一致することを証明するだけであり、そのコードが何を行うことを許可されているかについては何も語らないことです。コントラクトは検証され、監査され、部分的に所有権が放棄されていても、所有者がウォレットを凍結したり、売却を制限したり、何もないところから新しい供給をミントしたりできる機能を依然として持っている可能性があります。このガイドは実践的な監査であり、用語集ではありません。どの機能を具体的に探すべきか、エクスプローラーでそれらを読み取る方法、そして通常の管理者ツールと罠を区別する方法を正確に学びます。

主なポイント

  • 検証はコードがバイトコードと一致することを証明するものであり、コードが安全であることを証明するものではありません。
  • blacklist()、pause()、および取引トグルは、あなたの売却注文を永久に凍結する可能性があります。
  • ミントバックドアは、流動性プールに触れることなく開発者がホルダーを希釈することを可能にします。
  • エクスプローラーのWriteタブを読み、誰がそれらを呼び出すことができ、何を変更するかによって機能を判断してください。

検証済みまたは部分的に所有権が放棄されたコントラクトが依然として危険である理由

検証は透明性の機能であり、安全性の保証ではありません。プロジェクトがコントラクトを検証すると、エクスプローラーは提出されたソースをコンパイルし、それが既にデプロイされている正確なバイトコードを生成することを確認します。これは、16進数を見つめる代わりにコントラクトが何をするかを読み取ることができるため、本当に役立ちます。しかし、悪意のある開発者も検証を望んでいます。なぜなら、クリーンで読みやすいコントラクトは、未検証のコントラクトよりも早く信頼を築くからです。多くの詐欺は意図的に検証済みのコードを出荷します。この区別が不明確な場合は、検証済みコントラクトが実際に意味するものに関する私たちの解説で、その限界を詳しく説明しています。

所有権の放棄にも同様のギャップがあります。開発者は標準の所有者ロールを放棄しても、ロジックにハードコードされた2番目の特権アドレスを保持したり、危険なセッターがすでに損害を与えた後にのみ放棄したりすることができます。また、危険な関数が誰でも呼び出し可能に書かれていた場合や、そもそも所有権の背後にゲートされていなかった場合、放棄は何の効果もありません。放棄されたコントラクトが本当に証明するものに関する私たちの分析を、放棄をゴーサインと見なす前に読んでください。正直なまとめ: 検証済みと放棄済みは出発点であり、最終的な判断ではありません。

スマートコントラクトで探すべき隠された所有者特権

ほとんどのホルダーを罠にかける権限は、少数の所有者のみの機能に存在します。これらの名前を覚えれば、1、2分でコントラクトをスキャンできます。開発者はしばしばそれらの名前を変更することに注意してください。そのため、ラベルだけでなく動作で判断してください。

  • blacklist() / setBlacklist() / addBot() は特定のウォレットをマークし、転送や売却ができないようにします。開発者は購入者が参加した直後にブラックリストに登録し、彼らが決して売却できないトークンを保持させたままにすることができます。
  • setMaxTx() / setMaxWallet() は、1回のトランザクションで移動できる量を制限します。非常に小さな値に設定すると、購入は流れるのに意味のある売却は不可能になります。
  • enableTrading() / setTradingEnabled() は、転送が機能するかどうかを切り替えます。ローンチ後に取引をオフにできる場合、あなたの出口は意のままに閉じられる可能性があります。
  • mint() または供給を増やす機能は、すべてのホルダーを希釈するバックドアです。これは、開発者が流動性を引き出すことなく価値を吸い上げる方法です。
  • pause() / unpause() は、すべてのトークン活動を停止します。真の安全停止は理論的には問題ありませんが、悪用されると市場全体を凍結するボタンとなります。
  • setFee() / setTaxes() は、購入または売却税を変更します。コード内のハードキャップを探してください。所有者が99%の売却税を設定できる場合、すべての売却は実質的に没収されます。

ブロックエクスプローラーでWrite-functionリストを読み取る方法

ブロックエクスプローラーでトークンを開き、Contractタブに移動し、Write Contract(トークンがプロキシパターンを使用している場合はWrite as Proxy)を選択します。このリストは、コントラクトが公開する状態変更アクションの完全なメニューです。各エントリを名前で読み、3つの質問をしてください: 何を変更するか、誰がそれを呼び出すことが許可されているか、そして設定できる値に制限があるか。

関数を呼び出せる人を確認するには、Read Contractタブに切り替えてowner()を見つけ、現在の所有者アドレスを確認します。ゼロアドレス(0x000...000)が返された場合、所有権は放棄されています。次に、Codeタブの関数定義でonlyOwner修飾子または呼び出し元を制限するrequireステートメントを探します。残高や手数料を変更するアクセス制御のない関数は、重大な危険信号です。Solidityを読むのが得意でない場合は、自動スキャナーがこのトリアージを実行してくれます。スマートコントラクトを分析するための最高の無料ツールのまとめでは、特権機能を自動的にフラグ付けするツールを紹介しています。

機能所有者ができることリスクレベル
blacklist()選択したウォレットの売却または転送をブロックする
mint()新しいトークンを作成し、すべてのホルダーを希釈する
pause()すべての転送と取引を停止する
setFee() (no cap)売却税を100%近くまで引き上げる
setMaxTx()最大売却サイズをほぼゼロまで縮小する
setFee() (capped low)安全なハードコードされた制限内で税金を調整する

各特権が開発者に何をさせるか、流動性に触れずにラグプルを行うことも含む

古典的なラグプルは流動性プールを枯渇させますが、LPがロック解除されている場合はしばしばその兆候を見ることができます。隠された所有者特権は、流動性に全く触れない、より静かなバージョンを可能にします。機能するblacklist()があれば、開発者は全員に購入させ、価格が上昇するのを見守り、その後ホルダーをブラックリストに登録して、チームだけが買い側の需要に売却できるようにします。プールは満たされたままで、あなたの売却が失敗する瞬間までチャートは健全に見えます。キャップのないsetFee()は、売却のほぼすべてをチームウォレットにルーティングすることで同じ結果を達成します。mint()バックドアは最も遅く、最も否定しやすいものです。所有者は静かに大量の新しい割り当てをミントし、徐々に売却することで、コントラクトがカジュアルな流動性チェックを通過している間もホルダーを希釈します。これらのどれもLPを引き出す必要がないため、流動性の削除のみを監視するツールをすり抜けることがよくあります。これが、より広範なラグプルチェックリストと並んで機能レベルのレビューが重要である理由です。

無害な管理者機能とホルダーを罠にかける機能を区別する

すべての所有者のみの機能が脅威であるわけではありません。多くの正当なトークンは、正当な理由で管理者ツールを保持しており、目標は調整であり、パラノイアではありません。3つのテストが、通常の機能と罠を区別します。第一に、危険な状態がすでに安全な方向にロックされているか?取引が永続的にオンになり、その機能がもはやそれを無効にできない場合、取引トグルは問題ありません。第二に、ハードコードされた上限があるか?例えば10%を超えることができないsetFee()は防御可能ですが、上限がないものはそうではありません。第三に、所有権は放棄されたか、タイムロックまたはマルチシグに移されたか?単一の人物が即座にトリガーできない特権は、匿名のEOAによって制御されるものよりもはるかに危険性が低いです。真に良性の例としては、ローンチ時に一度オンになり、オフにできないenableTrading()、ルーターとコントラクト自体に対するexcludeFromFee()、および流動性プールではなく手数料ウォレットに限定された引き出し機能などがあります。この判断を、トークンを購入する前に安全かどうかを確認する方法に関する私たちのより広範なガイドと組み合わせて、コントラクトの読み取りがいくつかの入力の1つとなるようにしてください。

所有者特権のクイック監査チェックリスト

トークンを購入する前に、この手順を実行してください。数分で完了し、最も一般的な罠を捕捉します:

  • コントラクトが検証されていることを確認し、実際にソースを読み取れるようにします。
  • Write Contractタブを開き、すべての状態変更関数をリストアップします。
  • blacklist、pause、mint、trading toggle、max-tx、およびfee settersにフラグを立てます。
  • 各フラグについて、アクセス制御を確認します: 誰がそれを呼び出すことができ、所有権は放棄されているか、タイムロックされているか、マルチシグであるか。
  • 税金セッターにハードコードされた上限があるか、そしてその上限が何かを確認します。
  • ローンチ後に取引トグルが再びオフにできないことを確認します。
  • 見落としがないか、自動スキャナーとクロスチェックします。
  • 単一の匿名ウォレットが売却を凍結したり、税金を無制限に引き上げたり、供給をミントしたりできる場合、そのトークンがどれほどクリーンに見えても高リスクとして扱います。

あなたを守る規律はシンプルです: コントラクトを、それが身につけているバッジではなく、その所有者が何を行うことを許可されているかで判断してください。検証済みと放棄済みは入力であり、決して結論ではありません。Writeタブを読むことが習慣になれば、隠されたレバーは隠されたものではなくなります。

この記事は教育目的のみであり、金融アドバイスではありません。