Cách zk-ASM có thể cung cấp một mạng Internet an toàn và không cần tin cậy

Phân tích nghiên cứu ban đầu của Web3.com Ventures

0xNhà nghiên cứu cá

Lưu ý: Bài viết này là một bài viết khá chuyên sâu về mặt kỹ thuật và giả định bạn đã có hiểu biết cơ bản về khái niệm zk-Proofs và/hoặc zk-Rollups. Bạn có thể tìm thấy phần giới thiệu tổng quát hơn về những nguyên tắc này tại đây.

Giới thiệu

Bằng chứng kiến ​​thức không, đặc biệt là zk-SNARK (Đối số kiến ​​thức không tương tác ngắn gọn) có lẽ là một trong những công nghệ quan trọng nhất ở tiền tuyến của Web 3. Trong khi hầu hết sự chú ý của giới truyền thông và đầu tư trong lĩnh vực phụ này đều hướng tới zk -Rollups, 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, đây hoàn toàn không phải là ứng dụng duy nhất của zk-SNARK. Trong bài luận này, tôi sẽ phân tích sâu khái niệm về mã Zero-Knowledge Assembly (hoặc zkASM), đánh giá các trường hợp sử dụng của nó trong cả zk-Rollups và hơn thế nữa, khám phá các khả năng lý thuyết của nó trong việc phát minh lại Internet như chúng ta đã biết.

Nguyên tắc kỹ thuật

zk-ASM, như tên gọi của nó, bao gồm hai phần kỹ thuật chính: ZK và ASM. Phần ZK đề cập đến zk-SNARKs, hay Succinct Non-Interactive Arguments of Knowledge, trong khi phần ASM đề cập đến Assembly code. Để hiểu được tiềm năng của zk-ASM, trước tiên chúng ta phải hiểu được nền tảng lý thuyết của cả hai khái niệm có vẻ bí ẩn này.

zk-SNARK

zk-SNARK là viên ngọc quý của zk-Proof: chúng là một bằng chứng ngắn gọn cho thấy một tuyên bố nào đó là Đúng khi bằng chứng không tiết lộ bất cứ điều gì về dữ liệu đang được chứng minh. Ví dụ, hãy xem xét một người nào đó khẳng định tuyên bố "Tôi biết một m sao cho C(m) = 0", trong đó m là một thông điệp dài một gigabyte và C là một hàm. Một zk-SNARK sẽ là một bằng chứng rất ngắn (< 1GB) có thể được xác minh nhanh chóng và không tiết lộ bất cứ điều gì về m (ngoài thông tin công khai) [1].

Vậy “C(m)” này là gì? Nó hữu ích như thế nào? Hàm này thực chất là một mạch số học, hoặc là một biểu diễn Đồ thị có hướng không chu trình (DAG) của một hàm cụ thể mà chúng ta muốn thực hiện, như sơ đồ cho thấy [2]. 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 logic hoặc phép toán số học riêng lẻ. Ví dụ, một nút “+” có thể có “2” và “3” làm đầu vào và đưa ra “5” vào toán tử tiếp theo. Do đó, một phép toán số học hoặc logic tùy ý có thể được mã hóa trong một “mạch số học”.

Khi chúng ta có mạch số học này như một biểu diễn của mã mà chúng ta muốn chạy zk-SNARK, chúng ta có thể bắt đầu xây dựng zk-SNARK này. Về cơ bản, zk-SNARK là khả thi vì "định lý cơ bản của đại số", trong đó nêu rằng một đa thức bậc "d" có nhiều nhất là "d" nghiệm [3]. Thủ thuật toán học gồm hai bước: (1) bằng cách nào đó chuyển đổi hàm "f(m)" mà chúng ta muốn chứng minh thành một đa thức (và gắn bó với điều đó), và (2) sử dụng "định lý cơ bản của đại số" để tương tác với đa thức và cung cấp một bằng chứng ngắn gọn. Trong thuật ngữ kỹ thuật, phần đầu tiên được gọi là "Sơ đồ cam kết đa thức" (PCS) và phần thứ hai được gọi là "Bằng chứng Oracle tương tác đa thức" (PIOP) [4].

