Bằng chứng Zero-Knowledge: zk-STARK là gì và hoạt động như thế nào? (zk-Stark V2)

Phát hành vào 21 thg 10, 2024Cập nhật vào 10 thg 11, 2024Thời gian đọc: 21 phút30

Bằng chứng dự trữ và Bằng chứng Zero Knowledge là gì?

Bằng chứng dự trữ (PoR)

Đây là một quy trình để các sàn giao dịch tiền mã hóa chứng tỏ rằng họ có đủ tài sản để trang trải toàn bộ số dư của khách hàng. Điều này tạo dựng niềm tin bằng cách chứng minh sàn giao dịch không che giấu bất kỳ khoản nợ nào. Cách đơn giản nhất để thể hiện điều này là công bố cả số lượng tài sản của sàn giao dịch và danh sách số dư của người dùng để mọi người có thể xác nhận:

  • Tổng số tài sản của người dùng mà OKX tuyên bố nắm giữ là tổng số dư tài sản của mỗi người dùng

  • Tổng số dư của mỗi người dùng đều lớn hơn 0 và tài sản của họ được ghi nhận, bao gồm các khoản nợ phải trả và đảm bảo rằng mỗi người dùng đều có vốn chủ sở hữu ròng dương.

  • Tổng giá trị mà sàn giao dịch xác nhận quyền sở hữu được tính cho mỗi người dùng, vì vậy mọi người dùng sẽ có thể xác minh việc đưa giá trị ròng vào tổng giá trị

Tuy nhiên, việc tiết lộ những số dư này có thể ảnh hưởng đến quyền riêng tư của người dùng. Để giải quyết vấn đề này, chúng tôi sử dụng một phương pháp có tên Bằng chứng Zero Knowledge (ZKP) để bảo vệ quyền riêng tư của người dùng.

Bằng chứng Zero-Knowledge (ZKP)

Đây là một kỹ thuật bảo mật cho phép trao đổi tiền mã hóa chứng minh một tuyên bố là đúng mà không tiết lộ bất kỳ thông tin bổ sung nào.

Trong trường hợp của chúng tôi, chúng tôi muốn chứng minh rằng mình có đủ tiền mà không chia sẻ thông tin chi tiết về người dùng cụ thể. Hầu hết ZKP thuộc hai loại:

  • zk-SNARK

  • zk-STARK

Chúng tôi sử dụng zk-STARK vì loại này an toàn hơn và có giả định bảo mật tối thiểu. Trong bài viết này, chúng tôi sẽ giải thích cách sử dụng zk-STARK để bảo vệ quyền riêng tư của người dùng đồng thời chứng minh khả năng thanh toán của mình.Trước khi tiếp tục, sẽ rất hữu ích nếu bạn hiểu một số thuật ngữ ZKP cơ bản, như Mạch, Cây Merkle và Cam kết.

Đối với người mới, có rất nhiều tài nguyên khả dụng để giúp bạn bắt đầu. Đối với người dùng nâng cao, bạn có thể tham khảo Khóa học MOOCchuyên khảo học thuật

zk-STARK hoạt động như thế nào?

Chúng tôi tạo cây Merkle bằng cách sử dụng hash của mỗi tài khoản người dùng làm lá. Mỗi tài khoản hiển thị số dư bằng USD cho các loại token khác nhau,ví dụ, BTC, ETH. Để xử lý các số dư này, chúng tôi tách các số dư thành vốn chủ sở hữu và các khoản nợ không âm cho mỗi token. Bằng cách này, chúng tôi chỉ làm việc với số dương, giúp việc xử lý phép tính dễ dàng hơn và tránh sai sót.

Ví dụ:

  • Nếu số dư token BTC của người dùng là A, vốn chủ sở hữu BTC của người dùng là A và nợ BTC là 0

  • Nếu số dư token ETH của người dùng là -B, vốn chủ sở hữu tương ứng của người dùng là 0 và nợ là B

Tiếp theo, chúng tôi xây dựng cây Merkle có các giá trị tài khoản này dưới dạng các lá. Gốc của cây hoạt động như một giá trị duy nhất đại diện cho tất cả số dư của người dùng. Mỗi người dùng có thể chứng minh tài khoản của họ là một phần của cây này bằng cách sử dụng Đường dẫn Merkle cho biết cách tài khoản của họ kết nối với thư mục gốc.

Chúng tôi cũng công bố tổng vốn sở hữu và nợ tổng hợp cho tất cả các token và người dùng. Sau đó, chúng tôi tạo Bằng chứng Zero Knowledge (ZKP) để hiển thị hai điều:

  • Bằng chứng tổng: giá trị vốn chủ sở hữu và nợ trong cây Merkle cộng lại một cách chính xác

  • Bằng chứng không âm: tổng vốn chủ sở hữu của mỗi người dùng lớn hơn tổng số nợ của họ

