イーサリアムのスマートコントラクトは本当に非中央集権か?

イーサリアムのスマートコントラクト(以下、コントラクトと略す)は、契約の履行に人の仲介を介さず、ブロックチェーン上にあるプログラムによって自動で行うものである。イーサリアムではプログラミング言語を用いて、誰でもコントラクトを自作できるようになっている。

一度、ブロックチェーンに上げたコントラクトのプログラムを修正することはできない。これは契約の書き換えが行われないことを意味する。これにより、コントラクトは非中央集権でトラストレスであると言われる。しかし、これはコントラクトの実装次第ということになるだろう。

コントラクトの状態と機能

ざっくり言うとコントラクトは、状態と機能で構成される。状態はブロックチェーン上に永続的に保持することができ、機能は状態の読み書きができる。ユーザーの送金をトリガーとして、コントラクトの機能は実行される。

オブジェクト指向に馴染みがあるプログラマであれば、コントラクトはクラス、状態はメンバ変数、機能はメソッドと考えればわかりやすいだろう。実際、Solidityでコントラクトを作る作業はクラスの設計と実装に近い。

機能を実行できるアカウントの制限

機能は誰の送金によって実行されようとしているかをチェックすることができる。特定のアドレスからの送金時のみ機能を実行し、それ以外はしないという実装もできる。つまり、開発者のみ実行する機能を設けることも可能である。

プログラムを書き換えられなくとも挙動を変えることはできる

一度、ブロックチェーンに上げたコントラクトのプログラムを後で書き換えることはできない。しかし、コントラクトの状態によって挙動を変えるようにプログラミングしておくことはできる。

たとえば、初期状態ではある機能Aを実行するためには3ETH必要であるとしよう。この3ETHという値を状態Xとして保持しておく。機能Aを実行する際に、送金されたETHが状態X未満であれば実行しないようにしておく。

そして機能Bを用意し、これは受け取ったパラメータに応じて、状態Xを任意の値に変えられるようにしておく。さらに機能Bは開発者の送金アドレスでのみ実行するようにしておく。

このようにしておくと、開発者が機能Aの実行に必要な金額を5ETHに値上げしたいと判断すれば、自分だけが実行できる機能Bのパラメータを5ETHにして実行し、状態Xを書き換えれば良い。それ以降、機能Aの実行には5ETH必要になる。つまり開発者の都合で値上げが可能である。

中央集権的なコントラクト

上に上げた例は簡易のものであるが、複数の状態を参照することにより、より細かな調整ができるようにすることもできるだろう。それを開発者のみが任意のタイミングで実行できるのなら、そのコントラクトは中央集権的と言えるのではないだろうか?

イーサリアムはコントラクトを自作できる自由度ゆえに、中央集権的なコントラクトを作ることもできることは認識しておいたほうが良いだろう。

仮想通貨投資はZaifのコイン積立だけで十分だと思う理由