2
2
3
3
# このブログの対象読者
4
4
5
- ① イーサリアムについて知りたい方<br />
6
- ② 暗号資産やNFTを触れたことがあり、背景で何が起こっているのか理解したい人<br />
7
- ③ スマートコントラクトを書いていて、EVM(Ethereum virtual machine)の知識を増やしたい方
5
+ 1 . イーサリアムについて知りたい方<br />
6
+ 2 . 暗号資産やNFTを触れたことがあり、背景で何が起こっているのか理解したい人<br />
7
+ 3 . スマートコントラクトを書いていて、EVM(Ethereum virtual machine)の知識を増やしたい方
8
8
9
9
# はじめに
10
10
30
30
31
31
それぞれのアドレスにはアカウントのStateが紐づけられています。アカウントのstateは以下の4項目から成ります。
32
32
33
- ### ① nonce
33
+ ### 1. nonce
34
34
35
35
EOAsでは、アカウントから送られたトランザクションの数を示します。一番最初のトランザクションのnonceは0を示し、それ以降トランザクションを送るたび1増加していきます。<br />
36
36
37
37
contract accountsでは、アカウントから作られたコントラクトの数を示します。コントラクトが新しいコントラクトデプロイするとnonceが1増えます。(contract accountsのnonceは0ではなく1から始まります。)
38
38
39
- ### ② ether balance
39
+ ### 2. ether balance
40
40
41
41
アドレスが持つETH(単位はwei)を表します。EOAs, contract accounts両方ともETHを受け取る、また送ることが可能です。その際に、このbalanceの値が更新されていきます。solidityでは、<address >.balanceで取得することが可能です。なお、1ETH=1,000,000,000,000,000,000 wei(0が18個)です。
42
42
43
- ### ③ codeHash
43
+ ### 3. codeHash
44
44
45
45
EVM上でcontract accountsが持つプログラムコードのハッシュです。ユーザーがDappsを利用するときに実行されるスマートコントラクトのコードになります。スマートコントラクトがデプロイした後に変更できない理由は、このcodeHashを書き換えることが出来ないためです。EOAsはコードを持たないため、空文字となります。
46
46
47
- ### ④ storageRoot
47
+ ### 4. storageRoot
48
48
49
- contract accountsのstorageは、Merkle Patricia treeというデータ構造で管理されています。現在のstorageの状態を正確で効率的に表す値として、storageRoot(Merkle Patricia treeのルーツノードのハッシュ)が使われています。気になる方は、[ Merkle Patricia tree] ( https://ethereum.org/en/developers/docs/data-structures-and-encoding/patricia-merkle-trie/ ) を読んでみてください。
49
+ contract accountsのstorageは、Merkle Patricia treeというデータ構造で管理されています。現在のstorageの状態を正確で効率的に表す値として、storageRoot(Merkle Patricia treeのルーツノードのハッシュ)が使われています。気になる方は、[ Merkle Patricia tree] ( https://ethereum.org/en/developers/docs/data-structures-and-encoding/patricia-merkle-trie/ ) を読んでみてください。EOAsはこのデータ構造を保持しません。EOAsのstorageRootは空となります。
50
50
51
51
EOAsとcontract accountsでは、それぞれの保持するstate(codeHashとstorageRoot)に違いがあることが確認できました。これが最初に出した問題の答えです。Etherscanで確認すると、contract accountsではContractCreatorという項目で、誰がこのコントラクトをデプロイしたかを確認することができます。またcontractという項目をみると、ソースコードを見ることができます(コードがverifyされていない場合は、見ることができません。)
52
52
@@ -56,10 +56,10 @@ EOAsとcontract accountsでは、それぞれの保持するstate(codeHashとsto
56
56
57
57
イーサリアムのworld stateは、トランザクションによって更新されます。単純化してworld stateの更新をみていきます。<br />
58
58
59
- ① ユーザーはトランザクションを作成します。<br />
60
- ② 作成したトランザクションにprivate keyで署名します。<br />
61
- ③ トランザクションはMempoolに送られます。<br />
62
- ④ マイニングにより、トランザクションはブロックチェーンのブロックに取り込まれます。<br />
59
+ 1 . ユーザーはトランザクションを作成します。<br />
60
+ 2 . 作成したトランザクションにprivate keyで署名します。<br />
61
+ 3 . トランザクションはMempoolに送られます。<br />
62
+ 4 . マイニングにより、トランザクションはブロックチェーンのブロックに取り込まれます。<br />
63
63
64
64
これがworld state更新の流れになります。署名にprivate keyが使われることからも明らかですが、トランザクションを送ることができるのはEOAsのみになります。contract accountsはトランザクションを送ることができません。このこともEOAsとcontract accountsの違いになります。
65
65
0 commit comments