メインコンテンツへスキップ
Change page

イーサリアムのアカウント

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

前提条件

このページをよりよく理解するために、まずはイーサリアムの概要を読むことをお勧めします。

アカウントの種類

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

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

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

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

主な違い

外部所有アカウント

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

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

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

アカウントの詳細

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

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

A diagram showing the make up of an account 図はEthereum EVM illustrated (opens in a new tab)より引用

外部所有アカウントと鍵ペア

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

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

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

アカウントの作成

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

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

例:

fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036415f

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

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

例:

0x5e97870f263700f46aa00d967821199b9bc5a120

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

Gethのドキュメント (opens in a new tab)

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

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

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

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

例:

0x06012c8cf97bead5deae237070f9587f8e7a266d

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

バリデータ鍵

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

バリデータ鍵の詳細

ウォレットに関する注意点

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

視覚的なデモ

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

Hash function — ETH.BUILD

A demonstration of cryptographic hash functions using the ETH.BUILD educational tool.

トランスクリプト付きで視聴 

Key pair — ETH.BUILD

A demonstration of public-private key pairs using the ETH.BUILD educational tool.

トランスクリプト付きで視聴 

参考文献

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