giới thiệu

Bằng chứng không có kiến ​​thức, đặc biệt là zk-SNARK (Đối số kiến ​​thức không tương tác ngắn gọn về kiến ​​thức bằng không), có lẽ là một trong những công nghệ tiên tiến quan trọng nhất trong Web 3. Hiện tại, hầu hết sự chú ý của giới truyền thông và đầu tư vào trường con này đều tập trung vào zk-Rollups, một giải pháp mở rộng quy mô cung cấp khả năng mở rộng quy mô lớn cho các chuỗi khối L1 như Ethereum. Mặc dù vậy, zk-Rollups không phải là mục đích duy nhất của zk-SNARK. Bài viết này sẽ cung cấp phân tích chuyên sâu về khái niệm mã lắp ráp không có kiến ​​thức (zkASM), đánh giá các trường hợp sử dụng của nó trong zk-Rollups và các khía cạnh khác, đồng thời khám phá tiềm năng của nó trong việc tái phát minh Internet từ cấp độ lý thuyết.

Nguyên tắc kỹ thuật

Đúng như tên gọi, zk-ASM chủ yếu bao gồm hai thành phần kỹ thuật: ZK và ASM. ZK đề cập đến zk-SNARK, là đối số kiến ​​thức không tương tác ngắn gọn và ASM đề cập đến mã hợp ngữ. Để hiểu được tiềm năng của zk-ASM, trước tiên chúng ta phải hiểu cơ sở lý thuyết của hai khái niệm tưởng chừng như mơ hồ này.

zk-SNARK

zk-SNARK là viên ngọc quý của zk-Proofs: chúng là một cách ngắn gọn để chứng minh rằng một tuyên bố là đúng mà không tiết lộ bất kỳ thông tin nào về dữ liệu được chứng minh. Ví dụ: giả sử ai đó tuyên bố "Tôi biết có một m sao cho C(m) = 0," trong đó m là một gigabyte thông tin và C là một hàm. Zk-SNARK sẽ tạo thành một bằng chứng ngắn (<1GB) nhanh chóng xác minh sự tồn tại của m trong khi không tiết lộ bất kỳ thông tin nào về m (ngoài thông tin công khai).

Chính xác thì "C (m)" này là gì? Công dụng là gì? Hàm này thực sự là một mạch số học hoặc biểu diễn đồ thị chu kỳ có hướng (DAG) của hàm cụ thể mà chúng ta muốn thực thi, như trong hình. Về cơ bản, "m" là dữ liệu đầu vào của mạch và các "nút" cụ thể trong mạch là các cổng hoặc hoạt động logic riêng lẻ. Ví dụ: "2" và "3" có thể được nhập vào nút "+" và sau đó "5" được xuất cho toán tử tiếp theo. Điều này cho phép bất kỳ phép toán số học hoặc logic nào được mã hóa trong một "mạch số học".

Sau khi mã zk-SNARK mà chúng ta muốn chạy được biểu thị bằng mạch số học, chúng ta có thể bắt đầu xây dựng zk-SNARK này. Nói một cách cơ bản, tính khả thi của zk-SNARK được thiết lập bởi "Định lý cơ bản của đại số". Theo Định lý cơ bản của đại số, một đa thức bậc "d" có nhiều nhất là gốc "d". Thủ thuật toán học này là một quá trình gồm hai bước: (1) chuyển hàm số "f(m)" cần chứng minh thành đa thức và tiếp tục sử dụng đa thức đó, và (2) sử dụng "Định lý cơ bản của đại số" để xử lý đa thức và đưa ra chứng minh ngắn gọn. Về mặt kỹ thuật, phần đầu tiên được gọi là "Chương trình cam kết đa thức" (PCS) và phần thứ hai được gọi là "Bằng chứng tương tác đa thức của Oracle" (PIOP).

Thành phần của mạch phổ dụng hiệu quả SNARK. Nguồn: https://cs251.stanford.edu/lectures/lecture15.pdf

Việc triển khai cụ thể PCS và PIOP nằm ngoài phạm vi của bài viết này, nhưng điều này cho chúng ta bản phác thảo sơ bộ về các bước cốt lõi của zk-SNARK:

  1. Chọn một hàm (hàm mã, phương trình toán học, v.v.) mà bạn muốn chạy zk-SNARK trên

  2. Mã hóa hàm này thành mạch số học C(m)

  3. Chạy PCS để lấy biểu diễn đa thức của mạch số học

  4. Chạy PIOP và nhận bằng chứng ngắn gọn về kích thước log(m)

Hiện nay đã có zk-SNARK tùy chỉnh, có thể chứng minh rằng ai đó biết một thông tin nhất định mà không tiết lộ nội dung cụ thể của thông tin đó.

mã lắp ráp

