Blockchain Basicsintermediatearticle35 min read

Dual Ledger Midnight: Sổ Cái Kép Shielded & Unshielded Kết Nối Bằng ZKP | VCC

Tìm hiểu kiến trúc dual ledger của Midnight: sổ cái che (shielded) và sổ cái công khai (unshielded) kết nối bằng zero-knowledge proofs. Phân tích kỹ thuật sâu với sơ đồ cho developers Cardano.

Vietcardano teamTeam

Đội ngũ biên tập VietCardanoCommunity — các chuyên gia blockchain và Cardano, cung cấp nội dung giáo dục và nghiên cứu chuyên sâu cho cộng đồng.

Published 31 tháng 8, 2026Updated 30 tháng 8, 2026

Kiến trúc dual ledger midnight của Midnight sử dụng hai cây trạng thái song song – một shielded sổ cái cho trạng thái riêng và một unshielded sổ cái cho trạng thái công khai – được kết nối bằng các bằng chứng không hiểu biết (ZKP) xác nhận các phép tính riêng tư mà không tiết lộ các đầu vào. Điều này cho phép các nhà phát triển xây dựng các ứng dụng dApp bảo vệ quyền riêng tư trên Cardano trong khi vẫn tuân thủ các quy định trên lớp công khai.

Hãy tưởng tượng hai kế toán viên chia sẻ một cuốn sổ kế toán. Người đầu tiên viết bằng mực không thể nhìn thấy (shielded) – chỉ những người liên quan mới có thể đọc các ghi chú của họ. Người thứ hai viết bằng mực thông thường (unshielded) – bất kỳ ai cũng có thể kiểm tra tổng số. Một bằng chứng toán học (ZKP) kết nối chúng: nó chứng minh các ghi chú không thể nhìn thấy được cộng lại đúng mà không bao giờ tiết lộ các số. Đó là Midnight trong một nốt.

Tại Sao Midnight Tồn Tại: Đôi Bên Trái Của Sự Minh Bạch Và Quyền Riêng Tư

Cardano's UTXO mô hình là hoàn toàn minh bạch. Mỗi tài khoản ADA, mỗi dữ liệu hợp đồng thông minh, mỗi chuyển giao token – đều có thể được mọi người xem thấy mãi mãi. Sự minh bạch này cho phép xác minh không cần sự tin tưởng, nhưng lại tạo ra một vấn đề cho các ứng dụng trong thế giới thực:

  • GDPR (Yêu châu): Quyền xóa bỏ xung đột với sổ cái không thể thay đổi
  • Định 13/2023/NĐ-CP (Việt Nam - Điều 12): Dữ liệu cá nhân phải được mã hóa khi lưu trữ; quyền truy cập phải được ghi nhật ký
  • Dựng dụng doanh nghiệp: Ngân hàng không thể đặt KYC khách hàng trên chuỗi công khai
  • DeFi privacy: Front-running phát triển trên mempool công khai

Midnight giải quyết vấn đề này bằng một kiến trúc midnight không phải lựa chọn giữa quyền riêng tư và khả năng kiểm tra – nó cung cấp cả hai. Mô hình shielded unshielded blockchain cho bạn hai cuốn sách: một cuốn riêng tư, một cuốn công khai, được liên kết toán học bởi ZKP.

Mô Hình Hai Sổ Cái: Hai Sổ, Một Sự Thật

Midnight không chạy hai chuỗi khối riêng biệt. Nó chạy một lớp đồng thuận (protocap BFT của Midnight) với hai cây trạng thái:

Ledger Khả Năng Nhìn Thấy Mô Hình Trạng Thái Vai Trò Chính
Shielded Chỉ thành viên Cam kết ghi chú mã hóa (Pedersen) Tính toán riêng, chuyển tài sản, danh tính
Unshielded Công khai UTXO chuẩn + khóa xác minh Xác minh ZKP, neo gốc trạng thái, hợp đồng công khai

