Bắt đầu với hợp đồng thông minh ZK: Hướng dẫn xây dựng mạch ZK cơ bản bằng Noir và Barretenberg

07 tháng 4, 2026·5 phút đọc

ZK (Zero-Knowledge) đang rất hot trong lĩnh vực bảo mật và blockchain. Bài viết giới thiệu cách xây dựng một mạch SNARK đơn giản bằng ngôn ngữ lập trình Noir và công cụ Barretenberg, giúp bạn hiểu rõ nguyên lý hoạt động cơ bản và quy trình tạo bằng chứng mà không tiết lộ dữ liệu riêng tư.

Bắt đầu với hợp đồng thông minh ZK: Hướng dẫn xây dựng mạch ZK cơ bản bằng Noir và Barretenberg

ZK (Zero-Knowledge) là một chủ đề nóng trong lĩnh vực bảo mật, blockchain và tiền mã hóa. Nhưng việc xây dựng một mạch Zero-Knowledge (mạch ZK) thực sự như thế nào? Bài viết này sẽ hướng dẫn bạn cách tạo một mạch SNARK cơ bản, qua đó giúp bạn có cái nhìn sâu hơn về cách thức hoạt động cũng như các công cụ liên quan như Noir và Barretenberg.

1. Chúng ta đang xây dựng gì và bộ công cụ sử dụng

Trong series này, mục tiêu là xây dựng một SNARK – viết tắt của Succinct Non-interactive Argument of Knowledge – một hệ thống bằng chứng ngắn gọn và không tương tác. Chúng ta dùng Barretenberg làm backend để sinh bằng chứng. Barretenberg sử dụng UltraHonk, một hệ thống chứng minh dựa trên PLONK – một giao thức SNARK phổ biến.

Một điểm lưu ý là zero-knowledge (kiến thức bằng không) là tùy chọn trong Barretenberg. Khi không bật, ta chỉ tạo SNARK thuần túy, nhưng trong cộng đồng đôi khi vẫn gọi chung là "zk". Dòng chảy hoạt động tổng quan như sau:

  • Người chứng minh (prover) muốn chứng minh một tuyên bố, như "Tôi trên 20 tuổi"
  • Người chứng minh cung cấp dữ liệu bằng chứng được mã hóa dưới dạng byte giúp đảm bảo tính riêng tư
  • Người kiểm chứng (verifier) sẽ kiểm tra tính hợp lệ của bằng chứng dựa trên công thức toán học
  • Người kiểm chứng có thể được triển khai “on-chain” (trên blockchain), thực hiện truy vấn và phản hồi dựa kết quả

Để làm điều này, chúng ta có:

  • Noir: ngôn ngữ để viết các ràng buộc và mạch logic
  • Barretenberg: dùng để sinh bằng chứng và contract kiểm tra bằng chứng
  • Foundry: hệ sinh thái triển khai hợp đồng vào blockchain và test (sẽ dùng ở phần tiếp theo)

Noir chỉ định nghĩa phần 'ràng buộc' cần chứng minh. Việc sinh bằng chứng mã hóa và tạo contract kiểm tra thuộc phạm vi Barretenberg và Foundry.

2. Cài đặt môi trường

Noir phụ thuộc vào Rust, nên trước tiên bạn phải cài Rust nếu chưa có:

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh  

Sau đó, cài Noir thông qua công cụ noirup:

curl -L https://raw.githubusercontent.com/noir-lang/noirup/refs/heads/main/install | bash  
noirup  

Kiểm tra:

nargo --version  

Tiếp đến cài đặt Barretenberg:

curl -L https://raw.githubusercontent.com/AztecProtocol/aztec-packages/refs/heads/master/barretenberg/bbup/install | bash  
bbup  

Kiểm tra:

bb --version  

Bây giờ bạn đã sẵn sàng để viết mạch ZK.

3. Viết mạch mẫu

Bắt đầu bằng lệnh tạo project mới:

nargo new hello_world  
cd hello_world  

Dự án gồm có file Nargo.toml - manifest dự án và src/main.nr - code mạch ZK.

Mạch mẫu rất đơn giản, kiểm tra hai số xy không bằng nhau:

fn main(x: u64, y: pub u64) {  
    assert(x != y);  
}  

#[test]  
fn test_main() {  
    main(1, 2);  

    // Uncomment để thử test thất bại  
    // main(1, 1);  
}  

Ở đây, x kiểu u64 là dữ liệu riêng tư, còn ypub u64 - giá trị công khai. Khi máy chứng minh tạo bằng chứng, bên kiểm chứng sẽ biết y nhưng không biết gì về x. Đó chính là nguyên lý zero-knowledge: xác nhận tồn tại một giá trị x thỏa mãn điều kiện mà không tiết lộ giá trị đó.

Ví dụ khác về xác minh tuổi:

fn main(age: u8, pub min_age: u8) {  
    assert(age >= min_age);  
}  

Bạn có thể kiểm tra mạch:

nargo check  

Tạo file Prover.toml, nhập dữ liệu đầu vào:

x = "2"  
y = "1"  

Chạy thực thi:

nargo execute  

Nếu thỏa mãn điều kiện (2 khác 1), kết quả sẽ nằm ở target/hello_world.gz. Nếu không thỏa mãn (ví dụ x = y = 2), thì sẽ báo lỗi không thể giải ràng buộc.

4. Sản phẩm từ nargo là gì?

Ở thư mục target/, có hai file chính:

  • hello_world.json: chứa mạch đã biên dịch dưới dạng ACIR – định dạng chứa các ràng buộc, độc lập với dữ liệu đầu vào cụ thể
  • hello_world.gz: witness chứa các giá trị đầu vào cụ thể (cả công khai và riêng tư) thỏa mãn mạch đó

Hai file này là hai thành phần khác nhau, đều cần thiết để sinh ra bằng chứng mã hóa thực sự. Đây là bước mà Barretenberg sẽ xử lý tiếp theo—tạo các bằng chứng mật mã từ các tệp này và contract kiểm tra hợp lệ cho blockchain.

5. Tiếp theo

Mặc dù nargo execute kiểm tra điều kiện và tạo witness, nhưng nó không sinh ra một bằng chứng mật mã có thể xác thực trên blockchain. Bằng chứng này được tạo bởi Barretenberg kết nối circuit và witness, kiểm tra cùng khai báo bằng Solidity verifier contract.

Phần 2 của series sẽ giới thiệu sâu hơn về cách dùng Barretenberg để sinh bằng chứng, xác thực cục bộ và tạo contract để triển khai on-chain.


Tham khảo bổ sung

Bài viết hy vọng giúp bạn có cái nhìn rõ ràng và trực quan hơn về cách thức xây dựng ứng dụng ZK cơ bản, chuẩn bị nền tảng cho việc phát triển các ứng dụng bảo mật, ẩn danh trên blockchain trong tương lai.

Bài viết được tổng hợp và biên soạn bằng AI từ các nguồn tin tức công nghệ. Nội dung mang tính tham khảo. Xem bài gốc ↗