Smart Contractsadvancedarticle55 min read

Xây Dựng dApp Riêng Tư Đầu Tiên Trên Midnight — Hướng Dẫn dApp Midnight

Hướng dẫn dApp midnight thực hành: xây dựng dApp token shielded bằng Compact và Midnight.js — từ local devnet đến testnet và Kūkolu mainnet. Bao gồm vòng đời token compact shielded, ba ngữ cảnh, kiến trúc provider và kinh tế phí DUST.

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

Minh là một kỹ sư trong một công ty khởi nghiệp ở Hà Nội muốn thưởng cho khách hàng bằng điểm tín dụng trên một chuỗi công khai. Theo nghĩa công khai, điều đó có nghĩa là số dư và lịch sử mua hàng của mỗi khách hàng sẽ có thể được đọc bởi bất kỳ ai, mãi mãi. Một phiếu thanh toán từ Momo hoặc ZaloPay là riêng tư giữa khách hàng và cửa hàng; cùng một phiếu thanh toán trên một chuỗi công khai ledger là một tiêu đề. Hướng dẫn dApp midnight này cho thấy chính xác những gì Minh – và bạn – phải học để xây dựng nó đúng: một token shielded dApp trên Midnight, từ một máy tính có màn hình trống đến một hợp đồng đã được kiểm tra chạy trên một mạng sống. Đến cuối bài, bạn sẽ hiểu ba ngữ cảnh của một Midnight smart contract, viết một hợp đồng compact token shielded trên Midnight, kết nối nó với Midnight.js, và biết chính xác cách kiểm tra, phí và triển khai hoạt động trong năm 2026.

Tại sao phải xây dựng một dApp về quyền riêng tư trên Midnight?

Một blockchain công khai là một nhà kính. Mỗi giao dịch – người gửi, người nhận, số tiền, ngày tháng – đều được ghi lại vĩnh viễn và có thể đọc được bởi mọi người. Sự minh bạch đó là điều khiến một ledger đáng tin cậy cho tiền. Tuy nhiên, đối với một chương trình trung thành, một danh sách lương hoặc một tập tin KYC khách hàng, những bức tường kính chính là vấn đề, chứ không phải tính năng.

Ở Việt Nam, vấn đề này không phải là lý thuyết. Nghị định 13/2023, có hiệu lực từ ngày 1 tháng 7 năm 2023, phân loại dữ liệu tài chính là dữ liệu cá nhân nhạy cảm và yêu cầu sự đồng ý và tối thiểu hóa dữ liệu. Luật Bảo vệ dữ liệu cá nhân mới hơn (Luật số 91/2025/QH15), có hiệu lực từ ngày 1 tháng 1 năm 2026, tăng mức phạt lên đến 3 tỷ đồng Việt Nam hoặc 5% doanh thu trong năm trước. Nó cũng nêu rõ blockchain trong các lĩnh vực công nghệ cao mà nó quản lý, và Nghị định 356/2025 bổ sung các nghĩa vụ cụ thể. Một công ty fintech đưa lịch sử giao dịch lên một ledger công khai ngày hôm nay đang công bố chính xác những dữ liệu mà luật yêu cầu bảo vệ.

Midnight được tạo ra để giải quyết sự không đồng bộ này. Nó là một blockchain được thiết kế để bảo vệ dữ liệu: một ledger trong suốt giữ các phần cần được xác minh, trong khi một shielded ledger giữ mọi thứ nhạy cảm riêng tư – ở địa phương, trên thiết bị của người dùng. Giữa chúng, các bằng chứng không biết thông tin chứng minh rằng một thay đổi trạng thái là hợp lệ mà không tiết lộ dữ liệu bên dưới. Kiến trúc đó là lý do chính tại sao một midnight dApp được tạo ra, và đó là lý do tại sao một nhà phát triển biết về TypeScript có thể xây dựng một cái đó mà không cần bằng tiến sĩ về mật mã.

Mô hình tư duy Midnight dApp – ba bối cảnh

Trước khi viết bất kỳ đoạn mã nào, hãy xác định đúng mô hình tư duy, vì mỗi hợp đồng Compact thực tế là ba chương trình mặc một bộ áo.

  • ledger là trạng thái công khai, được sao chép và tồn tại trên blockchain. Nó là một máy trạng thái được định dạng: export ledger state: State. Mọi người đều có thể xem nó, và nó chỉ chứa những thứ mà bạn sẵn sàng công bố.