Kiến trúc dual ledger: hai chuỗi song song với cầu ZKP, shielded bên trái (biểu tượng khóa), unshielded bên phải (biểu tượng trái đất), mũi tên xác minh ZKP giữa chúng

Sổ cái shielded lưu trữ các cam kết ghi chú đã được mã hóa – hãy xem chúng như những hộp được khóa. Chỉ người sở hữu ghi chú mới biết mật khẩu (nguyên liệu bí mật). Khi họ chi tiêu, họ chứng minh rằng hộp tồn tại và chưa được mở trước đó – mà không cần phải tiết lộ mật khẩu.

Sổ cái unshielded là một chuỗi tương thích với chuẩn Cardano. Việc đặc biệt của nó là nó chạy một PLONK verifier circuit trên chuỗi. Mỗi giao dịch shielded tạo ra một ZKP; sổ cái unshielded kiểm tra nó và, nếu hợp lệ, cập nhật state root toàn cầu – một gốc Merkle cam kết với tất cả các ghi chú shielded.

Chìa khóa quan trọng: Sổ cái unshielded không lưu dữ liệu riêng. Nó lưu bằng chứng rằng dữ liệu riêng đã được xử lý chính xác. state root là phiếu nhận được về mật mã.

Sổ Cái Shielded Deep Dive — Quản Lý Trạng Thái Riêng

Ghi Chú Về Cam Kết: Các Thành Phần Cơ Bản

Mọi tài sản riêng trên Midnight được coi như một ghi chú:

Note = {
  value: u64,           // Số lượng (bằng DUST lovelace)
  owner: PublicKey,     // Khóa công khai người nhận
  nonce: Fr,            // Ngẫu nhiên cho tính duy nhất của cam kết
  asset_id: AssetId     // DUST, token tùy chỉnh, NFT...
}

Cam kết = PedersenCommitment(value, owner, nonce, asset_id). Điều này ẩn đi tất cả các trường nhưng liên kết chúng bằng thuật toán mã hóa. Dữ liệu ghi chú tương tự + nonce khác nhau = cam kết khác nhau (tránh liên kết).

Nullifiers: Ngăn Chặn Việc Chi Tiêu Nhiều Lần Mà Không Tiết Lộ Thông Tin Về Từng Đồng Tiền

Khi bạn chi một ghi chú, bạn tiết lộ một nullifier = H(note_secret). Sổ cái unshielded giữ một tập nullifier – một danh sách ngày càng lớn của tất cả các hash ghi chú đã chi.

  • Nếu nullifier đã trong tập → từ chối (double-spend)
  • Nếu nullifier không trong tập → thêm vào tập, chấp nhận chi tiêu

Sơ đồ quy trình vòng đời giao dịch shielded: tạo ghi chú → tạo ZKP → gửi sổ cái → đăng ký nullifier → cập nhật gốc trạng thái

Chuỗi Giao Dịch (Bên Được Bảo Vệ)

  1. Người dùng tạo ghi chú → tính toán cam kết cục bộ
  2. Người dùng tạo ZKP chứng minh:
    • Họ biết bí mật ghi chú (sở hữu)
    • Cam kết đầu vào tồn tại trong cây trạng thái hiện tại
    • Cam kết đầu ra được hình thành đúng cách
    • Nullifier = H(bí mật) không trong tập nullifier
    • Bảo toàn giá trị: tổng(đầu vào) = tổng(đầu ra)
  3. Gửi đến sổ cái shielded → validator kiểm tra bằng chứng, thêm nullifier, cập nhật state root
  4. State root lan truyền đến sổ cái unshielded để neo

Ràng buộc mạch: ~50.000 ràng buộc R1CS cho một chuyển giao tiêu chuẩn (PLONK, thời gian chứng minh ~2s trên máy tính, ~5-10s trên thiết bị di động).

Sổ Cái Unshielded — Neo Công Khai

Sổ cái unshielded có vẻ quen thuộc với bất kỳ nhà phát triển Cardano: UTXO, dữ liệu, người nhận, mã Plutus. Nhưng nó có hai trách nhiệm đặc biệt:

