今週のざっくばらん
Solidity
先週は「スマートコントラクトとは何か」について書きましたが、今週は Ethereum ブロックチェーン上のスマートコントラクトを記述するための言語、Solidity について解説します。
このメルマガの読者にはソフトウェア・エンジニアではない方も大勢いるので、出来るだけ分かりやすく書くように努めますが、全くプログラミングの知識のない人にとっては、難しいだろうと思いますがお付き合い下さい。
まずは、Solidityの公式ドキュメントの「Introduction to Smart Contracts」に最もシンプルな例として挙げられているスマートコントラクトを下に貼り付けます。プログラミングの世界では、最もシンプルな例として "Hello World" と画面に表示するプログラムを最初に紹介するのが一般的ですが、Solidity には画面に何かを表示する機能はないので、これが最もシンプルな例となります。
一行目はライセンス条件を示すコメントなので、無視しても大丈夫です。
二行目は、言語 Solidity のバージョンを指定するものですが、これも今の段階では無視しても大丈夫です。
四行目の"contract"から始まる部分が、SimpleStorage という名前のスマートコントラクトを定義しており、C++ や Java のクラスの定義と似ています。
五行目の "uint storedData;" がこのコントラクトの状態変数 storedData を定義しています。これは、他の言語におけるメンバー変数(もしくはプロパティ)に相当するものです。
七行目と九行目には、それぞれ set と get という関数が定義されており、これは他の言語におけるメソッドに相当するものです。関数 set が storedData の値を指定し、関数 get が storedData の値を返します。
これだけ見ると、「C++やJavaと大きな違いはない」と感じる人も多いと思いますが、実は、一つ大きな違いがあります。
C++やJavaのクラスは、実行時にはマシン語やバイトコードにコンパイルされ(コンパイル=マシンが実行出来る形に変更すること)、それがマシンにロードされた上で実行され、その結果としてクラスのインスタンス(オブジェクト)が作られます。さまざまな状態を持つインスタンスを複数作ることも可能だし、マシンごとに異なるインスタンスが作られるのが普通です。
Ethereum ブロックチェーン上でも、Solidityで書かれたコードが(バイトコードに)コンパイルされたのちに実行される点はC++やJavaのコードと同じですが、インスタンスは常に一つしか作られないし(シングルインスタンス)、コードとデータは一緒に管理されるし、Ethereum のマイニングマシンがたとえ数千台あろうと、基本的に全てのマシンに同じ状態を持つインスタンスが作られます。
つまり、上のコードで定義したSimpleStorageというコントラクトが Ethereum ブロックチェーン上にデプロイされた時に(デプロイ=運用環境に展開すること)、世界中にある全ての Ethereum マイニングマシン上にこのコントラクトのインスタンスが作られ、状態変数 storedData に格納された数字は、どのマシン上でも一緒になるのです。
全てのマシンに同じデータを保存するなど、従来型の発想では「とんでもない無駄」ですが、それによって初めて、特権を持つ存在が不要な分散型のデータベースを構築することが可能になっているのです。
SimpleStorage をブロックチェーン上にデプロイし(storedData の初期値は0)、次のブロックの前に set 関数を呼びだして storedData の値を1に変更した場合に、ブロックチェーンがどう変化するかを表したのが下の図です。
この記事は約
NaN 分で読めます(
NaN 文字 / 画像
NaN
枚)