Khi chúng tôi cố gắng xác minh cây Merkle cho một số lượng lớn tài khoản, việc xử lý một lần sẽ trở nên quá phức tạp. Để vượt qua thử thách này, chúng tôi chia tài khoản thành các nhóm nhỏ hơn gọi là loạt. Mỗi loạt được xử lý riêng biệt bằng các mạch loạt để kiểm tra phần dưới cùng của cây Merkle.

Việc chia loạt không chỉ giúp ích về mặt quản lý mà còn cho phép chạy các kiểm tra này cùng một lúc (xử lý song song). Sau khi có kết quả từ mỗi loạt, chúng tôi sử dụng một lớp mạch khác, được gọi là mạch đệ quy, để kết hợp và xác minh tất cả các loạt với nhau cho đến khi chứng minh được toàn bộ cây Merkle.

Mạch loạt là gì?

Mạch loạt sử dụng 1024 tài khoản (tài khoản0, tài khoản1,..., tài khoản1023) làm đầu vào và tạo ra 3 đầu ra chính: một hash (loạth), tổng giá trị vốn chủ sở hữu (loạte), và tổng giá trị nợ (loạtd). Mạch này kiểm tra:

  • Tổng vốn chủ sở hữu bằng USD của mỗi tài khoản lớn hơn tổng nợ của tài khoản đó

  • loạte là tổng của tất cả các giá trị vốn chủ sở hữu bằng USD trên các tài khoản này

  • Loạt d là tổng tất cả các giá trị nợ được tính bằng USD trên các tài khoản này

  • Loạt h là gốc của cây Merkle được tạo bằng cách sử dụng hash của tài khoản

  • Không có hiện tượng overflow trong quá trình tính tổng choloạteloạtd

Mạch đệ quy là gì?

