Midnight のしくみで「公開と秘密の二刀流」を学びました。 このページは、その置き場所の決めかたを、もう一歩くわしく見ます。
なんのためにあるの?
Midnight のいちばん大事なところは、「秘密にできること」よりも、
どれを公開に置き、どれを秘密に置き、何を「証明」でつなぐかを、自分で決められること。
このバランスの設計が、アプリの良し悪しを決めます。
秘密ステートって、どんなもの?
公式は、秘密ステートをこう説明しています。
「ユーザーの端末にローカルで保存され、ブロックチェーンには公開されない」
つまり——
- 自分のスマホやパソコンの中にだけ持っているデータ
- 中身を知っているのは持ち主だけ
- 他の人は中身を見ずに、「つじつまが合っているか」だけを確かめます
「ただ隠す金庫」というより、「秘密を持ったまま、正しさをあつかえる場所」と考えるとピッタリです。
公開ステートって、どんなもの?
公式は、公開ステートをこう説明しています。
「ブロックチェーンに保存され、ネットワークの参加者全員から見える」
つまり——
- チェーンの上にあって、みんなが見られるデータ
- 秘密の中身は出さずに、「みんなで確かめられる事実」を共有するための土台
- 秘密の方があっても、公開の方は必要です(共有の記録だから)
Compact での言いかた(ledger と witness)
Compact(契約を書く言葉)では、置き場所を言葉で分けて書きます。
イメージにすると、こんな感じです(※本物の 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(外部リンク・別タブで開きます)