Bằng chứng không kiến thức (ZKP) là một công cụ mã hóa mạnh mẽ có thể xác minh tính chính xác của các phép tính đồng thời bảo vệ quyền riêng tư của dữ liệu đầu vào. Là một phần không thể thiếu của cơ sở hạ tầng quan trọng này, các ngôn ngữ dành riêng cho miền (DSL) đóng một vai trò quan trọng, hợp lý hóa quá trình phát triển và xác minh các mạch ZKP. Chúng đóng vai trò quan trọng trong việc liên kết các khái niệm trừu tượng với các biểu diễn mạch chính xác cần thiết để chứng minh hệ thống, đóng vai trò là cầu nối quan trọng giữa hai khái niệm này.
Một trong những thách thức chính trong việc chứng minh hệ thống là chuyển các khái niệm cấp cao trừu tượng thành các mạch thực tế. Tuy nhiên, sự xuất hiện của DSL giải quyết thách thức này bằng cách tạo điều kiện thuận lợi cho việc diễn đạt có cấu trúc của các khái niệm trừu tượng này theo cách cụ thể và khả thi hơn.
Trong thập kỷ qua, chúng ta đã chứng kiến sự tăng trưởng đáng kể về số lượng và sự đa dạng của DSL. Hoạt động trong lĩnh vực này được phản ánh qua sự phát triển của một số ngôn ngữ mạch, bao gồm Noir, Leo, Zinc và các ngôn ngữ khác. Cho dù bạn cần một tùy chọn có mục đích chung, như Circom hay một giải pháp được tùy chỉnh cho một nền tảng cụ thể, như Cairo, bạn có thể chọn từ nhiều ngôn ngữ và khung để viết mạch ZKP.
Trong bài viết này, chúng ta sẽ khám phá các ngôn ngữ lập trình ZK chính mà các nhà phát triển đang tích cực tận dụng và phân tích các tính năng tốt nhất của từng ngôn ngữ.
TLDR;
Cairo của StarkWare
Cairo, ngôn ngữ cốt lõi của các chương trình điện toán đa năng hỗ trợ bằng chứng STARK, đã đóng một vai trò quan trọng trong sự thành công của StarkNet và StarkEx, thúc đẩy khả năng mở rộng của các ứng dụng trên mạng chính Ethereum. Đáng chú ý, Cairo là công cụ hỗ trợ nhiều ứng dụng khác nhau, bao gồm dYdX, Sorare, Immutable X, v.v. Cái tên "Cairo" xuất phát từ tên viết tắt của "Biểu diễn trung gian đại số CPU". Trong thế giới của các bằng chứng không có kiến thức, nó đóng vai trò tương tự như hợp ngữ, giúp các nhà phát triển quen thuộc với các ngôn ngữ lập trình cấp thấp như C, C++ hoặc Solidity dễ dàng bắt đầu hơn.
Lấy cảm hứng từ Rust, Cairo trao quyền cho các nhà phát triển tạo ra các hợp đồng thông minh Starknet với trọng tâm là bảo mật và phát triển thân thiện với người dùng. Cairo có một cú pháp mạnh mẽ giúp đơn giản hóa việc tạo các mạch ZK và cho phép người dùng thực hiện nhiều tác vụ khác nhau trong các chương trình Cairo. Ngoài ra, một lợi thế đáng kể của Cairo là khả năng mở rộng, cho phép giới thiệu linh hoạt các tính năng và khả năng mới.
Trong các hệ thống ZK, tính hiệu quả và khả năng mở rộng là những yếu tố quan trọng và Cairo đáp ứng yêu cầu này bằng cách nhấn mạnh hai khía cạnh này. Ngôn ngữ này tích hợp các chiến lược tối ưu hóa, bao gồm giảm ràng buộc và loại bỏ vòng lặp, để giảm bớt gánh nặng tính toán thường liên quan đến các mạch ZK. Việc tối ưu hóa thiết kế mạch của Cairo giúp tạo và xác minh bằng chứng nhanh hơn, khiến nó trở nên lý tưởng cho các ứng dụng yêu cầu thông lượng cao và độ trễ tối thiểu.
Sự mở rộng của Cairo rất ấn tượng với sự gia tăng phi thường về số lượng các nhà phát triển toàn thời gian trong hai năm qua. Sự gia tăng này làm nổi bật khả năng thích ứng của Cairo, vì việc sử dụng của Cairo không chỉ giới hạn ở blockchain mà còn phù hợp trong bất kỳ bối cảnh nào yêu cầu xác minh tính toán. Do đó, chúng ta có thể mong đợi sự tăng trưởng đáng kể hơn nữa trong việc áp dụng Cairo của nhà phát triển.
Vào ngày 28 tháng 9 năm 2023, Starknet tung ra bản nâng cấp quan trọng cho ngôn ngữ lập trình Cairo v2.3.0. Bản phát hành này đánh dấu một bước tiến quan trọng trong việc làm cho các hợp đồng trở nên mô-đun hơn, tăng tiềm năng của hợp đồng thông minh bằng cách giới thiệu các tính năng mới, tùy chọn lưu trữ và quản lý sự kiện. Việc tích hợp các thành phần này cung cấp một cách linh hoạt để mở rộng chức năng hợp đồng, cho phép các mô-đun của bên thứ ba nâng cao chức năng của hợp đồng.
Kẽm của ZkSync
Zinc là ngôn ngữ lập trình được thiết kế để tạo hợp đồng thông minh và mạch SNARK trên nền tảng zkSync. Nó sử dụng cú pháp Rust, kết hợp các yếu tố của Solidity và cung cấp các tính năng độc đáo.
Điều làm cho Zinc trở nên độc đáo là tính thân thiện với người dùng. Bạn không cần phải hiểu tất cả các chi tiết phức tạp của hệ thống ràng buộc bậc nhất (R1CS) để viết mã an toàn. Kẽm nhấn mạnh tính bất biến, làm cho nó có chức năng vốn có. Điều này có nghĩa là nó ưu tiên đánh giá chức năng và dữ liệu bất biến, từ đó giảm tác dụng phụ và thúc đẩy việc viết mã hợp đồng thông minh sạch hơn, ít xảy ra lỗi hơn.
Ngoài ra, Zinc còn bao gồm các phép toán an toàn để ngăn ngừa sự cố tràn tiềm ẩn, đảm bảo an toàn cho mọi hoạt động. Mặc dù có một số hạn chế, chẳng hạn như không có vòng lặp vô hạn và đệ quy, Zinc đơn giản hóa quá trình gỡ lỗi thông qua việc theo dõi nhật ký bảng điều khiển. Những dấu vết này cải thiện trải nghiệm gỡ lỗi bằng cách đơn giản hóa quá trình theo dõi và giải quyết các sự cố trên mạng thử nghiệm hoặc mạng chính.
Noir của Aztec
Noir là một DSL mã nguồn mở được phát triển bởi Aztec, dựa trên Rust, được thiết kế để đơn giản hóa việc tạo các mạch ZK và chương trình ZK mà không yêu cầu kiến thức chuyên sâu về mật mã. Nó được coi là một trong những ngôn ngữ dễ tiếp cận nhất để viết các ứng dụng ZK tương thích với bất kỳ hệ thống chứng minh nào. Noir tập trung vào tính bảo mật, sự đơn giản và hiệu suất. Nó cung cấp một cú pháp giống như Rust cấp cao giúp trừu tượng hóa bảo mật mật mã và đơn giản hóa việc sử dụng các nguyên hàm cơ bản về mật mã trong khi vẫn duy trì hiệu suất cao.
Noir có lợi thế đáng kể trong việc mở rộng phạm vi ứng dụng có thể tận dụng khả năng bảo vệ quyền riêng tư do ZKP cung cấp, từ đó nâng cao hiệu quả xác minh và quyền riêng tư. Noir được biên dịch thành một biểu diễn trung gian được gọi là Biểu diễn trung gian mạch trừu tượng (Acer), sau đó có thể được biên dịch thêm thành R1CS. Việc tách hệ thống chứng minh phụ trợ khỏi chính ngôn ngữ cho phép Noir hỗ trợ nhiều hệ thống chứng minh khác nhau, bao gồm Aztec Brettenberg, Turbo Plonk và các tích hợp tiềm năng trong tương lai như Groth16 và Halo2.
Ngôn ngữ này cung cấp một thư viện tiêu chuẩn bao gồm các tính năng hiệu quả như SHA-256 (hàm băm mật mã tạo ra đầu ra có kích thước cố định) và kiểm tra Pedersen-Merkle (một phương pháp sử dụng cam kết Pedersen và cây Merkle để đảm bảo tính toàn vẹn dữ liệu và mã hóa nhất quán công nghệ xác minh). Noir được thiết kế giống như Rust và bao gồm các tính năng quen thuộc với các nhà phát triển ứng dụng như hàm, mô-đun con, kiểu do người dùng xác định (cấu trúc), điều kiện, vòng lặp và hằng số toàn cục. Ngoài ra, những nỗ lực không ngừng đang được thực hiện để phát triển các chức năng chung và hạng nhất nhằm nâng cao hơn nữa khả năng biểu đạt của Noir.
Cần lưu ý rằng Noir vẫn đang trong quá trình hoàn thiện và có thể có một số hạn chế cũng như lỗi tiềm ẩn. Nhưng nhóm phát triển cam kết liên tục cải thiện và tối ưu hóa ngôn ngữ.
o1js bởi 0(1) Labs
o1js, trước đây là SnarkyJS, là thư viện TypeScript được phát triển bởi 0(1)Labs để tạo hợp đồng thông minh bằng ngôn ngữ lập trình SNARK. Nó tận dụng các công nghệ đã được thiết lập sẵn như Node.js và khả năng tương thích của trình duyệt để đảm bảo các nhà phát triển dễ dàng truy cập và sử dụng.
o1js tích hợp hoàn hảo với các thư viện và công cụ JavaScript và TypeScript, cung cấp cho các nhà phát triển một hệ sinh thái mạnh mẽ và sự hỗ trợ cộng đồng rộng rãi. Sự tích hợp này giúp đơn giản hóa quá trình phát triển và giảm thời gian học tập liên quan đến việc áp dụng môi trường phát triển mới. Ngoài ra, nó hỗ trợ đầy đủ Visual Studio Code (VS Code), một trình soạn thảo mã được sử dụng rộng rãi cho phép các nhà phát triển tận dụng các tính năng như hoàn thành mã, tô sáng cú pháp và gỡ lỗi để nâng cao trải nghiệm phát triển.
o1js về cơ bản là một khung ZK linh hoạt cung cấp cho bạn các công cụ chính bạn cần để tạo bằng chứng ZK. Nó hỗ trợ tạo ra các chương trình ZK đa dạng, bao gồm nhiều phép toán có thể chứng minh được tích hợp sẵn, bao gồm số học cơ bản, băm, chữ ký, phép toán Boolean, so sánh, v.v. Với khung o1js, bạn có thể xây dựng zkApps trên Giao thức Mina, hợp đồng thông minh được thực thi phía máy khách và có đầu vào riêng tư.
Điều đáng nói là vào đầu tháng 9 năm 2023, nhóm 0(1)Labs đã thông báo rằng họ sẽ chuyển từ SnarkyJS sang o1js và nhấn mạnh cam kết cải thiện hiệu suất của họ. Đặc biệt lưu ý là họ đã giảm được 3-4 lần thời gian tải thư viện, tức là thời gian cần thiết để nhập o1js, một quá trình có thể chặn luồng chính. Đối với các ứng dụng web, thời gian tải có ý nghĩa quan trọng đối với cả thời gian thực thi JavaScript và hiển thị toàn bộ trang. Ngoài ra, nhóm đã cập nhật Mina zkApp CLI để cải thiện trải nghiệm xây dựng giao diện người dùng và công bố những cải tiến tiếp theo đối với API Archive Node để nâng cao độ tin cậy và độ rõ ràng của nó.
Leo của Aleo
Chuỗi khối Aleo là duy nhất trong lĩnh vực hợp đồng thông minh và nhấn mạnh vào việc bảo vệ quyền riêng tư. Cốt lõi của nó là ngôn ngữ lập trình Leo, một ngôn ngữ gõ tĩnh lấy cảm hứng từ Rust. Được thiết kế đặc biệt để phát triển các ứng dụng riêng tư, Leo trao quyền cho những người sáng tạo muốn xây dựng một hệ sinh thái phi tập trung an toàn và riêng tư. Điều thực sự độc đáo ở Leo là vai trò tiên phong của nó trong việc giới thiệu bộ công cụ toàn diện cho các ứng dụng không cần kiến thức có mục đích chung. Bộ công cụ này bao gồm khung kiểm tra, đăng ký gói, trình phân tích cú pháp nhập, trình biên dịch từ xa và trình tạo định lý.
Leo được hình thành bởi một nhóm các nhà phát triển do Howard Wu dẫn đầu. Họ đã hình dung ra một công nghệ có thể trao quyền cho các nhà phát triển xây dựng các ứng dụng phi tập trung ưu tiên quyền riêng tư và bảo mật. Thiết kế của Leo dựa trên các nguyên tắc của Rust đồng thời kết hợp một số yếu tố giống JavaScript để tăng cường sự quen thuộc và thuận tiện trong quá trình phát triển. Ngoài ra, Leo đặt mục tiêu tăng tốc độ phát triển và đơn giản hóa quá trình phát triển bằng cách cung cấp nền tảng thử nghiệm tích hợp, đăng ký gói và chuyển đổi nhập khẩu. Sự tích hợp này cho phép các nhà phát triển tập trung vào logic cốt lõi của ứng dụng của họ mà không bị ảnh hưởng bởi các vấn đề về cơ sở hạ tầng.
Một tính năng nổi bật của Leo là trình biên dịch của nó, giúp chuyển đổi các chương trình thành định dạng chứng minh R1CS cấp thấp. Trình biên dịch Leo là duy nhất trong quy trình xác minh chính thức nghiêm ngặt của nó. Việc xác minh này rất quan trọng vì các lỗ hổng có thể phát sinh ở nhiều giai đoạn, từ lập trình ban đầu đến kiểm tra và biên dịch. Bằng cách tiến hành kiểm tra toán học nghiêm ngặt để đảm bảo rằng trình biên dịch nhất quán với mục đích của người lập trình, Leo nhằm mục đích giảm nguy cơ xảy ra lỗi không được phát hiện hoặc các lỗ hổng tiềm ẩn, đặc biệt là trong bối cảnh L2, bản tổng hợp ZK hoặc các chương trình riêng tư trên nền tảng Leo.
Circom của iden3
Circom, một DSL được chế tạo đặc biệt để phát triển mạch ZK, là kết quả của nỗ lực chung giữa Jordi Baylina và nhóm iden3. Trình biên dịch Circom được viết bằng Rust và nhiệm vụ chính của nó là biên dịch các mạch được viết bằng ngôn ngữ Circom. Đáng chú ý, Circom đã trở thành lựa chọn hàng đầu cho các ứng dụng ZK nổi bật trong thế giới thực, chẳng hạn như Dark Forest và Tornado Cash. Sự phổ biến của nó là do hiệu suất tuyệt vời của nó, bao gồm thời gian kiểm chứng trình duyệt nhanh thông qua bằng chứng WASM được tối ưu hóa, bằng chứng phía máy chủ hiệu quả thông qua rapidsnark và xác minh trên chuỗi hiệu quả.
Tuy nhiên, điều quan trọng là phải nhận ra rằng chức năng của Circom chủ yếu tập trung vào phát triển mạch ZK, điều này có thể khiến nó ít phù hợp hơn để xử lý nhiều tác vụ điện toán hơn. Các nhà phát triển đang tìm kiếm nhiều chức năng hơn có thể đáp ứng nhiều nhu cầu phát triển hơn có thể nhận thấy khả năng của Circom có phần hạn chế. Trong trường hợp này, nhà phát triển có thể cần kết hợp các ngôn ngữ hoặc framework lập trình khác để đáp ứng nhu cầu phát triển rộng hơn.
Hình ảnh qua Circom
Khả năng tương thích của Circom tập trung vào các hệ thống ZKP được sử dụng rộng rãi như snarkjs và libsnark. Mặc dù khả năng tương thích này đảm bảo khả năng tích hợp liền mạch với các hệ thống được sử dụng rộng rãi này, nhưng điều đó cũng có nghĩa là các mạch Circom thừa hưởng các khả năng và hạn chế cụ thể liên quan đến những phụ thuộc này. Những nhà phát triển thích hoặc cần một hệ thống ZKP thay thế có thể phải đối mặt với những thách thức về khả năng tương thích hoặc cần đầu tư thêm công việc để điều chỉnh và tích hợp các mạch do Circom tạo vào hệ thống ưa thích của họ.
Lurk của Lurk Lab
Lurk là một phương ngữ Lisp có phạm vi tĩnh chịu ảnh hưởng của Đề án và Lisp thông thường, với một tính năng độc đáo: nó cho phép chứng minh trực tiếp tính chính xác của việc thực thi chương trình bằng cách sử dụng zk-SNARK, cho phép xác minh nhỏ gọn và hiệu quả.
Các ứng dụng chính của Lurk bao gồm:
Tính toán có thể kiểm chứng: Lurk cho phép bạn chứng minh tính chính xác của các biểu thức của nó trong điều kiện không có kiến thức, tăng độ tin cậy vào kết quả tính toán.
Không có kiến thức: Người dùng có thể chứng minh kiến thức mà không tiết lộ thông tin cụ thể ngoài thông tin đầu vào của công chúng, do đó bảo vệ quyền riêng tư.
Dữ liệu có thể định địa chỉ nội dung: Mỗi chương trình Lurk được trang bị một mã định danh nội dung (CID) duy nhất, giúp chương trình tương thích với IPFS và IPLD.
Tính hoàn chỉnh của Turing: Lurk hỗ trợ việc tạo và chứng minh các yêu cầu tính toán tùy ý.
Các hàm bậc cao hơn: Các hàm Lurk có thể chấp nhận và trả về các hàm, cho phép lập trình hàm biểu cảm.
Tính toán xử lý dữ liệu riêng tư: Lurk cho phép xử lý dữ liệu riêng tư trong khi vẫn đảm bảo đầu ra chính xác có thể chứng minh được mà không ảnh hưởng đến quyền riêng tư.
Lurk tận dụng tối đa lợi thế của bộ cấp phát bộ nhớ "nhược điểm" của Lisp khi xây dựng các mạch có mục đích chung. Bộ cấp phát này kết hợp các biểu thức và tạo các tham chiếu thông qua hàm băm. Điều quan trọng là chứng minh rằng hai biểu thức thực sự có cùng tham chiếu. Việc xác minh này cho phép Lurk thực hiện các phép tính trong mạch báo động.
Lurk rất giàu tính năng, bao gồm hỗ trợ đệ quy vô hạn, vòng lặp, luồng điều khiển có điều kiện và nhiều hệ thống chứng minh phụ trợ, chẳng hạn như Groth16 và SnarkPack+ và Nova. Tính linh hoạt này mở ra cơ hội cho nhiều ứng dụng khác nhau, bao gồm tính toán xác minh, xử lý dữ liệu riêng tư và thực hiện các chương trình Turing-complete trong các mạch báo động.
Tóm tắt
Khi tính đa dạng của các ứng dụng ZK tăng lên, DSL có triển vọng phát triển rộng rãi trong lĩnh vực ZK. Chìa khóa dẫn đến DSL thành công là xây dựng một cộng đồng thịnh vượng và các thư viện phong phú để làm phong phú thêm trải nghiệm của nhà phát triển. DSL ưu tiên khả năng tương thích với các thư viện hiện có có thể tận dụng kiến thức và tài nguyên của cộng đồng nhà phát triển rộng lớn hơn. Cách tiếp cận này tạo điều kiện tích hợp mượt mà hơn, tăng tốc độ phát triển và mang lại sự linh hoạt cao hơn khi triển khai các ứng dụng ZK. Nỗ lực hợp tác này rất quan trọng để thúc đẩy một hệ sinh thái mạnh mẽ hơn xung quanh DSL, mang lại lợi ích hữu hình cho các nhà phát triển và sẽ thúc đẩy hơn nữa việc áp dụng và hiệu quả của công nghệ ZK.