Phần thứ hai của câu đố zk-ASM là mã lắp ráp. Nó là một ngôn ngữ giống ngôn ngữ chứa các hướng dẫn ngôn ngữ cấp thấp, dễ đọc cho máy nhưng khó giải mã cho con người. Không giống như các ngôn ngữ cấp cao như Python, Java hay thậm chí C, hợp ngữ chứa một số hàm rất nguyên thủy, cũng như MOVE (di chuyển), CMP (so sánh), ADD (bổ sung) và JMP (nhảy) tại bộ xử lý và đăng ký cấp độ. Ví dụ: mã Python để gõ các số từ 1 đến 9 trên màn hình là `123456789`:

Điều đó thật dễ hiểu phải không? Chúng ta hãy xem phiên bản lắp ráp x86 của nó:

Nó thực sự rắc rối hơn rất nhiều, và đây chỉ là một thao tác rất đơn giản. Trong trường hợp này, tại sao lại sử dụng hợp ngữ? Như đã đề cập ở trên, mặc dù con người không dễ dàng đọc được những hướng dẫn này nhưng chúng có thể dễ dàng được "tập hợp" thành mã byte `110011001` để máy đọc và thực thi (được gọi là trình biên dịch mã). Để so sánh, mặc dù các ngôn ngữ cấp cao như Python và Java dễ đọc hơn nhưng bộ xử lý không thể thực thi trực tiếp các chương trình được viết bằng các ngôn ngữ này. Chúng ta cần một "trình biên dịch" để chuyển đổi mã Python hoặc Java mà chúng ta viết thành mã hợp ngữ ở trên và giao cho máy để lắp ráp và thực thi. Lý do tại sao cùng một đoạn mã Python hoặc Java có thể chạy trơn tru trên các bộ xử lý và hệ điều hành khác nhau là do trình biên dịch thực hiện công việc nặng nhọc và biên dịch mã nguồn thành hợp ngữ cho bộ xử lý hoặc hệ điều hành cụ thể.

Bởi vì tất cả các ngôn ngữ đều biên dịch thành mã hợp ngữ (bản thân mã này được biên dịch thêm thành các tệp nhị phân có thể thực thi được), về cơ bản, hợp ngữ giống như "mẹ của tất cả các ngôn ngữ". Bây giờ giả sử rằng chúng ta có thể chuyển đổi tất cả toán hạng trong ngôn ngữ hợp ngữ (chẳng hạn như x86 hoặc RISC-V) thành biểu diễn mạch số học, chúng ta có thể cung cấp bằng chứng zk-SNARK cho tất cả toán hạng trong ngôn ngữ hợp ngữ này. Về lý thuyết, điều này có nghĩa là chúng tôi có thể cung cấp zk-SNARK cho bất kỳ chương trình nào được viết bằng bất kỳ ngôn ngữ cấp cao nào biên dịch sang tập hợp, chẳng hạn như Python hoặc Java. Vì điều này, zk-ASM xứng đáng được chúng ta nghiên cứu kỹ lưỡng.

Ứng dụng thực tế

Bản cuộn zk-EVM: Đa giác zk-ASM

Một trong những ứng dụng quan trọng nhất của zk-ASM là tạo ra zk-Rollups tương thích với Máy ảo Ethereum hoặc zk-EVM. zk-EVM rất quan trọng đối với khả năng mở rộng blockchain vì nó cho phép các lập trình viên triển khai trên chuỗi L2 dựa trên zk-Rollup mà không thực hiện quá nhiều (hoặc bất kỳ) sửa đổi nào đối với mã. Về vấn đề này, zk-EVM của Polygon là một ví dụ điển hình về cách có thể sử dụng zk-ASM để đạt được mục tiêu này.

Các nhà phát triển trên chuỗi công khai Ethereum L1 thường sử dụng ngôn ngữ Solidity, đây là ngôn ngữ lập trình cấp cao tương tự như ngôn ngữ C. Trước khi mã Solidity được chạy trên chuỗi khối L1, trước tiên nó sẽ được biên dịch thành một loạt mã hoạt động EVM, chẳng hạn như ADD, SLOAD, EQ, v.v. Theo mặc định, quá trình này rõ ràng không tạo ra bất kỳ zk-Proof nào. Sự khéo léo của Polygon là tạo ra một cách để dịch mọi mã opcode EVM sang zk-ASM được viết tùy chỉnh của chúng, rất thân thiện với zk-SNARK. Sau đó, L2 zk-EVM của họ thực thi zk-ASM trong khi tạo mạch zk-SNARK của ASM để tạo bằng chứng zk-SNARK. Ví dụ: mã hoạt động THÊM trong EVM sẽ được dịch sang zk-ASM của Polygon như sau:

Vì phép thuật của Polygon zk-EVM xảy ra ở cấp độ lắp ráp, nên nó "thấp hơn" hai cấp so với lớp mã mà Ethereum thông thường chạm vào, lớp "Solidity". Do đó, hầu hết các nhà phát triển có thể chuyển trực tiếp mã EVM mà họ đã xây dựng cho mạng chính Ethereum sang Polygon zk-EVM. Đồng thời, Polygon zk-EVM "giữ lại" ngăn xếp công nghệ Ethereum cho đến cấp mã hoạt động và tất cả cơ sở hạ tầng gỡ lỗi dựa trên phân tích mã hoạt động đã biên dịch vẫn có thể được sử dụng nguyên vẹn. Điều này khác với các thiết kế zk-EVM khác không cung cấp zk-Proof ở cấp độ opcode, chẳng hạn như zk-Sync. Do đó, mặc dù Polygon đã phát minh và xác minh ngôn ngữ hợp ngữ của riêng mình, nhưng như Buterin đã nói, "nó vẫn có thể xác minh mã EVM, nhưng nó chỉ sử dụng logic bên trong khác".