Mặc dù việc triển khai cụ thể của PCS và PIOP nằm ngoài phạm vi của bài viết này, cho đến nay chúng tôi đã phác thảo sơ bộ các bước cốt lõi của zk-SNARK:

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

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

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

  4. Chạy PIOP để có được một bằng chứng ngắn gọn về kích thước logarit của “m” ban đầu

Và viola, chúng ta có zk-SNARK được thiết kế riêng có thể chứng minh rằng ai đó biết một tin nhắn nhất định mà không tiết lộ tin nhắn đó là gì.

Mã lắp ráp

Mảnh ghép thứ hai của zk-ASM là ý tưởng về Mã hợp ngữ. Mã hợp ngữ là một lớp ngôn ngữ chứa các lệnh ngôn ngữ rất thấp mà máy có thể dễ dàng đọc được nhưng con người lại khá khó để giải mã. Không giống như các ngôn ngữ cấp cao hơn, chẳng hạn như Python, Java hoặc thậm chí là C, ngôn ngữ hợp ngữ chứa các hàm rất thô sơ, chẳng hạn như di chuyển, so sánh, cộng và nhảy trên một loạt các thanh ghi dữ liệu trên bộ xử lý và các vị trí bộ nhớ được mã hóa cứng. Ví dụ, mã Python để in các số từ 1 đến 9 trên màn hình là 123456789:

Khá dễ hiểu phải không? Đây là phiên bản x86 Assembly của nó [5]:

Tệ hơn nhiều, đặc biệt là đối với một thao tác đơn giản như vậy. Vậy tại sao lại sử dụng ngôn ngữ Assembly? Như đã nêu ở trên, trong khi những hướng dẫn này có thể không dễ đọc đối với con người, nhưng chúng lại rất dễ "lắp ráp" thành mã byte 110011001 để máy đọc và thực thi (đây được gọi là trình biên dịch) [6]. So sánh mà nói, các ngôn ngữ cấp cao hơn như Python và Java thân thiện hơn nhiều với con người khi đọc, nhưng các chương trình được viết bằng các ngôn ngữ này không thể được bộ xử lý thực thi trực tiếp. Thay vào đó, chúng ta cần dựa vào một "trình biên dịch" xử lý mã Python hoặc Java mà chúng ta viết và đưa ra một bản sao mã assembly như mã ở trên để máy có thể lắp ráp và thực thi. Chúng ta có thể mong đợi cùng một đoạn Python hoặc Java chạy trơn tru trên các bộ xử lý và hệ điều hành khác nhau vì trình biên dịch thực hiện công việc nặng nhọc, biên dịch mã nguồn của bạn thành ngôn ngữ Assembly dành riêng cho bộ xử lý hoặc hệ điều hành đó.

Bởi vì tất cả các ngôn ngữ đều biên dịch xuống mã assembly (bản thân nó được biên dịch xuống mã nhị phân có thể thực thi), assembly về cơ bản 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ể biến tất cả các toán hạng trong một ngôn ngữ Assembly (như x86 hoặc RISC-V) thành một biểu diễn mạch số học, sao cho chúng ta có thể cung cấp các bằng chứng zk-SNARK của tất cả các toán hạng trong ngôn ngữ Assembly này. Điều này có nghĩa là về mặt lý thuyết, chúng ta có khả năng cung cấp một zk-SNARK của bất kỳ chương trình nào được viết bằng một ngôn ngữ cấp cao tùy ý (như Python hoặc Java) biên dịch xuống ngôn ngữ Assembly này. Và đó là lý do tại sao chúng ta cần quan tâm đến zk-ASM.

Ứng dụng thực tế

zk-EVM Rollups: Polygon zk-ASM