Ba ngữ cảnh này giải thích mọi điều kỳ lạ trong phần còn lại của bài hướng dẫn này. ledger chỉ lưu trữ các thông tin công khai. circuit là nơi "người dùng này thực sự sở hữu số dư này" được chứng minh. witness là nơi các thông tin riêng tồn tại – và trình biên dịch yêu cầu bạn nói rõ khi một thông tin riêng được phép vượt qua thành một kết quả công khai.

Ba ngữ cảnh của một Midnight dApp: ledger giữ trạng thái công khai nhân bản hiển thị cho tất cả, circuit tạo ra ZK proof chứng minh sự chuyển đổi, và witness giữ trạng thái riêng tư chạy ngoài chuỗi; input công khai đến từ ledger và input riêng tư đến từ witness, proof lên chuỗi còn dữ liệu thì không, và disclose() là cánh cửa duy nhất từ riêng tư sang công khai

Hình 2: Ba ngữ cảnh — ledger, circuit, witness — và cánh cửa disclose()

Cài đặt môi trường phát triển Midnight

Một tài liệu hướng dẫn dApp midnight cần một môi trường thực tế, và môi trường của Midnight khá nhỏ. Bạn cần bốn phần:

  1. Cấu trúc công cụ Compact. Cài đặt trình biên dịch (compactc, phiên bản hiện tại là 0.31.1) bằng cách sử dụng trình cài đặt một dòng chính thức, sau đó kiểm tra bằng compact --version. Bạn cũng nhận được một mở rộng VS Code cho việc nhấn mạnh cú pháp và công cụ Fix-up tự động sửa lỗi biên dịch.

Trong phát triển địa phương, không có bước cài đặt vòi nước – bạn đăng ký một ví, mạng lưới cung cấp cho nó tNIGHT và DUST xuất hiện trong khoảng năm phút. Tương tự, quy trình này cũng hoạt động với testnet công khai, nơi có tDUST miễn phí dành cho các nhà phát triển, vì vậy bạn có thể thực hiện hướng dẫn này với chi phí bằng không.

Thiết lập môi trường phát triển Midnight: trình biên dịch compactc 0.31.1 với VS Code và Fix-up, mạng riêng midnight-local-dev cộng indexer, proof server Docker cục bộ, và ví Lace ký trong trình duyệt với ZK proofs, nuôi vòng lặp cục bộ chi phí bằng không với tNIGHT và DUST trong khoảng năm phút, với cùng stack chạy trên testnet với tDUST miễn phí

Hình 1: Bốn thành phần của môi trường phát triển Midnight — vòng lặp cục bộ chi phí bằng không

Hợp đồng đầu tiên của bạn – một token shielded

Bây giờ là quá trình xây dựng thực tế: một hợp đồng compact có mã shielded. Chúng tôi cố ý xây dựng phiên bản shielded, không phải phiên bản unshielded, vì đây là phiên bản làm cho quyền riêng tư trở thành hiện thực – và đây là nơi mô hình tư duy mang lại lợi ích.

Một token shielded không có số dư công khai. Trên Midnight, chuỗi ghi nhận các commitments và các nullifiers, không phải là số tiền. Giá trị của nó nằm trong các đồng tiền không thể thay đổi: một ShieldedCoinInfo là một nonce, một màu sắc và một giá trị, và bạn không thể thay đổi giá trị của một đồng tiền tại chỗ. Không có lệnh unshieldedBalance(color), vì số đó không tồn tại trên chuỗi. Để biết nó chứa gì, hợp đồng theo dõi các đồng tiền của chính nó; để chứng minh một chuyển khoản đã thành công, bạn đọc số dư shielded của ví, không phải của hợp đồng.

Dưới đây là một hợp đồng tối thiểu nhưng có hình dạng thực tế, tạo ra một đồng shielded và chuyển giao nó một cách riêng tư cho người gọi trong một giao dịch duy nhất. Nó tuân theo mẫu hướng dẫn sử dụng token shielded chính thức của Midnight, có hiệu lực đến ngày compactc 0.31.1:

pragma language_version 0.23;

import Zswap;

