ステップ2 スマートコントラクトの更新メソッドを呼び出して実行する
スマートコントラクトの更新メソッドについては、呼び出しと実行の2つに分けて順に解説します。呼び出しはノードを使ってブロックチェーンネットワークにトランザクションを送信すること、実行は当該トランザクションが新しく作成されるブロックに取り込まれることにそれぞれ相当します。新しいブロック作成までには一定の時間がかかるため、更新メソッドの実行は原則的に非同期処理です。
ステップ2-1 スマートコントラクトの更新メソッドの呼び出し
スマートコントラクトの更新メソッド呼び出しとして、トランザクションをブロックチェーンネットワークに送信します。これを担ってくれるのがノードです。トランザクションは、呼び出し対象メソッドの指定(メソッド名)と引数、および内容の改ざん防止と送信者本人であることの証明を行うデジタル署名を付与したデータ構造です。このデータ構造をブロックチェーンネットワークに送信するようノードに対し命令します。
ノードは、トランザクションのデータに問題ないこと(例えば、デジタル署名が正しく付与されているなど)をチェックし、P2Pネットワーク上で直接接続されているノードに当該トランザクションを転送するとともに、ブロックへの格納を待っているトランザクションとしてそれをキューイングします。このような処理待ちのトランザクションを保持しておく場所のことをトランザクションキューなどと呼び、基本的にすべてのノードが持っています(図3)。
一方で、トランザクションの受信側のノードでは、受け取ったトランザクションをトランザクションキューに取り込み(もし、キュー内にまだ存在しなかった場合)、さらに他のノードに転送します。各ノードでの転送がP2Pネットワーク内で繰り返されることにより、トランザクションは最終的にブロックチェーンネットワークを構成するすべてのノードに伝搬していきます。このような伝搬は、ある情報が知り合いの知り合いを通して伝言ゲーム的に広がるのと同じようなものです。最終的に、トランザクションは新たなブロックの作成を担うノードにもたどり着きます。ブロック作成ノードは誰が担えるのかについてはコンセンサスアルゴリズム次第ですが、ここでは、自ノード以外のどこかで行われるとします。
以上でメソッド呼び出しとしてトランザクションの送信が完了し、次はメソッドの実行です。
ステップ2-2 スマートコントラクトの更新メソッドの実行
スマートコントラクトの更新メソッドの実行は、当該メソッドの呼び出しトランザクションが新しいブロックに格納されることです。新たなブロックは、ブロック作成の役割を持つノードが行います(ブロック作成ノードとします)。ブロックチェーンのデータはノード間で共有されていますので、ブロック作成ノードはスマートコントラクトのコードを持っています。ブロックを作成する際には、トランザクションキューからトランザクションを取り出し、ブロックに格納していきます。トランザクションには、スマートコントラクトのメソッド呼び出しの引数(つまり、入力値)が設定されています。この入力値をもとに、スマートコントラクトのコード内の当該メソッドを呼び出して処理を実行することで、スマートコントラクトの内部状態(つまり、出力値)を計算します。実行結果として、この出力がブロックに格納されます(図4、なお、実際には出力値を集約したハッシュ値がブロックのヘッダ情報に埋め込まれるといった間接的な格納です)。
ひとつのブロックには複数のトランザクションをある上限まで格納できますので、トランザクションキュー内にトランザクションがまだ残っていれば、格納上限数に達するまで上記を繰り返します。ブロック作成ノードでは、これらの結果と時系列的にひとつ前のブロックのハッシュ値などとともに、コンセンサスアルゴリズムで規定される正当なブロックとしての証拠の値を新しいブロックに格納します(例えば、PoWであれば暗号パズルの解であり、これは実際にパズルを解く計算の仕事をしたという証拠の意味を持っています)。以上にて新しいブロックが完成したので、ブロック作成ノードはこの新ブロックをP2Pネットワーク上に送信します。新ブロックは、P2Pネットワークを介してブロックチェーンネットワーク上の全ノードに伝搬していき、ブロックチェーンのシステム的には動作が進んだことになりますが、重要なのは新ブロックを自分のノードが受け取った時の動作です(図 5)。
ノードは新しいブロックを受信した際(受信ブロックとします)、その受信ブロックを検証します。検証においては、受信ブロックが時系列的にひとつ前のブロックとハッシュ値でつながっているか、正当なブロックとしての証拠が正しいかなどをチェックします。さらに、トランザクションの検証としてブロック作成ノードが行ったことと全く同じことを実行します。つまり、受信ブロック内のトランザクションをひとつずつ取り出し、実際に対象スマートコントラクトの更新メソッドを実行してみます。ここで、スマートコントラクトのコードはブロックチェーンネットワーク上で共有されており、メソッドへの入力はトランザクションから取り出せばよいので、どのノードでも実行することは可能です。従って、ノードは、メソッドの実行によってスマートコントラクトの内部状態を自分自身でも更新することができます。これを受信ブロック内の全トランザクションに対し繰り返します(前掲の図4)。
以上のすべて結果が受信ブロックの内容と一致すれば、受信ブロックは正しいとして、ノード内の自分のブロックチェーンのデータ構造に受信ブロックを接続します。そうでなければ、ブロックを無効として破棄します。また、正しいブロックに格納済みとなったトランザクションをトランザクションキューから削除します。もし、新ブロックの中に更新メソッド呼び出しとして送信したトランザクションが入っていれば、更新メソッドの呼び出しが実行されたとみなせます。
このような受信ブロックの検証は、前述のステップ1で新しいノードをブロックチェーンネットワークに参加させたときのデータ同期でも行われます。
