Titan FX(タイタンFX)

スマートコントラクトとは?仕組み・ガス代・用途と安全上のリスク

スマートコントラクトとは?仕組み・ガス代・用途と安全上のリスク
スマートコントラクトとは、ブロックチェーン上に置かれたプログラムのことで、あらかじめ決められた条件が満たされると、誰かが動かしたり許可を出したりしなくても自動で実行されます。

よく持ち出されるたとえが自動販売機です。お金を入れてボタンを押せば商品が出てくる。あなたが買ってよい相手かどうかを店員が判断する場面はありません。スマートコントラクトも同じことをしていて、違うのは条件も実行結果もチェーン上に残る点です。誰でも事前にコードを読めますし、あとから実行履歴も確認できます。

この設計が解いたのは「相手が約束どおり動いてくれるか」という問題でした。そのかわり、まったく別のリスクが生まれます。いったんデプロイされたコードは書かれたとおりに動く——書き間違えていても、そのとおりに動いてしまう。この記事では動作の流れ、ガス代、トークン規格、実際の用途、そして現実に起きた失敗事例までを解説します。

本記事のポイント
  • スマートコントラクトはブロックチェーン上に置かれ、条件が満たされると自動で実行されるプログラム。結果は全ノードがそれぞれ計算し直して確認する
  • チェーン上の状態を書き換える呼び出しにはガス代がかかり、公開データを読むだけなら不要。無限ループでネットワークが止まるのを防ぐ仕組みで、失敗した取引でもガス代は引かれる
  • 「デプロイしたら変更できない」が当てはまるのはバイトコードだけ。多くのプロジェクトはプロキシコントラクトで更新の余地を残しており、本当のリスクは管理者キーにある
  • コントラクトは自分からチェーンの外を見にいけない。価格や気温、試合結果といった外部の情報は、オラクルがチェーンに書き込んではじめて読める
  • 大きな損失の多くはロジックの不具合、オラクルの操作、管理者キー、ブリッジから生まれている。監査はリスクを下げるが、安全の保証にはならない

1. スマートコントラクトとは?

スマートコントラクトは、ブロックチェーン上に置かれたプログラムで、それ自身だけが書き換えられる保存領域を持っています。条件を満たす呼び出しが届くと、書かれたとおりのロジックで動き、自分のデータを更新する。その一部始終がチェーン上に残ります。

この言葉はプログラムより二十年ほど先に生まれました。1994年、法学者であり暗号学者でもあるニック・サボが、信頼ではなく仕組みによって約束を守らせるという発想を、自動販売機を例にスマートコントラクトとして提唱しています。当時はそれを載せられる基盤がありませんでした。実現したのは2015年、イーサリアムのメインネットが動き出し、チューリング完全なスマートコントラクトの実行環境がはじめて登場したときです。

できることとできないことを決めているのは、2つの性質です。

1つ目は決定性。同じコードに同じ入力を与えたら、世界中のどのノードでもまったく同じ結果にならなければいけません。そうでないと、各ノードが持つ台帳の中身がずれてしまいます。

そのため、コントラクトのなかに本当の乱数はありませんし、自分からインターネットに出てデータを取りにいくこともできません。価格や為替レート、気温といったチェーン外の情報は、オラクルがチェーンに書き込んではじめて読めるようになります。オラクルの操作が DeFi でよくある攻撃経路になっているのは、まさにここが理由です。

2つ目は公開されていること。バイトコードは必ずチェーン上にありますし、多くのプロジェクトはソースコードも検証できる形で公開しています。利用者は触る前にロジックを確かめられますが、攻撃者もじっくり穴を探せるということでもあります。

ブロックチェーンそのものに馴染みがない場合は、暗号資産の基本から目を通しておくと背景がつかめます。

2. スマートコントラクトはどう動くのか?

書かれてから使われるまでに、決まった段階をたどります。

書いてからチェーンに乗るまでの5段階

スマートコントラクトの呼び出しの流れを示した図。ユーザーが1件の呼び出しを送信してガス代を支払うと、その呼び出しが全ノードに広がり、どのノードも同じコードを実行して結果が一致したときにはじめて新しい状態がブロックに書き込まれる。デプロイは一度きりであること、読み取りだけの呼び出しはオンチェーンに記録されずガス代もかからないことも示している
  • 書く:イーサリアム圏でよく使われるのは Solidity で、ほかに Vyper などもあります。どんな関数があるか、誰が呼べるか、どのデータを書き換えるかをコードで定めます。

  • コンパイル:ソースコードは EVM(イーサリアム仮想マシン)が読めるバイトコードに変換されます。同時に ABI、つまり外部のプログラムがこのコントラクトを呼ぶための説明書もできあがります。

  • デプロイ:バイトコードを1件のトランザクションに包んでチェーンへ送ります。確定するとコントラクトに固定のアドレスが割り当てられ、そのままチェーン上に居続けます。デプロイ自体にもガス代がかかり、コードが長いほど高くなります。

  • 呼び出し:誰でも、あるいは別のコントラクトからでも、そのアドレスにトランザクションを送って関数を実行できます。データを読むだけの問い合わせは無料。状態を書き換えるものはすべてトランザクションになります。

  • 検算と記録:全ノードが同じコードをそれぞれ実行し、結果を突き合わせ、合意が取れたところで新しい状態がブロックに書き込まれます。「自動で実行される」の中身はここです。裏で何かのスケジューラーが動いているわけではなく、どのノードも同じコードを1回ずつ計算しています。

気をつけたいのは、コントラクトが自分から動き出すわけではないという点です。必ず1件のトランザクションが引き金になります。「期日になったら自動で支払われる」という機能も、実際には誰か(あるいは何らかの自動化サービス)が期日にその呼び出しを送っています。

ガス代:コードを動かすのになぜ費用がかかるのか

コードはチューリング完全なので、理屈のうえでは永遠に終わらないループも書けてしまいます。実行が無料なら、誰でも無限ループひとつでネットワークを止められることになる。ガス代はその穴をふさぐために設けられた単位です。

演算の種類ごとに消費するガスの量は決まっていて、保存領域への書き込みがいちばん高く、単純な足し算引き算がいちばん安い。トランザクションを送るときには2つを設定します。

  • ガスの上限:この取引に最大どれだけのガスを使ってよいか。低すぎると途中で実行が止まります。

  • ガスの単価:イーサリアムでは2021年の London アップグレード以降、「基本手数料+チップ」という形になりました。基本手数料は混雑の度合いに応じて自動で調整され、そのまま焼却されます。チップはバリデーターに渡ります。

初心者がつまずきやすいのが、失敗した取引でもガス代は引かれるという点です。条件が合わずに途中で止まった場合、状態は実行前に戻りますが、そこまでに使った計算は返ってきません。混雑しているときに失敗する取引を送るのは、手数料を捨てているのと同じです。

チェーンによって費用は大きく違います。同じ送金でも、イーサリアムのメインネットでは数ドルかかるところが、Polygon のようなスケーリング手段なら1セントに届かないこともあります。

「デプロイしたら変更できない」は本当か

半分だけ本当です。バイトコードそのものは確かに書き換えられませんが、それは機能が変わらないという意味ではありません。

主流のやり方がプロキシコントラクトです。利用者がやり取りするアドレスは中継役にすぎず、実際のロジックは差し替え可能な別のコントラクトに置かれています。更新するときは中継役の向き先を新しいほうへ変えるだけで、利用者のアドレスも残高もそのままです。

これで不具合を直せないという問題は解決しましたが、同時に権限が開発チームの手に戻ってきます。誰が更新できるのか、誰がコントラクトを止められるのか、誰が資金を引き出せるのか。こうした権限はたいてい一組の管理者キーか、マルチシグのウォレットが握っています。

つまりコントラクトを見きわめるとき、コードを読み終えても仕事は半分です。更新の権限が単一の秘密鍵にあるのか、マルチシグなのか、タイムロック付きなのか。この層の違いのほうが、技術的な設計よりも効いてきます。

3. 従来の契約とは何が違うのか?

名前は近いのに、動き方はほとんど逆です。

比較項目従来の契約スマートコントラクト
表現の仕方自然言語。解釈の余地が残るコード。結果はひととおりしかない
履行のされ方当事者の意思しだい。破れば司法へ条件が満たされれば実行。破る余地がない
執行のコストあとから回収するのは時間も費用もかかるガス代1回分、数秒で完了
間違えたとき協議・修正・取消の請求ができる書かれたとおりに実行。多くは取り返せない
使える範囲文章で約束できることなら何でも条件がチェーン上のデータで判定できるものに限る

違いの核心はあいまいさにあります。従来の契約は「合理的な期間内に」「重大な悪影響」といった余白を残しておき、もめたときは裁判所が埋める。スマートコントラクトにその余白はなく、判断の条件はすべてプログラムが読める形に置き換えておく必要があります。

ここから使いどころの境界も見えてきます。エスクロー払い、決められた比率での分配、担保が基準を割ったら清算——チェーン上のデータで判定できる場面なら、スマートコントラクトは速くて安い。ただし主観的な判断、意思表示の解釈、当事者の行為能力といったものが絡んだ瞬間、コードには手が出せません。

誤解されやすい点をもうひとつ。多くの国や地域では、スマートコントラクトそれ自体が法律上の契約になるわけではありません。合意が成立しているか、目的が適法かは、その土地の法律で判断されます。実務でよく見るのは、権利義務は書面の契約で定めておき、支払いの部分だけをスマートコントラクトに任せる組み合わせです。

4. どのチェーンで動く?EVM系と非EVM系

どのチェーンでもスマートコントラクトが動くわけではなく、動くチェーンも大きく2つに分かれます。

EVM系:一度書けば複数のチェーンへ

イーサリアムが EVM という実行環境を定めました。そのあと BNB Chain、Polygon、Avalanche の C-Chain、さらに Arbitrum・Optimism・Base といったレイヤー2 も、これに合わせる道を選んでいます。

利点ははっきりしています。同じ Solidity のコードがほとんど手を入れずに別のチェーンへ載りますし、開発ツールもウォレットもエクスプローラーもそのまま使えます。

トークン規格が広がったのも同じ理屈で、BNB Chain の BEP-20 はイーサリアムの ERC-20 を持ってきたものです。

非EVM系:それぞれ独自の道

Solana は Rust で書き、コントラクトを program と呼び、並列実行で処理量を稼いでいます。Cardano は Plutus、Aptos と Sui は Move を使います。

性能と安全性の取り方はそれぞれですが、そのぶん生態系どうしはつながらず、コードをそのまま移すこともできません。

ビットコインがこのリストに入らない理由

ビットコインのスクリプト言語は、あえてチューリング完全にしない設計になっていて、マルチシグやタイムロックといった限られた機能しか持ちません。2021年の Taproot アップグレードで表現できる幅は広がりましたが、汎用のスマートコントラクト基盤ではないままです。

これは安全性を優先した選択であって、技術が遅れているわけではありません。土台の違いはブロックチェーンの解説で詳しく扱っています。

5. 何に使われている?4つの主な用途

トークンの発行とトークン規格

チェーン上のトークンは、それ自体が1つのスマートコントラクトです。誰がいくら持っているかを記録し、送金や承認といった関数を備えています。ERC-20 は代替可能なトークンが持つべき関数とイベントを定めたもので、ERC-20 の解説に項目の一覧があります。ERC-721 は一つひとつが唯一無二の NFT に対応し、ERC-1155 は1つのコントラクトで複数種類のトークンをまとめて扱えるようにしたものです。

規格の値打ちはインターフェースがそろうことにあります。ウォレットはトークンごとに対応を書き足さずに済みますし、取引所も新しいトークンを扱うたびに裏側を作り直す必要がありません。

分散型金融(DeFi)

スマートコントラクトがいちばん成熟している領域です。

  • 自動マーケットメイカーは、オーダーブックのかわりに数式を置きます。代表例が Uniswap で、流動性の提供者が2種類のトークンをプールに預け、取引する側はプールを相手に売買します。

  • Aave のようなレンディングのプロトコルでは、担保を預けて別の資産を借りられます。金利はプールの利用率で自動的に決まり、担保比率が基準を割れば清算が動きます。

  • DAI のような過剰担保型のステーブルコインは、担保をロックして発行します。発行から清算までの決まりごとが、すべてコントラクトに書かれています。

DeFi の組み合わせやすさは「マネーレゴ」と呼ばれます。あるコントラクトが別のコントラクトを直接呼べるので、借り入れ・交換・ステーキングを1件の取引でつなげてしまえる。効率は高い一方で、リスクも同じ経路を伝わっていきます。

ステーキングとバリデーターの仕組み

プルーフ・オブ・ステークのチェーンでは、ステーキングのロック、報酬の配分、違反したノードへの罰則をコントラクトが受け持ちます。リキッドステーキングはさらに一歩進んで、預けた証しとなるトークンを発行し、ロック中でも売買できる資産を手元に残せるようにしています。

NFTとオンチェーンガバナンス

NFT のコントラクトは、1枚ごとの所有者とメタデータの置き場所を記録し、転売時に自動でロイヤルティを分配する決まりもコードに書き込めます。DAO は組織の規約をコントラクトにしたもので、ガバナンストークンを持つ人が投票し、可決された提案はコントラクトがそのまま実行します。取締役会の署名は要りません。

6. リスク:実際に起きた5つの失敗

いちばん時間をかける価値がある章です。以下はどれも現実に損失を出しており、しかも今も繰り返されています。

ロジックの不具合:The DAO とリエントランシー攻撃

いちばん有名なのが2016年6月の The DAO です。攻撃者はコントラクトが残高を更新する前に引き出しの関数を繰り返し呼び、およそ360万 ETH を持ち去りました。この手口はのちにリエントランシー攻撃と呼ばれるようになり、スマートコントラクトの安全性を語るうえで最も古典的な脆弱性の型になっています。イーサリアムのコミュニティは最終的にハードフォークで巻き戻し、そこからイーサリアムクラシック(ETC)が分かれました。ロジックの誤りを訴える窓口はどこにもない——この出来事が残した教訓はそこにあります。

オラクルの操作:フラッシュローン攻撃

レンディングやデリバティブのコントラクトは外部の価格に頼っています。もし価格の出どころが1つの取引所の板情報だけなら、攻撃者はフラッシュローンで同じ取引のなかに価格を吊り上げたり叩き落としたりして、誤った値段で清算や貸し出しをさせられます。2020年以降、この種の攻撃は何度も起きてきました。防ぐ側は時間加重平均や複数ソースの集約を使います。Chainlink のような分散型オラクルのネットワークは、まさにそのために生まれたものです。

管理者キーと持ち逃げ

前の章で触れた更新の権限は、最も見落とされやすいリスクです。上限なしの発行、取引の停止、資金の引き出しといった関数がコントラクトに残っていて、その権限が単一の秘密鍵にあるなら、設計がどれだけ美しくても開発チーム自身の行動は止められませんし、鍵が盗まれる可能性も残ります。プロジェクトを見るときは、権限の一覧とタイムロックの設定をコードと一緒に確認してください。

ブリッジ:損失の規模が最も大きい

ブリッジは A のチェーンで資産をロックし、B のチェーンで預り証を発行する仕組みで、たいていスマートコントラクトとチェーン外のバリデーターの両方が関わります。2021年から2022年にかけて、Poly Network、Wormhole、Ronin といったブリッジの事件はいずれも数億ドル規模の損失を出しました。このうち Ronin の原因はバリデーターの秘密鍵が盗まれたことであって、コントラクトのコードに誤りがあったわけではありません。「スマートコントラクトのリスク」はコードだけを見ていても足りず、その周辺にあるチェーン外の部分まで見る必要がある、ということです。

利用者側の承認リスク

個人がいちばん直接ぶつかるのがこれです。DEX やレンディングのプロトコルに自分のトークンを動かしてもらうには、まず approve のトランザクションを送って承認を与える必要があります。多くの画面では上限なしの額で申請されるのが初期設定で、しかもその承認は自分で取り消すまで生き続けます。フィッシングサイトの常套手段は、悪意のあるコントラクトに承認を与えさせておき、こちらが気づかないうちにトークンを持ち出すというものです。

トークンの承認額を比べた図。同じウォレットから同じコントラクトへ2本の経路が伸びており、上は無限記号と時計を添えた太い経路で、取り消すまで有効な上限なしの承認を表す。下は細い経路で、今回必要な分だけを通す上限つきの承認を表す

現実的な対処は、承認する額をその取引に必要な分だけに変えること、ブロックエクスプローラーや承認管理ツールで定期的に確認して使わない承認を取り消すこと、そしてまとまった資産は日常的に使うウォレットと分けておくことです。長く動かさない分はコールドウォレットへ移しておくとよいでしょう。

7. FAQ:スマートコントラクトに関するよくある質問

Q1:スマートコントラクトは本当に変更できないのですか?

デプロイ済みのバイトコードは書き換えられませんが、多くのプロジェクトはプロキシ構成を採っていて、ロジックを差し替え可能なコントラクトに置いているため、機能は更新できます。本当に変更できないかどうかは、プロキシ層があるか、更新の権限を誰が握っているか、タイムロックが付いているかで判断してください。

Q2:ガス代は誰に支払われるのですか?なぜ高いときがあるのですか?

イーサリアムの London アップグレード以降、ガス代は混雑に応じて自動調整され焼却される基本手数料と、取引を取り込んだバリデーターに渡るチップに分かれています。高さを決めるのは、その取引にどれだけの演算が必要かと、そのときブロックの空きをどれだけの人が奪い合っているかです。

Q3:取引が失敗したら、ガス代は返ってきますか?

返ってきません。状態は実行前に戻りますが、そこまでに使った演算は返金されず、設定したガスの上限のうち使わなかった分だけが戻ります。混雑しているときは、送る前にシミュレーションのツールで通るかどうか確かめておくと無駄がありません。

Q4:スマートコントラクトは法律上有効ですか?

多くの国や地域では、それだけで法的拘束力のある契約になるわけではありません。電子的な記録やブロックチェーン上の署名に証拠としての効力を認める法整備が進んでいる地域もありますが、それが解決しているのは形式の問題であって、コードそのものを契約と認めたわけではありません。

Q5:個人投資家はコードを読めるようになる必要がありますか?

一行ずつ読める必要はありませんが、身につけておきたい習慣が4つあります。コントラクトのアドレスを公式の経路から確認すること。ブロックエクスプローラーでソースコードが検証済みか、いつからデプロイされているか、どれくらいの人が触っているかを見ること。使わなくなったトークンの承認を定期的に取り消すこと。そして、まとまった資産と日常的に使うウォレットを分けること。どれもプログラミングの知識は要りませんが、よくある損失の大半はこれで防げます。

Q6:スマートコントラクトと DApp は同じものですか?

層が違います。スマートコントラクトはチェーン上のバックエンドで、DApp(分散型アプリケーション)はそれに加えてウェブのフロントエンドを持つのが普通です。フロントエンドは更新もできますし、閉鎖されることも、乗っ取られて悪意のある版に差し替えられることもあります。それでもコントラクトはチェーン上でそのまま動き続ける。慣れた利用者がフロントエンドの接続先が正しいコントラクトのアドレスかを確かめるのは、このためです。

Q7:スマートコントラクトは安全ですか?

分けて考える必要があります。実行そのものは検証できます。コードは公開されていて、呼び出しは1件ずつ記録が残るからです。ただし実行が検証できることと、結果が安全であることは別です。前章の5つのリスクのうち、コントラクトのコードに起因するのは1つ目だけで、残りの4つは外部データ、権限の設計、周辺の基盤、そして利用者自身の承認の習慣から生まれています。監査はリスクを下げますが、特定の版に対する抜き取り検査であって、安全の保証にはなりません。

8. まとめ:実行は保証するが、正しさは保証しない

スマートコントラクトが本当に変えたことは1つだけです。「相手が約束どおり動いてくれるか」という問いを、「このコードは正しく書けているか」という問いに置き換えました。前者には信頼と司法が要り、後者にはコードの検証と権限の設計が要ります。

これは確かな前進で、その代償もはっきりしています。コードは書かれたとおりに動き、書き間違えていてもそのとおりに動く。資産が動いてしまえば、取り消してくれる窓口はありません。これまでで規模の大きかった損失は、ロジックの不具合、オラクルの操作、管理者キー、ブリッジから出ています。暗号技術が破られたからではありません。

現実的な向き合い方は、スマートコントラクトを検証できる自動実行の仕組みとして捉えることです。決まりごとは公開され、実行は速く安くなりました。ただしリスクが消えたわけではなく、置き場所が変わっただけです。どこへ移ったのかが見えていれば、正しい問いを立てられます。関連する資産の値動きはイーサリアムのリアルタイム相場などで直接追えます。


関連記事
✏️ 著者について

Titan FX 取引戦略研究所。FX、商品(原油・貴金属・農産物)、株価指数、米国株、暗号資産など、幅広い金融商品を対象に投資家向け教育コンテンツを制作しています。


主な出典(カテゴリ別)
  • プロトコル仕様:イーサリアム公式ドキュメントと改善提案(EIP)による EVM、ガスの計量、トークン規格に関する一般的な説明
  • セキュリティ研究:リエントランシー、オラクルの操作、ブリッジの事件を扱った公開のスマートコントラクト・セキュリティ研究と事故のまとめ
  • オンチェーンデータ:公開ブロックエクスプローラーによるコントラクトの検証状況、デプロイ時期、利用件数などの一般的なデータ
  • 投資家教育:各国の金融当局による、暗号資産の承認リスク、フィッシングの手口、詐欺の見分け方に関する教育資料