Rollup là một loại giải pháp mở rộng Layer 2 của blockchain. Trong các kế hoạch Rollup, các nhà điều hành của dự án chạy một nền tảng Layer 2 tương đối độc lập dưới sự mở rộng của chuỗi chính (tức là Layer 1). Người dùng có thể thực thi hợp đồng hoặc chuyển đổi token trên nền tảng Layer 2.
Sự an toàn của nền tảng Layer 2 được đảm bảo bởi chuỗi khối Layer 1 mà nó dựa vào. Khi một block mới được tạo ra trong Layer 2, thông tin giao dịch từ block Layer 2, cũng như gốc trạng thái sau giao dịch của Layer 2, được gói lại dưới dạng giao dịch Rollup và được công bố trên chuỗi Layer 1. Việc thực hiện giao dịch thực tế và thay đổi trạng thái được xử lý trên nền tảng Layer 2 dưới chuỗi chính, và Layer 1 chỉ cần xác minh tính đúng đắn của các chuyển đổi trạng thái của Layer 2. Vì chi phí xác minh tính chính xác của chuyển đổi trạng thái thấp hơn nhiều so với việc thực hiện các giao dịch này trên Layer 1, Layer 2 có thể đạt được sự mở rộng của nền tảng Layer 1. Nền tảng Layer 2 có thể cung cấp khả năng xử lý giao dịch cao hơn và chi phí giao dịch thấp hơn so với Layer 1 trong khi duy trì sự an toàn tương đương.
So với các hệ thống giao dịch ngoại chuỗi khác, Rollups có hai đặc điểm:
Dựa vào các phương pháp xác minh của cập nhật trạng thái Layer 2 bởi chuỗi chính, hiện tại có hai loại giải pháp công nghệ Rollup chính. Một loại là Optimistic Rollup. Trong loại hình này, hợp đồng chuỗi chính không xác minh trực tiếp trạng thái mới được gửi bởi Layer 2. Thay vào đó, một giai đoạn thách thức được chuẩn bị cho mỗi trạng thái mới được gửi. Vì Rollup gửi tất cả thông tin giao dịch đến chuỗi chính và làm cho nó trở nên công khai, bất kỳ ai cũng có thể xác minh cập nhật trạng thái (đặc biệt khi cập nhật liên quan đến ví của họ). Nếu trạng thái mới không chính xác, người xác minh có thể tạo ra một bằng chứng gian lận đối với trạng thái sai lầm đó và gửi nó trong thời kỳ thách thức, từ đó vô hiệu hóa cập nhật trạng thái không chính xác.
Một loại giải pháp Rollup khác là zk Rollup. Trong loại hình này, sau khi thực hiện cập nhật trạng thái Layer 2, người vận hành Layer 2 phải cung cấp một bằng chứng không kiến thức về sự chính xác của việc cập nhật trạng thái và gửi nó đến chuỗi chính cùng với cập nhật trạng thái. Hợp đồng trên chuỗi chính sẽ xác minh bằng chứng để xác định tính chính xác của việc cập nhật trạng thái.
So với hệ thống Optimistic Rollup, zk Rollup không đòi hỏi một thời gian thách thức dài để cuối cùng xác nhận các giao dịch Layer 2 và có thể được xác nhận nhanh hơn. Ngoài ra, zk Rollup không phụ thuộc vào giả định rằng luôn có người xác minh trung thực trong mạng sẽ kịp thời nộp chứng minh gian lận khi xảy ra gian lận. Tuy nhiên, đồng thời, zk Rollup cũng đối mặt với các vấn đề như chi phí tính toán cao của công nghệ chứng minh không biết, sự phức tạp và khó khăn trong phát triển, làm trở ngại cho việc triển khai thực tế công nghệ zk Rollup trong Rollups. Với sự phát triển tiếp theo của công nghệ chứng minh không biết trong hai năm qua, những trở ngại này dần dần được vượt qua. Công nghệ zk Rollup đang bắt đầu chiếm một phần ngày càng lớn trên thị trường Layer 2.
Như được hiển thị trong hình dưới đây, trong lĩnh vực mở rộng lớp 2 Rollup, zkRollup đã chiếm hơn nửa diện tích và đang phát triển nhanh chóng.
Dữ liệu được truy xuất vào: 18 tháng 1 năm 2024
Trong quá trình phát triển của mình, zkRollup chủ yếu đã trải qua hai giai đoạn. Loại đầu tiên là zkRollup không chung, trong khi loại thứ hai là zkRollup chung có khả năng thực thi hợp đồng tùy ý Turing-complete.
Sự khác biệt giữa hai loại công nghệ zkRollup này chủ yếu nằm ở việc nền tảng Layer 2 có thực hiện logic chuyên biệt hạn chế được viết bởi nhà cung cấp nền tảng hay logic hợp đồng thông minh tùy ý được người dùng viết trong giao dịch.
Trong các dự án zkRollup không phải là tổng quát (như zkSync Lite, xếp hạng thứ 8 trong hình trên), người dùng chỉ có thể thực hiện một số loại hoạt động giao dịch, chẳng hạn như chuyển đổi FT (token có thể thay thế), thanh toán, trao đổi và chuyển đổi NFT (token không thể thay thế). Luật giao dịch cho những hoạt động này chỉ có thể được xác định và triển khai bởi chủ dự án.
Thông qua các dự án zkRollup như vậy, chúng tôi có thể chuyển tiền với mức phí thấp hơn đáng kể so với Ethereum mainnet và đạt được lưu lượng giao dịch cao hơn. Tuy nhiên, nếu chúng tôi muốn thử nghiệm một số hợp đồng thú vị trên chuỗi, chúng tôi sẽ không thể làm được.
Tại sao zkRollups chuyên biệt không cho phép người dùng triển khai và sử dụng hợp đồng thông minh của riêng họ? Điều này đưa chúng ta trở lại kiến trúc chứng minh của zkRollup chính nó.
Để đảm bảo rằng các chuyển đổi trạng thái của L2 là chính xác và đáng tin cậy, trong zkRollup, tất cả logic chuyển đổi trạng thái L2 cần được viết dưới dạng mạch chứng minh không mô tả và được xác minh bởi các hợp đồng L1. Chỉ có các trạng thái qua được xác minh mới có thể được chấp nhận bởi L1 và cuối cùng hoàn thành Rollup. Quy trình này đòi hỏi rằng tất cả logic thực thi giao dịch của nền tảng zkRollup được xác minh trong mạch chứng minh không mô tả. Tuy nhiên, việc hỗ trợ việc thực thi logic hợp đồng tùy ý trong mạch chứng minh không mô tả là một thách thức (các lý do cho khó khăn này sẽ được giải thích sau trong văn bản). Do đó, các dự án zkRollup sớm thường chỉ hỗ trợ một số lượng giới hạn các giao dịch tương đối đơn giản.
Việc thực hiện chỉ một số lượng cố định giao dịch đơn giản rõ ràng không đáp ứng kỳ vọng của chúng tôi đối với zkRollup. May mắn thay, công nghệ zkVM (Máy Ảo Zero-Knowledge) đã giải quyết khó khăn trong việc chứng minh việc thực thi bất kỳ mã hoàn toàn Turing nào trong mạch chứng minh không biết, khiến nền tảng zkRollup chung trở thành một khả năng. Tiếp theo, bài viết này sẽ giới thiệu nguyên tắc triển khai của zkVM, cho phép độc giả hiểu cách bộ phận cốt lõi nhất của công nghệ zkRollup chung hoạt động.
Trước khi giới thiệu nguyên tắc của zkVM, chúng tôi sẽ cung cấp một sự giới thiệu ngắn gọn về công nghệ chứng minh không cần chứng minh. Ở đây, chúng ta không cần hiểu rõ về nguyên lý toán học cơ bản của chứng minh không cần chứng minh; đủ để hiểu được những gì mà chứng minh không cần chứng minh có thể làm được, cách họ được sử dụng, và những hạn chế được áp đặt bởi mạch chứng minh chuyên biệt của họ.
Chứng minh không cần biết chi tiết trong zkRollup giúp chứng minh rằng các giao dịch Layer 2 đã được thực hiện đúng và trạng thái Layer 2 đã được cập nhật đúng cách.
Để đạt được mục đích này, mạch zkVM cần chứng minh rằng bất kỳ hợp đồng thông minh nào triển khai trên Layer 2 đều đã được thực thi đúng. Trước khi giới thiệu các nguyên tắc của zkVM, chúng ta cần thảo luận về vai trò của chứng minh không cần biết và cách chúng hoạt động.
Tại sao cần chứng minh không biết gì
Chứng minh không tri thức là một nguyên tố mật mã cho phép một bên chứng minh thuyết phục một bên xác minh về tính chính xác của một tuyên bố mà không tiết lộ bất kỳ thông tin bổ sung nào cho bên xác minh.
Chứng minh không thông báo có ba đặc tính cốt lõi:
Với sự hoàn chỉnh của chứng minh zero-knowledge, khi bên chứng minh hoàn thành một phép tính phức tạp, họ có thể tạo ra một bằng chứng thuyết phục bên xác minh rằng dữ liệu đầu ra nhận được từ dữ liệu đầu vào là kết quả do người thực hiện cung cấp. Tính đúng đắn của chứng minh zero-knowledge đảm bảo rằng khi người thực hiện cung cấp một kết quả sai, họ không thể tạo ra một bằng chứng hợp lệ.
Do đó, với sự hoàn chỉnh và tính chắc chắn của các bằng chứng không thông báo, chúng ta có thể tự tin giao các phép tính phức tạp này cho người khác và xác minh thông qua quá trình xác minh tương đối đơn giản liệu phép tính đó có chính xác, mà không cần phải tin tưởng vào bên được giao việc.
Ngoài ba đặc tính cốt lõi của chứng minh không thông tin, mô hình zk-SNARK được sử dụng phổ biến còn có đặc tính là súc tích. Điều này có nghĩa là đối với bất kỳ logic phức tạp nào được chứng minh bằng chứng minh không thông tin, kích thước của chứng minh được tạo ra và thời gian để xác minh chứng minh đều cố định và tương đối nhỏ. Điều này cho phép zk-Rollup giảm bớt tính toán cập nhật trạng thái ngoại chuỗi và chỉ xác minh tính đúng đắn của các hoạt động trên chuỗi, từ đó làm cho giải pháp mở rộng trở nên khả thi.
Quá trình chứng minh không thông tin
Tiếp theo, bài viết này sẽ sử dụng phép tính đơn giản dưới đây làm ví dụ để giải thích quá trình chứng minh không biết.
c=a²+b+5
Vì mục đích giải thích khía cạnh không biết của chứng minh không biết, chúng ta sẽ đặt các biến a và c làm giá trị công khai của chứng minh không biết này, với b là đầu vào bí mật chỉ người chứng minh biết. Vì tính toán của chúng ta rất đơn giản, người xác minh có thể dễ dàng suy ra giá trị của đầu vào bí mật từ các giá trị công khai. Điều này không ảnh hưởng đến tính chất không biết của phương pháp chứng minh không biết, vì nó chỉ đảm bảo rằng người xác minh không thể có được thông tin về đầu vào bí mật từ quá trình chứng minh.
Khi chứng minh, người chứng minh trước tiên chọn một giá trị cho a và b tương ứng làm đầu vào và tính toán giá trị của c. Ở đây, chúng ta đặt a = 3, b = 2, sau đó c = 16. Sau khi hoàn thành tất cả các phép tính, người chứng minh có thể tạo ra một bằng chứng không tiết lộ thông tin cho các giá trị và phép toán này.
Sau khi hoàn thành bằng chứng, người chứng minh sẽ cung cấp cho người xác minh các đầu vào công khai của bằng chứng (tức là các giá trị của a và c) cũng như bằng chứng không tiết lộ thông tin.
Sau khi nhận được bằng chứng, người xác minh có thể, thông qua việc xác thực bằng chứng không bằng cách, tin rằng bằng chứng không cho thấy rằng bằng chứng không cho thấy rằng người chứng minh đã sử dụng một đầu vào bí mật b, làm cho công thức trên đúng khi a = 3 và c = 16 (tức là, các giá trị đầu vào công khai), và không thể thu thập bất kỳ thông tin nào vượt quá các đầu vào công khai (a = 3, c = 16).
Phần tiếp theo của bài viết sẽ giới thiệu quá trình chứng minh cụ thể. Khi chúng ta cần chứng minh một phép tính bằng phương pháp chứng minh không biết, chúng ta cần đầu tiên đại diện cho phép tính dưới dạng mạch số học mà thuật toán chứng minh không biết có thể chấp nhận. Các mạch số học là biểu diễn Turing-complete của phép tính. Như tên gọi của nó, một mạch số học là một mạch tính toán được tạo thành từ cổng thực hiện các phép toán số học. Trong ví dụ của chúng ta, kết quả chuyển đổi được hiển thị trong hình vẽ. Bạn có thể nhận thấy rằng ngoài đầu vào công khai a và c và đầu vào b bí mật mà chúng tôi nhắc đến, còn có hai giá trị bổ sung, d và e. Đây là các biến trung gian được sử dụng trong quá trình tính toán.
Chúng ta có thể nghĩ về mỗi dây dẫn trong mạch toán học như một giá trị, có thể là đầu vào công khai, đầu vào bí mật, hoặc một biến trung gian. Sau khi mở rộng tính toán thành mạch toán học, mỗi biến trung gian sẽ có vị trí riêng và được sử dụng trong quá trình chứng minh. Sự khác biệt duy nhất giữa chúng và các đầu vào là giá trị của chúng không được nhập trực tiếp bởi bên chứng minh mà được xác định bởi các giá trị đầu vào khác trong mạch toán học.
Chúng ta có thể xem mạch số học như hai phần: một phần là tất cả các giá trị số xuất hiện trong mạch, và phần còn lại là mối quan hệ (ràng buộc) giữa các giá trị này. Thông thường, chúng ta đề cập đến các đầu vào công khai trong mạch như câu lệnh (trong ví dụ của chúng tôi, a và c), và tất cả các giá trị khác, bao gồm đầu vào bí mật (b) và biến trung gian (d và e), được gọi là bằng chứng.
Theo logic của mạch, khi chúng ta có các đầu vào công khai là câu lệnh và các đầu vào bí mật là nhân chứng, chúng ta có thể tính toán tất cả các giá trị nhân chứng trong mạch.
Do đó, mạch cổng của mạch toán cũng có thể được biểu diễn dưới dạng sau:
tuyên bố:
a,c
chứng kiến:
b,d,e
ràng buộc:
d = a * a
e = b + 5
c = d + e
Sau khi mạch cần chứng minh được biểu diễn dưới dạng bài toán số học, thuật toán chứng minh không cần biết được xử lý các ràng buộc của mạch và chuyển chúng sang dạng cần thiết cho việc tạo và xác minh chứng minh. Sau khi xử lý, mạch tạo ra một VK (Khóa Xác minh) có độ dài cố định không liên quan đến kích thước của mạch. Người xác minh có thể xác minh chứng minh không cần biết của mạch tương ứng thông qua khóa xác minh. Khóa xác minh có một chút tương tự như sự cam kết đối với mạch. Nếu có bất kỳ thay đổi nào xảy ra đối với các ràng buộc, khóa xác minh tương ứng cũng sẽ thay đổi.
Trong các ứng dụng thực tế, người dùng của các chứng minh không cho biết cần phải viết logic họ cần vào mã nguồn mạch zk và tạo ra một VK tương ứng thông qua việc kiểm tra. VK này được chuyển giao cho người xác minh. Các đầu vào công khai được chứng minh bởi bên chứng minh, cùng với bằng chứng được tạo ra, được nộp, và người xác minh có thể xác minh xem các đầu vào công khai này có đáp ứng các ràng buộc hay không. Trong ví dụ này, bên chứng minh có thể tạo ra một bằng chứng với các giá trị của a, b và c. Người xác minh có thể xác minh xem a2 + b có bằng C hay không mà không cần thực hiện phép tính này.
Hạn chế của Mạch Chứng minh Zero-Knowledge
Mặc dù mạch zk là Turing-complete và có thể biểu diễn bất kỳ phép tính nào, nhưng do cần chuyển đổi các phép tính thành dạng biểu diễn đặc biệt của mạch toán học, nên có một số hạn chế bổ sung khi viết mạch toán học.
Trong các chương trình máy tính mà chúng ta quen thuộc hơn, chúng ta có thể kiểm soát các nhánh của việc thực hiện chương trình bằng các câu lệnh if-else. Chỉ có nhánh được lựa chọn trong chương trình được thực hiện. Tuy nhiên, trong quá trình chứng minh không chứng minh, các tính toán được làm phẳng thành mạch, và không có khái niệm về các đường đi thực hiện hoặc luồng điều khiển. Do đó, chúng ta không thể chọn một nhánh cụ thể để thực hiện trong một mạch số học.
Tất nhiên, điều này không có nghĩa là chúng ta không thể sử dụng các nhánh và lựa chọn trong mạch điện. Điều đó chỉ đơn giản là trong mạch điện, tất cả các nhánh, cho dù được chọn hay không, sẽ được thực hiện và đóng góp vào việc sản xuất bằng chứng. Việc lựa chọn các nhánh chỉ ảnh hưởng đến việc kết quả của nhánh nào sẽ được đưa ra cho biến tiếp theo.
Ví dụ sau đây sẽ minh họa cho việc thực hiện:
if (cờ) {
c = x + x
} else {
c = x * x
}
Khi thao tác này được chuyển đổi thành mạch toán, nó sẽ được chuyển đổi thành các ràng buộc được hiển thị dưới đây. Rõ ràng, hai nhân chứng mới, temp1 và temp2, sẽ được thêm vào mạch. Ngoài ra, giá trị của x+x và giá trị của x*x sẽ được tính toán cả hai.
Điều đó có nghĩa là, trong một mạch zk, tất cả các nhánh và logic sẽ được tính toán, cho dù chúng được thực hiện hay không.
temp1 = x + x
temp2 = x * x
c = cờ kỳ hiệu temp1 + (1-flag) temp2
Do vì những hạn chế này, việc hỗ trợ lựa chọn có điều kiện trong mạch chứng minh không cần dẫn là khá khó khăn. Làm thế nào để chứng minh đường thực thi của một logic hợp đồng thông minh với nhiều biến thể trong một chứng minh không cần dẫn là một trong những thách thức chính của máy ảo zk.
Chúng tôi mô tả VM thông qua một mô hình của máy trạng thái toàn cầu. Một VM là một máy trạng thái chuyển đổi trạng thái khi các chỉ thị được xử lý. Hãy minh họa cách một máy ảo được chứng minh bằng một mạch không chứng minh với một ví dụ về máy trạng thái rất đơn giản.
Chúng tôi giả định máy trạng thái tổng quát này có các thanh ghi đa năng (A và B), và bổ sung, một thanh ghi Bộ địa chỉ chương trình lưu trữ số hiện tại của chỉ thị.
Trạng thái của các thanh ghi trước khi thực thi lệnh
Hình dưới đây cho thấy quy trình cơ bản của một mạch chứng minh máy ảo ZK:
Trạng thái 0 có thể được coi là trạng thái ban đầu của máy ảo trước khi chạy. Trạng thái ban đầu, sau tổng cộng m hướng dẫn, đạt đến trạng thái cuối cùng m. Ngoài trạng thái ban đầu, máy ảo này còn có hai bảng nhập thông thường:
Trong hình vẽ, quá trình thực hiện của lệnh thứ n được trừu tượng hóa và hiển thị ở bên trái. Trạng thái của máy trạng thái, Trạng thái n, chuyển sang Trạng thái n+1 sau khi thực hiện lệnh thứ n. Mạch giống nhau, sau m lần lặp, đạt được thực thi của m lệnh trong vm.
Có hai vấn đề ở đây.
Một vấn đề là làm thế nào để thực hiện các hướng dẫn khác nhau trong một mạch cố định? Khi thực hiện bytecode hợp đồng, không thể xác định hướng dẫn thứ n nào được thực hiện, vì vậy logic mạch thực tế ở đây không thể xác định được.
Thứ hai là làm thế nào để chứng minh nếu số lượng hướng dẫn cần thực hiện không phải là m?
Đối với câu hỏi đầu tiên, giải pháp là triển khai logic cho tất cả các hướng dẫn có thể trong mạch. Sau đó sử dụng Một Bộ chọn, dựa trên hướng dẫn, để chọn một trong số chúng như trạng thái tiếp theo, tương tự như câu lệnh if-else trong mạch chuyên biệt đã được đề cập trước đó.
Đối với câu hỏi thứ hai, chúng tôi không thể thay đổi trực tiếp số lượng hướng dẫn trong mạch. Điều này bởi vì mỗi hướng dẫn trong mạch đều yêu cầu một đoạn mạch độc lập để thực thi. Nếu số lượng hướng dẫn tăng hoặc giảm, mạch sẽ thay đổi và chìa khóa xác minh tương ứng cũng sẽ thay đổi. Điều này khiến việc đáp ứng yêu cầu xác minh bất kỳ logic nào trong một mạch cố định trở nên không thể thực hiện được.
Để giải quyết vấn đề này, một hướng dẫn noop không thay đổi trạng thái có thể được thêm vào tập hướng dẫn. Do đó, có một giới hạn trên số lượng hướng dẫn mà mỗi mạch cố định có thể thực thi. Mạch zkVM có thể được xem như một bộ chứa với một số lượng khe hướng dẫn cố định. Nếu cần thêm hướng dẫn, cần một mạch lớn hơn. Trong chứng minh thực tế, một mạch có kích thước phù hợp có thể được chọn khi cần.
Chứng minh một Hướng dẫn Cơ bản
Dưới đây là một số hướng dẫn tính toán cơ bản như một ví dụ về cách chứng minh các hướng dẫn cơ bản trong mạch.
Hình vẽ cho thấy sơ đồ luồng của mạch chứng minh hướng dẫn. Công thức dưới đây là ràng buộc mạch cho bằng chứng.
Hai ràng buộc này có thể chứng minh một số hướng dẫn cơ bản cho các thanh ghi đa năng A và B được liệt kê ở góc phải trên cùng. Các chứng minh này có thể tải các giá trị từ bảng đầu vào hoặc các giá trị ngay lập tức từ các hướng dẫn vào các thanh ghi hoặc thêm các giá trị trong các thanh ghi A và B và ghi lại vào các thanh ghi.
Từ hình vẽ này, chúng ta có thể thấy rằng để xây dựng ràng buộc cho các thay đổi trạng thái, mạch giới thiệu một số trạng thái kiểm soát phụ trợ:
Logic tính toán giữa các thanh ghi phụ này và các thanh ghi tổng quát được thực hiện bằng các công thức dưới đây. Các độc giả quan tâm có thể thay thế các giá trị tương ứng vào các công thức ràng buộc để xác minh. Có thể thấy rằng với hai ràng buộc này, các hướng dẫn cộng trừ cơ bản có thể được thực hiện. Nếu cần thêm các phép toán khác, sẽ phải thêm nhiều ràng buộc hướng dẫn hơn.
Trở lại sơ đồ quy trình cơ bản, chúng ta có thể xem mạch tính toán trong phần này như một hướng dẫn trong quy trình tổng thể. Bộ chọn sẽ quyết định xem kết quả mà nó tạo ra có phải là trạng thái tiếp theo sẽ được áp dụng bởi máy trạng thái hay không. Các trạng thái phụ cần thiết bởi mạch trong phần này được tạo ra bởi hướng dẫn mà PC đăng ký trỏ tới.
Quá trình truy xuất hướng dẫn được thực hiện bởi một mạch tìm kiếm chuyên biệt, có thể chứng minh việc truy xuất một đoạn dữ liệu từ một bảng cố định thông qua một chỉ mục. Do đó, mạch zkVM có thể chứng minh việc chuyển trạng thái được thực hiện bởi máy ảo được xác định bởi PC.
Chứng minh các phán đoán có điều kiện và nhảy luồng điều khiển
Khả năng của máy trạng thái thực hiện logic phức tạp dựa vào các hướng dẫn điều kiện và nhảy. Trong các hợp đồng thực tế, chúng ta thường cần xử lý logic thay đổi đường đi thực thi dựa trên điều kiện, vì vậy các mạch như vậy là cần thiết.
Nên lưu ý ở đây rằng các mạch zkVM không phải là các mô-đun thực sự thực thi logic hợp đồng và tính toán kết quả. Những mạch zkVM thực sự làm là chứng minh quá trình tính toán của logic hợp đồng. Do đó, khi chứng minh, cần điền quá trình chuỗi lệnh thực thi thực tế vào mạch, xác minh qua mạch xem liệu điều kiện cho việc nhảy này có được đáp ứng hay không, và sau đó chứng minh rằng luồng lệnh đã thực thi đã thực hiện nhảy đúng.
Đầu tiên, chúng tôi giới thiệu bằng chứng của việc đánh giá điều kiện:
Lấy việc xét xem toán hạng trong lệnh thứ i có bằng không làm ví dụ. Chúng ta thêm một trạng thái phụ là isZero cho kết quả của sự xét đoán. Nếu giá trị được xét là 0, thì giá trị của trạng thái phụ isZero là 1; nếu giá trị được xét là bất kỳ giá trị nào khác ngoài 0, thì isZero là 0.
Quy trình này bị ràng buộc bởi hai công thức trong sơ đồ.
Sự hợp lệ của ràng buộc này liên quan đến các tính chất toán học của các đường cong elip được sử dụng trong các bằng chứng không biết. Mỗi giá trị trong mạch bằng chứng không biết là một phần tử trong một trường hữu hạn trên một đường cong elip. Nếu giá trị của nó không phải là 0, phải có một phần tử nghịch đảo mà khi nhân với chính nó, kết quả là 1. Sử dụng tính chất này, với hai ràng buộc trong biểu đồ, có thể xác minh xem một giá trị có phải là không và chuyển đổi nó thành một trạng thái phụ.
Khi chúng ta có trạng thái phụ đề này là trạng thái isZero, chúng ta có thể tiếp tục để chứng minh các hướng dẫn nhảy có điều kiện:
Quay lại sơ đồ quy trình cơ bản, nếu chỉ thị hiện tại là một chỉ thị nhảy có điều kiện. Đầu tiên thực hiện kiểm tra isZero, xác định xem điều kiện nhảy có được đáp ứng hay không, sau đó sửa đổi giá trị của PC. Sau khi cập nhật giá trị của PC, việc thực hiện chỉ thị tiếp theo đầu tiên liên quan đến việc tìm kiếm dựa trên PC để tìm chỉ thị sau khi nhảy.
I/O và Các Phép Toán Phức Tạp
Khi sử dụng mạch chứng minh trạng thái máy trạng thái tổng quát, để xử lý chuyển đổi trạng thái một cách chính xác, cần phải thêm các trạng thái kiểm soát và ràng buộc tương ứng cho mỗi hướng dẫn được hỗ trợ trong một chuyển đổi trạng thái duy nhất. Số lượng các giá trị trạng thái và ràng buộc này cũng phải được nhân lên theo số lượng hướng dẫn được hỗ trợ bởi zkVM. Ngay cả khi không có bất kỳ hoạt động nào được thực hiện trong chương trình thực thi bởi zkVM (tất cả NOP), những giá trị trạng thái và kiểm tra ràng buộc này không thể bị bỏ qua.
Do đó, việc sử dụng mạch máy trạng thái tổng quát trong nửa đầu của bài viết này để thực hiện các phép tính phức tạp là rất không hiệu quả. Nếu những phương pháp này được sử dụng để thực hiện các phép tính phức tạp, hiệu suất của chúng là khó chấp nhận. Ngoài ra, việc mạch máy trạng thái tổng quát thực hiện các chỉ thị phức tạp hoặc tương tác trực tiếp với thế giới bên ngoài là khó khăn.
Để giải quyết vấn đề này, các triển khai thực tế của zkVMs thường sử dụng một sự kết hợp giữa mạch máy trạng thái tổng quát và mạch chứng minh chuyên biệt để chứng minh các phần của chương trình một cách riêng biệt và sau đó tổng hợp các chứng minh thành một giải pháp duy nhất.
Sơ đồ bên trái là kiến trúc mạch của dự án Scroll, và sơ đồ ở góc dưới bên phải là kiến trúc mạch của Polygon. Cả hai đều áp dụng một phương pháp tương tự như được thể hiện trong sơ đồ ở góc trên.
Máy trạng thái tổng quát chịu trách nhiệm chứng minh logic điều khiển thực thi của chương trình. Trong hầu hết các hợp đồng, thời gian thực thi thực tế của phần logic này rất nhỏ, vì vậy việc chứng minh nó bằng máy trạng thái tổng quát không hiệu quả vẫn chấp nhận được về mặt hiệu suất.
Các phép tính phức tạp cố định hơn, như hash, các hoạt động cây MPT, dữ liệu đầu vào bên ngoài, v.v., được chứng minh bởi mạch chuyên dụng.
Trạng thái tổng quát của máy và mạch chứng minh chuyên dụng tương tác bằng cách sử dụng bảng tra cứu. Mỗi khi mạch của máy trạng thái gọi các hoạt động này, các mô-đun tạo chứng cứ cho bằng chứng sẽ ghi các tham số gọi và kết quả tính toán vào bảng tra cứu. Do đó, các cuộc gọi đến các hoạt động này trong mạch của máy trạng thái được đơn giản hóa thành một hoạt động tra cứu.
Độ chính xác của mỗi cuộc gọi và giá trị trả về trong bảng tra cứu được ràng buộc và chứng minh bởi một mạch chuyên dụng.
Cuối cùng, các ràng buộc sao chép trong mạch kết nối mạch máy trạng thái, mạch chuyên biệt và bảng tra cứu, kiểm tra xem mỗi mục trong bảng tra cứu có được chứng minh bởi mạch chuyên biệt tương ứng không, và cuối cùng tạo ra một bằng chứng cho toàn bộ khối.
Hợp đồng L1 chỉ cần xác minh chứng cứ tổng hợp này để xác nhận tính đúng đắn của quá trình thực thi máy ảo toàn bộ.
Công nghệ chứng minh không biết giúp chứng minh tính toán một cách đơn giản và nhanh chóng, mở ra cánh cửa cho việc gửi bộ xử lý qua môi trường không tin cậy. Công nghệ này, khi được sử dụng trong blockchain, giải phóng việc thực thi khỏi chuỗi, cho phép blockchain chính tập trung vào các vấn đề phân quyền và bảo mật. Tuy nhiên, đặc điểm của mạch chứng minh không biết chuyên ngành chỉ thực thi logic cố định hạn chế tiềm năng của việc chứng minh không biết trên blockchain, hạn chế khả năng của zkRollup sớm đầu tiên đối với một số loại giao dịch.
Tuy nhiên, với sự phát triển và trưởng thành của các máy ảo zk, việc hỗ trợ thực thi Turing hoàn chỉnh của hợp đồng thông minh tùy ý đã trở nên khả thi. Tiềm năng của zkRollup sẽ thực sự được giải phóng, thực hiện tầm nhìn của nó về việc phá vỡ ba khía cạnh của blockchain.
Rollup là một loại giải pháp mở rộng Layer 2 của blockchain. Trong các kế hoạch Rollup, các nhà điều hành của dự án chạy một nền tảng Layer 2 tương đối độc lập dưới sự mở rộng của chuỗi chính (tức là Layer 1). Người dùng có thể thực thi hợp đồng hoặc chuyển đổi token trên nền tảng Layer 2.
Sự an toàn của nền tảng Layer 2 được đảm bảo bởi chuỗi khối Layer 1 mà nó dựa vào. Khi một block mới được tạo ra trong Layer 2, thông tin giao dịch từ block Layer 2, cũng như gốc trạng thái sau giao dịch của Layer 2, được gói lại dưới dạng giao dịch Rollup và được công bố trên chuỗi Layer 1. Việc thực hiện giao dịch thực tế và thay đổi trạng thái được xử lý trên nền tảng Layer 2 dưới chuỗi chính, và Layer 1 chỉ cần xác minh tính đúng đắn của các chuyển đổi trạng thái của Layer 2. Vì chi phí xác minh tính chính xác của chuyển đổi trạng thái thấp hơn nhiều so với việc thực hiện các giao dịch này trên Layer 1, Layer 2 có thể đạt được sự mở rộng của nền tảng Layer 1. Nền tảng Layer 2 có thể cung cấp khả năng xử lý giao dịch cao hơn và chi phí giao dịch thấp hơn so với Layer 1 trong khi duy trì sự an toàn tương đương.
So với các hệ thống giao dịch ngoại chuỗi khác, Rollups có hai đặc điểm:
Dựa vào các phương pháp xác minh của cập nhật trạng thái Layer 2 bởi chuỗi chính, hiện tại có hai loại giải pháp công nghệ Rollup chính. Một loại là Optimistic Rollup. Trong loại hình này, hợp đồng chuỗi chính không xác minh trực tiếp trạng thái mới được gửi bởi Layer 2. Thay vào đó, một giai đoạn thách thức được chuẩn bị cho mỗi trạng thái mới được gửi. Vì Rollup gửi tất cả thông tin giao dịch đến chuỗi chính và làm cho nó trở nên công khai, bất kỳ ai cũng có thể xác minh cập nhật trạng thái (đặc biệt khi cập nhật liên quan đến ví của họ). Nếu trạng thái mới không chính xác, người xác minh có thể tạo ra một bằng chứng gian lận đối với trạng thái sai lầm đó và gửi nó trong thời kỳ thách thức, từ đó vô hiệu hóa cập nhật trạng thái không chính xác.
Một loại giải pháp Rollup khác là zk Rollup. Trong loại hình này, sau khi thực hiện cập nhật trạng thái Layer 2, người vận hành Layer 2 phải cung cấp một bằng chứng không kiến thức về sự chính xác của việc cập nhật trạng thái và gửi nó đến chuỗi chính cùng với cập nhật trạng thái. Hợp đồng trên chuỗi chính sẽ xác minh bằng chứng để xác định tính chính xác của việc cập nhật trạng thái.
So với hệ thống Optimistic Rollup, zk Rollup không đòi hỏi một thời gian thách thức dài để cuối cùng xác nhận các giao dịch Layer 2 và có thể được xác nhận nhanh hơn. Ngoài ra, zk Rollup không phụ thuộc vào giả định rằng luôn có người xác minh trung thực trong mạng sẽ kịp thời nộp chứng minh gian lận khi xảy ra gian lận. Tuy nhiên, đồng thời, zk Rollup cũng đối mặt với các vấn đề như chi phí tính toán cao của công nghệ chứng minh không biết, sự phức tạp và khó khăn trong phát triển, làm trở ngại cho việc triển khai thực tế công nghệ zk Rollup trong Rollups. Với sự phát triển tiếp theo của công nghệ chứng minh không biết trong hai năm qua, những trở ngại này dần dần được vượt qua. Công nghệ zk Rollup đang bắt đầu chiếm một phần ngày càng lớn trên thị trường Layer 2.
Như được hiển thị trong hình dưới đây, trong lĩnh vực mở rộng lớp 2 Rollup, zkRollup đã chiếm hơn nửa diện tích và đang phát triển nhanh chóng.
Dữ liệu được truy xuất vào: 18 tháng 1 năm 2024
Trong quá trình phát triển của mình, zkRollup chủ yếu đã trải qua hai giai đoạn. Loại đầu tiên là zkRollup không chung, trong khi loại thứ hai là zkRollup chung có khả năng thực thi hợp đồng tùy ý Turing-complete.
Sự khác biệt giữa hai loại công nghệ zkRollup này chủ yếu nằm ở việc nền tảng Layer 2 có thực hiện logic chuyên biệt hạn chế được viết bởi nhà cung cấp nền tảng hay logic hợp đồng thông minh tùy ý được người dùng viết trong giao dịch.
Trong các dự án zkRollup không phải là tổng quát (như zkSync Lite, xếp hạng thứ 8 trong hình trên), người dùng chỉ có thể thực hiện một số loại hoạt động giao dịch, chẳng hạn như chuyển đổi FT (token có thể thay thế), thanh toán, trao đổi và chuyển đổi NFT (token không thể thay thế). Luật giao dịch cho những hoạt động này chỉ có thể được xác định và triển khai bởi chủ dự án.
Thông qua các dự án zkRollup như vậy, chúng tôi có thể chuyển tiền với mức phí thấp hơn đáng kể so với Ethereum mainnet và đạt được lưu lượng giao dịch cao hơn. Tuy nhiên, nếu chúng tôi muốn thử nghiệm một số hợp đồng thú vị trên chuỗi, chúng tôi sẽ không thể làm được.
Tại sao zkRollups chuyên biệt không cho phép người dùng triển khai và sử dụng hợp đồng thông minh của riêng họ? Điều này đưa chúng ta trở lại kiến trúc chứng minh của zkRollup chính nó.
Để đảm bảo rằng các chuyển đổi trạng thái của L2 là chính xác và đáng tin cậy, trong zkRollup, tất cả logic chuyển đổi trạng thái L2 cần được viết dưới dạng mạch chứng minh không mô tả và được xác minh bởi các hợp đồng L1. Chỉ có các trạng thái qua được xác minh mới có thể được chấp nhận bởi L1 và cuối cùng hoàn thành Rollup. Quy trình này đòi hỏi rằng tất cả logic thực thi giao dịch của nền tảng zkRollup được xác minh trong mạch chứng minh không mô tả. Tuy nhiên, việc hỗ trợ việc thực thi logic hợp đồng tùy ý trong mạch chứng minh không mô tả là một thách thức (các lý do cho khó khăn này sẽ được giải thích sau trong văn bản). Do đó, các dự án zkRollup sớm thường chỉ hỗ trợ một số lượng giới hạn các giao dịch tương đối đơn giản.
Việc thực hiện chỉ một số lượng cố định giao dịch đơn giản rõ ràng không đáp ứng kỳ vọng của chúng tôi đối với zkRollup. May mắn thay, công nghệ zkVM (Máy Ảo Zero-Knowledge) đã giải quyết khó khăn trong việc chứng minh việc thực thi bất kỳ mã hoàn toàn Turing nào trong mạch chứng minh không biết, khiến nền tảng zkRollup chung trở thành một khả năng. Tiếp theo, bài viết này sẽ giới thiệu nguyên tắc triển khai của zkVM, cho phép độc giả hiểu cách bộ phận cốt lõi nhất của công nghệ zkRollup chung hoạt động.
Trước khi giới thiệu nguyên tắc của zkVM, chúng tôi sẽ cung cấp một sự giới thiệu ngắn gọn về công nghệ chứng minh không cần chứng minh. Ở đây, chúng ta không cần hiểu rõ về nguyên lý toán học cơ bản của chứng minh không cần chứng minh; đủ để hiểu được những gì mà chứng minh không cần chứng minh có thể làm được, cách họ được sử dụng, và những hạn chế được áp đặt bởi mạch chứng minh chuyên biệt của họ.
Chứng minh không cần biết chi tiết trong zkRollup giúp chứng minh rằng các giao dịch Layer 2 đã được thực hiện đúng và trạng thái Layer 2 đã được cập nhật đúng cách.
Để đạt được mục đích này, mạch zkVM cần chứng minh rằng bất kỳ hợp đồng thông minh nào triển khai trên Layer 2 đều đã được thực thi đúng. Trước khi giới thiệu các nguyên tắc của zkVM, chúng ta cần thảo luận về vai trò của chứng minh không cần biết và cách chúng hoạt động.
Tại sao cần chứng minh không biết gì
Chứng minh không tri thức là một nguyên tố mật mã cho phép một bên chứng minh thuyết phục một bên xác minh về tính chính xác của một tuyên bố mà không tiết lộ bất kỳ thông tin bổ sung nào cho bên xác minh.
Chứng minh không thông báo có ba đặc tính cốt lõi:
Với sự hoàn chỉnh của chứng minh zero-knowledge, khi bên chứng minh hoàn thành một phép tính phức tạp, họ có thể tạo ra một bằng chứng thuyết phục bên xác minh rằng dữ liệu đầu ra nhận được từ dữ liệu đầu vào là kết quả do người thực hiện cung cấp. Tính đúng đắn của chứng minh zero-knowledge đảm bảo rằng khi người thực hiện cung cấp một kết quả sai, họ không thể tạo ra một bằng chứng hợp lệ.
Do đó, với sự hoàn chỉnh và tính chắc chắn của các bằng chứng không thông báo, chúng ta có thể tự tin giao các phép tính phức tạp này cho người khác và xác minh thông qua quá trình xác minh tương đối đơn giản liệu phép tính đó có chính xác, mà không cần phải tin tưởng vào bên được giao việc.
Ngoài ba đặc tính cốt lõi của chứng minh không thông tin, mô hình zk-SNARK được sử dụng phổ biến còn có đặc tính là súc tích. Điều này có nghĩa là đối với bất kỳ logic phức tạp nào được chứng minh bằng chứng minh không thông tin, kích thước của chứng minh được tạo ra và thời gian để xác minh chứng minh đều cố định và tương đối nhỏ. Điều này cho phép zk-Rollup giảm bớt tính toán cập nhật trạng thái ngoại chuỗi và chỉ xác minh tính đúng đắn của các hoạt động trên chuỗi, từ đó làm cho giải pháp mở rộng trở nên khả thi.
Quá trình chứng minh không thông tin
Tiếp theo, bài viết này sẽ sử dụng phép tính đơn giản dưới đây làm ví dụ để giải thích quá trình chứng minh không biết.
c=a²+b+5
Vì mục đích giải thích khía cạnh không biết của chứng minh không biết, chúng ta sẽ đặt các biến a và c làm giá trị công khai của chứng minh không biết này, với b là đầu vào bí mật chỉ người chứng minh biết. Vì tính toán của chúng ta rất đơn giản, người xác minh có thể dễ dàng suy ra giá trị của đầu vào bí mật từ các giá trị công khai. Điều này không ảnh hưởng đến tính chất không biết của phương pháp chứng minh không biết, vì nó chỉ đảm bảo rằng người xác minh không thể có được thông tin về đầu vào bí mật từ quá trình chứng minh.
Khi chứng minh, người chứng minh trước tiên chọn một giá trị cho a và b tương ứng làm đầu vào và tính toán giá trị của c. Ở đây, chúng ta đặt a = 3, b = 2, sau đó c = 16. Sau khi hoàn thành tất cả các phép tính, người chứng minh có thể tạo ra một bằng chứng không tiết lộ thông tin cho các giá trị và phép toán này.
Sau khi hoàn thành bằng chứng, người chứng minh sẽ cung cấp cho người xác minh các đầu vào công khai của bằng chứng (tức là các giá trị của a và c) cũng như bằng chứng không tiết lộ thông tin.
Sau khi nhận được bằng chứng, người xác minh có thể, thông qua việc xác thực bằng chứng không bằng cách, tin rằng bằng chứng không cho thấy rằng bằng chứng không cho thấy rằng người chứng minh đã sử dụng một đầu vào bí mật b, làm cho công thức trên đúng khi a = 3 và c = 16 (tức là, các giá trị đầu vào công khai), và không thể thu thập bất kỳ thông tin nào vượt quá các đầu vào công khai (a = 3, c = 16).
Phần tiếp theo của bài viết sẽ giới thiệu quá trình chứng minh cụ thể. Khi chúng ta cần chứng minh một phép tính bằng phương pháp chứng minh không biết, chúng ta cần đầu tiên đại diện cho phép tính dưới dạng mạch số học mà thuật toán chứng minh không biết có thể chấp nhận. Các mạch số học là biểu diễn Turing-complete của phép tính. Như tên gọi của nó, một mạch số học là một mạch tính toán được tạo thành từ cổng thực hiện các phép toán số học. Trong ví dụ của chúng ta, kết quả chuyển đổi được hiển thị trong hình vẽ. Bạn có thể nhận thấy rằng ngoài đầu vào công khai a và c và đầu vào b bí mật mà chúng tôi nhắc đến, còn có hai giá trị bổ sung, d và e. Đây là các biến trung gian được sử dụng trong quá trình tính toán.
Chúng ta có thể nghĩ về mỗi dây dẫn trong mạch toán học như một giá trị, có thể là đầu vào công khai, đầu vào bí mật, hoặc một biến trung gian. Sau khi mở rộng tính toán thành mạch toán học, mỗi biến trung gian sẽ có vị trí riêng và được sử dụng trong quá trình chứng minh. Sự khác biệt duy nhất giữa chúng và các đầu vào là giá trị của chúng không được nhập trực tiếp bởi bên chứng minh mà được xác định bởi các giá trị đầu vào khác trong mạch toán học.
Chúng ta có thể xem mạch số học như hai phần: một phần là tất cả các giá trị số xuất hiện trong mạch, và phần còn lại là mối quan hệ (ràng buộc) giữa các giá trị này. Thông thường, chúng ta đề cập đến các đầu vào công khai trong mạch như câu lệnh (trong ví dụ của chúng tôi, a và c), và tất cả các giá trị khác, bao gồm đầu vào bí mật (b) và biến trung gian (d và e), được gọi là bằng chứng.
Theo logic của mạch, khi chúng ta có các đầu vào công khai là câu lệnh và các đầu vào bí mật là nhân chứng, chúng ta có thể tính toán tất cả các giá trị nhân chứng trong mạch.
Do đó, mạch cổng của mạch toán cũng có thể được biểu diễn dưới dạng sau:
tuyên bố:
a,c
chứng kiến:
b,d,e
ràng buộc:
d = a * a
e = b + 5
c = d + e
Sau khi mạch cần chứng minh được biểu diễn dưới dạng bài toán số học, thuật toán chứng minh không cần biết được xử lý các ràng buộc của mạch và chuyển chúng sang dạng cần thiết cho việc tạo và xác minh chứng minh. Sau khi xử lý, mạch tạo ra một VK (Khóa Xác minh) có độ dài cố định không liên quan đến kích thước của mạch. Người xác minh có thể xác minh chứng minh không cần biết của mạch tương ứng thông qua khóa xác minh. Khóa xác minh có một chút tương tự như sự cam kết đối với mạch. Nếu có bất kỳ thay đổi nào xảy ra đối với các ràng buộc, khóa xác minh tương ứng cũng sẽ thay đổi.
Trong các ứng dụng thực tế, người dùng của các chứng minh không cho biết cần phải viết logic họ cần vào mã nguồn mạch zk và tạo ra một VK tương ứng thông qua việc kiểm tra. VK này được chuyển giao cho người xác minh. Các đầu vào công khai được chứng minh bởi bên chứng minh, cùng với bằng chứng được tạo ra, được nộp, và người xác minh có thể xác minh xem các đầu vào công khai này có đáp ứng các ràng buộc hay không. Trong ví dụ này, bên chứng minh có thể tạo ra một bằng chứng với các giá trị của a, b và c. Người xác minh có thể xác minh xem a2 + b có bằng C hay không mà không cần thực hiện phép tính này.
Hạn chế của Mạch Chứng minh Zero-Knowledge
Mặc dù mạch zk là Turing-complete và có thể biểu diễn bất kỳ phép tính nào, nhưng do cần chuyển đổi các phép tính thành dạng biểu diễn đặc biệt của mạch toán học, nên có một số hạn chế bổ sung khi viết mạch toán học.
Trong các chương trình máy tính mà chúng ta quen thuộc hơn, chúng ta có thể kiểm soát các nhánh của việc thực hiện chương trình bằng các câu lệnh if-else. Chỉ có nhánh được lựa chọn trong chương trình được thực hiện. Tuy nhiên, trong quá trình chứng minh không chứng minh, các tính toán được làm phẳng thành mạch, và không có khái niệm về các đường đi thực hiện hoặc luồng điều khiển. Do đó, chúng ta không thể chọn một nhánh cụ thể để thực hiện trong một mạch số học.
Tất nhiên, điều này không có nghĩa là chúng ta không thể sử dụng các nhánh và lựa chọn trong mạch điện. Điều đó chỉ đơn giản là trong mạch điện, tất cả các nhánh, cho dù được chọn hay không, sẽ được thực hiện và đóng góp vào việc sản xuất bằng chứng. Việc lựa chọn các nhánh chỉ ảnh hưởng đến việc kết quả của nhánh nào sẽ được đưa ra cho biến tiếp theo.
Ví dụ sau đây sẽ minh họa cho việc thực hiện:
if (cờ) {
c = x + x
} else {
c = x * x
}
Khi thao tác này được chuyển đổi thành mạch toán, nó sẽ được chuyển đổi thành các ràng buộc được hiển thị dưới đây. Rõ ràng, hai nhân chứng mới, temp1 và temp2, sẽ được thêm vào mạch. Ngoài ra, giá trị của x+x và giá trị của x*x sẽ được tính toán cả hai.
Điều đó có nghĩa là, trong một mạch zk, tất cả các nhánh và logic sẽ được tính toán, cho dù chúng được thực hiện hay không.
temp1 = x + x
temp2 = x * x
c = cờ kỳ hiệu temp1 + (1-flag) temp2
Do vì những hạn chế này, việc hỗ trợ lựa chọn có điều kiện trong mạch chứng minh không cần dẫn là khá khó khăn. Làm thế nào để chứng minh đường thực thi của một logic hợp đồng thông minh với nhiều biến thể trong một chứng minh không cần dẫn là một trong những thách thức chính của máy ảo zk.
Chúng tôi mô tả VM thông qua một mô hình của máy trạng thái toàn cầu. Một VM là một máy trạng thái chuyển đổi trạng thái khi các chỉ thị được xử lý. Hãy minh họa cách một máy ảo được chứng minh bằng một mạch không chứng minh với một ví dụ về máy trạng thái rất đơn giản.
Chúng tôi giả định máy trạng thái tổng quát này có các thanh ghi đa năng (A và B), và bổ sung, một thanh ghi Bộ địa chỉ chương trình lưu trữ số hiện tại của chỉ thị.
Trạng thái của các thanh ghi trước khi thực thi lệnh
Hình dưới đây cho thấy quy trình cơ bản của một mạch chứng minh máy ảo ZK:
Trạng thái 0 có thể được coi là trạng thái ban đầu của máy ảo trước khi chạy. Trạng thái ban đầu, sau tổng cộng m hướng dẫn, đạt đến trạng thái cuối cùng m. Ngoài trạng thái ban đầu, máy ảo này còn có hai bảng nhập thông thường:
Trong hình vẽ, quá trình thực hiện của lệnh thứ n được trừu tượng hóa và hiển thị ở bên trái. Trạng thái của máy trạng thái, Trạng thái n, chuyển sang Trạng thái n+1 sau khi thực hiện lệnh thứ n. Mạch giống nhau, sau m lần lặp, đạt được thực thi của m lệnh trong vm.
Có hai vấn đề ở đây.
Một vấn đề là làm thế nào để thực hiện các hướng dẫn khác nhau trong một mạch cố định? Khi thực hiện bytecode hợp đồng, không thể xác định hướng dẫn thứ n nào được thực hiện, vì vậy logic mạch thực tế ở đây không thể xác định được.
Thứ hai là làm thế nào để chứng minh nếu số lượng hướng dẫn cần thực hiện không phải là m?
Đối với câu hỏi đầu tiên, giải pháp là triển khai logic cho tất cả các hướng dẫn có thể trong mạch. Sau đó sử dụng Một Bộ chọn, dựa trên hướng dẫn, để chọn một trong số chúng như trạng thái tiếp theo, tương tự như câu lệnh if-else trong mạch chuyên biệt đã được đề cập trước đó.
Đối với câu hỏi thứ hai, chúng tôi không thể thay đổi trực tiếp số lượng hướng dẫn trong mạch. Điều này bởi vì mỗi hướng dẫn trong mạch đều yêu cầu một đoạn mạch độc lập để thực thi. Nếu số lượng hướng dẫn tăng hoặc giảm, mạch sẽ thay đổi và chìa khóa xác minh tương ứng cũng sẽ thay đổi. Điều này khiến việc đáp ứng yêu cầu xác minh bất kỳ logic nào trong một mạch cố định trở nên không thể thực hiện được.
Để giải quyết vấn đề này, một hướng dẫn noop không thay đổi trạng thái có thể được thêm vào tập hướng dẫn. Do đó, có một giới hạn trên số lượng hướng dẫn mà mỗi mạch cố định có thể thực thi. Mạch zkVM có thể được xem như một bộ chứa với một số lượng khe hướng dẫn cố định. Nếu cần thêm hướng dẫn, cần một mạch lớn hơn. Trong chứng minh thực tế, một mạch có kích thước phù hợp có thể được chọn khi cần.
Chứng minh một Hướng dẫn Cơ bản
Dưới đây là một số hướng dẫn tính toán cơ bản như một ví dụ về cách chứng minh các hướng dẫn cơ bản trong mạch.
Hình vẽ cho thấy sơ đồ luồng của mạch chứng minh hướng dẫn. Công thức dưới đây là ràng buộc mạch cho bằng chứng.
Hai ràng buộc này có thể chứng minh một số hướng dẫn cơ bản cho các thanh ghi đa năng A và B được liệt kê ở góc phải trên cùng. Các chứng minh này có thể tải các giá trị từ bảng đầu vào hoặc các giá trị ngay lập tức từ các hướng dẫn vào các thanh ghi hoặc thêm các giá trị trong các thanh ghi A và B và ghi lại vào các thanh ghi.
Từ hình vẽ này, chúng ta có thể thấy rằng để xây dựng ràng buộc cho các thay đổi trạng thái, mạch giới thiệu một số trạng thái kiểm soát phụ trợ:
Logic tính toán giữa các thanh ghi phụ này và các thanh ghi tổng quát được thực hiện bằng các công thức dưới đây. Các độc giả quan tâm có thể thay thế các giá trị tương ứng vào các công thức ràng buộc để xác minh. Có thể thấy rằng với hai ràng buộc này, các hướng dẫn cộng trừ cơ bản có thể được thực hiện. Nếu cần thêm các phép toán khác, sẽ phải thêm nhiều ràng buộc hướng dẫn hơn.
Trở lại sơ đồ quy trình cơ bản, chúng ta có thể xem mạch tính toán trong phần này như một hướng dẫn trong quy trình tổng thể. Bộ chọn sẽ quyết định xem kết quả mà nó tạo ra có phải là trạng thái tiếp theo sẽ được áp dụng bởi máy trạng thái hay không. Các trạng thái phụ cần thiết bởi mạch trong phần này được tạo ra bởi hướng dẫn mà PC đăng ký trỏ tới.
Quá trình truy xuất hướng dẫn được thực hiện bởi một mạch tìm kiếm chuyên biệt, có thể chứng minh việc truy xuất một đoạn dữ liệu từ một bảng cố định thông qua một chỉ mục. Do đó, mạch zkVM có thể chứng minh việc chuyển trạng thái được thực hiện bởi máy ảo được xác định bởi PC.
Chứng minh các phán đoán có điều kiện và nhảy luồng điều khiển
Khả năng của máy trạng thái thực hiện logic phức tạp dựa vào các hướng dẫn điều kiện và nhảy. Trong các hợp đồng thực tế, chúng ta thường cần xử lý logic thay đổi đường đi thực thi dựa trên điều kiện, vì vậy các mạch như vậy là cần thiết.
Nên lưu ý ở đây rằng các mạch zkVM không phải là các mô-đun thực sự thực thi logic hợp đồng và tính toán kết quả. Những mạch zkVM thực sự làm là chứng minh quá trình tính toán của logic hợp đồng. Do đó, khi chứng minh, cần điền quá trình chuỗi lệnh thực thi thực tế vào mạch, xác minh qua mạch xem liệu điều kiện cho việc nhảy này có được đáp ứng hay không, và sau đó chứng minh rằng luồng lệnh đã thực thi đã thực hiện nhảy đúng.
Đầu tiên, chúng tôi giới thiệu bằng chứng của việc đánh giá điều kiện:
Lấy việc xét xem toán hạng trong lệnh thứ i có bằng không làm ví dụ. Chúng ta thêm một trạng thái phụ là isZero cho kết quả của sự xét đoán. Nếu giá trị được xét là 0, thì giá trị của trạng thái phụ isZero là 1; nếu giá trị được xét là bất kỳ giá trị nào khác ngoài 0, thì isZero là 0.
Quy trình này bị ràng buộc bởi hai công thức trong sơ đồ.
Sự hợp lệ của ràng buộc này liên quan đến các tính chất toán học của các đường cong elip được sử dụng trong các bằng chứng không biết. Mỗi giá trị trong mạch bằng chứng không biết là một phần tử trong một trường hữu hạn trên một đường cong elip. Nếu giá trị của nó không phải là 0, phải có một phần tử nghịch đảo mà khi nhân với chính nó, kết quả là 1. Sử dụng tính chất này, với hai ràng buộc trong biểu đồ, có thể xác minh xem một giá trị có phải là không và chuyển đổi nó thành một trạng thái phụ.
Khi chúng ta có trạng thái phụ đề này là trạng thái isZero, chúng ta có thể tiếp tục để chứng minh các hướng dẫn nhảy có điều kiện:
Quay lại sơ đồ quy trình cơ bản, nếu chỉ thị hiện tại là một chỉ thị nhảy có điều kiện. Đầu tiên thực hiện kiểm tra isZero, xác định xem điều kiện nhảy có được đáp ứng hay không, sau đó sửa đổi giá trị của PC. Sau khi cập nhật giá trị của PC, việc thực hiện chỉ thị tiếp theo đầu tiên liên quan đến việc tìm kiếm dựa trên PC để tìm chỉ thị sau khi nhảy.
I/O và Các Phép Toán Phức Tạp
Khi sử dụng mạch chứng minh trạng thái máy trạng thái tổng quát, để xử lý chuyển đổi trạng thái một cách chính xác, cần phải thêm các trạng thái kiểm soát và ràng buộc tương ứng cho mỗi hướng dẫn được hỗ trợ trong một chuyển đổi trạng thái duy nhất. Số lượng các giá trị trạng thái và ràng buộc này cũng phải được nhân lên theo số lượng hướng dẫn được hỗ trợ bởi zkVM. Ngay cả khi không có bất kỳ hoạt động nào được thực hiện trong chương trình thực thi bởi zkVM (tất cả NOP), những giá trị trạng thái và kiểm tra ràng buộc này không thể bị bỏ qua.
Do đó, việc sử dụng mạch máy trạng thái tổng quát trong nửa đầu của bài viết này để thực hiện các phép tính phức tạp là rất không hiệu quả. Nếu những phương pháp này được sử dụng để thực hiện các phép tính phức tạp, hiệu suất của chúng là khó chấp nhận. Ngoài ra, việc mạch máy trạng thái tổng quát thực hiện các chỉ thị phức tạp hoặc tương tác trực tiếp với thế giới bên ngoài là khó khăn.
Để giải quyết vấn đề này, các triển khai thực tế của zkVMs thường sử dụng một sự kết hợp giữa mạch máy trạng thái tổng quát và mạch chứng minh chuyên biệt để chứng minh các phần của chương trình một cách riêng biệt và sau đó tổng hợp các chứng minh thành một giải pháp duy nhất.
Sơ đồ bên trái là kiến trúc mạch của dự án Scroll, và sơ đồ ở góc dưới bên phải là kiến trúc mạch của Polygon. Cả hai đều áp dụng một phương pháp tương tự như được thể hiện trong sơ đồ ở góc trên.
Máy trạng thái tổng quát chịu trách nhiệm chứng minh logic điều khiển thực thi của chương trình. Trong hầu hết các hợp đồng, thời gian thực thi thực tế của phần logic này rất nhỏ, vì vậy việc chứng minh nó bằng máy trạng thái tổng quát không hiệu quả vẫn chấp nhận được về mặt hiệu suất.
Các phép tính phức tạp cố định hơn, như hash, các hoạt động cây MPT, dữ liệu đầu vào bên ngoài, v.v., được chứng minh bởi mạch chuyên dụng.
Trạng thái tổng quát của máy và mạch chứng minh chuyên dụng tương tác bằng cách sử dụng bảng tra cứu. Mỗi khi mạch của máy trạng thái gọi các hoạt động này, các mô-đun tạo chứng cứ cho bằng chứng sẽ ghi các tham số gọi và kết quả tính toán vào bảng tra cứu. Do đó, các cuộc gọi đến các hoạt động này trong mạch của máy trạng thái được đơn giản hóa thành một hoạt động tra cứu.
Độ chính xác của mỗi cuộc gọi và giá trị trả về trong bảng tra cứu được ràng buộc và chứng minh bởi một mạch chuyên dụng.
Cuối cùng, các ràng buộc sao chép trong mạch kết nối mạch máy trạng thái, mạch chuyên biệt và bảng tra cứu, kiểm tra xem mỗi mục trong bảng tra cứu có được chứng minh bởi mạch chuyên biệt tương ứng không, và cuối cùng tạo ra một bằng chứng cho toàn bộ khối.
Hợp đồng L1 chỉ cần xác minh chứng cứ tổng hợp này để xác nhận tính đúng đắn của quá trình thực thi máy ảo toàn bộ.
Công nghệ chứng minh không biết giúp chứng minh tính toán một cách đơn giản và nhanh chóng, mở ra cánh cửa cho việc gửi bộ xử lý qua môi trường không tin cậy. Công nghệ này, khi được sử dụng trong blockchain, giải phóng việc thực thi khỏi chuỗi, cho phép blockchain chính tập trung vào các vấn đề phân quyền và bảo mật. Tuy nhiên, đặc điểm của mạch chứng minh không biết chuyên ngành chỉ thực thi logic cố định hạn chế tiềm năng của việc chứng minh không biết trên blockchain, hạn chế khả năng của zkRollup sớm đầu tiên đối với một số loại giao dịch.
Tuy nhiên, với sự phát triển và trưởng thành của các máy ảo zk, việc hỗ trợ thực thi Turing hoàn chỉnh của hợp đồng thông minh tùy ý đã trở nên khả thi. Tiềm năng của zkRollup sẽ thực sự được giải phóng, thực hiện tầm nhìn của nó về việc phá vỡ ba khía cạnh của blockchain.