Mạch đệ quy sử dụng 64 bằng chứng khác nhau (π0, ..., π63), hash (h0, ..., h63), vốn chủ sở hữu (e0, ..., e63), và nợ (d0, ..., d63) từ các mạch ở lớp thấp hơn làm đầu vào. Mạch này kết hợp các đầu vào này và tạo ra 3 đầu ra: một hash mới (đệ quyh), tổng vốn chủ sở hữu (đệ quye), và tổng nợ (đệ quyd). Mạch này kiểm tra:

  • Mỗi bằng chứng trong số 64 bằng chứng đều hợp lệ

  • Mỗi bằng chứng π0, ..., π63 từ mạch tầng thấp hơn đều hợp lệ

  • Đệ quye là tổng của e0, ..., e63

  • Đệ quyd là tổng của d0, ..., d63

  • Đệ quyh là hash của phép nối h0, ..., h63, i.(tức là

    • Đệ quyh = Hash (h0 || h1 || ... || h63)

  • Không có hiện tượng overflow trong quá trình tính tổng cho đệ quyeđệ quyd

Mối quan hệ giữa các mạch loạt và mạch đệ quy là gì?

Sơ đồ dưới đây minh họa cách mạch loạt và mạch đệ quy kết nối và truyền dữ liệu với nhau. Hãy nhớ rằng trong sơ đồ, chúng tôi nhân đôi các mạch nhằm mục đích minh họa, nhưng trong quá trình triển khai, chúng tôi chỉ sử dụng một mạch cho mỗi lớp.

CT-web-PoR-relationship

Cây Merkle của chúng tôi được cấu trúc hơi khác một chút. Ở 10 cấp độ dưới cùng, mỗi nút cha có 2 nút con, trong khi ở các cấp độ trên, mỗi nút cha có 64 nút con. Điều này là do các mạch loạt xử lý phần dưới cùng và các mạch đệ quy quản lý phần trên cùng. Sơ đồ dưới đây sử dụng ví dụ với "Alice" để hiển thị cây Merkle và bằng chứng Merkle của "Alice" (có màu xanh lá).

CT-web-PoR-example

Để biết thêm chi tiết kỹ thuật, chẳng hạn như cách chúng tôi điều chỉnh số tài khoản để phù hợp với kích thước loạt hoặc chọn thuật toán hash phù hợp, hãy xem trang này.

Những tiến bộ trong zk-PoR Phiên bản 2

Zk-PoR Phiên bản 2 của chúng tôi đã có một số tiến bộ so với phiên bản trước:

  • Hiệu quả cao hơn: Hiện đã nhanh hơn 50 lần so với phiên bản trước. Mất 3 giờ trên một máy 10 lõi, so với 36 giờ của phiên bản trước khi sử dụng 9 máy 64 lõi. Sự tăng tốc này là do việc sử dụng khung Plonky2, khung này biên dịch các mạch được mã hóa Rust thành ngôn ngữ máy hiệu quả thay vì sử dụng các tập lệnh Python chậm hơn. Chúng tôi cũng cải tiến Plonky2 để chạy một số tính toán trên GPU, giảm thời gian thêm 30%.

  • Khả năng kiểm toán tốt hơn: Với Phiên bản 2, chúng tôi sử dụng một khung cấp cao để giúp xử lý các chi tiết mật mã phức tạp. Điều này làm cho mã của chúng tôi rõ ràng hơn, dễ đọc hơn và ít bị lỗi hơn.

  • Bằng chứng ngắn gọn: Kích thước bằng chứng V2 (~500KB) chỉ bằng 0.05% của V1 (khoảng 1,2GB). Nhờ phương pháp đệ quy, các bằng chứng có thể được tổng hợp và cô đọng nhiều lần thành một bằng chứng duy nhất.

Cách thực hiện tự xác minh Bằng chứng dự trữ (PoR)?

Dưới đây là cách bạn có thể kiểm tra xem số dư tài sản có được đưa vào dưới dạng lá Merkle zk-STARK hay không:

  1. Đăng nhập vào tài khoản OKX của bạn, truy cập Tài sản và chọn báo cáo PoR

  2. Chọn Chi tiết để xem dữ liệu kiểm toán của bạn

    CT-web-PoR-step2
  3. Lấy dữ liệu bạn cần để xác minh thủ công bằng cách chọn Sao chép dữ liệu

    CT-web-PoR-step3
  4. Sau khi chọn Sao chép dữ liệu, mở trình soạn thảo văn bản,ví dụ sử dụng sổ ghi chép, sau đó dán và lưu chuỗi JSON dưới dạng tệp. Tệp phải kết thúc bằng tên "_inclusion_proof.json." Chuỗi JSON chứa số dư tài khoản của bạn và ảnh chụp nhanh đường dẫn Merkle, sau đó lưu tệp vào một thư mục mới

  5. Mở một trình soạn thảo văn bảnví dụ, Sổ ghi chép, rồi dán và lưu chuỗi JSON dưới dạng tệp. Tên tệp phải kết thúc bằng "_inclusion_proof."json."Lưu tệp vào một thư mục mới

    • Chuỗi JSON chứa số dư tài khoản của bạn và ảnh chụp nhanh đường dẫn Merkle.

    • Văn bản JSON được hiển thị dưới đây:

      {"sum_tree_siblings":["9ffb169fecf075e203edca2af65e4c69fa4331d13ac75ccae4cd5b990c91b675","7149661a789763cb61293ebf5d8bdd5570e79ee203738f87a444c79642b89a79","788aac9e392fa62bc3f79c98c7afd7bb41ee7d5bd496876cd0580080f19e002f","e828a44d345e6799e232aabc57cb2b92986ee1c52b65344d83e79d84b4b571b7","6c0675de9cd6b2be1abd6a98260e7ea776492c4aa9aadf31086f23452cb7c48d","2dfe3aadb5ac00ee0b1110ee8c313afdee85d9f9c62904d6ee79c8f02354d80a","5068ae26192587432892a6de8b54ea25a8aafd1c010ab5e67b55b2c30c6257fa","a1bb026ec9f3d8a1fa1b6f498c40ed8b117a57e1af9816d08d9135ab4fe43a60","119dfcd214191405b7f7f7c7091b89196c0cae818bfcd8252a48f20d9cf3c378","4d9403482ca177c669df34a60bb2afab7a18097012d0b70703c8e59258cdfee6"],"recursive_tree_siblings":[{"right_hashes":["e041eaa366259f873e9e1477aac77362f4b1b460c2d5e1c14907fa9288d66cff","b45a8c503e649ff39543a918996b06fc65f4df9b61d071b22f7342f94862c9be","e00ec1225dfe6b7e950f6b9b8e9d1121bf17eb60c444fd7191b861a2ddddad23","c02c12beb73c03f996508cdce7bef927f0aa8b77ebd899f6a75df83de9d4022e","d36b95f14c5fd5bfaf1347e3177340e2fc9475a77b852321b80527132e7d539c","c0b9770178e70a7bba4ac8aeaadab2bcb2ae7f90d0f678bd463f2c42ff4f4a7b","fab5e7c6f7f8bc6d51f515c5db235cc1ebe987adee8c19c9bc7313e9e266d72c","b3884fb88fc95949c78ca8867cfa9e8a3c4c59fa1a48d8371f7fbfbebda0acfd","0c6da9bdbd40065f92ddaa45297670f2f0bffedb74020c5d5752e70d8b507b77","left_hashes":["1101beee3c6a36a168ceee9d43fcf6cb6de7e5c87ed4d22cd0308c9870d17839","d40a8e9eb4c873996ec515600def480eaa9378ca8481a7bcdf5f77725dbec4ae","63b12566ba8473f502386e92d500664cb63683dca6c26593378dcc9715257b77","166440a8ccbfbc1ce6ec5efaf8bc0b25e1bf692fa972e2729e45ce709d1d35a3","724451ad1d937fc47de5ede930d159dce78093d5e6a1f2e698452f8a29b4de3a","081a88f12d4e23173a1bf5038d4a9413cc92dd421c92261065de06492b5010ec","a76dbb1d4c393539b9546f4460d50ebc7582748d7de63c62c463b793c55bac7c","91e6c21de3f4060e1bd864131a570af42de31bbcd84a5afcbbc8fedcbf806002","fad08eca5bfdc5f37d39eabb44c2216afc6498afcb6b913d72586eaaf132a572","d39b06fe28387ba8045e2b2f95e90613916beef4f79df7961514e6e4cbfd07fa","81d07e300a116a0e4fcb56c39715c5fd5921abe8d10329b07c3f33d417b70ca8","7b72a7e62a45c9958a8a55eec2ba47352f2af701bacba098668589f6a3ce0423","8766bc64c38c2bb4188d89de0e732bca103daaed0c779cba9a8b191e24b51c9c","fa57ae4409e46c605f3cbfd01dfd9ccebc86cbd765cdc067206cb9367832442f"]}, ...... "index":9583119,"account":{"id":"50f5f08cc5036e15a541c64ac4ac6d2d9aa8ddab1ec32ed58b10e6ed3edfad59","debt":["0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"],"equity":["8412384","9386185","45265193","0","0","8751","3824171","2716990","0","313671","28319","0","0","0","41261","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","142353","0","0","0","0","0","4435","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","662","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","993","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","25132","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","305","0","0","0","0","0","0","0","0","6141","0","0","0","0","0","0","0","0","0","0","0","5511","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"]}}

  6. Tải xuống công cụ xác minh mã nguồn mở OKX: zk-STARKValidator

  7. Lưu công cụ xác minh mã nguồn mở của OKX, zk-STARKValidator và tệp chuỗi JSON cùng nhau trong thư mục mới được tạo trong bước 5. Trong trường hợp này, chúng tôi đã đặt công cụ và tệp dữ liệu trong thư mục Tải xuống, đặt tên là "proof-of-reserves" như hiển thị dưới đây:

    CT-web-PoR-json
  8. Mở zk-STARKValidator; nó sẽ tự động chạy tệp JSON mà bạn đã lưu trong thư mục.

  9. Kiểm tra kết quả:

    • Nếu xác minh thành công, kết quả Xác thực đưa vào thành công sẽ hiển thị:

      zero-knowledge-proofs-what-are-zk-starks-and-how-do-they-work image 21
    • Nếu xác minh không thành công, kết quả Xác thực đưa vào không thành công sẽ hiển thị:

      zero-knowledge-proofs-what-are-zk-starks-and-how-do-they-work image 22

Cách xác minh tổng số dư zk-STARK và ràng buộc không âm?

Sau đây là cách bạn có thể xác minh rằng tài sản mà chúng tôi tuyên bố nắm giữ là đúng sự thật và không có người dùng nào nắm giữ vốn chủ sở hữu ròng âm:

  1. Truy cập trang Bằng chứng dự trữ của chúng tôi và chọn Báo cáo nợ

  2. Tải xuống tệp zk-STARK và lưu vào một thư mục mới

    CT-web-PoR-self-verification-step2
  3. Giải nén tệp để trích xuất tệp "sum_proof_data.json"

    CT-web-PoR-json-sum
  4. Tải xuống công cụ xác minh mã nguồn mở OKX: zk-STARKValidator

  5. Lưu công cụ xác minh mã nguồn mở zk-STARKValidator và tệp "sum_proof_data.json" vào thư mục mới được tạo ở Bước 2. Trong trường hợp này, chúng tôi đã đặt công cụ và tệp dữ liệu trong thư mục Tải xuống, đặt tên là "proof-of-reserves" như hiển thị dưới đây:

    CT-web-PoR-json
  6. Mở zk-STARKValidator, công cụ này sẽ tự động chạy tệp sum proof data mà bạn đã lưu trong thư mục.

  7. Kiểm tra kết quả

    • Nếu xác minh thành công, kết quả Xác thực tổng và ràng buộc không âm thành công sẽ hiển thị:

      zero-knowledge-proofs-what-are-zk-starks-and-how-do-they-work image 21
    • Nếu xác minh không thành công, kết quả Xác thực tổng và ràng buộc không âm không thành công sẽ hiển thị:

      zero-knowledge-proofs-what-are-zk-starks-and-how-do-they-work image 22

Để khám phá thêm chi tiết kỹ thuật, hệ thống Bằng chứng dự trữ của chúng tôi có mã nguồn mở và khả dụng để rà soát và sử dụng trên github.