スマートコントラクトもソフトウェアではあるのですが、通常のソフトウェアとは大きく異なる点があります。
アップデート…できない?
ふつうのソフトウェアは、一度で完成形に至るものは稀で、ときおりバージョンアップしてバグ修正や機能の強化を図っていくものです。
これに対して、ブロックチェーンに焼き込むスマートコントラクトは、一度反映すれば決して更新できません。同じものを再度ブロックチェーンに投入したところで、新しいスマートコントラクトができるだけで、もとのスマートコントラクトには何ら影響がありません。
どのような手を取ればいいか
ブロックチェーンのこのような特性をもとにして、バグの発生をゼロにはできない現実世界でスマートコントラクトを動かすには、どんなふうに進めればいいのでしょうか。
事前の監査
まず前提として、ブロックチェーンに投入する前に厳密なコード監査などを行って、事前に摘める不具合は摘んでおく必要があります。
永続するものは、更新の必要ないシンプルなコントラクトにする
イーサリアム上に構築した系でトークンのあるものも多いですが、トークン自体に複雑な機能を組み込むと、そこでバグを発生させる危険が出てくるなど、価値を保持するトークンとしては好ましくありません。
ということで、トークンはERC20などの規格を満たす最低限で作る、という形にすれば、少なくともアップデートの必要性自体が大幅に減少します。
永続しないコントラクトの活用
イーサリアムのコントラクトは、selfdestruct
といって、「自爆」することができます。クラウドファンディングなどのように「実行期限」や「送金限度」が決まっているものは、その期限を迎えればselfdestruct
するようにしておくことで、完了後には攻撃される心配もなくなります。
フロントエンドとバックエンドの分離
ある程度アップデートを前提として作らざるを得ないシステムでは、本体以外にフロントエンドとなるコントラクトを用意しておいて、バックエンドのコントラクトのアドレスを書き換え可能とすることで、処理の内容を入れ替え可能となります。
ただし、アドレスを変更可能ということは、ブロックチェーンの、一度書き込めば不変という部分に穴を開けているようなものなので、状況によってはデメリットやセキュリティリスクともなりかねません。
最後の手段
もうどうしようもなくなれば、残った手段は「新しいコントラクトを反映して、そちらを使ってもらうようにする」しかなくなります。イーサリアム上にあったAugurはもともとSerpentという言語で書かれていましたが、Serpent自体に脆弱性が見つかるという事態となりました。
対策として、Augur全体をSolidityで作り直して、取引所も含めてそちらに移行、旧Augurは脆弱性を使って止めてしまうということとなりました(詳細)。この場合はたまたまシステムを止められる脆弱性だったので、前のスマートコントラクトは使用不能となっていますが、もしそうでない場合、旧システムもそのまま動き続けることとなるので、フォークのようになることもありえます。