コントラクトを書くときは、安全なコードに特に注意し、バグが残っていても対処できるキルスイッチ(kill switch)を入れてください。キルスイッチがなく、スマートコントラクトに悪用可能な脆弱性があると、コントラクトや他の利用者から資源が盗まれるおそれがあります。
この問題は、悪名高い DAO 事件 ↗ で鮮明になりました。DAO のスマートコントラクトは複雑で分散型のベンチャーキャピタル基金として機能し、投資家グループから集めた Ether はピーク時に 2 億 5,000 万ドル相当を保有していました。攻撃者はスマートコントラクトの脆弱性を突いて、5,000 万ドル相当の Ether を盗みました。
Ether ではトランザクションを取り消せないため、非常に議論を呼んだ「ハードフォーク」が行われました。コミュニティの過半数が、DAO の資金をすべて特別な「WithdrawDAO」リカバリーコントラクトへ移す 不規則な状態変更 を含むブロックを受け入れることに同意したのです。十分な数のマイナーがこの不規則なブロックを有効と認めることで、DAO は投資家の資金を返せました。ただし全員がこのチェーンに同意したわけではありません。反対した人たちは不規則なブロックを拒否し、Ethereum Classic ネットワークを形成しました。以降、各ブロックチェーンは独立して成長しています。
キルスイッチ自体が問題を起こすこともあります。たとえばライブラリであるコントラクトのキルスイッチが作動した場合です。ライブラリのコード自体は不変でも、それに依存するすべてのコントラクトは意図どおりに動きません。最近、攻撃者が基盤ライブラリ関数のキルスイッチを作動させ、50 万 Ether 超が マルチシグネチャウォレットに閉じ込められる ↗ 事態が起きました。マルチシグネチャライブラリの利用者は、コードが不変ならライブラリは常に想定どおり動くと考え、そのブロックを受け入れました。これを受けて、スマートコントラクトのバグを検査したり、バグバウンティを実施したりするツールが多数登場しています。
ブロックチェーンとやり取りするスマートコントラクトが決定論的に動くのは、ブロックチェーンの状態を考慮した場合に限られます。
これは透明性と説明責任を提供する、根本的に異なるアプローチです。すべてのコントラクトとトランザクションは公開され、コンセンサス で検証されるため、信頼は一部の大規模機関に集中せず、人々のあいだに分散します。
機関に与えられる信頼は歴史に基づきます。その歴史が信頼性を築きます。
コンセンサスベースのアルゴリズムに置かれる信頼は、ほとんどの人が誠実である、より正確には、悪意ある結果を生むほど十分に大きな集団を結託させられない、という前提に基づきます。これが 信頼の民主化 です。DAO 攻撃では、ノードの過半数が不規則な状態遷移を受け入れることに同意しました。これにより攻撃の被害は事実上取り消され、少なくともブロックチェーンの世界では、認識が現実になることが示されました。ほとんどの人がこの不規則なブロックを「信じた」――つまり受け入れた――ため、それは「本物の」――有効な――ブロックになったのです。