1. Thanh Khóa Xác Thực (Verification Key Registry)

Mỗi mạch ZKP đều có một khóa xác thực (VK). Sổ cái unshielded lưu các VK trong một thanh UTXO. Khi một mạch mới được triển khai (ví dụ: hợp đồng DEX riêng mới), VK của nó được đăng ký một lần. Tất cả các bằng chứng tương lai cho mạch đó tham chiếu VK này.

2. Cam Kết Gốc Trạng Thái (State Root Commitments)

Mỗi khối, sổ cái unshielded bao gồm gốc trạng thái shielded mới nhất trong một dữ liệu UTXO chuyên dụng:

UnshieldedDatum = {
  shielded_state_root: MerkleRoot,
  nullifier_set_root: MerkleRoot,
  verification_keys: Map,
  public_contracts: Map
}

Mọi người có thể kiểm tra: "Tại độ cao khối N, trạng thái shielded cam kết cho gốc R." Đây là đường dẫn kiểm toán.

Cấu trúc sổ cái unshielded: tập UTXO với cam kết gốc trạng thái che, thanh khóa xác thực, dữ liệu công khai

Cầu ZKP – Cách Chúng Kết Nối

Đây là trái tim của kiến trúc dual ledger midnight. ZKP không chỉ là công cụ bảo mật – nó là cơ chế đồng thuận giữa hai sổ cái.

Cấu Trúc Mạch (PLONK Qua Kachina)

Mỗi mạch ZKP bao gồm ba thành phần:

Thành Phần Ai Thực Hiện Kích Thước Mục Đích
Mạch Prover Người dùng (off-chain) ~50k ràng buộc Tạo bằng chứng từ đầu vào riêng
Mạch Verifier Sổ cái unshielded (on-chain) ~5k ràng buộc Xác minh bằng chứng, cập nhật trạng thái
Khóa Xác Thực (VK) Tạo khi triển khai ~2 KB Tham số công khai để xác minh

Thông tin gốc: Mạch verifier nhỏ hơn mạch prover 10 lần. Đây là tối ưu PLONK có chủ đích – prover chạy trên thiết bị người dùng (laptop, điện thoại) – có thể chịu tính toán nặng. Verifier chạy trên mọi nút validator – phải nhẹ. Kachina của Midnight tối ưu cho sự bất đối xứng này.

Luồng Xác Minh

1. Prover (Thiết Bị User)
   ├─ Đầu Into Riêng (Witness): bí mật ghi chú, nonce, ngẫu nhiên
   ├─ Đầu Vào Công Khai: gốc trạng thái hiện tại, nullifiers, cam kết mới
   ├─ Mạch: transfer.circuit (50k ràng buộc)
   └─ Đầu Ra: ZK Proof (π)

2. Gửi
   └─ Giao dịch gửi đến mạng Midnight (mempool che)

3. Validator (Sổ Cái Unshielded)
   ├─ Lấy VK cho mạch
   ├─ Chạy verifier.circuit (5k ràng buộc) với (VK, π, public_inputs)
   ├─ Nếu hợp lệ: chấp nhận, cập nhật gốc trạng thái, thêm nullifiers
   └─ Nếu không hợp lệ: từ chối, phí hoàn trả

4. Cập Nhật Gốc Trạng Thái
   └─ Gốc shielded_state_root mới ghi vào UTXO datum unshielded

Luồng xác minh ZKP: Prover → Mạch → Chứng minh → Verifier Unshielded → Cập nhật Gốc Trạng Thái → Quy Toán Cardano

Tổng Hợp Đệ Quy: Mở Rộng Thông Lượng Riêng Tư

Midnight hỗ trợ tổng hợp bằng chứng đệ quy – nhiều giao dịch shielded gom vào một xác minh unshielded duy nhất.

  • User A, B, C mỗi người tạo bằng chứng chuyển (π₁, π₂, π₃)
  • Tổng hợp tạo bằng chứng đệ quy π_agg chứng minh "π₁, π₂, π₃ đều hợp lệ"
  • Unshielded ledger chỉ xác minh π_agg (~5k ràng buộc)
  • Kết quả: chi phí xác minh on-chain O(1) bất kể lượng giao dịch riêng tư

