---
title: "イーサリアムのアカウント"
description: "イーサリアムのアカウントについての説明。データ構造や鍵ペアの暗号技術との関係について。"
lang: ja
---

[イーサリアム](/)のアカウントは、イーサ（ETH）の残高を持ち、イーサリアム上でメッセージを送信できるエンティティです。アカウントはユーザーが制御することも、スマート・コントラクトとしてデプロイすることもできます。

## 前提条件 {#prerequisites}

このページをよりよく理解するために、まずは[イーサリアムの概要](/developers/docs/intro-to-ethereum/)を読むことをお勧めします。

## アカウントの種類 {#types-of-account}

イーサリアムには2種類のアカウントがあります。

- 外部所有アカウント（EOA） – 秘密鍵を持つ人によって制御されるアカウント
- コントラクト・アカウント – ネットワークにデプロイされ、コードによって制御されるスマート・コントラクト。[スマート・コントラクト](/developers/docs/smart-contracts/)について学ぶ

どちらのアカウント・タイプも以下の機能を持っています。

- ETHやトークンの受信、保持、送信
- デプロイされたスマート・コントラクトとのやり取り

### 主な違い {#key-differences}

**外部所有アカウント**

- アカウントの作成にコストはかからない
- トランザクションを開始できる
- 外部所有アカウント間のトランザクションは、ETHやトークンの送金のみ可能
- アカウントの活動を制御する公開鍵と秘密鍵という暗号技術による鍵ペアで構成される

**コントラクト・アカウント**

- ネットワークのストレージを使用するため、コントラクトの作成にはコストがかかる
- トランザクションを受信した応答としてのみメッセージを送信できる
- 外部アカウントからコントラクト・アカウントへのトランザクションは、トークンの送金や新しいコントラクトの作成など、さまざまなアクションを実行できるコードをトリガーできる
- コントラクト・アカウントは秘密鍵を持たない。代わりに、スマート・コントラクトのコードのロジックによって制御される

## アカウントの詳細 {#an-account-examined}

イーサリアムのアカウントには4つのフィールドがあります。

- `nonce` – 外部所有アカウントから送信されたトランザクションの数、またはコントラクト・アカウントによって作成されたコントラクトの数を示すカウンター。各アカウントに対して特定のナンスを持つトランザクションは1つしか実行できないため、署名されたトランザクションが繰り返しブロードキャストされて再実行されるリプレイ攻撃を防ぐことができます。
- `balance` – このアドレスが所有するWeiの数。WeiはETHの単位であり、1 ETHあたり1e+18 Weiです。
- `codeHash` – このハッシュは、イーサリアム仮想マシン（EVM）上のアカウントの_コード_を指します。コントラクト・アカウントには、さまざまな操作を実行できるコード・フラグメントがプログラムされています。このEVMコードは、アカウントがメッセージ・コールを受け取ると実行されます。他のアカウント・フィールドとは異なり、変更することはできません。このようなコード・フラグメントはすべて、後で取得できるように対応するハッシュの下で状態データベースに含まれています。このハッシュ値はcodeHashとして知られています。外部所有アカウントの場合、codeHashフィールドは空の文字列のハッシュになります。
- `storageRoot` – ストレージ・ハッシュと呼ばれることもあります。アカウントのストレージ内容（256ビット整数値間のマッピング）をエンコードする[マークル・パトリシア・トライ](/developers/docs/data-structures-and-encoding/patricia-merkle-trie/)のルート・ノードの256ビット・ハッシュであり、256ビット整数キーのケチャック・256ハッシュからRLPエンコードされた256ビット整数値へのマッピングとしてトライにエンコードされます。このトライは、このアカウントのストレージ内容のハッシュをエンコードしており、デフォルトでは空です。

![A diagram showing the make up of an account](./accounts.png)
_図は[Ethereum EVM illustrated](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)より引用_

## 外部所有アカウントと鍵ペア {#externally-owned-accounts-and-key-pairs}

アカウントは、公開鍵と秘密鍵という暗号技術による鍵ペアで構成されています。これらは、トランザクションが実際に送信者によって署名されたことを証明し、偽造を防ぐのに役立ちます。秘密鍵はトランザクションに署名するために使用するものであり、アカウントに関連付けられた資金の保管権を付与します。実際に暗号資産を保持することはなく、保持するのは秘密鍵です。資金は常にイーサリアムの台帳上にあります。

トランザクションの送信者を常に検証できるため、悪意のあるアクターが偽のトランザクションをブロードキャストするのを防ぐことができます。

アリスが自分のアカウントからボブのアカウントにイーサを送りたい場合、アリスはトランザクション・リクエストを作成し、検証のためにネットワークに送信する必要があります。イーサリアムが公開鍵暗号技術を使用していることで、アリスは自分が最初にトランザクション・リクエストを開始したことを証明できます。暗号技術のメカニズムがなければ、悪意のある敵対者イブは「アリスのアカウントからイブのアカウントに5 ETHを送る」といったリクエストを公にブロードキャストするだけでよく、それがアリスからのものではないことを誰も検証できなくなります。

