コントラクトアドレスとは、ブロックチェーン上のスマートコントラクトのアドレスです。コントラクトがデプロイされたときに作られ、秘密鍵を持たず、トークンの横に「CA」と書かれているときに指しているのがこの文字列です。
イーサリアムとすべての EVM チェーンでは、見た目はウォレットアドレスとまったく同じで、0x の後に 16 進数 40 文字が続きます。USDT や USDC のようなトークンはコントラクトなので、トークンのアドレスはコントラクトアドレスです。ウォレットアドレスと違うのは、その裏にあるものです。秘密鍵を持つ人ではなく、コードとストレージがあります。
この言葉が出てくる場面は 3 つあります。ウォレットにカスタムトークンを追加するとき、ブロックエクスプローラーがアドレスをコントラクトとして表示するとき、そして誰かが新しいコインの CA を投稿するときです。このガイドでは、このアドレスが何を識別しているか、どう生成されるか、ウォレットアドレスとどう見分けるか、トークンの本物のアドレスはどこにあるか、そしてそこに資金を送るとどうなるかを説明します。
要約
- コントラクトアドレスはコードを指し、ウォレットアドレスは鍵の持ち主を指します。EVM チェーンでは両者の形式が同じなので、形式だけではどちらなのか判断できません。ブロックエクスプローラーか eth_getCode の呼び出しなら判断できます。
- EVM チェーンではアドレスは 0x + 40 文字の 16 進数で、デプロイ者のアドレスと nonce から、あるいは CREATE2 では salt から導出されます。Tron は T で始まる 34 文字、Solana は base58 のミントアドレスを使います。
- トークンのアドレスは発行元のサイトかドキュメントからコピーし、エクスプローラーに検証済みのソースコード、多数の保有者、長い履歴が表示されることを確認します。詐欺トークンは本物の名前とシンボルを使い回します。
- ほとんどのトークンコントラクトは、自分自身のアドレスに送られたトークンを返すことができません。入金はウォレットアドレスに送るものであり、コントラクトとのやり取りは、その関数を知っている dApp かウォレットを通じて行います。
1. コントラクトアドレスとは?
イーサリアム、そしてそれと同じ仕組みで作られたチェーンでは、すべてのアカウントがアドレスを持っています。アカウントには 2 種類あります。外部所有アカウント(EOA)は、その秘密鍵を持つ人のものです。コントラクトアカウントはプログラムと、そのプログラムが保持するデータを持ち、そのアドレスがコントラクトアドレスです。ethereum.org のドキュメントは端的にこう述べています。コントラクトアカウントは秘密鍵を持たず、スマートコントラクトのコードのロジックによって制御される、と。
コントラクトは 1 つのトランザクションによって一度だけデプロイされ、その時点でアドレスを受け取り、チェーンが存在する限りそのアドレスを保ち続けます。誰でもそのアドレスにトランザクションを送って、コントラクトの関数を呼び出せます。トークンの送金や分散型取引所でのスワップは、コントラクト宛てのトランザクションです。
最も一般的な例がトークンです。USDT、USDC、WETH をはじめ、すべての ERC-20 トークンは残高の表を保持するコントラクトです。したがってトークンのアドレスはコントラクトアドレスであり、ウォレットがまだ知らないトークンを表示するために必要な唯一の情報でもあります。
2. 暗号資産の「CA」とは?
CA はコントラクトアドレス(contract address)の略です。X、Telegram、Discord では、新しいトークンについての投稿はたいてい CA とアドレスで締めくくられます。トークンの名前やティッカーは一意ではなく、アドレスは一意だからです。取引サイトやウォレットも同じ略語を使います。
Solana では、CA はトークンのミントアドレス、つまりトークンの供給量と小数桁数(decimals)を定義するアカウントです。イーサリアム、BNB Chain、Base などの EVM ネットワークでは、ERC-20 や BEP-20 コントラクトのアドレスです。どちらの場合も、誰かが話題にしているまさにそのトークンにたどり着くためにウォレットやエクスプローラーに貼り付けるのが、このアドレスです。偽の CA がよくある詐欺の手口なのもそのためで、同じ名前のそっくりなトークンには別のアドレスが付きます。
3. コントラクトアドレスはどんな形?
形式はチェーンごとに決まっており、そのチェーンがウォレットアドレスに使うのと同じ形式です。以下は、広く使われている 2 つのステーブルコインの公式アドレスで、発行元のページから取ったものです:
| ネットワーク | トークン | コントラクトアドレス | 形式 |
|---|---|---|---|
| Ethereum | USDT(ERC-20) | 0xdAC17F958D2ee523a2206206994597C13D831ec7 | 0x + 40 文字の 16 進数 |
| Ethereum | USDC | 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 | 0x + 40 文字の 16 進数 |
| Base | USDC | 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 | 0x + 40 文字の 16 進数 |
| Arbitrum One | USDC | 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 | 0x + 40 文字の 16 進数 |
| Polygon PoS | USDC | 0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359 | 0x + 40 文字の 16 進数 |
| Tron | USDT(TRC-20) | TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t | T で始まる base58check 34 文字 |
| Solana | USDC(ミントアドレス) | EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v | base58 で 32 〜 44 文字 |
Ethereum、Base、Arbitrum、Polygon の項目はCircle の USDC コントラクトアドレス一覧から、USDT の項目はTether の対応プロトコルのページから取っています。USDC はチェーンごとに異なるアドレスを持っています。名前が同じでも同じコントラクトとは限りません。EVM アドレスの大文字と小文字はEIP-55で定義されたチェックサムになっており、すべて小文字で書いた形も同じアドレスで、エクスプローラーもウォレットも両方を受け付けます。
ビットコインにはコントラクトアドレスがありません。3 や bc1 で始まるビットコインのアドレスはスクリプトをエンコードできますが、そのアドレスに呼び出せるプログラムが置かれているわけではありません。この概念は、Ethereum、Tron、Solana のようなアカウントベースのチェーンのものです。
4. コントラクトアドレスとウォレットアドレスの違いは?
EVM チェーンでは両者の見た目は同じなので、違いはアドレスを何が制御しているかにあります。
| ウォレットアドレス(外部所有アカウント) | コントラクトアドレス | |
|---|---|---|
| 制御するもの | 秘密鍵。通常はシードフレーズから導出される | コントラクトのコード。秘密鍵はない |
| トランザクションを開始できるか | できる | できない。トランザクションか別のコントラクトから呼び出されたときだけ実行される |
| コードを持つか | 持たない。ただし EIP-7702 でコードに委任した場合を除く | 持つ。加えて独自のストレージも持つ |
| 作られ方 | 無料。公開鍵から導出され、トランザクションは不要 | ガスを支払うデプロイトランザクションによって |
| 典型的な用途 | 資金の受け取り、トランザクションへの署名 | トークン、取引所、レンディングプール、NFT コレクション、ブリッジ |
| ブロックエクスプローラーでの表示 | 通常のアドレスとして表示される | コントラクトとして表示され、Contract タブが付く |
唯一のグレーゾーンがEIP-7702です。2025 年 5 月の Pectra アップグレード以降、イーサリアムで有効になっています。ウォレットアドレスが自分自身に委任コードを付けられるようにするもので、これにより呼び出しをまとめて実行したり、手数料を他の誰かに支払ってもらったりできます。鍵が引き続きアカウントを制御し、アカウントは引き続きトランザクションを送れるので、コードが付いたウォレットアドレスであることに変わりはありません。
見分けるには、ブロックエクスプローラーでアドレスを開きます。コントラクトには Contract タブ、作成者のアドレス、そしてソースが公開されていれば検証済みのコードが表示されます。コードからは、JSON-RPC メソッドの eth_getCode がアドレスに保存されたバイトコードを返し、ウォレットアドレスなら 0x だけを返します。これらのタブがそれぞれどこにあるかはEtherscan ガイドで確認できます。
5. コントラクトアドレスはどう生成される?
アドレスは選ぶものではなく計算されるもので、チェーンごとに独自のルールがあります:
- Ethereum と EVM チェーン(CREATE)
- アドレスは、デプロイ者のアドレスとその nonce(そのアドレスが送信したトランザクションの数)の Keccak-256 ハッシュの末尾 20 バイトです。同じアカウントから 2 回デプロイすると、nonce が進んでいるため 2 つの異なるアドレスになります。
- Ethereum と EVM チェーン(CREATE2)
- コントラクトは、自分自身のアドレス、自分で選んだ salt、そして作成コードのハッシュから計算されるアドレスに、別のコントラクトをデプロイできます。計算式は keccak256(0xff ++ address ++ salt ++ keccak256(init_code))[12:] です。アドレスは何かがデプロイされる前からわかっているので、1 つのコントラクトを多数のチェーンで同じアドレスに置けるのはこの仕組みによります。
- Tron
- Tron のアドレスは先頭が 0x41 の 21 バイトで、T で始まる base58check 34 文字として表示されます。コントラクトアドレスはウォレットアドレスと同じ形式で、デプロイトランザクションの ID とデプロイ者のアドレスから導出されます。
- Solana
- プログラムのアドレスは、その実行可能コードを保存するアカウントの公開鍵です。トークンはミントアカウントのアドレスで識別され、このアカウントは Token Program が所有しています。トークンを保有するウォレットは、ミントごとに別々のトークンアカウントを持ちます。
ルールはethereum.org のアカウントのドキュメント、CREATE2 についてはEIP-1014、Tron のアカウントリファレンス、そしてSolana のトークンのドキュメントにあります。
6. トークンアドレスとコントラクトアドレスは同じ?
EVM チェーンでは同じです。トークンアドレスとは、そのトークンのコントラクトのコントラクトアドレスのことで、ウォレット、エクスプローラー、取引所は同じ文字列に対してこの 2 つの名前を使っています。ウォレットにカスタムトークンを追加するとは、このアドレスを貼り付けることです。ウォレットはシンボルと小数桁数をコントラクト自体から読み取るので、間違ったアドレスを貼るとエラーではなく間違ったトークンが表示されます。
追加の識別子が必要なケースが 2 つあります。NFT は、1 つのコントラクトがコレクション全体を保持しているため、コレクションのコントラクトアドレスとトークン ID で識別されます。Solana ではトークンアドレスはミントアドレスで、自分が保有する残高はミントではなく、自分のウォレットに紐づいたトークンアカウントにあります。
7. トークンのコントラクトアドレスはどこにある?
発行元が管理しているソースから取り、エクスプローラーで確認します。
- 発行元のウェブサイトやドキュメント
- ステーブルコインの発行元、プロトコル、そしてほとんどのプロジェクトは、チェーンごとのアドレスを公開しています。Circle と Tether はそれぞれ USDC と USDT のページを 1 つずつ用意しており、上の表の項目はそこから取っています。
- CoinMarketCap と CoinGecko
- トークンのページには、Contracts の欄にチェーンごとのコントラクトアドレスが、コピーボタンとエクスプローラーへのリンク付きで載っています。
- ブロックエクスプローラー
- Etherscan、BscScan、Polygonscan、Tronscan、Solscan でトークン名を検索します。エクスプローラーは定着したトークンに印を付け、保有者数を表示します。同じ名前で保有者が 10 人しかいないコピーは別のトークンです。
- 自分のウォレットや取引所
- ウォレットはトークンの詳細画面にアドレスを表示します。取引所は入金・出金ページに、そのアドレスが属するネットワークとともに表示します。
文字列は丸ごとコピーし、ネットワークの情報も一緒に控えておいてください。Base の USDC アドレスは Arbitrum では何の意味も持たず、間違ったチェーンで調べるとエクスプローラーには空のアドレスが表示されます。
8. コントラクトアドレスが本物かどうかはどう確認する?
トークンの名前とシンボルはコントラクト内の自由なテキストなので、誰でも 2 つ目の USDC をデプロイできます。次の確認で、本物のコントラクトとコピーを見分けられます:
- 発行元と照合する
- アドレスは、発行元のサイトやドキュメントにあるものと 1 文字残らず一致していなければなりません。最初と最後の数文字だけでなく全体を比べてください。そっくりなアドレスは、まさにその部分が一致するように生成されています。
- 検証済みのソースコードを確認する
- Etherscan などのエクスプローラーでは、Contract タブに、デプロイ者がソースを公開し、エクスプローラーが再コンパイルしてバイトコードと一致することを確認したかどうかが表示されます。広く使われているトークンで未検証のバイトコードというのは警戒すべきサインです。
- 保有者数、経過期間、アクティビティを確認する
- 本物のステーブルコインのコントラクトには、数百万件の送金と何年もの履歴があります。先週デプロイされ、保有者が数人しかおらず、検証済みのソースもないコントラクトは、名前が何であれ別のトークンです。
- トークンのルールを読む
- エクスプローラーやトークンスキャナーは、所有者が自由にミントできる、送金を停止できる、手数料を変更できる、売却をブロックできるコントラクトに警告を付けます。プロキシコントラクトはアドレスを保ったまま実装を差し替えられるので、誰がアップグレードを制御しているかを確認してください。
- チェーンを照合する
- 同じプロジェクトでもチェーンが違えばアドレスも違うので、エクスプローラー、ウォレット、情報源がすべて同じネットワークを指していることを確かめてください。
これらの確認に使う Contract タブと Read Contract、Write Contract のビューについては、Etherscan ガイドで順を追って説明しています。
9. コントラクトアドレスに暗号資産を送れる?
送ることはできますが、結果はコントラクト次第です。レンディングプールへの預け入れ、分散型取引所での購入、NFT のミントはいずれも、コントラクトのインターフェースを知っているウォレットや dApp を通じて、通常は関数呼び出しを付けたトランザクションをコントラクトに送ることで動いています。
避けるべき間違いは、トークンをそのトークン自身のコントラクトアドレスに送ることです。ERC-20 標準は transfer、approve、残高の関数を定義していますが、コントラクトがトークンを返すための関数は何も定義していません。そのため、誤ってトークンコントラクトに送ったコインは、発行元が回収用の関数を作っていて、その使用に応じてくれない限り、通常は戻ってきません。単純な送金を受け取るように設計されていないほとんどのコントラクトについても同じで、拒否するものもあれば、黙って受け入れるものもあります。
取引所や個人が入金を求めるときに渡してくるのはウォレットアドレスです。プロトコルが操作を求めるときは、dApp がトランザクションを組み立ててくれます。送金の宛先欄にトークンのコントラクトアドレスを貼り付けている自分に気づいたら、手を止めて何をしているのか確認してください。
10. コントラクトアドレスはどのブロックチェーンでも同じ?
デプロイ者が意図的にそうしない限り、同じではありません。上の USDC の表では、同じ資産なのに 4 つの EVM チェーンで 4 つの異なるアドレスになっています。各デプロイが、異なる nonce を持つアカウントからの別々のトランザクションだったからです。ブリッジ版のトークン(.e のような接尾辞が付いていることが多い)も独自のアドレスを持つので、1 つのネットワーク上で USDC という名前のトークンがエクスプローラーに複数表示されることがあります。
チェーンをまたいで同一のアドレスにすることは、CREATE2 を使うか、同じ署名済みデプロイトランザクションを各チェーンで新しいアカウントから再送することで可能です。ウォレットやライブラリが使う補助コントラクトの Multicall3 が、100 以上のチェーンで 0xcA11bde05977b3631167028862bE2a173976CA11 に置かれているのはそのためで、デプロイ一覧で確認できます。ほとんどのトークンはこの方法でデプロイされていないので、使っているチェーンでアドレスを調べてください。
ウォレットがどのネットワークに接続しているかわからないときは、チェーンID一覧で各チェーンIDがどのネットワークとエクスプローラーに対応するかを確認できます。
11. コードでアドレスを確認する
ユーザーにトークンや受取人のアドレスを貼り付けさせるアプリケーションは、トランザクションを組み立てる前に形式を検証すべきです。ChainGate の SDK は Bitcoin、Ethereum、Litecoin、Dogecoin、Bitcoin Cash、そして登録した任意の EVM ネットワークのアドレスを検証し、大文字小文字のチェックサムが一致しない EVM アドレスを拒否します:
import { ChainGate, isValidEvmAddress } from 'chaingate';
const cg = new ChainGate({ apiKey: process.env.CHAINGATE_API_KEY });
// Format checks: true for a well-formed address, false otherwise
cg.networks.ethereum.isValidAddress('0xdAC17F958D2ee523a2206206994597C13D831ec7'); // true (USDT contract)
cg.networks.ethereum.isValidAddress('0xD8DA6bf26964af9d7eed9e03e53415d37aa96045'); // false (EIP-55 checksum does not match)
isValidEvmAddress('0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48'); // true (USDC contract)
// Bitcoin: validate and classify the address type
cg.networks.bitcoin.isValidAddress('bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4'); // true
cg.networks.bitcoin.identifyAddressType('bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4'); // 'segwit-p2wpkh'形式の検証でわかるのは、その文字列が正しい形のアドレスであることだけで、そこにコードがあるかどうかはわかりません。それを知るには、RPC エンドポイントで eth_getCode を呼び出します。コントラクトならバイトコードを、ウォレットアドレスなら 0x を返します。対応しているすべてのネットワークと、SDK が認識する Bitcoin のアドレスタイプはアドレス検証のドキュメントに載っています。
12. 次に読むもの
コントラクトアドレスはどのプログラムとやり取りしているかを、トランザクションハッシュはどの呼び出しを行ったかを教えてくれ、Etherscan ガイドはその両方をエクスプローラーで読む方法を示しています。コントラクトの呼び出しには必ずガスがかかり、各ネットワークで今いくらかかるかはガストラッカーでわかります。アドレスの検証、残高、送金を Bitcoin、Ethereum、その他のネットワークにわたって 1 つの SDK に任せたいなら、ChainGate がそれを行います。
よくある質問
暗号資産のコントラクトアドレスとは?
スマートコントラクトのブロックチェーン上のアドレスです。スマートコントラクトはトランザクションによってデプロイされたプログラムで、独自のストレージを持ち、秘密鍵は持ちません。トークン、分散型取引所、レンディングプール、NFT コレクションはコントラクトなので、それぞれにコントラクトアドレスがあります。イーサリアムとその他の EVM チェーンでは 0x の後に 16 進数 40 文字が続く形で、ウォレットアドレスと同じ形式です。
暗号資産の CA とは?
CA はコントラクトアドレス(contract address)の略です。名前やティッカーは一意ではなくアドレスは一意なので、トークン名の横に投稿されます。Solana では CA はトークンのミントアドレスで、イーサリアム、BNB Chain、Base ではトークンコントラクトのアドレスです。
コントラクトアドレスとウォレットアドレスは同じ?
いいえ。ウォレットアドレスは秘密鍵によって制御され、トランザクションを開始できます。コントラクトアドレスはそこにデプロイされたコードによって制御され、秘密鍵を持たず、トランザクションから呼び出されたときだけ動作します。EVM チェーンではどちらも同じ 0x 形式なので、ブロックエクスプローラー(コントラクトには Contract タブが付きます)か、ウォレットアドレスに対して 0x を返す eth_getCode の RPC 呼び出しで見分けます。
コントラクトアドレスはどんな形?
Ethereum、BNB Chain、Polygon、Arbitrum、Base などの EVM チェーン:0x + 40 文字の 16 進数。例えば USDT は 0xdAC17F958D2ee523a2206206994597C13D831ec7 です。Tron:T で始まる base58check 34 文字。例えば USDT は TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t です。Solana:32 〜 44 文字の base58 ミントアドレス。例えば USDC は EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v です。
トークンのコントラクトアドレスはどこで見つかる?
発行元のウェブサイトやドキュメント、または CoinMarketCap や CoinGecko のトークンページの Contracts 欄から取り、同じチェーンのブロックエクスプローラーで確認します。検証済みのソースコード、多数の保有者、長い送金履歴が本物のコントラクトの目印です。ウォレットはトークンの詳細画面に、取引所は入金ページにアドレスを表示します。
アドレスがコントラクトかどうかはどうわかる?
ブロックエクスプローラーで開きます。コントラクトのページには Contract タブ、作成者のアドレス、そして公開されていれば検証済みのソースコードが表示されます。コードからは、eth_getCode の RPC メソッドがコントラクトならバイトコードを、ウォレットアドレスなら 0x を返します。
コントラクトアドレスにトークンを送れる?
レンディングプールや取引所のように受け取るよう設計されたコントラクトに限られ、通常は適切な関数呼び出しを付けてくれる dApp を通じて送ります。トークンをそのトークン自身のコントラクトアドレスに送ると、ERC-20 標準には送り返すための関数がないため、通常は失われます。取引所への入金や個人への支払いは、必ずウォレットアドレスに送ります。
トークンアドレスとは?
トークンのスマートコントラクトのコントラクトアドレスです。ウォレット、エクスプローラー、取引所は、同じ文字列に対してトークンアドレスとコントラクトアドレスの両方の呼び方を使います。Solana ではトークンアドレスはミントアドレスです。NFT は、コレクションのコントラクトアドレスとトークン ID で識別されます。
コントラクトアドレスはすべてのチェーンで同じ?
デフォルトでは同じではありません。USDC は、各デプロイが別々のトランザクションであるため、Ethereum、Base、Arbitrum、Polygon で異なるアドレスを持っています。プロジェクトは、CREATE2 を使うか、Multicall3 のように同じ署名済みデプロイを再送することで多数のチェーンで同一のアドレスを得られますが、アドレスは常に使っているチェーンで調べるべきです。
スマートコントラクトは秘密鍵を持っている?
いいえ。コントラクトアカウントはそのコードによって制御されます。コードに所有者用の関数が含まれている場合、所有者は別のアドレス(通常はウォレットかマルチシグ)で、そちらが独自の鍵を持っています。所有権が放棄されたコントラクトには、それを変更できる人は誰もいません。
ChainGate で構築する
アイデアをコードに落とし込みましょう — ChainGate は Ethereum と 20 以上のブロックチェーン向けのウォレット、トランザクション、マネージド RPC を 1 つのライブラリで提供します。