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 |

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

Chuỗi Giao Dịch (Bên Được Bảo Vệ)
- Người dùng tạo ghi chú → tính toán cam kết cục bộ
- 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)
- Gửi đến sổ cái shielded → validator kiểm tra bằng chứng, thêm nullifier, cập nhật state root
- 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 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

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

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)

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
- "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.
- 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.
- 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.
- 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:
- Người dùng gửi ghi chú danh tính mã hóa đến sổ cái che
- Cơ quan quản lý yêu cầu xác minh tuổi
- 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)
- Cơ quan xác minh bằng chứng trên sổ cái unshielded – chỉ học rằng tuổi ≥ 18
- 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.
- Midnight Dev Docs: https://midnight.network/docs – kiến trúc, hướng dẫn Compact, tham chiếu API
- Compact Language Tutorial: https://midnight.network/docs/compact/first-contract – hello world 15 phút
- Local Simulator:
cargo install midnight-simulator– full stack trong một binary - Kachina Circuits: https://github.com/MidnightNetwork/kachina – mạch PLONK, tối ưu verifier
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.