Đây là cách Midnight đạt thông lượng riêng tư cao mà không làm phồng sổ cái unshielded.

Ví Dụ Dữ Liệu Đầu-Đuôi – Alice Gửi 100 DUST Riêng Tư Cho Bob

Hãy theo dõi Alice gửi 100 DUST riêng tư cho Bob:

THIẾT BỊ ALICE                          MẠNG MIDNIGHT                    CARDANO
─────────────────                      ─────────────────                   ─────────
1. Tạo ghi_chú_Bob(100 DUST)
   cam_kết = Ped(100, Bob_PK, nonce)

2. Tạo ZKP (transfer.circuit)
   ├─ Witness: Alice_bí_mật, Bob_nonce
   ├─ Công khai: gốc_tt_N, nullifier_Alice
   └─ Chứng minh π_Alice→Bob

3. Gửi tx đến mempool che
                                              4. Validator nhặt tx
                                              5. Chạy verifier.circuit(VK, π, pub)
                                              6. Hợp lệ → Cập nhật state_root_N+1
                                              7. Thêm nullifier_Alice vào tập
                                              8. Ghi gốc mới vào UTXO unshielded
                                                       9. Ranh epoch:
                                                       10. Checkpoint: {epoch, state_root, block_hash}
                                                       11. Đăng lên Cardano qua script partner chain
                                                       12. Cardano cuối cùng → neo bất biến

Sơ đồ quy trình chuyển giao riêng tư đầu-đuôi: Alice → Ghi chú + ZKP → Sổ Cái Che → Xác Minh ZKP → Sổ Cái Unshielded → Gốc Trạng Thái → Lớp Quy Toán Cardano

Kết quả: Bob nhận 100 DUST riêng tư. Chỉ Alice và Bob biết số lượng và người nhận. Thế giới thấy: "Một ZKP hợp lệ cập nhật gốc trạng thái che từ R₁ sang R₂." Cardano có bản ghi bất biến rằng chuyển đổi này xảy ra đúng đắn.

So Sánh Shielded vs Unshielded — So Sánh Bên Cạnh

Bảng so sánh này là đầu tiên của loại này – không tài liệu hiện có đặt các thuộc tính này cạnh nhau.
Thuộc Tính Sổ Cái Shielded Sổ Cái Unshielded
Khả Năng Nhìn Thấy Chỉ người tham gia (mã hóa) Công khai
Mô Hình Trạng Thái Cam kết ghi chú mã hóa (cây Merkle) UTXO chuẩn
Đồng Thuận Chia sẻ (BFT Midnight) Chia sẻ (BFT Midnight)
Vai Trò ZKP Tạo bằng chứng (prover) Xác minh bằng chứng (verifier)
Quy Toán Qua unshielded → Cardano Trực tiếp đến Cardano
Trường Hợp Sử Dụng Chính DeFi riêng tư, danh tính, token tuân thủ Token công khai, quản trị, dấu vết kiểm toán
Ràng Buộc Mạch ~50k (prover) ~5k (verifier)
Dữ Liệu Lưu Trữ Cam kết mã hóa, nullifiers UTXO, VK, gốc trạng thái, datum công khai

Midnight Trên Cardano — Quy Toán & Tương Tác

Midnight là một partner chain (sidechain) của Cardano, không phải L1 độc lập. Mối quan hệ này định nghĩa bảo mật và kinh tế của nó.

Checkpointing: Neo Cardano

Mỗi epoch (~5 ngày), Midnight đăng một giao dịch checkpoint lên Cardano:

CheckpointDatum = {
  epoch: u64,
  shielded_state_root: MerkleRoot,
  unshielded_block_hash: Hash,
  vrf_proof: VRFOutput,     // Chứng minh lựa chọn validator Midnight
  aggregate_vk_hash: Hash   // Cam kết tất cả VK đã đăng ký
}

