イーサリアムのアカウントについて
このブログの対象読者
- イーサリアムについて知りたい方
- 暗号資産やNFTを触れたことがあり、背景で何が起こっているのか理解したい方
- スマートコントラクトを書いていて、EVM(Ethereum virtual machine)の知識を増やしたい方
はじめに
突然ですが、問題です。
Etherscanには、二つの異なるアカウントの種類があります。その違いはどこにあるでしょうか。
ヒント:イーサリアムのアカウントは、Etherscan上で見ることができます。
上記のURLで、表示の違いを確認してみて下さい。
今回のブログでは、イーサリアムのアカウントについて紹介します。問題に答えることができた方でも、まだ知らない発見があるかもしれません。是非最後までご覧ください。
イーサリアムのアカウント
冒頭で触れたように、イーサリアムには下記の二種類のアカウントがあります。
- externally owned accounts (EOAs)
- contract accounts
EOAsはprivate keyによって管理されるアカウントです。私たちユーザーが保持しているアカウントともいえます。contract accountsは、スマートコントラクトがデプロイされて作られるアカウントになります。contract accountsはprivate keyを保持しておりません。イーサリアムのworld stateはこの両方のアカウントの集合体になります。
ここからはそのアカウントの特徴をみていきます。
アドレスとState
アドレス
どちらのアカウントもアドレスを持っています。このアドレスは、十六進法で書かれた42文字から成っています。先ほどあげた0x9C8fF314C9Bc7F6e59A9d9225Fb22946427eDC03もイーサリアムのアドレスです。42文字あるか数えてみてください。
State
それぞれのアドレスにはアカウントのStateが紐づけられています。アカウントのstateは以下の4項目から成ります。
1. nonce
EOAsでは、アカウントから送られたトランザクションの数を示します。一番最初のトランザクションのnonceは0を示し、それ以降トランザクションを送るたび1増加していきます。
contract accountsでは、アカウントから作られたコントラクトの数を示します。コントラクトが新しいコントラクトデプロイするとnonceが1増えます。(contract accountsのnonceは0ではなく1から始まります。)
2. ether balance
アドレスが持つETH(単位はwei)を表します。EOAs, contract accounts両方ともETHを受け取る、または送ることが可能です。
その際に、このbalanceの値が更新されていきます。solidityでは、<address>.balanceで取得することが可能です。なお、1ETH=1,000,000,000,000,000,000 wei(0が18個)です。
3. codeHash
EVM上でcontract accountsが持つプログラムコードのハッシュです。ユーザーがDappsを利用するときに実行されるスマートコントラクトのコードになります。スマートコントラクトがデプロイした後に変更できない理由は、このcodeHashを書き換えることが出来ないためです。
EOAsはコードを持たないため、空文字となります。
4. storageRoot
contract accountsのstorageは、Merkle Patricia treeというデータ構造で管理されています。現在のstorageの状態を正確で効率的に表す値として、storageRoot(Merkle Patricia treeのルーツノードのハッシュ)が使われています。気になる方は、Merkle Patricia treeを読んでみてください。EOAsはこのデータ構造を保持しません。EOAsのstorageRootは空となります。
EOAsとcontract accountsでは、それぞれの保持するstate(codeHashとstorageRoot)に違いがあることが確認できました。これが最初に出した問題の答えです。Etherscanで確認すると、contract accountsではContractCreatorという項目で、誰がこのコントラクトをデプロイしたかを確認することができます。またcontractという項目をみると、ソースコードを見ることができます(コードがverifyされていない場合は、見ることができません。)
しかし、両者の違いはstateだけではありません。最後にEOAsとcontract accountsのトランザクションからもみていきます。
重要な相違点: EOAsはトランザクションを送ることができる。
イーサリアムのworld stateは、トランザクションによって更新されます。単純化してworld stateの更新をみていきます。
- ユーザーはトランザクションを作成します。
- 作成したトランザクションにprivate keyで署名します。
- トランザクションはMempoolに送られます。
- マイニングにより、トランザクションはブロックチェーンのブロックに取り込まれます。
これがworld state更新の流れになります。署名にprivate keyが使われることからも明らかですが、トランザクションを送ることができるのはEOAsのみになります。contract accountsはトランザクションを送ることができません。こちらもEOAsとcontract accountsの違いになります。
おまけ: なぜprivate keyが重要なのか?
重要な相違点でみたように、private keyがあればトランザクションに署名することができます。private keyを誰にも教えてはいけない理由は、このためです。悪意のある他人やが、あなたのprivate keyを手に入れたとします。この人物はトランザクションを作成し、あなたのprivate keyで署名します。彼はこのトランザクションで、あなたのETHやERC20トークンを自分の指定するアドレスに送ることが可能です。悪意のある人物、Webサイトはあの手この手でprivate keyの情報を入手しようとします。private keyの扱いには注意しましょう。
最後に
今回のブログでは、イーサリアムのアカウントについて紹介しました。簡単なテーマのようですが、EVMやいくつかの重要なのEthereum Improvement Proposals (EIPs) を理解するときにも必要な知識です。また必要になったときに読み返してみてください。最後までご覧いただきありがとうございました。
また、現在モノバンドル株式会社では、エンジニアを採用中です!
ぜひフルリモートで、スピード感や大きな変化を楽しみながらぜひ働いてみませんか?
参考資料
Ethereum Yellow Paper
Ethereum Whitepaper
Andreas M. Antonopoulos. Mastering Ethereum
Introduction to Smart Contracts
ETHEREUM ACCOUNTS
State in Ethereum
PATRICIA MERKLE TREES
What is an Ethereum Address?
https://info.etherscan.com/what-is-an-ethereum-address/#:~:text=An Ethereum address is a,receive funds from another party.
Discussion