こんにちは!Etheruemの仕組みが難しくて挫折しそうなIzuruです笑
ビットコインの論文は割とサクサク読めたのですが、イーサリアムはビットコインより複雑で、理解するのに結構時間がかかりますね、、
でも、諦めずに読み進めていきましょう!
きちんと理解すれば必ずいいことがあります、、きっと笑
イーサリアム(Ethereum)のホワイトペーパーを読んでみようPart1
イーサリアム(Ethereum)のホワイトペーパーを読んでみようPart2
イーサリアム(Ethereum)のホワイトペーパーを読んでみようPart3
今回は、
のチャプターをいってみましょう!
1. トランンザクションが 「 well-formed 」であるか(例えば、値が正しい数値であるか)チェックし、 署名が有効であれば、ノンスが送信者のアカウントのものと合致するかチェックします。もし、そうでなければ、エラーを返します。
2. トランザクションの手数料を STARTGAS * GASPRICE として計算し、署名から送信アドレスを決定します。 送信者のアカウントの残高から手数料を差し引き、送信者のノンスを次の値へとインクリメントします。 もし、残高不足であれば、エラーを返します。
3. GAS = STARTGAS として、GAS 値を初期化し、トランザクションにおける byteデータ量 のぶんだけ byte あたり一定量の gas を支払います。
4. 送信者のアカウントから受信者のアカウントにトランザクションの値を転送します。もし、受信者のアカウントが存在しないものであったならば、あたらしくつくります。もし、受信者のアカウントが contract であれば、すべての実行が完了するか、あるいは ガス欠 になるまで contract のコードを実行します。
5. もし、送信者が十分なお金を持っていなかったり、 ガス欠 のために、値の転送が失敗した場合には、手数料の支払いを除いて、全状態を元に戻し、手数料はマイナーのアカウントに加えます。
6. そうでなければ、余った全ての gas を全て送信者に返し、消費した gas は採掘者に支払われる手数料として送信します。
んーなに言ってるかわかりませんね笑
とりあえずここで言いたいことは、トランザクションのやり方です。
全てのトランザクションはEOAから作られます。
さらにイーサリアムに特徴的なのは、contractアカウントを作成するトランザクションがあるということですね。
つまり、EOAからの指示で、コントラクトアカウントを作成するトランザクションです。
Ethereum の contract コードは低級スタック・ベース・バイトコード言語で書かれており、「 Ethereum 仮想マシンコード 」や「 EVM code 」などと呼ばれております。 そのコードは一連のbyte列から構成されており、各 byte はひとつの命令を表しております。
EVM における 命令 はデータを貯蔵するために必要な 三種類の スペース にアクセスします。
* stack, 後入れ先出しのコンテナで、push と pop という二つの命令により値を出し入れします。
* Memory, 無限拡張および無限展開可能なバイト配列
* storage, contract が保持する長期保存用ストレージで 、Key/value の貯蔵庫。スタックやメモリでは計算実行後毎にリセットされるのに対し、storage では長期間、値が保持される。
ちょっと専門的すぎるのでここは大幅にシンプルに、
コントラクトアカウントにかかれているコードは、「EVMコード」というコードで書かれていると理解しましょう。(EVM = Ethereum Virtual Machine, イーサリアム仮想マシン。
そして、スタックやメモリー(一時的なデータを保存する)、ストレージ(永久的にデータを保存する)という部分に分かれているということですね。
そして、EOAからcontractアカウントへのトランザクションによって、contractアカウントに書かれているコードが実行されるということですね。
これによって、イーサリアムでは、ブロックチェーン上でアプリケーションを動かすことを可能にしています。
Ethereum の blockchain は多くの点で Bitcoin のそれと似ていますが、いくつか違う点があります。 bockchain のアーキテクチャに関する Ethereum と Bitcoin の違いは、次のようになります。 Bitcoin とは違い Ethereum のブロックはトランザクションのリストとブロック生成時点の 状態 のコピーを内部に保持しています。 脇道にそれますが、ブロック番号 と difficulty という、べつの二つの値もブロックに貯蔵されます。 Ethereum における基本的な、ブロック有効化 アルゴリズム は以下となります。
1. ブロックの参照する 直前のブロック が存在し、それが有効であるかをチェックします。
2. タイムスタンプが 、直前のにおけるそれよりも値が大きく、15分さきの未来まで後出のものより値が小さいことを確認します。
3. ブロック番号、難易度、トランザクションのルート、Uncle のルート および ガスの上限(様々な、低級Ethereumの仕様概念)が有効であるか確認します。
4. ブロックの有効証である proof of work が有効であるか確認します。
5. 直前のブロックの最後の状態を S[0] とする。
6. TX をトランザクション・リストとし、n 個のトランザクションを含むものとする。 0...n-1 までの全ての数に対し、S[i+1] = APPLY(S[i], TX[i]) とする。 もし、アプリケーション群のどれか一つでもエラーを返したり、ブロックで消費される全 gas 量がこの段階で GASLIMIT を超過していたりすると、エラーを返します。
7. S[N] を S_FINAL としますが、採掘者へのブロック採掘に対する報酬も加えます。
8. 状態 S_FINAL の マークル木 の ルート がブロックヘッダにおいて与えられる 最終状態のルート と一致するか確かめます。 もしそうであれば、ブロックは有効で、そうでなければ、ブロックは無効です。
ここで述べられているのは、ブロックの採掘の仕方ですね。
イーサリアムのブロックには、ビットコインと異なり、トランザクションのリストだけでなく、「ブロック生成時点の状態のコピー」が含まれています。
ビットコインのやりとりはUTXO; Unspent Transaction Output(未使用のトランザクションの出力)のやりとりとして行われています。
つまり、「電子署名の履歴」そのものがビットコインであり、新しい署名の履歴(=トランザクションの出力)だけが無数に存在している状態がビットコインです。
ビットコインでは、誰がいくら保有しているか、という情報は保存されず、UTXOを全てかぞえあげることでしか誰がいくら保有しているかを知ることはできません。
それに対し、イーサリアムでは、アカウントごとに「現在の状態」の情報が保存されています。
ビットコインの仕組みについてはこちらで説明していますので、ご覧ください。
ブロック生成にあたっては、タイムスタンプや難易度、トランザクションのルート、ガスなどの有効性を確認します。
ひとつひとつトランザクションを認証していき全てのトランザクションを確認したら、マイナーは報酬をもらいます。
今回もなかなか重い内容でしたね笑
では、続きはまた次回!
イーサリアムのホワイトペーパーより引用