export ledger initialized: Bool;
export ledger total_supply: Uint<64>;
export ledger mint_count: Counter;
export ledger token_color: Opaque<Bytes<32>>;
export ledger minter: Bytes<32>;

export circuit constructor(owner: Bytes<32>): [] {
  // Record the deployer's derived key as the authorized minter.
  minter = owner;
}

export circuit mint_and_send(amount: Uint<64>, nonceIndex: Uint<128>): [] {
  // Only the holder of the deploy secret may mint.
  require(minter == ownPublicKey());

  // Derive a unique coin nonce from a private seed.
  let nonce: Uint<128> = evolveNonce(disclose(nonceIndex), localNonceSeed());

  // Mint a fresh shielded coin owned by the contract...
  let minted: Zswap.ShieldedCoinInfo = Zswap.mintShieldedToken(
    kernel.self(), amount, nonce
  );

  // ...and spend it in this same transaction, delivered to the caller.
  let result: Zswap.ShieldedSendResult = Zswap.sendImmediateShielded(
    minted, ownPublicKey(), amount
  );

  // Record public facts: color, initialization, supply, count.
  if (!initialized) {
    token_color = result.sent.color;
    initialized = true;
  }
  total_supply = (total_supply + disclose(amount)) as Uint<64>;
  mint_count.increment();
}

Các mục ledger là trạng thái công khai - cung cấp, số lượng, màu sắc, nhà phát hành. mintShieldedToken phát hành một đồng xu mới vào quyền sở hữu của hợp đồng (kernel.self()), và sendImmediateShielded chi tiêu đồng xu mới đó trong cùng một giao dịch và chuyển nó cho người ký (ownPublicKey()). Số lượng phát hành là Uint<64> vì quy trình giới hạn một lần phát hành ở độ rộng đó; giá trị đồng xu là Uint<128>, đó là lý do tại sao kết quả mang kiểu rộng hơn.

Hai chi tiết dễ bị sai lầm. Thứ nhất, ownPublicKey() trả về một giá trị prover được tuyên bố mà không có sự liên kết với người ký – tài liệu chính thức cảnh báo rằng bất kỳ ai cũng có thể bỏ qua kiểm tra trên nó, do đó, việc xác nhận ở đây dựa trên bí mật triển khai, không chỉ đơn thuần là ownPublicKey(). Thứ hai, evolveNonce(disclose(nonceIndex), localNonceSeed()) lấy ra một nonce duy nhất từ một seed riêng. Nếu bạn sử dụng lại nonce, chuỗi có thể liên kết các cam kết của bạn – đó là nguy cơ replay shielded kinh điển.

Chế độ hoạt động của token shielded

Bảo vệ của hợp đồng nằm trong sự khác biệt giữa một đồng tiền mới và một đồng tiền đã cam kết – và đây là phần mà mỗi nhà xây dựng mới gặp phải.

  • Một đồng xu mới là một ShieldedCoinInfo: nonce, màu sắc, giá trị. Nó tồn tại trong giao dịch tạo ra nó và nó chưa có vị trí Merkle. Bạn chi tiêu nó bằng sendImmediateShielded(đồng mới, người nhận, giá trị).

Hai cuộc gọi đều trả về một đối tượng ShieldedSendResult chứa sent và một đối tượng Maybe để trả tiền thừa. Một chuyển khoản một phần – gửi ít hơn giá trị toàn bộ đồng tiền – sẽ trả lại tiền thừa mà bạn phải lưu trữ và theo dõi cho đến khi nó có vị trí riêng của nó.

Vòng đời token shielded: mintShieldedToken tạo đồng xu mới thuộc hợp đồng, sendImmediateShielded chi tiêu đồng xu mới trong cùng một giao dịch cho người gọi, ledger gán vị trí Merkle để cam kết đồng xu, sendShielded chi tiêu đồng xu đã cam kết và trả tiền thừa, và gửi đến shieldedBurnAddress hủy giá trị; đồng xu mới không có vị trí Merkle còn đồng xu đã cam kết được định vị bằng mt_index

Hình 3: Vòng đời token shielded — đồng mới trở thành đồng đã cam kết trước khi chuyển tiếp

