開発者にとってのスマートコントラクト
開発者の方にとってスマートコントラクトがどんなものか、この後で解説するブロックチェーンの技術要素やそれを使ったデータ構造の仕組みなどから考えるよりも、まずは、すでにご存じと思われるオブジェクト指向言語のクラスやインスタンスなどとの類比で考える方がよいかもしれません。とくに、スマートコントラクトの開発を中心に置くなら後者が役立つかもしれず、ブロックチェーンの解説に入る前のここでそのイメージを示します。
スマートコントラクトは、何らかのプログラミング言語でプログラムコード書いて実装するもので、これはオブジェクト指向言語でいうクラスに相当します。クラスと同様に、スマートコントラクトはAPIと内部状態(データやプロパティー)の格納領域を持つことができます。APIには、データを参照するためのメソッド(いわゆるgetメソッド)と、内部状態を変更するための更新メソッド(いわゆるsetメソッド)が定義できます(なお、スマートコントラクトには処理上の制約があり、基本的にはAPIの引数から計算した値で内部状態を変更する程度のことしかできないと考えてください。この理由も今後の連載で解説します)。
スマートコントラクトのコードはコンパイルして実行イメージに変換する必要があります。この実行イメージをブロックチェーンに書き込む(デプロイする)と、スマートコントラクトを呼び出して実行できるようになります。これは、クラスのインスタンス化に相当します。なお、スマートコントラクトもコンストラクタを持つことができ、デプロイ時に呼び出されることで内部状態の格納領域がブロックチェーン上に生成されます。補足として、スマートコントラクトはデプロイのたびに別々に認識される実体が作られることに注意してください。これはクラスのインスタンスが別々に認識される実体であることと同じです。
スマートコントラクトを実行するには、デプロイで実体化された先に対してAPI呼び出しを行います。参照系のAPI呼び出しは即時に結果を得ることができますが、更新系APIの呼び出しは非同期的に処理されます(この理由を知るにはブロックチェーンの仕組みを知らなければならず、以降で解説します)。
ただし、スマートコントラクトをシステム機能の粒度的な観点で見た場合、単なるクラスというよりはマイクロサービスに近しい位置づけです。スマートコントラクトは、マイクロサービスのように自身のインターフェースを介して完全に独立したひとつのサービス機能を提供するものです。例えばNFTは、スマートコントラクトによるデジタル的な唯一無二の価値表現とその交換の機能を提供するひとつの独立したサービスです。
それでは、ブロックチェーンの技術要素を確認しながら、スマートコントラクトの実行プラットフォームであるブロックチェーンの特徴を整理していきます。