+6

Zero-knowledge : Xu hướng tiếp theo của Crypto hay mãi chỉ là đứa trẻ chưa thể lớn ?

Mayfest2023

Zero-knowledge - một công nghệ được coi là xu hướng trong liên tiếp các chu kỳ Bull run tuy nhiên chúng ta lại chưa từng thấy một cơn sóng nào thực sự lớn giống như Defi hay Gamefi. Hiện tại ứng dụng tiêu biểu nhất của công nghệ ZK cũng chính là ứng dụng Tornado Cash - ứng dụng đã khiển founder rơi vào vòng lao lý. Trong thời điểm bài viết này, sự kiện EDCON2023 cũng đang diễn ra quy tụ phần lớn bigboy của giới crypto, và trong đó top 1 server Vitalik Buterin - top 1 shiller đang thao thao bất tuyệt về ZK.

image.png

Zero-knowledge là gì ?

Về cơ bản đây là một công nghệ để ẩn đi các state trên một public blockchain. Trong khuôn khổ bài viết này mình sẽ không đào sâu quá vào từng ngóc ngách chi tiết, bài viết này mình sẽ tập trung vào cập nhật các bước tiến công nghệ hiện nay để hỗ trợ cho ZK.

Còn về kiến thức cơ bản, mình nghĩ bài viết của một hacker dưới đây đã cho bạn đầy đủ: https://viblo.asia/p/zero-knowledge-proof-va-privacy-tren-blockchain-part-1-Do754pq05M6

ZK tại năm 2023

Liên tiếp các sự kiện lớn tại năm 2023 đều trình làng những công nghệ mới được xây dựng cho ZK, nhưng liệu nó đã đủ. Trong bài viết lần này chúng ta sẽ tìm hiểu về một dự án được đánh giá khá cao tại ETH Denver là Onchain ZK Shuffle Texas HoldEm , mình nghĩ dự án này cũng đã phản ánh phần nào trạng thái của ZK tại thời điểm này. Và tất nhiên để mass-adoption một công nghệ nói chung và crypto nói riêng thì không gì tốt bằng những Gambling Game.

Dự án tuy mới chỉ dừng lại ở MVP nhưng cũng đã mang lại nhiều đánh giá từ cộng đồng, về demo của dự án các bạn có thể xem tại đây:

Tại sao cần ZK

Đến đây nhiều người sẽ tự hỏi là các Web server đều đang thực hiện tốt các dạng game Gambling như thế này mà ít thao tác hơn rất nhiều. Cái này thì phần lớn các lập trình viên đều phần nào hiểu được lí do tuy nhiên các retail lại không nắm rõ : Nhà cái hoàn toàn có thể biết được tất cả dữ liệu của những lá bài tưởng như đang úp trên màn hình.

Do đó điểu duy nhất khiến họ vẫn có thể chơi đó là niềm tin vào sự công bằng của nhà cái, và hiển nhiên điều này đã vi phạm vào văn hoá của Blockchain:

                                    Don't trust, verify

Và đây là lúc chúng ta cần ZK vào cuộc. Cuộc chơi mà player chỉ cần cung cấp proof và kết quả được phân định một cách công bằng.

How it's Made

Để hoàn thiện game bài Poker này về cơ bản sẽ cần 3 phần:

  • ZKP circuits: Được viết bằng circom dùng cho việc verify 2 tác vụ của những người chơi là : decrypt và shuffle
  • Contract Logic Game: Dùng để xác định logic tính điểm
  • Frontend

image.png

Trong bài viết này chúng ta sẽ tập trung vào phần ZK : ZKP circuits

Để thực hiện thành công một ván Poker, cơ chế của game sẽ phải đảm bảo đủ các tính chất toàn vẹn là ShuffleDeal Card

Shuffle and Encrypt

Tác dụng của Shuffle để trộn một cách ngẫu nhiên các lá bài từ thứ tự mặc định ban đầu, tuy nhiên nếu chỉ shuffle thì cho dù có define private cho biến trong contract thì vẫn hoàn toàn có thể đâm vào storage và lấy ra giá trị, do đó chúng ta cần thêm 1 bước nữa là Encrypt.

image.png

Tác dụng của Encrypt này sẽ làm giá trị của bộ bài được giấu đi sao cho không một người chơi hay một hacker nào có thể xác định đúng giá trị của các quân bài cho dù có đầy đủ các state on-chain.

Để bước này được coi là hoàn hảo chúng ta cần có sự tham gia (tạo transaction) của toàn bộ người chơi (hand) vì chúng ta cần bảo toàn tính chất trustless, khi đó không cần ai phải phụ thuộc, đặt niềm tin vào nhau.

Với Onchain ZK Shuffle Texas HoldEm , nhà phát triển đã xử lý vấn đề này bằng những thuận toán và mã hoá rất đơn giản như sau:

  • Shuffle: Sử dụng một Permutation Matrix để thay sắp xếp lại giá trị của bộ bài, ví dụ một bộ bài 52 quân sẽ được biểu diễn dưới dạng một mảng 52 phần tử, khi đó khi nhân với một Permutaion Matrix 52x52 được random ở local sẽ thay trộn lại giá trị của mảng đó.

    Note : Permutation Matrix là một ma trận mxm, giá trị mỗi phần tử chỉ là 1 hoặc 0, đảm bảo rằng tổng từng hàng dọc hoặc hàng ngang trong ma trận chỉ được là 1.

