Appearance
S1C1: The Greeting
1. 問題
プレイヤーはCTFシステムに登録してから後続のチャレンジに参加する必要があります。コントラクト Season1Challenge1 は registerMe(string) 関数を提供しており、呼び出すとプレイヤー名が記録され、登録証明として S1C1 NFT がミントされます。
2. 原因
Season 1 のすべてのチャレンジコントラクトは、同じ Season1NFTFlags コントラクトを共有しています。後続のチャレンジ(S1C10、S2シリーズなど)では、呼び出し元が S1C1 の登録を完了しているかどうか(hasMinted[address][1] == true)をチェックし、未登録の場合は拒否します。
3. 方案
registerMe("your_name") を直接呼び出すだけです:
bash
cast send <S1C1_ADDRESS> "registerMe(string)" "player_name" --private-key $PK --rpc-url $RPC
4. 遭遇したトラップ
特に目立ったトラップはありません。これは入門レベルのステージです。
5. トラップの原因
N/A
6. 解決方法
N/A
7. 技術ポイント
| ポイント | 説明 |
|---|---|
| CTF登録メカニズム | NFTのミントを通じてプレイヤーの完了状態を記録し、hasMinted mapping をチャレンジ間の検証に使用 |
| 権限チェックなし | registerMe にはアクセス制御が一切なく、誰でも任意の回数登録可能(ただし NFTFlags が重複ミントをチェック) |
| Solidity 基礎 | mapping(address => string), emit イベント |