Chế độ đời sống có bốn bước, tất cả đều được xây dựng từ những nguyên mẫu giống nhau:

  • Mint — mintShieldedToken tạo ra một đồng xu shielded mới thuộc về hợp đồng. Trong hướng dẫn chính thức, địa điểm mint là hợp đồng chính nó (right(kernel.self())), và cùng một giao dịch ngay lập tức gửi nó đi.

Một hạn chế ảnh hưởng đến những gì một chuyển giao thông qua hợp đồng có thể thực hiện ngày nay: sendShielded hiện tại không tạo ra văn bản mã hóa tiền. Trong thực tế, điều đó có nghĩa là một hợp đồng có thể cung cấp giá trị shielded cho người gọi – người ký giao dịch – nhưng gửi cho bên thứ ba sẽ không thông báo cho người dùng về tiền đó. Hãy lập kế hoạch cho dApp dựa trên điều này: giá trị riêng được chuyển đến người yêu cầu.

Kết nối dApp với Midnight.js

Hợp đồng là phần khó khăn; phần còn lại là những điều bạn đã biết. Midnight.js là khung ứng dụng, và nó sử dụng kiến trúc cung cấp mô-đun – gồm bảy thành phần có thể cài đặt, kết hợp lại tạo thành khách hàng của bạn:

  • privateStateProvider — lưu trữ trạng thái riêng được mã hóa ở địa phương (trình lưu trữ mặc định LevelDB mã hóa khi ở trạng thái tĩnh bằng AES-256-GCM).
Kiến trúc provider Midnight.js: dApp với React UI và state hooks nằm trên sáu provider có thể cắm — trạng thái riêng tư lưu mã hóa AES-256-GCM khi tĩnh, dữ liệu công khai từ indexer và WebSocket, cấu hình ZK với circuits và khóa, proof provider tạo proofs qua proof server, ví ký và cân bằng giao dịch, và midnight gửi giao dịch — với ví Lace trong trình duyệt hoặc ví nội bộ trong Node bên dưới, giữ trạng thái riêng tư ở cục bộ trong khi proofs lên chuỗi

Hình 4: Kiến trúc provider mô-đun của Midnight.js — sáu thành phần có thể cắm

Khi các nhà cung cấp đã được cấu hình, bề mặt tương tác bao gồm ba chức năng: deployContract (xuất bản một bản sao hợp đồng mới), findDeployedContract (tiếp tục một bản sao hiện có) và callTx (gọi một circuit và gửi giao dịch). Các nhân chứng chúng ta đã tuyên bố trong hợp đồng được thực hiện như các chức năng TypeScript trả về các đầu vào riêng mà circuit cần – trong ví dụ của shielded-token, một hàm localNonceSeed() witness đọc khóa từ kho lưu trữ trạng thái riêng và truyền nó cho circuit. Đây là nơi "bối cảnh witness" có ý nghĩa: witness của bạn nhận được trạng thái ledger, trạng thái riêng và địa chỉ hợp đồng, và trả về các giá trị chính xác mà circuit mong đợi.

Một cách sạch sẽ là bao quanh các gọi Midnight.js nguyên bản trong một lớp nhỏ API (một lớp có thuộc tính mintAndSend, getBalance, getSupply), sau đó cho phép UI của bạn giao tiếp với lớp đó và không bao giờ tiếp xúc trực tiếp với các circuit hoặc các nhà cung cấp.

Thử nghiệm và triển khai – địa phương → testnet → mainnet

Một hướng dẫn dApp midnight nghiêm túc bao gồm câu chuyện thử nghiệm, và Midnight thực sự tốt: trình biên dịch Compact phát ra một môi trường chạy JS cùng với một tệp khai báo TypeScript (.d.ts), vì vậy bạn sẽ thử nghiệm môi trường hợp đồng được tạo ra, chứ không phải là một tái triển khai của logic của bạn.

Hai lớp kiểm tra là tiêu chuẩn:

  • Kiểm tra đơn vị mô phỏng. Tạo một đối tượng của lớp Contract đã được biên dịch ở địa phương với ledger trong bộ nhớ, gọi các chuỗi qua nó và kiểm tra trạng thái ledger với Vitest. Mô phỏng là xác định, nhanh chóng và không cần mạng. Đây là nơi bạn kiểm tra rằng mint_and_send chuyển đồng xu, nguồn cung tăng đúng số lượng và chỉ người tạo đồng xu mới có thể tạo đồng xu. Quy tắc chung từ cộng đồng đóng góp của Midnight: không bao giờ tái triển khai logic hợp đồng trong tệp kiểm tra của bạn – đọc tệp .d.ts được tạo ra như nguồn gốc.

Khi bộ công cụ tích hợp có màu xanh, việc triển khai là một thang, không phải một bước nhảy vọt:

  1. Local devnet — lặp lại nhanh, DUST trong khoảng 5 phút.

Hãy lên kế hoạch chuyển mainnet một cách cẩn thận. Trên ví mainnet mới, NIGHT đạt đến Midnight thông qua đường dẫn xuyên chuỗi (còn gọi là cNIGHT trên Cardano), và đăng ký mất khoảng 12 giờ – không phải vài phút. DUST là một loại pin: giữ NIGHT sẽ tăng dung lượng, mỗi giao dịch sẽ làm nó cạn kiệt, và một chiếc pin đã cạn kiệt sẽ được sạc lại trong khoảng 7 ngày. DUST không thể mua, chuyển giao hoặc bán; nếu ai đó đề nghị bạn mua DUST, đó là một trò lừa đảo. Một nhà phát triển có thể giữ NIGHT và hỗ trợ phí cho người dùng, đây là một đặc điểm kinh doanh hữu ích – một công ty khởi nghiệp Việt Nam có thể đăng ký khách hàng không bao giờ sử dụng tiền điện tử.

Đường ống triển khai từ local devnet đến testnet đến Kūkolu mainnet: local devnet cho vòng lặp nhanh với DUST trong khoảng năm phút, testnet cung cấp tDUST miễn phí trên mạng thực, và Kūkolu mainnet là vĩnh viễn với đăng ký cNIGHT khoảng mười hai giờ và pin DUST tự sạc; giai đoạn Mōhalu mang xác thực Cardano SPOs và trao đổi công suất DUST, và DUST không thể mua vì nhà phát triển trợ phí cho người dùng

Hình 5: Bậc triển khai — local devnet, testnet, rồi đến Kūkolu mainnet

Các nguy cơ về bảo mật mà mỗi nhà phát triển Midnight dApp gặp phải

Đây là những lỗi mà cộng đồng thường gặp nhất, mỗi lỗi đã được bao gồm trong một giới hạn trong chuỗi công cụ hoặc một quy tắc mà bạn vừa đọc:

  • Không có disclose(). Máy biên dịch từ chối việc tiết lộ giá trị witness mà không được khai báo với lỗi như "một sự tiết lộ giá trị witness có thể được khai báo nhưng không được thực hiện". Xử lý nó như một công cụ kiểm tra bảo mật: máy biên dịch buộc bạn phải nói rõ "Tôi có ý định công bố điều này". Khi kiểm tra một hợp đồng Compact, các cuộc gọi disclose() là bản đồ chính xác về những gì nó tiết lộ.

Việt Nam — tại sao midnight dApp quan trọng ở đây

Góc nhìn của Việt Nam không phải là một chi tiết trang trí; nó thay đổi những gì bạn xây dựng. Mỗi giao dịch Momo hoặc ZaloPay là một phần dữ liệu cá nhân về tài chính theo quy định của ND 13/2023. Chia sẻ chúng trên một ledger công khai là một sự kiện tuân thủ. Một shielded chương trình trung thành dApp là sự khác biệt giữa việc chia sẻ "một người đã kiếm được 1.000 điểm tại một cửa hàng ở Hà Nội" (một cam kết) và chia sẻ "Minh, 32 tuổi, số điện thoại +84..., đã kiếm được 1.000 điểm tại chi nhánh này" (một thông tin công khai).

Hệ thống PDPL đã tăng cường các quy định. Luật số 91/2025/QH15, có hiệu lực từ ngày 1 tháng 1 năm 2026, quy định mức phạt lên đến 3 tỷ đồng hoặc 5% doanh thu năm trước, và cụ thể liệt kê blockchain trong các lĩnh vực công nghệ cao mà nó quản lý. Nghị định 356/2025/NĐ-CP nêu rõ blockchain, dữ liệu lớn và AI, và yêu cầu các nhà cung cấp dịch vụ xử lý dữ liệu phải là các tổ chức Việt Nam có chứng chỉ MPS. Mô hình của Midnight – chứng minh các sự kiện mà không tiết lộ dữ liệu – là đối ứng về mật mã của nghĩa vụ hạn chế dữ liệu theo luật. Một công ty fintech có thể chứng minh rằng họ có một cơ sở khách hàng hợp lệ cho một đối tác mà không tiết lộ khách hàng; một chương trình trung thành có thể chứng minh rằng các khoản thanh toán phù hợp với các khoản nợ mà không tiết lộ ai đã thanh toán gì.

VNeID là nền tảng tự nhiên. Ứng dụng định danh số quốc gia của Việt Nam đã cho phép thực hiện eKYC tại Momo và ZaloPay. Trên một midnight dApp, một danh tính được xác minh bằng VNeID có thể hoạt động như một danh tính shielded với lộ trình lựa chọn: chứng minh "trên 18 tuổi", "người cư trú" hoặc "đã được xác minh bởi MPS" mà không cần sao chép tệp danh tính gốc vào một cơ sở dữ liệu khác – chính xác là mô hình ba ngữ cảnh mà bài viết này dựa trên. Và vì một nhà phát triển có thể hỗ trợ DUST, lợi thế tuân thủ không bị đánh đổi bằng sự khó khăn trong quá trình đăng ký.

Những câu hỏi thường gặp

Hướng dẫn dApp midnight bao gồm những gì?

Xây dựng một ứng dụng Midnight thực sự từ đầu đến cuối: hợp đồng Compact, lớp witness, các nhà cung cấp Midnight.js, thử nghiệm bằng máy ảo và mạng địa phương, và triển khai thông qua testnet đến Kūkolu mainnet – bao gồm các cơ chế phí DUST mà một nhà xây dựng mới phải cân nhắc.

Token compact contract shielded có khó không?

Token hợp đồng compact shielded mà bạn vừa xem có khoảng 40 dòng. Những phần khó khăn không phải là ngôn ngữ – nó có hình dạng TypeScript – mà là mô hình: không có số dư công khai, đồng tiền không thể thay đổi, trạng thái mới so với trạng thái đã xác nhận, và kỷ luật nonce. Mô hình tư duy ba ngữ cảnh bao gồm hầu hết các phần đó.

Xây dựng midnight dApp có giống xây dựng Ethereum dApp không?

Từ cấu trúc, có — triển khai hợp đồng, gọi các hàm, đọc trạng thái — nhưng mô hình bảo mật được đảo ngược. Solidity không có các đầu vào riêng; mọi thứ đều có thể nhìn thấy trong dữ liệu gọi. Compact là riêng tư theo mặc định, và mỗi lần chuyển sang ledger công khai phải được khai báo bằng disclose(). Các đọc cân bằng diễn ra trong ví, không phải trên chuỗi.

Có phải người dùng phải trả phí cho một midnight dApp không?

Mỗi giao dịch Midnight tốn DUST, một nguồn phí không thể chuyển nhượng, giống như một viên pin khi bạn giữ NIGHT. Các nhà phát triển và các nhà điều hành DApp có thể hỗ trợ phí cho người dùng của họ, vì vậy một doanh nghiệp có thể thu hút khách hàng không bao giờ tiếp xúc với tiền điện tử. DUST không thể mua được – bất kỳ lời đề nghị bán nó đều là một trò lừa đảo.

Ngày nay Midnight dApp của tôi có thể gửi token shielded cho bất kỳ người dùng nào không?

Ngày nay, một hợp đồng có thể cung cấp giá trị shielded cho người gọi giao dịch một cách đáng tin cậy, vì sendShielded hiện chưa tạo văn bản mã hóa đồng cho bên thứ ba. Thiết kế các chuyển khoản riêng để chuyển đến người yêu cầu chúng và theo dõi các đồng thay đổi từ các chuyển khoản phần trăm.

Midnight đã sẵn sàng cho phát triển sản xuất chưa?

Kūkolu mainnet đang hoạt động (31 tháng 3 năm 2026) và là một hệ thống lâu dài, nhưng xác thực vẫn được thực hiện theo cách liên kết và hệ sinh thái còn khá mới; Mōhalu (năm 2026, quý 2) mở khả năng xác thực cho các nhà điều hành kho tài sản Cardano. Để xây dựng một hệ thống nghiêm túc, con đường an toàn là mô phỏng → mạng địa phương → testnet với tDUST → mainnet cuối cùng.

Tôi có cần có kiến thức về mật mã không?

Compact sẽ biên dịch thành các mạch không có kiến thức cho bạn; hệ thống chứng minh được xử lý bởi trình biên dịch, proof server và mạng. Điều bạn cần là TypeScript và các quy tắc được liệt kê trong phần rủi ro của bài viết.

Token shielded giúp doanh nghiệp Việt Nam như thế nào?

Một token shielded cho phép một doanh nghiệp chứng minh các số dư, chuyển khoản và thanh toán mà không cần công bố người sở hữu những gì – tương đương với trách nhiệm giảm thiểu dữ liệu của ND 13/2023, phù hợp với chế độ PDPL mà cụ thể đề cập đến blockchain.

Kết luận

Vấn đề của Minh — điểm tín dụng riêng tư trên một chuỗi công khai — hóa ra là một vấn đề thiết kế có hình dạng rõ ràng: giữ các witness công khai nhỏ, giữ các thực tế riêng tư trong witness, và để circuit chứng minh sự khác biệt. Hướng dẫn này đã đi qua toàn bộ quá trình: ba ngữ cảnh, một hợp đồng token compact với chu trình đời sống đầy đủ từ tân tạo đến cam kết, bộ cung cấp Midnight.js, một thang kiểm tra từ mô hình hóa đến testnet đến mainnet, và nền kinh tế DUST giúp các giao dịch riêng tư có thể thanh toán được. Điều khác biệt giữa nó và một midnight dApp thông thường là rằng quyền riêng tư không phải là một tính năng được gắn vào — nó là mặc định, và trình biên dịch khiến bạn phải tự quyết định về việc tiết lộ. Đối với một nhóm người Việt Nam, đặc tính này cũng là một chiến lược tuân thủ: bằng chứng mà không bị lộ, phần thưởng mà không có tiêu đề, và một ledger không bao giờ tiết lộ những gì được luật pháp bảo vệ. Bộ công cụ chỉ cách vài lần cài đặt; mô hình tư duy nằm trong bài viết này. Cái dApp bảo mật đầu tiên của bạn trên Midnight gần hơn nhiều so với bạn nghĩ.


Hướng dẫn nhanh

Câu hỏiTrả lời
Một Midnight dApp là gì?Một dApp có hợp đồng có trạng thái công khai ledger + các mạch không có kiến thức + các chứng nhân riêng; dữ liệu riêng không bao giờ được lưu trên chuỗi
Ba ngữ cảnhLedger (tình trạng công khai) · Circuit (ZK proof) · Witness (tình trạng riêng, ngoài chuỗi)
Lõi token shieldedKhông có số dư công khai; giá trị trong các đồng ShieldedCoinInfo không thể thay đổi; mới so với đã cam kết (có chỉ số Merkle)
Nguyên thủy chínhmintShieldedToken, sendImmediateShielded (tươi), sendShielded (đã thực hiện), shieldedBurnAddress (đốt), evolveNonce
Nối dâyMidnight.js: trạng thái riêng, dữ liệu công khai, cấu hình ZK, bằng chứng, ví, midnight, trình ghi
Thử nghiệmTest đơn vị giả lập (Vitest, tạo ra thời gian chạy) + test tích hợp trên midnight-local-dev
Bậc triển khaiLocal devnet (~5 phút DUST) → testnet (miễn phí tDUST) → Kūkolu mainnet (tốc độ ~12h, pin cNIGHT)
DUSTNguồn phí không thể chuyển nhượng; không thể mua; các nhà phát triển có thể hỗ trợ phí cho người dùng
Phù hợp với Việt NamND 13/2023 + PDPL (Luật 91/2025) về tối thiểu hóa dữ liệu; VNeID công bố chọn lọc; DUST đăng ký hỗ trợ
Tình trạng (2026)Kūkolu mainnet diễn ra ngày 31 tháng 3 năm 2026 (được liên kết); Mōhalu (trao đổi công suất SPOs + DUST) tiếp theo

Tags:

dapp midnight tutorialshielded token compactmidnight dapp