📘 Academy原文準拠 | Phase 1 · Unit 3 · Lesson 3.1 Smart Contracts Basics 内容に忠実な日本語版です。原文(英語)・図・動画は公式 Academy(外部リンク・別タブで開きます)を正本に。
スマートコントラクトは、最初はなかなかピンと来ません。「ブロックチェーンの上で動くプログラムだよ」とよく説明されますが、それだけだと疑問がふえるばかりです。コンピュータが無いのに、どうやってプログラムが動くの? だれが実行しているの? 途中で止められるの?
ここでは、スマートコントラクトが実際には何なのか、そしてどう動くのかを、ひとつずつほどいていきます。とくに Midnight では、プライバシーまわりでとても賢いことをやっています。
スマートコントラクトの正体
スマートコントラクトとは、ブロックチェーンの上に置かれたコードで、ある条件が満たされると自動で実行されます。人の手も、「これ処理しておいて」というお願いも要りません。ただの純粋な自動化です。
特別なのはここから。いちどデプロイすると、そのコードは変更できません。ネットワークのどのノードも、同じコードを同じ入力で実行し、同じ結果にたどり着きます。たとえるなら、何千台ものコンピュータがおたがいの宿題を答え合わせしているようなものです。
ほとんどのブロックチェーンでは、何もかもが公開です。コントラクトのコードも、データも、すべての取引も、みんなから丸見え。Midnight はこれをひっくり返します。あなたのプライベートなデータは自分の端末に置いたまま、「あることが真である」という証明(proof)を作り(たとえば「十分な資金を持っている」)、証明だけを送ります。ネットワークは、あなたの実データを見ることなく、あなたが本当のことを言っていると検証します。
スマートコントラクトの構造と部品
コントラクトを動かしている部品を見ていきましょう。これらは、コントラクトの臓器のようなもので、それぞれに役割があります。
順に分解します。
1. 状態変数(State Variables)
これはコントラクトの永続的な記憶です。いちど状態変数に書き込むと、その値はブロックチェーン上にずっと残り続けます。コントラクトがあなたのトークン残高を追跡したり、だれが所有者かを覚えていたりするとき、それが状態変数です。
すべてのノードがまったく同じコピーを保持します。だからこそ、1万台のコンピュータが、中央のデータベースに問い合わせることなく、あなたの今の残高について合意できるのです。
2. 関数(Functions)
関数は、コントラクトに実際に何かをさせるものです。スマートコントラクトの「動詞」にあたります。たとえば transfer()・deposit()・vote()・withdraw() など。
関数には、公開(だれでも呼べる)のものもあれば、特定のユーザーだけに制限されたものもあります。たとえば transfer() 関数は、さきほどの状態変数を更新することで、アカウント間でトークンを動かすかもしれません。
3. イベント(Events)
イベントは、コントラクトが「大事なことが起きたよ」と外の世界に向かって叫ぶための仕組みです。トークンが動けばイベントが発火し、だれかが投票すればイベントが発火します。
外部のアプリ(あなたのウォレット、ウェブサイト、分析ツールなど)は、これらのイベントを待ち受けて(listen)、オンチェーンで何が起きているかを知ります。イベントはコントラクトの状態を変えません。あくまで情報を知らせるための放送です。
4. 修飾子(Modifiers)
修飾子は、関数に条件を付け足す、使い回せるコードのかたまりです。いちばんよくあるのは onlyOwner で、これはコントラクトの所有者だけが特定の関数を呼べるようにします。
管理用の関数すべてに「呼び出し元が所有者かチェック」を書く代わりに、一度だけ修飾子として書いて、必要なところに適用します。コントラクトのどのドアにも配置できる門番(bouncer)を雇うようなものです。
(これらを Solidity の組み込み修飾子 view / pure / payable と混同しないこと。ここで話しているのは、アクセス制御や検証のために自分で作るカスタム修飾子です。)
全体としてどう動くか
- 状態変数が現在のデータ(だれが何を持っているか)を保持している
- だれかが関数を呼んで、何かを変えようとする
- 修飾子が、その操作を許してよいかチェックする
- 関数が実行され、状態変数を更新する
- イベントが発火して、何が起きたかを知らせる
- 外部アプリがイベントを見て、自分の画面を更新する
すべての部品にそれぞれの役割がある、完結したシステムです。
具体例
Midnight のプライバシーの実際

従来のスマートコントラクトは、ガラス張りの家のなかで確定申告をするようなもの。だれもがすべてを見られます。Midnight はこれを根本から変えます。
データをオンチェーンに置く代わりに、手元(ローカル)に保持します。そして、詳細を明かさずに「あることが真である」ことを示すゼロ知識証明(zero-knowledge proof)を生成します。コントラクトが検証するのは、あなたのデータではなく、その証明です。
たとえば、自分の純資産を明かすことなく、適格投資家(accredited investor)であることを証明できます。コントラクトは、あなたが資産100万ドルなのか1億ドルなのかを知らないまま、「資格あり」とだけ判断します。
これは、こう考えるとしっくりきます。特別な小窓ごしに身分証を見せるようなもので、その窓には「21歳以上:はい」とだけ表示され、実際の生年月日・名前・住所は見えないのです。
もし圧倒されるように感じても、それは普通のことです。スマートコントラクトは、プログラミング・暗号・経済の仕組みを組み合わせたもので、しっかり理解するには時間がかかります。これからのレッスンで積み上げていくうちに、ひとつずつ腑に落ちていきます。
開発者として押さえる点
- スマートコントラクト=チェーン上のコードで、条件が満たされると自動実行。デプロイ後は変更不可、全ノードが同じ入力で同じ結果を出す(決定論的)
- 部品は4つ:状態変数(永続記憶)・関数(動詞)・イベント(外への通知、状態は変えない)・修飾子(再利用できるアクセス制御)
- 流れは 状態変数 → 関数呼び出し → 修飾子でチェック → 状態更新 → イベント発火 → 外部アプリが反応 という一連のサイクル
- ここでの「修飾子」は自作のカスタム修飾子であり、Solidity 組み込みの
view/pure/payableとは別物 - Midnight 固有:データはローカルに保持し、ゼロ知識証明だけを送る。コントラクトが検証するのはデータではなく proof(「見せずに証明する」)
やさしい版・公式へ
- やさしい版:Compactってなに?
- 公式:Academy Courses(外部リンク・別タブで開きます)(Phase 1 / Unit 3 / 3.1 Smart Contracts Basics)
- 関連 docs:Midnight 公式ドキュメント(外部リンク・別タブで開きます)(プライバシーとゼロ知識証明の全体像)
つぎに読むページ
➡️ 原文準拠コースの入口へ。このコースについて(次のレッスンは順次追加します)