Skip to main content

フェーズ3:Midnight のしくみ

公開・秘密・証明の置きどころ

どのデータを「みんなに見える所」に置き、どれを「自分の手元」に隠し、何を「証明」でつなぐか。Compact の ledger と witness の役わりも、やさしく。


Midnight のしくみで「公開と秘密の二刀流」を学びました。 このページは、その置き場所の決めかたを、もう一歩くわしく見ます。

なんのためにあるの?

Midnight のいちばん大事なところは、「秘密にできること」よりも、

どれを公開に置き、どれを秘密に置き、何を「証明」でつなぐかを、自分で決められること。

このバランスの設計が、アプリの良し悪しを決めます。

秘密ステートって、どんなもの?

公式は、秘密ステートをこう説明しています。

「ユーザーの端末にローカルで保存され、ブロックチェーンには公開されない」

つまり——

  • 自分のスマホやパソコンの中にだけ持っているデータ
  • 中身を知っているのは持ち主だけ
  • 他の人は中身を見ずに、「つじつまが合っているか」だけを確かめます

「ただ隠す金庫」というより、「秘密を持ったまま、正しさをあつかえる場所」と考えるとピッタリです。

公開ステートって、どんなもの?

公式は、公開ステートをこう説明しています。

「ブロックチェーンに保存され、ネットワークの参加者全員から見える」

つまり——

  • チェーンの上にあって、みんなが見られるデータ
  • 秘密の中身は出さずに、「みんなで確かめられる事実」を共有するための土台
  • 秘密の方があっても、公開の方は必要です(共有の記録だから)

Compact での言いかた(ledger と witness)

Compact(契約を書く言葉)では、置き場所を言葉で分けて書きます。

Compact の言葉 どっち? 役わり
ledger(レジャー) 公開ステート みんなの共有記録に書きこむ
witness(ウィットネス) 秘密ステート 自分の手元の秘密を、証明の材料として渡す

イメージにすると、こんな感じです(※本物の Compact とは細部がちがう、雰囲気のイメージです)。

「証明」が、秘密と公開をつなぐ橋

  • 証明(proof) は、秘密ステートを丸ごと見せるかわりに、「この条件は満たしているよ」とだけ公開側に渡せる橋です。
  • 秘密(witness)は手元で使われますが、その中身は共有記録には残らず、「正しい」という結果だけが公開側にわたります。
  • 公式はこの橋わたしを Kachina(カチナ)security model と呼んでいます(くわしくは別の資料で)。

なぜ「両方」分けて考えるの?

  • ぜんぶ公開 → プライバシーがこわれる
  • ぜんぶ秘密 → みんなで確かめる「共有記録」がなりたたない
  • だから「何を隠し・何を見せ・何を証明するか」を分けて考える必要があります

Witnesses と private data(開発者の視点 / Academy Phase 3 Unit 2.2)

開発者にとって、いちばん手を動かすのが witness(ウィットネス) です。

  • witness は Compact で宣言だけして、中身は TypeScript 側で実装します。
  • TS 側の witness 実装は「手元の秘密ステートから値を取り出して渡す関数」です。雰囲気で:
  • ここで渡した値は秘密のまま証明の材料になり、公開する所だけ disclose(...) でフタを開けます。
  • 秘密ステートは端末側に保存されます(DApp構造privateStateProvider、例:LevelDB)。

ポイント:「契約(Compact)は秘密の入口を宣言」「アプリ(TS)が中身を供給」という役わり分担。ここが分かると、けいじ板や Battleship の witness がスッと読めます。

気をつけること(よくあるかんちがい)

  • 「Midnight は全部が秘密になる」わけではありません
  • 「秘密ステート」は、ただのチェーンの外のデータベースではなく、検証のしくみと結びついた状態です。
  • Shielded(おおいをかける)秘密ステート(手元に置く) は、にているけどべつのことです。

開発者として何を学べばいい?

  • アプリのデータを見たら、まず「これは公開? 秘密? 証明でつなぐ?」と色分けするクセをつけること
  • 「どこに置くか」を決めること自体が、Midnight では設計の仕事になると知ること

今日のまとめ

  • 公開ステート=みんなに見える / 秘密ステート=手元だけ
  • Compact では ledger(公開)と witness(秘密)で書き分ける
  • 「証明」が、その2つをつなぐ橋

今はここだけでOK

「みんなのけいじ板(公開)と、自分のふでばこ(秘密)。それを『証明』という橋でつなぐ」——このイメージでOK。

📘 もっと正確に(原文準拠コース)

Academy 原文に忠実な詳しい版はこちら:

つぎに読むページ

➡️ その「秘密のまま正しく動かす」しくみへ。Kachina:秘密の契約のしくみ


📚 もっとくわしく(公式・むずかしめ): What is Midnight?(外部リンク・別タブで開きます)How Midnight works(外部リンク・別タブで開きます)