Nguồn chính thức:tiêu đề phụ
Tổng quan
Tổng quan
Khi nghiên cứu nguyên lý hoạt động của hệ thống chuỗi khối, chúng ta cần hiểu nhiều kiến thức về mật mã, chẳng hạn như secp 256 k 1, là một thuật toán chữ ký đường cong và bất đối xứng, được sử dụng cho chữ ký trong hệ thống bitcoin và ethereum và xác minh tài khoản. Ví dụ: sha 256 là thuật toán băm được sử dụng để nén thông tin có độ dài thay đổi thành các mã có độ dài cố định. Chẳng hạn như cơ sở 58, có thể chuyển đổi mã hóa thông tin thành một chuỗi được biểu thị bằng các ký tự có thể in được. Ví dụ: ECDH, thuật toán trao đổi khóa Diffie-Hellman, được sử dụng để trao đổi khóa liên lạc một cách an toàn giữa các nút P2P.
ZKP được đề xuất lần đầu tiên vào năm 1985. Tuy nhiên, nó đã không tìm được kịch bản ứng dụng quy mô lớn trong một thời gian dài nên sự phát triển của công nghệ rất chậm. Cho đến khi Bitcoin ra đời vào năm 2009, mọi người nhận thấy rằng nó rất phù hợp để giải quyết các vấn đề về quyền riêng tư và khả năng mở rộng trong chuỗi khối, kể từ đó, rất nhiều vốn và tài năng đã được đầu tư vào việc phát triển và ứng dụng kỹ thuật của công nghệ này. Có nhiều triển khai ZKP, chẳng hạn như: Groth 16, PlonK, STARK, v.v., và cho đến nay vẫn chưa có tiêu chuẩn công nghiệp thực sự nào xuất hiện. Bài viết này sẽ tổng hợp các đặc điểm kỹ thuật của các triển khai ZKP khác nhau, hy vọng sẽ giúp ích cho bạn học tập, nghiên cứu và phát triển kỹ thuật.
Trường ứng dụng ZKP
tiêu đề phụ
1. Giấy chứng nhận quyền riêng tư
Tornado Cash là một máy trộn tiền xu chạy trên Ethereum. Nó sử dụng ZKP để chứng minh các nút trên Merkle-Tree. Người dùng có thể gửi một lượng mã thông báo cố định vào nhóm quỹ, sau đó sử dụng Bằng chứng do ZKP tạo ra để chứng minh rằng họ đã gửi tiền tiền.Nhưng không cần tiết lộ thông tin giao dịch khi bạn gửi tiền.
tiêu đề phụ
2. Gia công phần mềm điện toán
zksync 1.0 là một ví dụ điển hình. Nó thực hiện chuyển mã thông báo Ethereum và giao dịch ngoài chuỗi, sau đó gửi kết quả đến các nút. Bằng cách xác minh bằng chứng ZKP, nút có thể biết liệu nó có được tính toán theo phương pháp mà nó yêu cầu hay không.
tiêu đề phụ
3. Nén dữ liệu
Mina là một ví dụ khác, trong nhiều hệ thống chuỗi khối tốc độ cao, dữ liệu giao dịch rất lớn, hệ thống cần giữ tất cả các khối để xác minh giao thức đồng thuận, do đó, hệ thống có yêu cầu rất cao đối với phần cứng và lưu trữ vĩnh viễn có nghĩa là các nút Chuỗi khối sẽ cần liên tục tăng dung lượng ổ đĩa và khả năng lập chỉ mục dữ liệu. Tại thời điểm này, ZKP có thể được sử dụng để nén dữ liệu xác minh. Mina nén sổ cái xuống còn 11 KB thông qua bằng chứng không kiến thức đệ quy, nhưng nó vẫn có thể xác minh tính chính xác của khối.
tiêu đề cấp đầu tiên
Hệ thống bằng chứng là triển khai thuật toán cơ bản của ZKP, có thể được chia thành hai loại: tương tác và không tương tác:
tiêu đề phụ
1. Hệ thống bằng chứng tương tác
Hệ thống chứng minh tương tác bao gồm hai bên, được gọi là Người chứng minh (viết tắt là P) và Người xác minh (viết tắt là V), trong đó P biết một bí mật nào đó (chẳng hạn như khóa bí mật của hệ thống mật mã khóa công khai hoặc căn bậc hai của phương trình bậc hai). dư x), P hy vọng sẽ thuyết phục được V rằng anh ta nắm giữ bí mật. Bằng chứng tương tác bao gồm nhiều vòng, trong mỗi vòng, P và V có thể cần gửi tin nhắn cho nhau dựa trên tin nhắn nhận được từ nhau và kết quả do chính họ tính toán. Một cách điển hình là V gửi một truy vấn tới P trong mỗi vòng và P trả lời cho V. Sau khi tất cả các vòng được thực hiện, V quyết định có chấp nhận bằng chứng của P hay không tùy thuộc vào việc liệu P có thể trả lời đúng câu hỏi do chính nó gửi trong mỗi vòng hay không.
2. Hệ thống chứng minh không tương tác
Trong hệ thống chứng minh tương tác nói trên, P và V không tương tác, P trực tiếp tạo ra bằng chứng cho V và V trực tiếp xác minh chứng minh, loại hệ thống chứng minh này được gọi là hệ thống chứng minh không tương tác (NIZK).
Hệ thống bằng chứng chúng tôi sử dụng trong chuỗi khối nói chung là NIZK, nút trong chuỗi khối là trình xác minh V và người dùng cuối hoặc mạng hai lớp (Lớp 2) là trình chứng minh P.
Liên kết tham khảo [ 1 ] ở cuối bài viết mô tả các kế hoạch và đặc điểm của NIZK đã được xuất bản công khai trong mười năm qua.
Bulletproofs
Trong các ứng dụng kỹ thuật thực tế, chúng tôi chủ yếu tập trung vào hiệu suất và tính linh hoạt, vì vậy chúng tôi phân loại và so sánh chi tiết hơn một số hệ thống chứng minh phổ biến, xem liên kết tham khảo ở cuối bài viết [2]:
Các tính năng: Kích thước bằng chứng ngắn gọn, không cần cài đặt đáng tin cậy, nhưng việc tạo và xác minh bằng chứng mất nhiều thời gian.
SNARKs (Succinct Non-interactive ARguments of Knowledge)
Dự án tiêu biểu: Bulletproofs, Halo, Halo 2.
Các tính năng: Kích thước của bằng chứng ngắn gọn và thời gian xác minh bằng chứng tương đối ngắn, nhưng mỗi mạch cần được tin cậy.
SNORKs (Succinct Non-interactive Oecumenical (Universal) aRguments of Knowledge)
Dự án đại diện: Groth 16.
Các tính năng: Bằng chứng về kích thước nhỏ gọn, chỉ cần một thiết lập đáng tin cậy cho tất cả các mạch.
STARKs (Succinct (Scalable) Transparent ARguments of Knowledge)
Các dự án tiêu biểu: Sonic, PlonK, Marlin, Plonky 2.
Tính năng: Bằng chứng rất lớn, không yêu cầu cài đặt đáng tin cậy và có khả năng mở rộng tốt.
Cách phân loại trên không phải là tuyệt đối, ví dụ như dự án Halo/Halo 2, họ cũng vay mượn rất nhiều ý tưởng từ Plonk trong thiết kế của mình, ngoài ra SNORK thường được xếp vào SNARK vì chúng đều yêu cầu cài đặt đáng tin cậy.
3. So sánh hiệu suất
(Xem link tham khảo cuối bài viết [3])
tiêu đề cấp đầu tiên
lập trình mạch
Mạch là triển khai logic nghiệp vụ của hệ thống ZKP và việc phát triển các ứng dụng ZKP yêu cầu lập trình mạch.Tại sao mã logic ZKP được gọi là mạch? Chủ yếu có những nguyên nhân sau:
Mã của bằng chứng ZKP sẽ được chuyển đổi thành một chuỗi biểu thức R 1 CS với các ràng buộc đơn giản, sau đó được chuyển đổi thành QAP đa thức khổng lồ bằng phương pháp nội suy Lagrange, cuối cùng được ràng buộc ở dạng mạch cổng.
Tương tự như mạch phần cứng, tất cả các nhánh mã sẽ được thực thi cùng nhau.
Chúng ta không cần sử dụng mật mã để triển khai các ứng dụng ZKP từ đầu. Có nhiều thư viện phát triển đã triển khai các hệ thống bằng chứng cơ bản này. Chúng ta chỉ cần tập trung vào việc triển khai logic nghiệp vụ. Tất nhiên, mỗi thư viện có một mức độ trừu tượng khác nhau, một số cần học các biểu thức mô tả mạch và một số có thể dễ dàng thực hiện chỉ bằng cách xác định mã theo quy trình.
tiêu đề phụ
libsnark
1. Các thư viện phát triển thường dùng
Hệ thống chứng minh chung, thư viện mạch cơ bản và các ví dụ ứng dụng được triển khai bằng ngôn ngữ C++.
Hệ thống bằng chứng: BBFR 15, BCCT 12, BCCT 13, BCGT V1 3, BCIOP 13, BCT V1 4 a, BCT V1 4 b, CT V1 5, DFGK 14, Groth 16, GM 17, GGPR 13, PGHR 13.
gnark
Liên kết: https://github.com/scipr-lab/libsnark.
Một hệ thống bằng chứng được triển khai trong Go, cung cấp API cấp cao để thiết kế mạch.
Hệ thống chứng minh: Groth 16, PlonK.
bellman
Liên kết: https://github.com/consensys/gnark.
Một hệ thống bằng chứng được triển khai trong Rust cung cấp giao diện mạch, cơ sở hạ tầng và một số triển khai mạch cơ bản, chẳng hạn như trừu tượng hóa boolean và số.
Hệ thống chứng minh: Groth 16.
snarkjs
Liên kết: https://github.com/zkcrypto/bellman.
Một hệ thống bằng chứng được triển khai trong Javascript và WASM có thể được sử dụng để thiết lập tin cậy, tạo bằng chứng và xác minh bằng chứng. snarkjs sử dụng trình biên dịch vòng tròn riêng của iden 3 để biên dịch các mạch được xác định bởi DSL.
Hệ thống chứng minh: Groth 16, PlonK.
ethsnarks
Liên kết: https://github.com/iden3/snarkjs.
Được triển khai bằng Python, bằng chứng có thể được tạo trong trình duyệt của người dùng, sử dụng hợp đồng thông minh Ethereum làm trình xác thực. Hiện tại, việc phát triển dự án không hoạt động và có thể là lựa chọn tốt hơn để sử dụng Circo trong cùng một kịch bản.
Hệ thống chứng minh: Groth 16.
bulletproofs
Liên kết: https://github.com/HarryR/ethsnarks.
Một hệ thống bằng chứng được triển khai trong Rust với các bằng chứng phạm vi đơn lẻ và tổng hợp, tính toán nhiều bên được nhập mạnh mẽ và API hệ thống ràng buộc có thể lập trình để chứng minh các tuyên bố tùy ý đang được phát triển.
Hệ thống bằng chứng: chống đạn.
halo 2
Liên kết: https://github.com/dalek-cryptography/bulletproofs.
Một hệ thống bằng chứng dựa trên triển khai Rust, được duy trì bởi nhóm ZCash. Halo 2 dành riêng cho PLONKish, cho phép kiểm soát rất trực tiếp cách biểu diễn các mạch trong các phép tính số học, khiến nó trở nên lý tưởng để viết các mạch được tối ưu hóa cao.
Liên kết: https://github.com/zcash/halo 2.
tiêu đề phụ
2. Quá trình phát triển
Lấy gnark làm ví dụ, quy trình làm việc điển hình như sau:
1) Sử dụng mã để mô tả vấn đề cần giải quyết.
2) Biên dịch thành hệ ràng buộc R 1 CS.
3) Thực hiện cài đặt đáng tin cậy trên R 1 CS để nhận khóa Chứng minh và khóa Xác minh.
5) Người xác minh sử dụng phím Xác minh để xác minh Bằng chứng.
ngôn ngữ đặc biệt cho lập trình mạch
tiêu đề phụ
Cairo
1. Dựa trên nền tảng Ethereum
Cairo là ngôn ngữ lập trình để viết các chương trình có thể chứng minh được, trong đó một bên có thể chứng minh với bên kia rằng một phép tính nhất định đã được thực hiện chính xác. Cairo và các hệ thống bằng chứng tương tự có thể được sử dụng để cung cấp khả năng mở rộng cho các chuỗi khối. StarkNet sử dụng ngôn ngữ lập trình Cairo cho cơ sở hạ tầng của mình và để viết các hợp đồng StarkNet.
Hệ thống bằng chứng: STARK.
Zokrates
Liên kết: https://www.cairo-lang.org/docs/.
ZoKrates sử dụng DSL để mô tả mạch và cung cấp một số thư viện mạch thường được sử dụng, có thể giúp bạn sử dụng các tính toán có thể kiểm chứng trong DApps, từ việc chuẩn hóa chương trình của bạn bằng ngôn ngữ cấp cao để tạo bằng chứng tính toán, sau đó xác minh các bằng chứng này trong Solidity.
Hệ thống chứng minh: GM 17, Groth 16, Marlin.
Circom
Liên kết: https://zokrates.github.io/.
Ngôn ngữ Circcom sử dụng DSL để mô tả các mạch và có thể hợp tác với snarkjs để tạo bằng chứng trong trình duyệt của người dùng, sử dụng hợp đồng thông minh Ethereum làm trình xác minh.
Hệ thống chứng minh: Groth 16, PlonK.
Noir
Liên kết: https://iden 3.io/circom.
Ngôn ngữ lập trình quyền riêng tư dựa trên Rust của Aztec sử dụng DSL để mô tả các mạch, cho phép xây dựng an toàn và liền mạch các mạch không có kiến thức bảo vệ quyền riêng tư.
Hệ thống chứng minh: PlonK.
zkEVM
Liên kết: https://noir-lang.org/index.html.
Hiện tại, zkSync, Polygon, Scroll, Starkware và các nhóm khác đang làm việc để hiện thực hóa zkEVM và đã đạt được tiến bộ đáng kể.
tiêu đề phụ
zkApp (Mina)
2. Dựa trên nền tảng chuỗi công khai
zkApps là hợp đồng thông minh của Giao thức Mina được cung cấp bởi bằng chứng không kiến thức. zkApps có thể thực hiện các phép tính phức tạp tùy ý ngoài chuỗi trong khi chỉ tính một khoản phí cố định để gửi bằng chứng không có kiến thức được tạo tới chuỗi để xác minh tính toán này, không giống như các chuỗi khối khác chạy tính toán trên chuỗi và sử dụng phí gas thay đổi. zkApps được viết bằng Typescript.
Hệ thống chứng minh: PlonK.
LEO (Aleo)
Liên kết: https://docs.minaprotocol.com/zkapps.
Leo là một ngôn ngữ lập trình được nhập tĩnh, chức năng được xây dựng có mục đích để viết các ứng dụng riêng tư. Được thiết kế cho các nhà phát triển, nó có thể được xây dựng một cách trực quan trên nền tảng chuỗi khối Aleo, cung cấp nền tảng cho một hệ sinh thái riêng tư, phi tập trung.
Liên kết: https://leo-lang.org/.
tiêu đề cấp đầu tiên
Các vấn đề bảo mật phổ biến của ZKP
Trong vài năm qua, nhóm bảo mật SlowMist đã tiến hành kiểm tra bảo mật mạch và ứng dụng cho nhiều sản phẩm ZKP nổi tiếng, bao gồm ZKSwap, Zkdex, Zksafe, v.v. và tìm thấy một số lỗ hổng có rủi ro trung bình và cao. sự hiểu biết sâu sắc hơn. Các vấn đề bảo mật phổ biến được nhóm bảo mật SlowMist tìm thấy trong quá trình kiểm tra ứng dụng ZKP là:
Rủi ro thông số tin cậy
Để sử dụng zk-SNARK, cần có một bộ tham số chung, được gọi là Chuỗi tham chiếu chung (CRS). Nhưng việc tạo ra các tham số này cũng tạo ra một số tham số riêng tư và nếu một bên có được các tham số riêng tư này, họ có thể giả mạo bằng chứng.
Ngoài ra, quá trình tạo CRS cần phải được kiểm tra để đảm bảo rằng không có cửa hậu số ngẫu nhiên hoặc các tham số riêng tư không được lưu giữ một cách có chủ ý. Việc sử dụng zk-SNORK cũng yêu cầu đảm bảo rằng Chuỗi tham chiếu có cấu trúc (SRS) được tin cậy.
Rủi ro bảo mật trong giai đoạn cấu hình đáng tin cậy có thể được giải quyết bằng cách sử dụng điện toán đa bên an toàn (MPC). đáng tin cậy.
bảo mật mã tĩnh
Phần này chủ yếu là do các vấn đề bảo mật do mã hóa không chuẩn gây ra, chẳng hạn như: tham số không được kiểm tra, giá trị trả về chưa được xử lý, tràn số, ranh giới không được kiểm tra, v.v. Nếu ngôn ngữ viết mạch là C/C++, cũng sẽ có rủi ro tràn bộ nhớ.
Rủi ro tấn công chuỗi cung ứng
Rủi ro chuỗi cung ứng chủ yếu đến từ việc sử dụng các cơ sở mã dễ bị tổn thương, chẳng hạn như: kho phiên bản cũ. Thông thường, các ứng dụng ZKP cũng cần được sử dụng cùng với máy khách hoặc giao diện người dùng Web và phần này cũng dễ bị tin tặc tấn công theo nhiều cách khác nhau.
lỗi logic
Lỗi logic là lỗi dễ xảy ra nhất trong quá trình thực hiện mạch, cần kiểm tra xem thiết kế mạch có đáp ứng yêu cầu kết hợp với tài liệu yêu cầu hay không.
tấn công chi tiêu gấp đôi
Thiết kế sai có thể dẫn đến các cuộc tấn công chi tiêu gấp đôi. Ví dụ: một số thư viện ZKP có rủi ro về khả năng mở rộng. Kẻ tấn công có thể sử dụng các Bằng chứng đã biết để tạo ra các Bằng chứng khác nhau. Nếu thiết kế không đúng sẽ dẫn đến các cuộc tấn công chi tiêu gấp đôi.
chứng minh giả mạo
Bằng chứng hiệu quả là vấn đề chính mà ZKP phải giải quyết, đảm bảo tính đầy đủ và độ tin cậy, nghĩa là sai không thể đúng, đúng không thể sai, vì vậy nếu một mạch có thể tạo ra bằng chứng sai, thường là do sơ hở trong thư viện cơ bản, thông thường chúng tôi khuyên bên dự án nên sử dụng thư viện ZKP đã được kiểm toán công khai và sử dụng phiên bản phát hành ổn định.
tấn công kênh phụ
Nếu mạch không được thiết kế phù hợp, các thông tin riêng tư khác nhau có thể có các đặc điểm tính toán khác nhau và kẻ tấn công có thể đoán dữ liệu đầu vào riêng tư thông qua đầu vào hoặc bằng chứng công khai.
lỗi ràng buộc mạch
Biểu thức mạch không phù hợp có thể dẫn đến các biến không bị ràng buộc.
tấn công giá trị đặc biệt
Một số giá trị đầu vào đặc biệt có thể bỏ qua logic xác thực của hệ thống, chẳng hạn như: 0, null, v.v.
Đoán đầu vào bảo mật
Đối với các ứng dụng như Tornado Cash, nếu có thể đoán được thông tin đầu vào sẽ dẫn đến các vấn đề nghiêm trọng về rò rỉ quyền riêng tư, lúc này cần phải kiểm tra nghiêm ngặt dữ liệu đầu vào để đảm bảo không thể đoán được.
Một số dự án có thể có đặc quyền quản trị viên đặc biệt, một khi các đặc quyền được sử dụng bất hợp pháp, quỹ dự án và tài sản của người dùng sẽ bị đánh cắp.
Rủi ro hợp đồng thông minh
Rủi ro hợp đồng thông minh
tiêu đề cấp đầu tiên
tóm tắt
tóm tắt
Cuối cùng, xin cảm ơn Safeheron, nhà cung cấp dịch vụ tự lưu ký tài sản kỹ thuật số một cửa hàng đầu, vì lời khuyên kỹ thuật chuyên nghiệp.
Liên kết tham khảo:
[ 1 ]. https://en.wikipedia.org/wiki/Zero-knowledge_proof
[ 2 ]. https://github.com/matter-labs/awesome-zero-knowledge-proofs
[ 3 ].https://docs.google.com/presentation/d/1gfB6WZMvM9mmDKofFibIgsyYShdf0RV_Y8TLz3k1Ls0/edit