## アカウントの作成 {#account-creation}

アカウントを作成したい場合、ほとんどのライブラリはランダムな秘密鍵を生成します。

秘密鍵は64文字の16進数で構成され、パスワードで暗号化できます。

例：

`fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036415f`

公開鍵は、[楕円曲線デジタル署名アルゴリズム](https://wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm)を使用して秘密鍵から生成されます。公開鍵のケチャック・256ハッシュの最後の20バイトを取得し、先頭に`0x`を追加することで、アカウントの公開アドレスを取得します。

つまり、外部所有アカウント（EOA）は42文字のアドレス（40文字の16進数である20バイトのセグメントに`0x`のプレフィックスを加えたもの）を持ちます。

例：

`0x5e97870f263700f46aa00d967821199b9bc5a120`

以下の例は、[Clef](https://geth.ethereum.org/docs/tools/clef/introduction)と呼ばれる署名ツールを使用して新しいアカウントを生成する方法を示しています。Clefは、イーサリアム・クライアントである[Geth](https://geth.ethereum.org)にバンドルされているアカウント管理および署名ツールです。`clef newaccount`コマンドは新しい鍵ペアを作成し、暗号化されたキーストアに保存します。

```
> clef newaccount --keystore <path>

Please enter a password for the new account to be created:
> <password>

------------
INFO [10-28|16:19:09.156] Your new key was generated       address=0x5e97870f263700f46aa00d967821199b9bc5a120
WARN [10-28|16:19:09.306] Please backup your key file      path=/home/user/go-ethereum/data/keystore/UTC--2022-10-28T15-19-08.000825927Z--5e97870f263700f46aa00d967821199b9bc5a120
WARN [10-28|16:19:09.306] Please remember your password!
Generated account 0x5e97870f263700f46aa00d967821199b9bc5a120
```

[Gethのドキュメント](https://geth.ethereum.org/docs)

秘密鍵から新しい公開鍵を導出することは可能ですが、公開鍵から秘密鍵を導出することはできません。秘密鍵を安全に保つことは非常に重要であり、その名の通り**秘密（PRIVATE）**にしておく必要があります。

署名を出力するメッセージやトランザクションに署名するには、秘密鍵が必要です。他の人はその署名を使用して公開鍵を導出し、メッセージの作成者を証明できます。アプリケーションでは、JavaScriptライブラリを使用してネットワークにトランザクションを送信できます。

## コントラクト・アカウント {#contract-accounts}

コントラクト・アカウントも42文字の16進数のアドレスを持ちます。

例：

`0x06012c8cf97bead5deae237070f9587f8e7a266d`

コントラクト・アドレスは通常、コントラクトがイーサリアムのブロックチェーンにデプロイされるときに付与されます。このアドレスは、作成者のアドレスと、そのアドレスから送信されたトランザクションの数（「ナンス」）から生成されます。これが`CREATE`オペレーションによるアドレスの導出方法です。

コントラクトは[`CREATE2`](https://eips.ethereum.org/EIPS/eip-1014)を使用してデプロイすることもできます。これは、作成者のアドレス、作成者が選択した値（「ソルト」）、およびコントラクトの作成コードのハッシュからアドレスを導出します。ナンスは関与しないため、コントラクトが存在する前にアドレスを計算でき、その間に作成者が他のトランザクションをいくつ送信してもアドレスは変わりません。これにより、まだデプロイされていないコントラクトを参照することが可能になります。

## バリデータ鍵 {#validators-keys}

イーサリアムには、プルーフ・オブ・ワーク（PoW）からプルーフ・オブ・ステーク（PoS）ベースのコンセンサスに移行した際に導入された、もう1つの種類の鍵もあります。これらは「BLS」鍵であり、バリデータを識別するために使用されます。これらの鍵は効率的に集約でき、ネットワークがコンセンサスに達するために必要な帯域幅を削減します。この鍵の集約がなければ、バリデータの最小ステーク額ははるかに高くなっていたでしょう。

[バリデータ鍵の詳細](/developers/docs/consensus-mechanisms/pos/keys/)

## ウォレットに関する注意点 {#a-note-on-wallets}

アカウントはウォレットではありません。ウォレットは、外部所有アカウントまたはコントラクト・アカウントのいずれかであるイーサリアムのアカウントとやり取りするためのインターフェースまたはアプリケーションです。

## 視覚的なデモ {#a-visual-demo}

Austinがハッシュ関数と鍵ペアについて解説する動画をご覧ください。

<VideoWatch slug="hash-function-eth-build" />

<VideoWatch slug="key-pair-eth-build" />

## 参考文献 {#further-reading}

- [イーサリアムのアカウントを理解する](https://info.etherscan.com/understanding-ethereum-accounts/) - Etherscan

_役に立ったコミュニティ・リソースをご存知ですか？このページを編集して追加してください！_

## 関連トピック {#related-topics}

- [スマート・コントラクト](/developers/docs/smart-contracts/)
- [トランザクション](/developers/docs/transactions/)