Một trong những ứng dụng quan trọng nhất của zk-ASM là tạo ra zk-Rollup tương thích với Máy ảo Ethereum, hay zk-EVM. Zk-EVM cực kỳ quan trọng đối với khả năng mở rộng của 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 cần sửa đổi nhiều (nếu có) mã của họ [7]. Trong lĩnh vực này, zk-EVM của Polygon là một nghiên cứu điển hình minh họa cách zk-ASM có thể được sử dụng để đạt được mục tiêu này.

Khi các lập trình viên phát triển trên blockchain Ethereum L1, họ thường viết mã bằng Solidity, một ngôn ngữ cấp cao tương tự như C. Mã Solidity này được biên dịch thành một loạt các Opcode EVM, chẳng hạn như ADD, SLOAD và EQ, trước khi được thực thi trên blockchain L1 [8]. Theo mặc định, quá trình này rõ ràng không tạo ra bất kỳ loại zk-Proof nào. Thủ thuật của Polygon là tạo ra một phương pháp để diễn giải từng Opcode EVM thành zk-ASM do họ viết riêng, rất thân thiện với zk-SNARK. Sau đó, zk-EVM L2 của họ sẽ thực thi zk-ASM, đồng thời tạo ra một mạch zk-SNARK của ASM để tạo ra bằng chứng zk-SNARK [9]. Ví dụ: opcode ADD trong EVM sẽ được dịch thành zk-ASM của Polygon như sau [10]:

Bởi vì trò gian lận của Polygon zk-EVM xảy ra ở cấp độ Assembly, nên nó cách xa hai cấp độ so với mã mà lập trình viên Ethereum trung bình chạm vào, cấp độ "Solidity". Đây là lý do tại sao hầu hết các nhà phát triển có thể chuyển mã EVM của họ được xây dựng cho mạng chính Ethereum trực tiếp sang Polygon zk-EVM. Hơn nữa, vì Polygon zk-EVM "giữ" ngăn xếp công nghệ của Ethereum xuống cấp độ opcode, nên tất cả cơ sở hạ tầng gỡ lỗi dựa trên việc phân tích các opcode đã biên dịch đều sẽ được giữ nguyên và có thể sử dụng được. Điều này không giống như một số thiết kế zk-EVM khác, chẳng hạn như zk-Sync, không cung cấp zk-Proofs ở cấp độ opcode. Do đó, ngay cả khi Polygon phát minh và chứng minh ngôn ngữ Assembly của riêng mình, Vitalik viết rằng "nó vẫn có thể xác minh mã EVM, nó chỉ sử dụng một số logic nội bộ khác để thực hiện việc đó" [11].

Vượt xa Rollups: zk-WASM

zk-EVM không phải là ứng dụng duy nhất cho zk-ASM. Hãy nhớ lại khẳng định trước đây của chúng tôi rằng ngôn ngữ Assembly về cơ bản là “mẹ của tất cả các ngôn ngữ” và việc tạo ra zk-ASM sẽ mở khóa zk-Proofs cho các chương trình chung được viết bằng bất kỳ ngôn ngữ nào biên dịch sang ngôn ngữ Assembly đó. Web Assembly, hay WASM, là một trong những ngôn ngữ assembly mới nổi quan trọng nhất. Lần đầu tiên được xuất bản vào năm 2018, mục đích của WASM là tạo ra một ngôn ngữ Assembly giúp tăng tốc độ thực thi của Ứng dụng Web và cung cấp phần bổ sung thực thi cho Javascript, ngôn ngữ mã hóa chính đằng sau Web [12].

Về cơ bản, khi Web phát triển qua nhiều năm, kích thước và độ phức tạp ngày càng tăng của Ứng dụng Web có nghĩa là trình duyệt thường biên dịch mọi thứ được viết bằng Javascript rất chậm và phải dựa vào các chu kỳ biên dịch-tối ưu hóa-tải lại phức tạp [12]. Mặt khác, WebAssembly loại bỏ nhu cầu phải dựa 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 một ngôn ngữ lắp ráp di động, mô-đun và dễ thực thi. Hơn nữa, là một ngôn ngữ lắp ráp, WASM cho phép các lập trình viên trực tiếp viết các đoạn mã bằng C, C++, Rust, Java hoặc Ruby chạy gốc trong trình duyệt. Do đó, WASM đã trở thành công nghệ được lựa chọn để “cung cấp các hàm không có máy chủ phân tán” [13].

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

