📘 Academy原文準拠 | Phase 3 · Unit 2 · Lesson 2.3 Shielded vs Unshielded Operations 内容に忠実な日本語版です。原文(英語)・図・動画は公式 Academy(外部リンク・別タブで開きます)を正本に。
前の 2 つのレッスンでは、計算のプライバシーを学びました。proof server が ZK 証明をつくる仕組み(2.1)と、witness が回路に秘密データを渡す仕組み(2.2)です。どちらも「入力やロジックを隠したまま、計算が正しいことを証明する」話でした。
このレッスンは、ちがう種類のプライバシー、トークンのプライバシーの話です。
Midnight でトークンを送るとき、ネットワークはその送金についてすべてを見られる(誰が・何を・誰に・いくら送ったか)か、あるいはほとんど何も見えないかのどちらかになります。この「シールド(shielded)にするか、アンシールド(unshielded)にするか」という選択は Midnight の根っこにあるもので、ブロックチェーン全体を支える UTXO モデルに直接組み込まれています。
動画で学ぶ(公式)
1 つのブロックチェーンに、2 種類のトークン

ほとんどのブロックチェーンでは、トークンの送金は完全に透明です。Ethereum で ETH を送れば、送り主・受取人・金額を誰でも見られます。逆に Zcash のように、すべてをデフォルトで秘密にするチェーンもあります。
Midnight はそのどちらでもなく、同じチェーン上で両方をサポートし、どちらを使うかを選べるという方針をとっています。
- アンシールドトークン(Unshielded tokens):Ethereum や Cardano のトークンと同じ。これに関わる取引は見える── 誰が・何を・誰に・いくら送ったか。Midnight のネイティブトークンは Night で、faucet から tNight を受け取ると、それはアンシールドアドレスにアンシールドトークンとして届きます。
- シールドトークン(Shielded tokens):プライベート。シールドトークンで取引すると、送り主・受取人・金額、さらにトークンの種類まで隠されます。
外から見ている人は「何かが送られた」(取引がチェーン上に存在する)こと、場合によっては「特定の契約が関わっている」ことは分かりますが、実際の中身は暗号的に隠されています。
これは見かけだけの違いではありません。この 2 種類のトークンは、内部でまったく別の仕組みを使っており、両方を理解することが Midnight 上で開発するうえで欠かせません。
UTXO モデル
シールド/アンシールドに入る前に、Midnight の取引モデルを理解しておく必要があります。
Midnight は、口座残高(account balances)ではなく UTXO(Unspent Transaction Outputs、未使用取引出力)を使います。
UTXO は現金(お札)のようなものだと考えてください。20 ドル札を持っていて 7 ドル払いたいとき、お札は破れません。20 ドル札をまるごと渡して、おつりとして 13 ドルを受け取ります。もとの 20 ドル札は消え(消費され)、新しく 2 枚 ── 7 ドルの支払いと 13 ドルのおつり ── が生まれます。
Midnight も同じです。あなたの「ウォレット残高」はデータベースの中の 1 つの数字ではなく、それぞれが特定の価値を持つ、ばらばらの UTXO の集まりです。
いくらかを使うには、UTXO をまるごと消費して、新しい UTXO をつくります。
どの UTXO も全額消費されなければなりません。部分的な支払いはできません。 一見不便ですが、これこそがシールドトークンを可能にし、取引の並列処理を可能にし、自然な監査証跡(audit trail)をつくる仕組みになっています。
アンシールドトークンの仕組み
アンシールドトークンは、よりシンプルなケースです。各アンシールド UTXO は、見える価値・見える所有者・見えるトークン種別を持ちます。あるアドレスから別のアドレスへ tNight を送ると、チェーンを見ている人は誰でも全体像を見ることができます。
あなたのアンシールドアドレスは mn_addr_preprod1... のような形をしていて、ウォレットの鍵導出ツリー(key derivation tree)から導かれます。SDK の中では UnshieldedWallet がこれらのトークンを管理し、使える UTXO を追跡して取引を組み立てます。
アンシールド操作は、透明性が望まれる・必要とされる場面で役立ちます ── 公開ガバナンス、監査可能な財務(treasury)操作、関係者全員が完全な可視性から恩恵を受けるような場面です。
シールドトークンの仕組み
シールドトークンは、Midnight のゼロ知識暗号が本領を発揮するところです。シールド UTXO は、その価値・所有者・トークン種別を一切さらしません。代わりに、それは commitment(コミットメント)── 値そのものを明かさずに UTXO を特定の値へ結びつける暗号的ハッシュ ── として表現されます。
シールド UTXO をつくるとき、次を計算します。
このコミットメントはチェーン上に公開されます。これは「特定の性質を持つ UTXO が存在する」ことを証明しますが、見ている人にはただのハッシュにしか見えず、価値・種別・所有者を取り出すことはできません。
シールド UTXO を使う(spend)とき、あなたは「どの UTXO を使っているか」を明かしません。代わりに nullifier(ナリファイア)── UTXO とあなたの秘密鍵から導かれる、別のハッシュ ── を計算します。
この nullifier は、グローバルな nullifier set(ナリファイア集合)に追加されます。これにより、どの UTXO を消費したかを明かさずに二重支払い(double-spending)を防ぎます(もしその nullifier が既に存在していれば、その UTXO はすでに使われている、と分かる)。コミットメントと nullifier の対応関係は、その UTXO の所有者だけが知っています。
あなたのシールドアドレスは mn_shield-addr_preprod1... のような形で、2 つの公開鍵 ── coin public key と encryption public key ── から構成されます。シールドトークンは ShieldedWallet が、アンシールドとは別に管理します。
Compact では、シールドトークンの操作は別の標準ライブラリ関数のセットを使います。
アンシールド操作との大きな違いは、シールド関数が平文の値ではなくコミットメントデータを運ぶ ShieldedCoinInfo 型・QualifiedShieldedCoinInfo 型を扱う、という点です。
ZSwap:シールド操作を支えるエンジン
Midnight 上のシールドトークン送金は、ZSwap によって動いています。ZSwap は Zerocash プロトコルにもとづくプロトコルで、プライベートで・アトミックな・マルチアセットのスワップを可能にします。
ZSwap の性質は次のとおりです。
- 取引の詳細(送り主・受取人・金額)は ZK-SNARKs によって秘匿される
- 複数のアセット種別を 1 つのアトミックな取引で交換できる ── すべての転送が成立するか、まったく成立しないかのどちらか
- 取引は設計上 malleable(可鍛性がある)── つまり、秘匿性を保ったままマージ(結合)できる。これにより、2 者がそれぞれ「半分の取引(half-transaction)」を用意し、それをオフチェーンで結合してから提出する、という流れが可能になる
DUST
Lesson 25 で、DUST が取引手数料を支払うことを学びました。DUST は実は第 3 のカテゴリで、特別な性質を持つシールドのリソースです。
- Night から時間をかけて生成される
- 手数料にしか使えない(転送はできない)
- もとになる tNight が使われると、ゼロに向かって減衰(decay)する
あなたの DUST アドレスは mn_dust_preprod1... のような形で、DustWallet が管理します。
3 種類のウォレットは、3 種類のアドレスに対応します。
これら 3 つを束ねるのが WalletFacade です。取引のバランスが取れる(balanced)と、WalletFacade は、実際の操作がシールド/アンシールドのどちらに関わるかに関わらず、手数料として DustWallet から DUST を引き出します。
どちらを、いつ使うか
シールドとアンシールドの選択は、「どちらが優れているか」ではありません。何をつくるかで決まります。
- 透明性が必要なら、アンシールドを使う。 公開ガバナンスの投票集計、透明な寄付トラッカー、公開オークション ── これらは全員が全体の状態を見られることから恩恵を受けます。
- プライバシーが重要なら、シールドを使う。 プライベートな支払い、機密のアセット転送、入札額を隠す必要があるブラインドオークション ── これらにはシールドトークンが必要です。トレードオフは、計算コストが高い(より複雑な ZK 証明)ことと、DApp のロジックがより複雑になることです。
- ユースケースが求めるなら、同じ契約で両方を使う。 たとえばコンプライアンスのシステムは、日々の操作にはシールド転送を、規制報告にはアンシールドの記録を必要とするかもしれません。Midnight はまさにこの種の selective disclosure(選択的開示) ── 明かすべきものだけを明かし、それ以上は明かさない ── のために設計されています。
これまでつくってきたものとのつながり
Lesson 24 では、あなたの hello-world 契約は完全に公開(public)でした。メッセージは disclose() を使って公開台帳に保存されました。faucet から受け取った tNight はアンシールドでした。
手数料のために生成された DUST はシールドでした(ただしあなたは直接それに触れず、ウォレットが処理していました)。
これから始まる bulletin board(掲示板)のレッスンでつくる契約では、witness(localSecretKey)を使って、投稿者の身元を秘密にしたまま、メッセージそのものは公開します。所有者の秘密鍵は決してチェーン上に現れず、そこから導出した公開鍵だけが現れます。これが selective disclosure の実例です ── メッセージは公開だが、投稿者の身元は明かさずに証明できるのです。
より高度な契約に進むと、契約の中でシールドトークン操作を使い始めます ── プライベートトークンの mint、機密の転送、ネットワークがデータを見ずに正しさを検証できるシステムの構築などです。
What’s next(原文の締め)
これで、Midnight 上の3 層のプライバシーが分かりました ── 計算のプライバシー(proof server)、データのプライバシー(witnesses)、そしてトークンのプライバシー(shielded vs unshielded)です。
次の 4 レッスンでは、これらすべてを組み合わせて、完全な bulletin board DApp をゼロから構築します ── 契約・witness・デプロイ・対話的な CLI まで。
開発者として押さえる点
- アンシールド = 透明:UTXO の価値・所有者・種別がすべて見える。
UnshieldedWalletが管理、アドレスはmn_addr_preprod1... - シールド = 秘密:UTXO は
PedersenCommit(value, randomness)の commitment として公開。使うときはnullifier = Hash(UTXO, ownerSecret)を nullifier set に入れ、どの UTXO を使ったか明かさず二重支払いを防ぐ。ShieldedWalletが管理、アドレスはmn_shield-addr_preprod1... - UTXO は全額消費:部分支払いは無い。おつりとして新しい UTXO をつくる。これが並列処理・監査証跡・シールドを成立させる
- Compact のシールド操作は専用関数(
mintShieldedToken/sendShielded/sendImmediateShielded/receiveShielded)と専用型(ShieldedCoinInfo/QualifiedShieldedCoinInfo)を使う - ZSwap(Zerocash 由来)がシールド送金を駆動:ZK-SNARKs で秘匿、マルチアセットのアトミックスワップ、設計上 malleable でオフチェーン結合が可能
- DUST は第 3 のカテゴリ:Night から生成・手数料専用・減衰する。
DustWalletが管理し、WalletFacadeがトークン種別に関わらず手数料を引き出す - 指針:透明性ならアンシールド、プライバシーならシールド、selective disclosure が要るなら両方
やさしい版・公式へ
- やさしい版:台帳と ZSwap(ledgers-and-zswap)
- 公式:Academy Courses(外部リンク・別タブで開きます)(Phase 3 / Unit 2 / 2.3)
- docs.midnight.network:Midnight のアーキテクチャ概要(外部リンク・別タブで開きます) / Compact 標準ライブラリ(shielded token 関数)(外部リンク・別タブで開きます)
つぎに読むページ
➡️ 原文準拠コースの入口へ戻る。このコースについて(次のレッスンは順次追加します)