//tips
//smart contract
どうもEVMについて完全に腹落ちしなかったの再度検証。Merkle Patricia Trieの構造まで突っ込んでいく。
気になっているのは、balanceは結局ブロックチェーン内に保存されるのか、ブロックチェーン(状態遷移)の付属品として、stateそのもの(遷移完了後形態)のデータ構造を持った状態で、付けられているのかというところ。
外部アカウント(EOA)は、ユーザーを表したアカウントであり、20byteのアドレスとstateを持ち、それをユーザーが管理している秘密鍵でコントロールする。
Bitcoinと同様に、秘密鍵から公開鍵が生成され、その公開鍵からこの外部アカウントアドレスが生成される。
state(パラメータ)として、NonceとBalanceのみを持つが、この中身はチェーン内に反映されるか?
Ethereum's state is a large data structure which holds not only all accounts and balances, but a machine state, which can change from block to block according to a pre-defined set of rules, and which can execute arbitrary machine code. The specific rules of changing state from block to block are defined by the EVM.
https://ethereum.org/en/developers/docs/evm/
Stateはmodified Merkle Patricia Trieと呼ばれるデータ構造をとっており、ハッシュによって繋がれる全てのアカウントとその分岐もととなるのハッシュをもつ。
the state is an enormous data structure called a modified Merkle Patricia Trie, which keeps all accounts linked by hashes and reducible to a single root hash stored on the blockchain.
外部アカウントのNonceはアカウントが行ったトランザクションの回数を記録しているもの。これでstate前後の管理はきちんとできそう。自分の外部アカウントのBalanceの値を取るためbalance参照が早い。
https://ethereum.github.io/yellowpaper/paper.pdf
では、それがブロックのどこに格納される情報なのかが問題。というか、気になる。
完了後の確定情報とトランザクション情報は、チェーン情報の中にありそうなことが下記のルートハッシュ構成からわかった。
ワールドステート:
各アカウントのステートで構成されるツリーのルートハッシュ。
トランザクションルート:
ブロックに含まれるトランザクションで構成されるツリーのルートハッシュ。
レシートルート:
トランザクションレシートで構成されるツリーのルートハッシュ。
この構造は、コンピュータで使用されているRAMのストレージモデルと同じ役割を果たし、これにより、通貨のトランザクション以外にもデータを取り扱えるようになった。
このトランザクションルートに格納されるハッシュは実行後のハッシュであり、その実行結果を受けたバランスなどの値がワールドステートのアカウント部分に格納されるという認識で良いのかと思ったが、これは要約値であり、実データではないとのこと。
これらの実データは各ノードのローカルデータに保存。
ブロックに含まれているのは、要約値のみであり、実際の「全てのアカウント状態のデータ」「全てのレシートのデータ」はブロックチェーンの外で管理されている。なんてこった。各フルノードがそれぞれのローカルストレージにこれらの値を保持していてこれらの実データはネットワークに伝搬されない。
https://www.etarou.work/posts/4979138
イーサリアムを理解したい場合にはこのお三方がおすすめ。
https://www.etarou.work/posts/4979138
truffle compileでbuild/contractsフォルダの中に作成した.jsonフォルダからabiとbytecodeを確認。
Remixを利用してここからdeploy済みのコントラクトの関数を実行してみた。
Abiを自身の.jsonから抽出し、remixに貼り付け。text.abiの形で貼り付けておき、metamaskをrinkebyに切り替えて、そちらにremixのinjected web3を使用して接続。
きちんとアカウント部分が自身のrinkebyアドレスであることが確認できたら、at address部分にdeployしたコントラクトのアドレスを入力。これは自身のEOAのアドレスと混同しない。
そうするとdeployed contractに接続し、インスタンス生成してくれているので、その中のボタンをペチペチ押して、nameやtotalsupplyがきちんと表示されるかを確認。問題なし。remixからclaimitemもできるか確かめておく。問題なし。
https://testnets.opensea.io/assets/rinkeby/0xd01fd6c7d061ed797e9269e9f31889e65ca25da5/6
Abi抽出参照:
https://v1.shunsuke.me/ja/tech/ethereum/recipe-how-to-send-tokens-easily-with-remix/#abi%E3%81%AE%E5%8F%96%E5%BE%97
https://rinkeby.infura.io/v3/
Rinkebyにアクセスする別アカウントから自身のアカウントを攻撃しようとしているのだが、もう一つのrinkeby接続アカウントが作れず苦戦。
Metamaskは同じテストネットワークにつながるアカウントを複数作れなかった。
Ganacheのテストネットワークにdeployして試すかと思ったが、metamaskのテスト用つくればよいことに気がついた。
なかなか怖くてできていなかったが、今なら作りだめしといても良さそう。
https://chrome.google.com/webstore/category/extensions?hl=ja
高度な設定からテストネット表示をオンにする必要があった。
若干時差があったので一旦閉じて再度開くと選択できるようになる。
3つまで手持ちメタマスクを増やした。