(手数料)連載「これからイーサリアムを学ぶ人のための教科書」ではこれからイーサリアムに関する情報を追っていくための基礎としてイーサリアムのプロトコルへの本質的な解説をしていきます。この連載を読み、技術レベルでの理解をしていただければ今後のイーサリアムに関する情報にキャッチアップしていくことができます。前回のおさらい前回はイーサリアムのイエローペーパーに基づいてブロックチェーンの枠組みを解説し、イーサリアムブロックチェーンのざっくりとしたイメージをつかむことができたと思います。押さえておくべきポイント以下の通りです。イーサリアムはトランザクションが実行されることによって現在の状態から次の状態へ移行する実行されるトランザクションの有効性がマイニングというプロセスによって検証されるトランザクション情報のグループであるブロックがチェーンのように連なって続いていく前回をまだ読んでいない方はこちらから。今回は少し具体的に上記のプロセスの構成要素にフォーカスして解説していきます。今回も前回同様、技術的に難しいと感じる部分に関しては漠然とした理解で読み進めて問題ありません。イーサリアムは大きく以下の要素によって構成されています。(プルーフオブワーク)今回はその中の、アカウント・ステート、そしてガスについて解説していきます。アカウントと呼ばれる要素によって構成されており、アカウント同士はメッセージの送信によって交信することができます。と20バイトのアドレスという160bitの識別名のようなものを持ちます。アカウントには以下の2種類が存在しています。以下EOA)ユーザーが普段ETHを送信するときなどに使用するアカウントで、秘密鍵によって管理され、スマートコントラクトのコードは持っていません。コントラクトアカウントスマートコントラクトのコードを持っており、そのコードによって管理される。EOAとコントラクトアカウントの違いEOAは、秘密鍵を用いてトランザクションに署名をすることにより、別のEOAやコントラクトアカウントにメッセージを送信することができます。EOA同士のメッセージ送信は単に送金のような機能です。EOAからコントラクトアカウントへのメッセージの送信は、コントラクトアカウントが持っているコードのプログラムを実行させ、トークンの送金・計算、コントラクトの作成など様々なトランザクションを発生させることができます。これに対し、コントラクトアカウントはトランザクションを自ら始めることはできず、他のアカウントからメッセージを受け取ることによってのみトランザクションを発生させることができます。このメッセージはEOAとコントラクトアカウントの両方から受け取ることができ、それぞれ以下のような流れとなっています。このように全てのトランザクションはEOAによって始められます。持っていると前述しました。このアカウントのステートは以下の4つの要素によって構成されています。(balance)バランスはそのアカウントが保有するWeiの数を表します。0.000000000000000001です。ルートノードのハッシュ値のことを表します。初期状態では空となっています。コードのハッシュ値のことを表します。コントラクトアカウントの場合、そのコントラクトが持っているコードのハッシュで、EOAの場合、空の文字列のハッシュとなります。(全体の状態)ワールドステートはイーサリアム全体のステートであり、それぞれのアカウントがどのような状態であるかを集約した全体の状態です。tree)と呼ばれるデータ構造が使われています。マークルパトリシアツリーの基礎となるマークルツリーについて説明します。リーフノード:基礎となるデータを保持したノード、画像では1番下のノード。中間ノード:2つの子ノードをハッシュ化したもの、画像では中間の2層。ルートノード:下層の2つの中間ノードを子ノードとしてハッシュ化したものこのように、ハッシュ化によって作られる木のような構造のことをマークルツリーと言います。イーサリアムの場合、マークルツリーを応用したデータの検索挿入コストを減少させたマークルパトリシアツリーというデータ構造が使われていますが、基本的には以上のような理解で問題ありません。(マークルツリーやマークルパトリシアツリーなどのデータ構造に関しては別の機会に詳説します)実際のイーサリアムのブロックチェーンの構造は以下のようになっています。このように各ブロックのヘッダーにStateRootとしてワールドステートのハッシュが保存され、ワールドステートのハッシュは各アカウントステートのハッシュから作られます。このマークルパトリシアツリーというデータ構造が使われているのはステートだけではなく、トランザクションやレシートでも使われており、以下のようにそれぞれがツリー構造を持っています。したデータ構造を用いることでひとつのアカウントステートが変更されれば最終的にワールドステートも変更されるようになっています。悪意のあるユーザーが偽物のトランザクションを作成し、リーフノードの部分を書き換えたとします。すると一つ上の層のハッシュが変化し、その上の層のハッシュが変化し、これが続くことによってルートノードの層が変化し、エラーが発生します。(手数料)イーサリアムにおいて手数料はとても大切なの概念となっています。イーサリアムネットワークで発生するトランザクションに伴う全ての計算に手数料がかかります。この手数料のことをガスと言います。支払われた手数料はそのトランザクションを承認したマイナーの元へ報酬として送られます。Priceは1Gasにつき払うEtherの量となります。Priceはgweiという単位で計られます。Weiとなっています。ガスリミットとガスプライスの積が送信者が支払い可能な最大値となります。手数料として払ってもよいと設定していることになります。ガスリミットは送信者が払う手数料の最大値なので、必要とされる手数料より多めに設定することができます。この場合、送信者に余った手数料は返金されることになります。送信者がトランザクションを実行するのに十分なガスを設定していなかった場合、トランザクションの途中でガス欠となり、そのトランザクションは無効とみなされ、トランザクション以前の状態に戻ります。失敗したトランザクションがどこでガス欠になり無効になったかが記録されます。ここで注意しなければならないのはガス欠になった場合は、手数料が返金されないということです。この返金されなかった手数料はガス欠になるまでそのトランザクションを承認しようとしたマイナーへ送られます。マイナーはどのトランザクションを有効化するか選ぶことができるので、ガスを高く設定すればするほどマイナーに選ばれやすくなります。マイナーは自分が有効化するトランザクションの最低手数料を決め、発表することができます。そのため、それを目安に送信者はガスを設定することになります。ストレージの手数料ガスはトランザクション承認のための計算以外に、ストレージ利用のためにも支払う必要があります。ストレージ手数料はトランザクションの手数料とは少し異なり、保存するデータの容量をより小さくするインセンティブが設計されています。ストレージの容量を解放する手続きが含まれたトランザクションの手数料は免除、あるいは報酬を得ることができます。これは、ストレージに保存された容量が増えれば増えるほどノードのデータベースを圧迫してしまうからです。手数料の目的イーサリアムネットワークによって実行される全てのオペレーションはノードによるものなので、ネットワークへの過度な負担はネットワークの遅延を引き起こします。手数料は、過度な負担によるネットワークの遅延を防ぐために導入されています。イーサリアムはチューリング完全な言語の機械となっています。チューリング完全とは簡単にいうと言語の仕組みによる制限がなく、どんなプログラムでも実行することができる言語です。チューリング完全な言語は停止性問題という問題を抱えており、ループするプログラムを実行した際に、そのプログラムを永遠に実行し続けるか、停止するのかを決めることができません。これがイーサリアムネットワークで起こってしまった場合、ネットワークへの多大な負担により、イーサリアムネットワークが崩壊してしまう可能性があります。そのため、計算の度に手数料を課すことでこれを防いでいます。ここまでがアカウント、ステート、ガスの説明になります。次回以降は構成要素の残りのトランザクション・ブロック、そしてマイニングについて解説していきます。5月お問い合わせ事例の紹介や、事業に合わせた提案など承っております。こちらのフォームからお申し込みください。2018特定業界や地域に特化した調査レポートの作成や、ブロックチェーンを活用したビジネスのプランニング等も承っております。