イーサリアムアカウント
イーサリアムアカウントとは、イーサリアム上でトランザクションを送信できる Ether (ETH) 残高を持つエンティティです。 アカウントはユーザーが管理し、スマートコントラクトとしてデプロイすることができます。
前提知識
この記事は初心者向けに記載していますが、 このページの理解を深めるために、まずは イーサリアム入門を読むことをお勧めします。
アカウントの種類
イーサリアムには 2 種類 のアカウントがあります。
- 外部所有アカウント(EOA) – 秘密鍵の保有者により管理
- コントラクトアカウント – ネットワークにデプロイされたスマートコントラクトでコードにより制御される。 スマートコントラクトの詳細
両方のアカウントで次のことができます。
- ETH やトークンの受信、保有、送信
- 展開されたスマートコントラクトとのやりとり
主な相違点
外部所有アカウント
- アカウント作成は無償
- トランザクションの開始が可能
- 外部所有アカウント間のトランザクションは、ETH やトークンの送金のみ可能
- アカウントの活動をコントロールする公開鍵と秘密鍵という暗号鍵のペアで構成
コントラクトアカウント
- コントラクト作成は有償(ネットワークストレージを使用するため)
- トランザクションの受信に応じてのみ、トランザクションを送信可能
- 外部アカウントからコントラクトアカウントへのトランザクションは、トークンの転送や新しいコントラクト作成まで、さまざまなアクションを実行するコードをトリガー可能
- コントラクトアカウントには秘密鍵がなく スマートコントラクトのコードのロジックによって制御される
アカウントの詳細
イーサリアムアカウントには 4 つのフィールドがあります。
nonce– アカウントから送信されたトラ ンザクションの総数を示すカウンター。 これにより、トランザクションは一度だけ実行される。 コントラクトアカウントでは、この数字はアカウントで作成されたコントラクト数を表す。balance- アドレスが所有する wei 額。 wei は ETH の最小単位で、1ETH は 1e+18wei。codeHash- このハッシュは、イーサリアム仮想マシン(EVM)のアカウントのコードを指す。 コントラクトアカウントには、さまざまな操作を行えるコードの断片がプログラムされており、 この EVM コードはアカウントにメッセージ呼び出しがあった場合に実行される。 他のアカウントのフィールドとは異なり、変更することはできない。 このようなコードの断片はすべて、対応するハッシュの状態データベースに含まれ、後で取得可能。 このハッシュ値が codeHash として知られている。 外部所有アカウントの場合、codeHash フィールドは空の文字列のハッシュとなる。storageRoot– ストレージハッシュとも呼ばれる。 アカウントのストレージ内容をコード化する Merkle Patricia ツリーのルートノードの 256 ビットハッシュ(256 ビット整数値間のマッピング)で、256 ビット整数キーの Keccak 256 ビットハッシュから RLP エンコードされた 256 ビット整数値へのマッピングとしてデジタルツリーの中へコード化される。 このツリーは、このアカウントのストレージコンテンツのハッシュであり、デフォルトは空です。
イーサリアム EVMからの図解
外部所有アカウントと鍵のペア
アカウントは、公開鍵と秘密鍵からなる暗号鍵のペアで構成されています。 トランザクションが送信者によって実際に署名されていることを証明し、偽造を防ぐためです。 秘密鍵はトランザクションの署名に使用されるもので、アカウントに紐づく資金を管理する権限を与えます。 暗号通貨を実際に保有することはなく、秘密鍵を保有するだけで、資金は常にイーサリアム台帳にあります。
これにより、トランザクションの送信者を常に確認することができるため、悪意のある者により偽のトランザクションをブロードキャストされることを防ぎます。
仮に Alice が自分のアカウントから Ether を Bob のアカウントに送金するとしましょう。Alice はトランザクションリクエストを作成し、検証するためネットワークに送信する必要があります。 イーサリアムの公開鍵暗号により、Alice が元々トランザクションリクエストを開始したことを証明できます。 暗号化メカニズムがなかったとすると、 悪意のある者により「Alice のアカウントから 5 ETH を Eve のアカウントに送信」のような要求を公に送信することができ、それが Alice からのリクエストでないことを確認することができなくなります。
アカウントの作成
アカウントを作成したい場合、ほとんどのライブラリはランダムな秘密鍵を生成します。
秘密鍵は 64 文字で構成されており、パスワードで暗号化することができます。
例:
fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036415f
公開鍵は、秘密鍵から楕円曲線 DSAを用いて生成されます。 公開鍵の keccak-256 ハッシュの末尾 20 バイトに0x を先頭に追加することで、アカウントの公開アドレスを取得できます。
次に GETH のpersonal_newAccountを使用してコンソールにアカウントを作成する例を示します。
1> personal.newAccount()2Passphrase:3Repeat passphrase:4"0x5e97870f263700f46aa00d967821199b9bc5a120"56> personal.newAccount("h4ck3r")7"0x3d80b31a78c30fc628f20b2c89d7ddbf6e53cedc"8
秘密鍵から新しい公開鍵を生成することは可能ですが、公開鍵から秘密鍵を生成することはできません。 これは秘密の名前が示すように、 秘密鍵を秘密に保つことが不可欠であることを意味しています。
署名を出力するメッセージとトランザクションに署名するには秘密鍵が必要です。 他者はそのメッセージの発信者を証明するための署名を取り出すことができます。 アプリケーションで、javascript ライブラリを使用してトランザクションをネットワークに送信できます。
コントラクトアカウント
コントラクトアカウントも、 42 文字の 16 進数のアドレスを持っています。
例:
0x06012c8cf97bead5deae237070f9587f8e7a266d
通常、コントラクトアドレスは、コントラクトがイーサリアムブロックチェーンにデプロイされるときに与えられます。 アドレスは作成者のアドレスとそのアドレスから送信されたトランザクション数(nonce)から作られます。
バリデータ鍵
イーサリアムにはもう 1 種類の鍵があり、これは イーサリアムがプルーフ・オブ・ワークからプルーフ・オブ・ステークに基づくコンセンサスに切り替えた際に導入されたものです。 「BLS」鍵で、バリデータを識別するために使用されます。 これらの鍵は効率的に集約され、ネットワークがコンセンサスに至るまでに必要な帯域幅を削減できます。 この鍵集約がなければ、バリデータの最小ステーク額ははるかに高くなってしまいます。
ウォレットについて
アカウントはウォレットではありません。 アカウントはユーザーが所有するイーサリアムアカウントの鍵ペアです。 ウォレットは、イーサリアムアカウントとやり取りできるインターフェイス、またはアプリケーションのことです。
ビジュアルデモ
ハッシュ関数と鍵ペアに関する Austin の説明動画をご覧ください。
参考文献
役に立つコミュニティリソースをご存知の場合は、 ページを編集して追加してください。