🌙 Khám Phá Midnight ZK Circuit Playground
📌 Tóm Tắt
Midnight ZK Circuit Playground là một môi trường tương tác giúp các nhà phát triển thử nghiệm các mạch chứng minh không biết (zero-knowledge proof circuits) của Midnight Network thông qua các mạch giả lập, giúp hiểu rõ cách thức hoạt động của bảo mật riêng tư trong các trường hợp thực tế.
🔎 Các Tình Huống
Playground có 3 tình huống chính:
- Bỏ Phiếu Bảo Mật - Chứng minh quyền bầu cử của cử tri mà không tiết lộ thông tin cá nhân.
- Đấu Giá Đóng Kín - Hiển thị cách thức số tiền đấu giá vẫn giữ bí mật cho đến giai đoạn công bố.
- Xác Thực Danh Tính Ẩn Danh - Chứng minh độ tuổi mà không tiết lộ dữ liệu cá nhân.
Mỗi tình huống đều đi kèm với quy trình tạo chứng minh từng bước với các giải thích chi tiết.
🔑 Tính Năng Chính
1. Xử Lý Dữ Liệu Riêng Tư & Ngăn Ngừa Ghi Đôi
Mã sau thực hiện một hệ thống nullifier - một cơ chế mật mã nhằm ngăn chặn các hành động trùng lặp hoặc các vấn đề kiểu "double-spending" trong nhiều tình huống. Hệ thống này tạo ra các định danh duy nhất (nullifiers) có thể được kiểm tra công khai để đảm bảo rằng ai đó chưa thực hiện một hành động cụ thể nào đó mà không tiết lộ danh tính thực.
typescript
// Hệ thống nullifier toàn diện ngăn chặn việc gửi lại
const nullifierCheck = (scenario: string, inputs: Record<string, string>) => {
switch (scenario) {
case 'voting':
nullifier = `voting_${inputs.voter_id}_${inputs.private_credentials}`;
errorMessage = 'ID cử tri này đã bỏ phiếu. Không được bỏ phiếu trùng lặp.';
break;
case 'auction':
nullifier = `auction_${inputs.bidder_secret}_${inputs.private_bidder_identity}`;
errorMessage = 'Người đấu giá này đã gửi một đấu giá. Không được đấu giá nhiều lần.';
break;
case 'identity':
nullifier = `identity_${inputs.private_ssn}_${inputs.birth_cert_hash}`;
errorMessage = 'Danh tính này đã được xác thực. Các nỗ lực trùng lặp bị chặn lại.';
break;
}
return { nullifier, errorMessage };
};
2. Hoạt Hình Mạch Tương Tác
Đây là một thành phần React chức năng nhận dữ liệu dưới dạng props và hiển thị một nút hình ảnh với các tay nối.
-
Hệ Thống Hoạt Hình:
- Ứng dụng định dạng hoạt hình khi
data.isAnimated
là true. - Tạo hiệu ứng nhấp nháy với vòng sáng quanh các nút đang hoạt hình.
- Sử dụng Tailwind CSS cho các chuyển tiếp mượt mà.
- Ứng dụng định dạng hoạt hình khi
-
Chỉ Báo Riêng Tư:
- Chỉ báo chấm đỏ ở góc phải trên với nhãn "P".
- Nhãn văn bản hiển thị "Dữ liệu Riêng Tư" bên dưới nội dung nút.
- Cả hai chỉ xuất hiện khi
data.isPrivate
là true. - Sử dụng bảng màu đỏ để phân biệt dữ liệu riêng tư.
typescript
const CircuitNode: React.FC<CircuitNodeProps> = ({ data }) => {
return (
<Card className={`circuit-node transition-all duration-300
${data.isAnimated ? 'animate-pulse ring-2 ring-primary/50' : ''}`}>
<Handle type="target" position={Position.Left} />
<Handle type="source" position={Position.Right} />
{data.isPrivate && (
<div className="absolute -top-1 -right-1 w-3 h-3 bg-red-500 rounded-full">
<span className="text-[8px] text-white font-bold">P</span>
</div>
)}
{data.isPrivate && (
<div className="text-[10px] text-red-500 font-medium mt-1">Dữ liệu Riêng Tư</div>
)}
</Card>
);
};
3. Thành Phần Giao Diện Nhấn Mạnh Về Riêng Tư
Các trường nhập liệu nhận thức về quyền riêng tư cho các ứng dụng mật mã tự động ẩn các đầu vào văn bản riêng tư như các trường mật khẩu, áp dụng định dạng màu đỏ để phân biệt dữ liệu nhạy cảm và bao gồm văn bản giải thích để trấn an người dùng rằng thông tin riêng tư của họ "vẫn được mã hóa và ẩn trong quá trình tạo chứng minh."
typescript
<Input
type={input.isPrivate && input.type === 'text' ? 'password' : input.type}
className={input.isPrivate ? 'border-red-500 bg-red-50 dark:bg-red-950/20' : ''}
placeholder={input.isPrivate ? 'Dữ liệu riêng tư - đã được mã hóa' : ''}
/>
{input.isPrivate && (
<div className="text-xs text-red-500 mt-1 flex items-center">
<span className="w-2 h-2 bg-red-500 rounded-full mr-1"></span>
Dữ liệu này vẫn được mã hóa và ẩn trong quá trình tạo chứng minh
</div>
)}
4. Tình Huống Zero-Knowledge Với Ví Dụ Thực
Tập tin cấu hình tình huống xuất khẩu một mảng ba trường hợp bảo vệ quyền riêng tư, mỗi trường hợp chứa đầy đủ thông số UI và mạch.
Mỗi tình huống bao gồm nhiều thành phần: đại diện mạch hình ảnh với các nút và cạnh hiển thị dòng dữ liệu qua các phép toán mật mã, quy trình tạo chứng minh từng bước với thời gian và cập nhật trạng thái, mã mạch viết bằng Midnight Compact Language thể hiện logic mật mã thực tế, và định nghĩa trường nhập liệu phân biệt giữa các trường dữ liệu công khai và riêng tư.
Tình huống Bỏ Phiếu Bảo Mật chứng minh tính hợp lệ của phiếu bầu mà không tiết lộ lựa chọn hay danh tính cử tri.
Tình huống Đấu Giá Đóng Kín cho thấy cách các nhà thầu có thể gửi các đấu giá riêng tư với các cam kết và các chứng minh khoảng cách để đảm bảo các yêu cầu đấu giá tối thiểu mà không tiết lộ các khoản tiền thực tế cho đến giai đoạn công bố.
Tình huống Danh Tính Ẩn Danh cho phép xác minh tuổi và kiểm tra tư cách thành viên mà không tiết lộ thông tin cá nhân như tuổi chính xác hay SSN, sử dụng các chứng minh Merkle cho xác minh tư cách thành viên.
typescript
// Bỏ Phiếu Bảo Mật - Bảo vệ quyền riêng tư thực sự
{
id: 'voting',
name: 'Bỏ Phiếu Bảo Mật',
inputs: [
{ label: 'ID Cử Tri', key: 'voter_id', type: 'text', defaultValue: 'voter_12345' },
{ label: 'Thông Tin Bảo Mật', key: 'private_credentials', type: 'text',
defaultValue: 'SSN:***-**-1234', isPrivate: true },
{ label: 'Nullifier Bí Mật', key: 'secret_nullifier', type: 'text',
defaultValue: 'secret_nonce_abc123', isPrivate: true },
{ label: 'Lựa Chọn Ứng Cử Viên', key: 'choice', type: 'select',
options: ['Ứng Cử Viên A', 'Ứng Cử Viên B', 'Ứng Cử Viên C'] }
],
code: `// Midnight Compact Language
circuit ConfidentialVote {
private input voter_id: Field;
private input choice: Field;
private input nullifier_secret: Field;
public input nullifier_hash: Field;
public output commitment: Field;
let vote_hash = hash(voter_id, choice);
let nullifier = hash(voter_id, nullifier_secret);
assert(nullifier == nullifier_hash);
commitment = hash(vote_hash, nullifier);
}`
}
// Xác Thực Danh Tính Ẩn Danh - Chứng minh tuổi mà không tiết lộ tuổi chính xác
{
id: 'identity',
name: 'Xác Thực Danh Tính Ẩn Danh',
inputs: [
{ label: 'Tuổi Riêng Tư', key: 'age', type: 'number', defaultValue: '25', isPrivate: true },
{ label: 'SSN Riêng Tư', key: 'private_ssn', type: 'text',
defaultValue: '***-**-5678', isPrivate: true },
{ label: 'Hash Giấy Khai Sinh Riêng Tư', key: 'birth_cert_hash', type: 'text',
defaultValue: '0x8a7f...b3c2', isPrivate: true }
],
code: `circuit AnonymousIdentity {
private input age: Field;
private input identity_hash: Field;
assert(age >= 18);
anonymous_token = hash(identity_hash, age);
}`
}
🎓 Tác Động Giáo Dục
Playground này chứng minh các ứng dụng zero-knowledge trong thực tế:
- Bỏ Phiếu Bảo Mật: Chứng minh tính hợp lệ của phiếu bầu mà không tiết lộ lựa chọn hay danh tính cử tri.
- Đấu Giá Riêng Tư: Cho phép đấu giá công bằng trong khi giữ bí mật số tiền.
- Danh Tính Ẩn Danh: Xác minh tuổi/tư cách mà không phơi bày dữ liệu cá nhân.
- Bảo Vệ Chống Ghi Lại: Ngăn chặn việc gửi lại trong tất cả các tình huống.