要約:
- アカウントは、そのブロックチェーンで取引したり、トークンを保管したりする際に必要なものです。Gmailのアカウントに似ています。アドレスや秘密鍵、EVMコードなどはアカウント情報の一部です。
- アドレスは、メールアドレスのようなものです。メールアドレスがメール受信を可能にするように、ウォレットアドレスはトークン受信を可能にします。
- イーサリアムのアカウントは、ユーザーが保有する「EOA」と、スマートコントラクトが存在する「コントラクトアカウント」に分けられます。
ブロックチェーンのアカウントとは
ブロックチェーンのアカウントとは、ブロックチェーン上で取引をしたり、トークン残高を管理したりする際に必要なものです。
取引をしようと思ったら、まずアカウント作成が必要です。Gmailを利用するのに、Googleアカウントが必要なのと似ていますね。
アカウントはウォレットを使い始める際などに作られます。初めてメタマスクを使う際は、シードフレーズをメモしたりしますが、あの一連の作業でアカウントを作っています。
アカウント vs アドレス
アカウントと似た存在に「アドレス」があります。

「ウォレットアドレス」「コントラクトアドレス」などの形でもよく聞きます。
簡単に言えば、アドレスはアカウントの一部で、アカウントはアドレスも含む概念です。
GoogleアカウントとGmailアドレスの関係
アカウントとアドレスの関係を理解するために、GoogleアカウントとGmailアドレスの関係を考えてみたいと思います。
Googleアカウントを作ると、Gmailアドレスなどが自動的に作られます。アカウントはアドレスを含む存在、アドレスはアカウントの一部という関係になっているのです。
メタマスクアカウントとメタマスクアドレスの関係
次にメタマスクのアカウントと、メタマスクのアドレスの関係を考えてみましょう。
メタマスクのアドレスといったら、トークンを送付してもらうときの送り先です。一方でメタマスクのアカウントといったら、アドレスや署名に必要な秘密鍵なども含みます。
メタマスクの例でも、アカウントはアドレスを含む存在、アドレスはアカウントの一部という関係になっています。
アカウント vs ウォレット
ブロックチェーンのアカウントはウォレットともなんとなく似ていますね。しかし、この二つもそれぞれ別物です。
ブロックチェーンアカウントは取引するのに必要なもので、ウォレットアドレスや秘密鍵などを含む存在でした。しかし実は、アカウントを持っているだけでは取引はできません。
たしかに、取引をするにはアカウントが必要です。ただ、取引を実行するには、アカウントを保有した状態で、さらにネットワークにアクセスしなければいけません。このネットワークへのアクセスを可能にするのがウォレットです。
ウォレットは、ブロックチェーンネットワークにアクセスする「インターフェース」などとも説明されますね。
インターフェースとは、とある存在(例:人間)が、別の存在(例:取引所)を操作する際の接点です。例えば、人間がBinanceで取引しようと思ったら、BinanceのWebサイトまたはアプリを操作します。このとき、サイトやアプリ画面がインターフェースです。
イーサリアムのアカウントは2種類
イーサリアムには2種類のアカウントが存在します。
- EOA
- コントラクトアカウント(CA)