Ngoài các bản cuộn: zk-WASM

zk-EVM hoàn toàn không phải là trường hợp sử dụng duy nhất của zk-ASM. Như đã đề cập ở trên, hợp ngữ về cơ bản là "mẹ của tất cả các ngôn ngữ" và việc tạo zk-ASM sẽ mở khóa zk-Proofs cho các chương trình có mục đích chung được viết bằng bất kỳ ngôn ngữ nào biên dịch sang hợp ngữ. Web Assembly (WASM) là một trong những ngôn ngữ hợp ngữ mới nổi quan trọng nhất. Nó được phát hành lần đầu tiên vào năm 2018 và nhằm mục đích cải thiện tốc độ thực thi của các ứng dụng web và cung cấp các phần bổ sung thực thi cho Javascript (ngôn ngữ lập trình chính đằng sau Web).

Về cơ bản, khi Web phát triển qua nhiều năm, các ứng dụng Web ngày càng phát triển về quy mô và độ phức tạp, điều đó có nghĩa là các trình duyệt phải biên dịch mọi thứ được viết bằng Javascript, thường với tốc độ cực kỳ chậm và phải lặp lại quá trình "biên dịch-Tối ưu hóa-Tải lại" phức tạp. quá trình. WebAssugging loại bỏ sự phụ thuộc vào các công cụ thực thi trình duyệt phức tạp bằng cách cung cấp ngôn ngữ lắp ráp di động, mô-đun và dễ thực thi. Ngoài ra, WASM, với tư cách là ngôn ngữ hợp ngữ, cho phép lập trình viên viết các đoạn mã bằng các ngôn ngữ như C, C++, Rust, Java hoặc Ruby có thể chạy trực tiếp trên trình duyệt. Do đó, WASM đã trở thành công nghệ được lựa chọn để "cung cấp các chức năng phi máy chủ phân tán".

Zk-SNARK có thể đóng vai trò gì trong vấn đề này? WASM độc đáo ở chỗ nó là công nghệ phía máy khách tương tác trực tiếp với dữ liệu do người dùng nhập. Điều này thường bao gồm dữ liệu nhạy cảm như mật khẩu và thông tin cá nhân, vì vậy chúng tôi cần một công nghệ (1) đảm bảo rằng chương trình được thực thi chính xác và (2) đảm bảo rằng thông tin nhạy cảm không bị rò rỉ. zk-SNARK là giải pháp hoàn hảo cho hai vấn đề này và do đó là một mảnh ghép quan trọng đối với WASM.

Công việc phát triển zk-WASM vẫn đang ở giai đoạn đầu, nhưng một số dự án gần đây đã phát hành mạch zk-SNARK nguyên mẫu cho WebAssembly. Ví dụ: trình mô phỏng zk-SNARK “ZAWA” của Delphinus Lab mang đến một cách mã hóa toán hạng và ngữ nghĩa của máy ảo WASM vào mạch điện toán, cho phép nó tạo ra các bằng chứng zk-SNARK. Mạch zk-WASM chắc chắn sẽ tiếp tục được tối ưu hóa để các chương trình được viết bằng các ngôn ngữ có mục đích chung như C, C++, Rust và Ruby sẽ áp dụng mô hình zk-Proofs.

Tóm lại là

Bài viết này khám phá cơ sở lý thuyết của zk-ASM và xem xét hai trường hợp sử dụng mô hình của zk-ASM: Polygon sử dụng zk-ASM để tạo zk-EVM ở cấp mã vận hành và áp dụng zk-SNARK cho WebAssembly để tạo zk-WASM. Cuối cùng, zk-ASM hứa hẹn sẽ kết hợp khả năng tương tác và quy mô của Web 2 với tính không tin cậy và bảo mật của Web 3.

Một mặt, blockchain ngày càng tìm cách vượt qua các tắc nghẽn về khối lượng xử lý hiện tại và mặt khác, các phương pháp tiếp cận Web 2 ngày càng bị chỉ trích vì không bảo vệ đầy đủ dữ liệu và quyền riêng tư của người dùng. Vì các lập trình viên có thể sử dụng các mô hình thiết kế Web 3 trong mã Web 2 và đưa các ngôn ngữ và mã Web 2 vào chuỗi khối, zk-ASM phổ quát dự kiến ​​sẽ trở thành điểm gặp gỡ giữa thế giới Web 2 và Web 3. Theo quan điểm này, zk-ASM có thể cho phép chúng tôi hình dung lại một mạng Internet an toàn và không cần tin cậy hơn.