(c1....c52)(0....1............1....0)\left(\begin{array}{cc} c _ { 1 } & .... & c _ { 52 }\\ \end{array}\right) \left(\begin{array}{cc} 0 & .... & 1\\ .... & .... & ....\\ 1 & .... & 0 \end{array}\right)

  • Encrypt: Với Encrypt thì chúng ta sẽ sử dụng một hệ mật homomorphic là Elgamal để có thể encrypt bộ bài. Lí do chọn homomorphic vì hệ mật này không đòi hỏi chúng ta phải decrypt tuần tự như thứ tự đã encrypt, chỉ cần có đầy đủ encrypt là có thể bảo đảm tính toàn vẹn giá trị decrypt cuối cùng.

2 bước này sẽ phải cùng được thực hiện ở mỗi turn của từng hand, không thể chỉ dùng 1 trong 2 vì nó sẽ tạo ra lỗ hổng sau:

  • Chỉ dùng shuffle mỗi turn thì giá trị hoàn toàn có thể đọc được từ các state onchain
  • Chỉ dùng mã hoá thì người đầu tiên có thể xác định được vị trí các quân bài

Tác dụng của ZK : Trong tác vụ này, ZK proof có nhiệm vụ để verify tính đúng đắn của shuffle và encrypt dữ liệu. Một hand có thể không submit đúng bộ bài đã random encrypt (submit thừa, hoặc thiếu dữ liệu) dẫn đến việc hỏng round chơi vì không thể decrypt, tuy nhiên họ cũng không được làm rò rỉ thứ tự shuffle vì hacker có thể can thiệp và tính ngược ra được vị trí của từng lá bài, do đó ZK được sử dụng để đảm bảo việc không để lộ thự tự shuffle.

Deal Card (Lật bài)

Lật bài sẽ được sử dụng trong các trường hợp sau:

  • Rút bài cho từng hand và đảm bảo chỉ họ biết giá trị của quân bài
  • Hand submit giá trị của những lá mình rút được
  • Lật những lá bài chung

image.png

Vì chúng ta đã dùng hệ mật homomorphic Elgamal do đó để biết rõ giá trị của lá bài cần phải có đẩy đủ decryption của các hand.

Trong ví dụ có 3 hands lần lượt là Alice, Bob, Charlie tham gia chơi và đã shuffle cũng như encrypt bộ bài, khi đó chúng ta có thể xử lý cả 3 trường hợp đã được để ra ở đầu đề mục như sau:

Một bộ bài 52 lá đã được shuffle hoàn toàn thì chúng ta chỉ việc rút lần lượt từ index 0 -> 51

  1. Rút bài cho từng hand: Với trường hợp Alice là người được chia bài, Alice sẽ cần decryption của Bob và Charlie để có thể xem được lá bài mình được chia mà không để lộ cho người khác, flow sẽ như sau:

    • Bob decrypt lá bài, sau đó submit decryption đó lên onchain
    • Sau khi Bob submit decryption của mình lên on-chain, Charlie sẽ decrypt tiếp bằng secret key của mình trước khi update lại kết quả lên onchain
    • Alice đã có kết quả từ 2 lần decryption và giờ secret key của Alice có thể khôi phục lại giá trị quân bài ban đầu (giá trị 1-> 52)

image.png

Trong trường hợp khi các tất cả các lá bài chung đã lật và các hand submit là bài của mình, ZKP một lần nữa được sử dụng để tránh các hand gian lận bằng cách submit lá bài không phải của mình.

Với trường hợp những lá bài chung được lật, các thao tác sẽ đầy đủ gồm có từng hand sẽ decrypt bằng secret key của mình và người cuối sẽ submit kết quả cuối cùng.

Okay vậy là đã hoàn thiện flow để có thể thiết lập một game poker cơ bản hoàn toàn on-chain, tuy nhiên nó vẫn còn rất nhiều hạn chế để có thể go-to-market.

Hạn chế

image.png

Nếu xem qua video mọi người có thể chưa hình dung được toàn bộ tình hình vì nó đang diễn tả một happy case khi tất cả user cùng tập trung chơi, trong thực tế sẽ luôn tồn tại các case bất ngờ mà ta chẳng thể lường trước được, có thể là mất điện, mất mạng, ví hết gas,... dẫn đến việc 1 hand bị đứt đoạn giữa đường và làm cho hệ mật Elgamal trở nên vô dụng vì đã mất đi 1 phần decryption khiến cho toàn bộ game coi như bỏ đi.

Bên cạnh đó số lượng tác vụ on-chain nhiều như vậy cũng tốn một lượng gas không hề nhỏ.

Tóm lại UX vẫn luôn là điểm yếu chí mạng của 1 Dapp ZK, cho dù circom hay noir đã cải thiện rất nhiều để hỗ trợ cho developer, rất có thể phải sang những layer được build riêng cho private state như Aleo mới có thể cải thiện triệt để những bất tiện này.

References


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí