スマートコントラクト入門
最終更新: 2026年2月25日
スマートコントラクトとは
「スマートコントラクト」とは、単にイーサリアムブロックチェーン上で動作するプログラムのことです。 イーサリアムブロックチェーン上の特定のアドレスに存在するコード(その機能)とデータ(その状態)の集合です。
スマートコントラクトはイーサリアムアカウントの一種です。 つまり、残高があり、トランザクションの対象とすることができます。 しかし、スマートコントラクトはユーザーによって制御されるものではなく、ネットワークにデプロイされ、プログラムされた通りに実行されます。 ユーザーアカウントは、スマートコントラクトで定義されている機能を実行するトランザクションを送信することで、スマートコントラクトとやり取りできます。 スマートコントラクトはビジネスにおける契約と同じように、ルールを定めて、そのルールをコードによって自動的に適用することができます。 スマートコントラクトは、デフォルトで削除できないようになっており、スマートコントラクトとのやり取りを取り消すことはできません。
前提条件
始めたばかりの方や、技術的すぎない入門ガイドをお探しの方には、スマートコントラクト入門をお勧めします。
スマートコントラクトの世界に飛び込む前に、アカウント、トランザクション、イーサリアム仮想マシンについて必ず読んでおいてください。
デジタル自動販売機
スマートコントラクトの最も良い例えは、Nick Szabo (opens in a new tab)が説明している自動販売機かもしれません。 適切な入力では、特定の出力が保証されます。
自動販売機でスナックを取得する場合、以下のロジックになります。
1お金 + スナック選択 = 出てくるスナックこのロジックは自動販売機にプログラムされています。
自動販売機と同様に、スマートコントラクトにはロジックがプログラムされています。 この自動販売機がSolidityで書かれたスマートコントラクトであればどのように見えるか、簡単な例を挙げてみましょう。
1pragma solidity 0.8.7;23contract VendingMachine {45 // コントラクトの状態変数を宣言6 address public owner;7 mapping (address => uint) public cupcakeBalances;89 // 'VendingMachine'コントラクトがデプロイされた時:10 // 1. デプロイしたアドレスをコントラクトの所有者としてセット11 // 2. デプロイされたスマートコントラクトのカップケーキの残高を100にセット12 constructor() {13 owner = msg.sender;14 cupcakeBalances[address(this)] = 100;15 }1617 // 所有者がスマートコントラクトのカップケーキの残高を増やせるようにする18 function refill(uint amount) public {19 require(msg.sender == owner, "補充できるのは所有者のみです。");20 cupcakeBalances[address(this)] += amount;21 }2223 // 誰でもカップケーキを購入できるようにする24 function purchase(uint amount) public payable {25 require(msg.value >= amount * 1 ether, "カップケーキ1個あたり少なくとも1ETHを支払う必要があります");26 require(cupcakeBalances[address(this)] >= amount, "この購入を完了するのに十分なカップケーキの在庫がありません");27 cupcakeBalances[address(this)] -= amount;28 cupcakeBalances[msg.sender] += amount;29 }30}すべて表示自動販売機が販売員の必要性を無くしたように、スマートコントラクトは多くの業界の仲介者を不要にし、自動化することができます。
パーミッションレス
誰でもスマートコントラクトを作成してネットワークにデプロイできます。 スマートコントラクト言語でのコーディング方法を学び、コントラクトをデプロイするのに十分なETHを持っているだけでよいのです。 スマートコントラクトのデプロイは技術的にはトランザクションなので、単純なETHの送金でガスを支払う必要があるのと同様に、ガスを支払う必要があります。 ただし、コントラクトのデプロイにかかるガス代は、はるかに高くなります。
イーサリアムには以下のような、スマートコントラクトを作成するためのデベロッパーフレンドリーな言語があります。
- Solidity
- Vyper
ただし、イーサリアムの仮想マシンがコントラクトコードを解釈して保存できるようするためには、コントラクトをデプロイする前にコンパイルが必要です。 コンパイルについての詳細
コンポーザビリティ
スマートコントラクトはイーサリアム上で公開されており、オープンAPIと考えることができます。 つまり、自分のスマートコントラクトの中で他のスマートコントラクトを呼び出し、自分のスマートコントラクトでできることを大幅に拡張することができるのです。 スマートコントラクトは他のスマートコントラクトをデプロイすることもできます。
スマートコントラクトのコンポーザビリティの詳細はこちら。
制約事項
スマートコントラクトだけでは、オフチェーンソースからデータを取得できないため、実世界のイベントに関する情報を得ることはできません。 そのため、実世界のイベントに反応することはできません。 これは、スマートコントラクトの仕様です。 外部の情報に頼ると、セキュリティや分散化のために重要なコンセンサスが損なわれる可能性があるためです。
しかし、ブロックチェーンアプリケーションにとって、オフチェーンデータが使えることは重要です。 そのための解決策は、オフチェーンデータを取り込んでスマートコントラクトで利用できるようにするツールであるオラクルです。
スマートコントラクトのもう一つの制約は、コントラクトの最大サイズです。 スマートコントラクトの最大サイズは24KBです。それ以上の場合はガス不足になります。 これはThe Diamond Pattern (opens in a new tab)を使用することで回避できます。
マルチシグコントラクト
マルチシグ(複数署名)コントラクトは、トランザクションを実行するために複数の有効な署名を必要とするスマートコントラクトアカウントです。 これは、相当量のイーサやトークンを保持するコントラクトで単一障害点を回避するのに特に便利です。 マルチシグはまた、コントラクトの実行と鍵の管理の責任を複数の当事者間で分担し、取返しのつかない資金損失につながる秘密鍵の紛失を防ぎます。 これらの理由から、簡単なDAOガバナンスのためにマルチシグコントラクトを利用することができます。 マルチシグは、実行するために、承認可能なM個の署名のうちN個の署名を必要とします(N ≤ M、かつ M > 1)。 N = 3, M = 5 と N = 4, M = 7 が一般的に使用されます。 4/7マルチシグでは、7つの有効な署名のうちの4つが必要です。 これは、3つの署名が失われても資金が回収可能であることを意味します。 この場合、コントラクトを実行するためには、鍵の保有者の過半数の同意と署名が必要であることも意味します。
スマートコントラクト関連リソース
OpenZeppelin Contracts - 安全なスマートコントラクト開発のためのライブラリ。
- openzeppelin.com/contracts/ (opens in a new tab)
- GitHub (opens in a new tab)
- コミュニティフォーラム (opens in a new tab)