Skip to main content

原文準拠 Phase 3:DApp開発

2.3 シールド対アンシールド操作

Midnight Academy Phase 3 / Unit 2 / 2.3 の原文準拠版。トークンのプライバシー、UTXO モデル、シールド/アンシールドの仕組み、ZSwap、DUST、3 種類のウォレットを正確に・やさしく。


📘 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 モデルに直接組み込まれています。

動画で学ぶ(公式)

🎬 シールド対アンシールド操作の概要 YouTubeで開く ↗
🎬 トークンのプライバシーとシールド/アンシールドの解説 YouTubeで開く ↗

1 つのブロックチェーンに、2 種類のトークン

3 種類のウォレット(ShieldedWallet / UnshieldedWallet / DustWallet)と、それぞれのアドレスプレフィックス(mn_shield-addr / mn_addr / mn_dust)、扱うトークン(シールドトークン・tNight などの非シールドトークン・DUST)、プライバシー(完全プライベート・完全公開・シールドされているが譲渡不可)を対比した表

ほとんどのブロックチェーンでは、トークンの送金は完全に透明です。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 種類のアドレスに対応します。

ウォレット 管理するもの アドレスの形
UnshieldedWallet アンシールドトークン(tNight など) mn_addr_preprod1...
ShieldedWallet シールドトークン mn_shield-addr_preprod1...
DustWallet DUST(手数料用のシールドリソース) mn_dust_preprod1...

これら 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 が要るなら両方

やさしい版・公式へ

つぎに読むページ

➡️ 原文準拠コースの入口へ戻る。このコースについて(次のレッスンは順次追加します)