Validator Cardano xác minh chứng minh VRF (chứng minh khối Midnight được sản xuất bởi tập validator đúng) và lưu checkpoint. Điều này cho Midnight finality cấp Cardano – đảo ngược khối Midnight yêu cầu đảo ngược Cardano.

Cầu Token DUST

DUST là tài sản gốc của Midnight (gas, staking, quản trị). Nó cầu nối đến Cardano qua lock/mint:

  • Cardano → Midnight: Khóa DUST trên Cardano (script Plutus) → Midnight đúc DUST tương đương (shielded hoặc unshielded)
  • Midnight → Cardano: Đốt DUST trên Midnight → Mở khóa trên Cardano (yêu cầu bằng chứng unshielded về việc đốt)

Quy toán Midnight-Cardano: các epoch Midnight → Checkpoint gốc trạng thái → Giao dịch Cardano → Cuối cùng → Cầu DUST

Trải Nghiệm Nhà Phát Triển — Xây Dựng Trên Dual Ledger

Compact: Ngôn Ngữ ZKP

Midnight giới thiệu Compact – ngôn ngữ giống Rust biên dịch trực tiếp thành R1CS (Hệ Ràng Buộc Bậc 1) cho PLONK.

// Hợp đồng token riêng tư trong Compact
contract PrivateToken {
    // Hàm shielded: chạy trong ZKP, trạng thái ẩn
    shielded fn transfer(
        from: Note,
        to_pubkey: PublicKey,
        amount: u64
    ) -> (Note, Note) {
        // Tự động tạo:
        // - Mạch prover (50k ràng buộc)
        // - Đăng ký verifier trên sổ cái unshielded
        // - Logic nullifier
    }
    
    // Hàm unshielded: công khai, minh bạch
    fn total_supply() -> u64 { ... }
}

Từ khóa shielded fn là phép màu – nó báo cho trình biên dịch: "Hàm này chạy trong ZKP. Tạo mạch, đăng ký verifier, xử lý nullifier." Nhà phát triển viết logic nghiệp vụ; Compact lo phần mật mã.

Mô Phỏng Cục Bộ (Không Cần Testnet)

Midnight cung cấp mô phỏng cục bộ – một file nhị đơn chạy toàn bộ stack dual-ledger cục bộ. Nhà phát triển có thể:

  • Biên dịch hợp đồng Compact
  • Tạo/kiểm tra ZKP ngay lập tức
  • Mô phỏng tương tác shielded + unshielded
  • Gỡ lỗi ràng buộc mạch

Không cần faucet testnet, không chờ khối. Tốc độ lặp: giây, không phải phút.

Luồng Triển Khai

1. Viết hợp đồng Compact
2. cargo compact build → tạo ra:
   - prover_circuit.wasm (cho user)
   - verifier_vk.json (cho sổ cái unshielded)
   - compact_abi.json (cho frontend)
3. Triển khai: gửi verifier_vk đến sổ cái unshielded (một lần)
4. User: gọi shielded fn → prover cục bộ tạo π → gửi

Sai Lầm Thường Gặp & Cạm Bẫy

  1. "Shielded nghĩa là ẩn khỏi tất cả" – Validator thấy ciphertext (cam kết, nullifier), không phải plaintext. Họ biết rằng một chuyển giao xảy ra, không phải gì được chuyển.
  2. Thấp ước thời gian tạo bằng chứng – ~2s desktop OK; ~8s mobile ảnh hưởng UX. Cache khóa chứng minh, dùng worker nền.
  3. Quên quản lý nullifier – Nếu frontend mất bí mật ghi chú trước khi chi, tiền bị khóa vĩnh viễn. Nullifier = H(bí_mật) – không bí_mật, không chi.
  4. Coi unshielded chỉ là "verifier" – Nó là chuỗi UTXO đầy đủ. Bạn có thể xây DeFi công khai, quản trị, oracle trực tiếp trên nó. Chia cắt shielded/unshielded là kiến trúc, không phải thứ bậc.