それぞれの特徴を記載します。
1.EOA
EOAはおそらく、私たちが「アカウント」と聞いてイメージするものです。例えば、私たちがメタマスクで保有しているアカウントは、EOAです。
このEOAは、ユーザーによって管理されています。
より厳密には、秘密鍵(またはシードフレーズ)の保有者によって管理されています。トランザクションの作成・送信(取引)に秘密鍵が要求される仕組みで、ユーザーが秘密鍵で署名操作を実行すると、トランザクションが作成されます。
2.コントラクトアカウント(CA)
コントラクトアカウントとは、ネットワーク上で利用可能なスマートコントラクトのアカウントですEVMコード(プログラム)によって管理されてます。
EOAは秘密鍵に管理されていました。一方でCAには秘密鍵がありません。CAには、秘密鍵の代わりEVMコードというプログラムがあり、そのプログラムによって特定の処理を行ったりするのです。
トークンコントラクトとは
メタマスクに新しい銘柄を表示させているとき、「トークンコントラクトアドレス」の入力を求められますよね。
このトークンコントラクトアドレスとは、そのトークンの仕様を管理する「コントラクトアカウント」のアドレスのことです。各トークンはスマートコントラクトによって規定されており、固有のコントラクトアカウントを持っているのです。
例えばトークンコントラクトは、トークンを別の人に送るときに作動しています。別の言い方では、トークンを送付するトランザクションは、トークンのスマートコントラクトのプログラムを動かすことで、残高変更を行っています。
EOAとCAの共通点と違い
EOAとコントラクトアカウントについて、以下の点で比較してみたいと思います。
何によってコントロールされるか
EOAは、秘密鍵を保有する人間によってコントロールされています。
一方でコントラクトアカウントは、EVMコード(プログラム)によってコントロールされています。コントラクトアカウントは、書かれたプログラムの通りにしか動きません。
作成コスト
EOAは無料で作成できます。メタマスクでは、無料でいくつものアカウントを作成できますよね。一方でコントラクトアカウントの作成には、ガス代がかかります。
コントラクトアカウントは、スマートコントラクトを処理するのに使うMemoryやStackや、スマートコントラクトの状態を保管するStorageを含みます。そのため、コントラクトアカウントが増えると、それだけネットワーク上のコンピュータの容量を使います。無料だとアカウント作り放題で、コンピュータの容量的に厳しくなる恐れがあり、その抑制のためガス代がかかります。
コントラクトアカウント作成のトランザクションが承認されれば、作成(デプロイ)完了です。
トランザクションのトリガー可否
EOAはトランザクションをトリガーできます。つまり、トランザクションを開始させられます。
一方でコントラクトアカウントはトランザクションをトリガーできません。基本的に受け身であり、EOAからの要請に従って動きます。
ただし、EOAが開始したトランザクションを受け、別のCAやEOAに働きかけるトランザクション(内部トランザクション)を開始させることはあります。
対応するトランザクションの種類
EOAからEOAに向けたトランザクションでは、厳密にはETHの送信しかできません。(※)
一方で、EOAからコントラクトアドレスに送るトランザクションでは、いろんな種類の処理を実行できます。例えば、EOAのトークンでDEXに流動性を提供したり、ERC20トークンを送付したり、トークンをスワップしたりできます。
ERC20トークンの送付は、EVM上でスマートコントラクトが動くことで実行されます。一方でETHの送付では、「送金元から送金先へETHを移動させる」という状態変化をEVMが直接っており、スマートコントラクトでの処理は不要です。
※上記の通り、EOA間で行えるトランザクションはETHの送信のみです。ただ、ユーザー視点ではERC20トークンの送付も「EOAからEOAへのトークンの送信」に見えます。
構造の違い
前提としてイーサリアムのアカウントの状態は、以下のように「アドレス 対 アカウントの状態」といった形でアドレスごとに保存されます。
アドレス | アカウントの状態 |
xxxxx | XXXXX |
yyyyy | YYYYY |
zzzzz | ZZZZZ |
「アカウントの状態」は、さらに以下の4つのフィールドによって規定されています。
- nonce:そのアカウントが取引するごとに1ずつ増える、取引数をカウントする数字です。
- 残高:アカウントの残高です。
- storage hash:スマートコントラクトの状態をハッシュ値に直した値です。
- code hash:スマートコントラクトのEVMコードをハッシュ値に直した値です。
以下はイメージです。
EOAの場合、nonceと残高には現在の値が入力されますが、storage hashとcode hashには、空白をハッシュ値に直した値が入力されます。EOAはStorageもEVMコードも持っていないためです。
一方でコントラクトアカウントの場合、4つのフィールドに各値が入力されます。
コントラクトアカウントはstorageを持っており、そこにはスマートコントラクトの状態の保存されています。そのスマートコントラクトの状態をハッシュ値に直したものがstorage hashに入ります。
また、コントラクトアカウントはEVMコードも含んでいます。そこで、code hashにはEVMコードをハッシュ値に直した値が入力されています。
参照

コメント