Trong khi công việc phát triển zk-WASM vẫn đang trong giai đoạn đầu, gần đây đã có một số dự án phát hành mạch zk-SNARK nguyên mẫu cho WebAssembly. Ví dụ, Trình giả lập zk-SNARK “ZAWA” của Delphinus Lab trình bày một phương pháp mã hóa các toán hạng và ngữ nghĩa của máy ảo WASM thành một mạch số học, cho phép nó thực hiện các bằng chứng zk-SNARK [13]. Theo thời gian, các mạch zk-WASM chắc chắn sẽ được tối ưu hóa liên tục, do đó cho phép các chương trình được viết bằng các ngôn ngữ chung (như C, C++, Rust và Ruby) áp dụng mô hình zk-Proofs.

Phần kết luận

Trong suốt bài luận này, chúng tôi đã khám phá nền tảng lý thuyết của zk-ASM cũng như xem xét hai nghiên cứu trường hợp tiêu biểu của zk-ASM: Polygon sử dụng zk-ASM để tạo zk-EVM cấp mã lệnh, cũng như ứng dụng zk-SNARK vào WebAssembly để tạo zk-WASM. Cuối cùng, lời hứa của zk-ASM là kết hợp khả năng tương tác và quy mô của Web 2 với sự không tin cậy và bảo mật của Web 3.

Một mặt, các blockchain ngày càng tìm cách mở rộng quy mô vượt ra ngoài các nút thắt thông lượng hiện tại của chúng và có khả năng hỗ trợ thực thi, trong khi mặt khác, các phương pháp Web 2 ngày càng bị tấn công vì bảo vệ dữ liệu và quyền riêng tư của người dùng không đầy đủ. Khi 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 của họ và giới thiệu các ngôn ngữ và mã Web 2 vào blockchain, zk-ASM chung có thể đại diện cho một điểm hợp nhất trong thế giới của Web 2 và Web 3 [15]. Theo nghĩa này, zk-ASM có thể cho phép chúng ta hình dung lại một Internet an toàn hơn và không cần tin cậy.

🐦 @0xfishylosopher

📅 Ngày 17 tháng 12 năm 2022

Tuyên bố miễn trừ trách nhiệm: thông tin được trình bày ở trên hoàn toàn mang tính giáo dục, không cấu thành lời khuyên tài chính và chỉ đại diện cho quan điểm của tác giả. Delphinus Lab là công ty danh mục đầu tư của Web3.com Ventures.

Tài liệu tham khảo

[1] https://z.cash/technology/zksnarks/

[2] https://cs251.stanford.edu/lectures/lecture14.pdf

[3] https://www.britannica.com/science/fundamental-theorem-of-algebra

[4] Xây dựng SNARK hiệu quả: https://cs251.stanford.edu/lectures/lecture15.pdf

[5] Ví dụ từ: https://www.tutorialspoint.com/assembly_programming/assembly_loops.htm

[6] https://en.wikipedia.org/wiki/Assembly_lingu

[7] https://www.alchemy.com/overviews/zkevm

[8] Để biết danh sách các mã lệnh: https://ethereum.org/en/developers/docs/evm/opcodes/

[9] https://wiki.polygon.technology/docs/zkEVM/zkASM/introduction

[10] https://wiki.polygon.technology/docs/zkEVM/zkASM/some-examples

[11] https://vitalik.ca/general/2022/08/04/zkevm.html

[12] https://blog.developer.adobe.com/under Hiểu-webassembly-wasm-d5b592208ecc

[13] https://jhc.sjtu.edu.cn/~hongfeifu/manuscriptb.pdf

[14] https://hyperoracle.medium.com/zkwasm-the-next-chapter-of-zk-and-zkvm-471038b1fba6

[15] https://delphinuslab.com/zk-wasm/