Bối Cảnh Việt Nam — Tuân Thủ Quyền Riêng Cho Fintech

Định 13/2023/NĐ-CP của Việt Nam (hiệu lực tháng 7/2023) quy định:

  • Điều 12: Dữ liệu cá nhân phải được mã hóa khi lưu trữ/truyền
  • Điều 14: Chủ thể dữ liệu có quyền biết ai truy cập dữ liệu của họ
  • Điều 15: Người kiểm soát dữ liệu phải ghi nhật ký mọi truy cập

Midnight ánh xạ tự nhiên đến điều này:

Yêu Cầu Định 13 Cơ Chế Midnight
Lưu trữ mã hóa (Điều 12) Sổ cái che: mọi ghi chú = cam kết mã hóa
Ghi nhật ký truy cập (Điều 15) Sổ cái unshielded: dấu vết kiểm toán bất biến của các gốc trạng thái
Tiết lộ có chọn lọc (Điều 14) ZKP: chứng minh "tôi trên 18 tuổi" mà không tiết lộ ngày sinh

Ví dụ cụ thể: Luồng KYC của Momo/ZaloPay trên Midnight:

  1. Người dùng gửi ghi chú danh tính mã hóa đến sổ cái che
  2. Cơ quan quản lý yêu cầu xác minh tuổi
  3. Người dùng tạo ZKP: "cam kết chứa tuổi ≥ 18" (mạch kiểm tra giá trị mã hóa)
  4. Cơ quan xác minh bằng chứng trên sổ cái unshielded – chỉ học rằng tuổi ≥ 18
  5. Dấu vết kiểm toán: sổ cái unshielded ghi "ZKP xác minh tại block N" – không dữ liệu cá nhân lộ ra

Đây là tiết lộ có chọn lọc – thánh grial của tuân thủ quyền riêng tư. Dữ liệu ở mã hóa; bằng chứng chỉ tiết lộ 사실 liên quan đến chính sách.

FAQ

Q: Midnight có phải blockchain riêng biệt từ Cardano?
A: Không. Midnight là partner chain – nó chia sẻ đồng thuận với tập validator Cardano (qua VRF) và quyết toán gốc trạng thái lên Cardano mỗi epoch. Hãy nghĩ nó như một lớp thực thi chuyên biệt cho tính toán riêng tư.

Q: Tạo ZKP mất bao lâu?
A: ~2 giây desktop (chuyển giao tiêu chuẩn), ~5-10 giây mobile. Mạch phức tạp (swap DEX riêng tư) ~5-15s desktop. Khóa chứng minh có thể cache cho phép lặp lại.

Q: Có thể di chuyển tài sản giữa shielded và unshielded?
A: Có. Shielding: UTXO unshielded → ghi chú shielded (công khai → riêng). Unshielding: Ghi chú shielded → UTXO unshielded (riêng → công khai). Cả hai đều yêu cầu ZKP chứng minh bảo toàn giá trị.

Q: Nếu xác minh ZKP thất bại thì sao?
A: Giao dịch bị từ chối. Trạng thái không đổi. Phí hoàn trả (mô hình phí Midnight chỉ thu cho thực thi thành công).

Q: DUST có bắt buộc cho gas?
A: Có. DUST trả cho: (a) thực thi sổ cái unshielded (mạch verifier), (b) checkpoint lên Cardano, (c) phần thưởng staking. Tính toán shielded "miễn phí" – user trả chi phí chứng minh off-chain.

Bắt Đầu Xây Dựng Trên Midnight

Mô hình dual-ledger không phải lý thuyết – nó chạy trên testnet hôm nay.

Internal link: Cardano Sidechains Explained – hiểu framework partner chain làm Midnight trở nên khả thi.


Quyền riêng tư không phải là ẩn giấu. Đó là chọn ai được thấy gì, và chứng minh bạn tuân thủ quy tắc mà không-show tay. Dual ledger của Midnight cho bạn sự lựa chọn đó – trên Cardano.

Tags:

dual ledger midnightshielded unshielded blockchainmidnight architecture