Giới thiệu
Với việc thương mại hóa zkevms, đã xuất hiện những cơ hội thú vị để cung cấp cơ sở hạ tầng hợp đồng thông minh riêng tư, đồng thời vẫn duy trì khả năng tương thích Máy ảo Ethereum (EVM) . Các nhà phát triển có thể viết Solidity và biên dịch nó bằng một phiên bản trình biên dịch Solidity hoặc một số công cụ hậu xử lý. Để tạo ra các hợp đồng thông minh riêng tư.
Có những sự đánh đổi quan trọng giữa trạng thái toàn cục riêng tư và quyền riêng tư, xuất phát từ quan niệm rằng bạn cần biết mình đang chứng minh điều gì để có thể chứng minh nó. Do đó, bạn không thể có một hợp đồng thông minh riêng tư với trạng thái công khai toàn cục mà bạn không biết. Do đó, bạn không thể có một hợp đồng thông minh riêng tư với trạng thái toàn cục riêng tư. Ví dụ, Uniswap là không thể vì người chứng minh cần biết số dư của cả hai nhóm để có thể chứng minh rằng việc hoán đổi đã được thực hiện chính xác. Tìm hiểu thêm về điều đó Tại sao bạn không thể xây dựng một Uniswap riêng tư với ZKP - #24 của bowaggoner
Vì vậy, một số thứ chúng ta biết và yêu thích không thể triển khai theo cách riêng tư, cho đến khi chúng ta có IO, đó là lý do tại sao IO lại quan trọng đến vậy. Nó cho phép chúng ta tạo ra một Ethereum hoàn toàn riêng tư với chính xác những giả định về độ tin cậy.
Dù sao thì bài đăng này nói về cách chúng ta có thể thêm hai mã lệnh vào pstore và pload, biên dịch nó thành zkevm và có các hợp đồng thông minh riêng có trạng thái người dùng riêng nhưng không có trạng thái toàn cục riêng.
Làm sao
Bạn có một số lệnh gọi hợp đồng riêng tư. Chúng tôi thực hiện điều này bằng cách tận dụng mã zkevm hiện có để chứng minh rằng các lệnh gọi này đã được thực thi chính xác nhưng không tiết lộ bất kỳ thông tin nào về những gì hợp đồng thực sự đã làm. Ngoài việc đáp ứng một số yêu cầu, ví dụ: một số lượng token nhất định đã được phê duyệt để sử dụng từ một hợp đồng khác, nhưng không phải token của ai. Chúng tôi triển khai hai mã OP mới là pstore và pload tương tự như sload và sstore, ngoại trừ các giá trị là riêng tư.
Hộp dụng cụ
Chúng ta lấy zkevm làm chuỗi công cụ. Chúng ta sẽ không thực hiện bất kỳ thay đổi nào đối với bản thân zkevm. Chúng ta sẽ coi đây là một hộp đen. Thay vào đó, chúng ta sẽ thực hiện các thay đổi đối với reth. Chúng ta sẽ thêm hai cây mới cho reth: cây lưu trữ riêng (PST) và cây hủy riêng (PNT).
Mỗi lá trong PST và PNT đều được xuất bản với mỗi bản cập nhật. Vì vậy, bất kỳ ai cũng có thể chứng minh tư cách thành viên của bất kỳ lá nào. Tuy nhiên, chỉ người dùng tạo ra chúng mới biết giá trị của các lá này.
tải lên
pload là một opcode Máy ảo Ethereum (EVM) mà chúng ta thêm vào. Nó tương tự như sload. Khi sload được thực thi trong zkevm, zkzkevm sẽ tạo ra một bằng chứng merkle cho thấy một giá trị certin nằm ở một vị trí certin nào đó trong cây.
Tương tự như vậy đối với pload, chúng ta tạo bằng chứng về tư cách thành viên cho lá đó trong cây nhưng chúng ta cũng tạo bằng chứng rằng lá đó chưa bị vô hiệu hóa.
Giả sử chúng ta muốn tải một giá trị x. Về cơ bản, chúng ta đang thực hiện hai bằng chứng Merkle
- chứng minh x trong PST
- chứng minh rằng x.nullifier không có trong PNT
Chỉ người dùng biết giá trị bí mật của lá đó mới có thể tính toán được giá trị vô hiệu của nó và chỉ người dùng như vậy mới có thể chứng minh rằng nó chưa bị vô hiệu.
LƯU Ý: sload có một bằng chứng ngầm định về việc không bao gồm vì nó sử dụng cây merkel có thứ tự. Chúng ta không thể sử dụng cây merkle có thứ tự cho pload và pstore, vì vậy chúng ta sẽ cần một loại mã hóa nào đó để đảm bảo rằng một lá nhất định chưa được tạo. Mã hóa như vậy có thể là Hash (hợp đồng, khe cắm, giá trị, hàm hủy).
LƯU Ý: Tôi cũng nghĩ nếu bạn nạp một địa chỉ không có dữ liệu nào, bạn sẽ nhận được 0x0 và điều đó cũng cần được xem xét. Có lẽ phải nghĩ cách xử lý vấn đề này trong zkzkevm sao cho devex vẫn tồn tại. Nhưng rất khó để chứng minh rằng khe lưu trữ chưa được lấp đầy.
cửa hàng
pstore sẽ thực hiện chức năng tương tự như sstore. Nhưng cách thức hoạt động có đôi Bit khác biệt.
Trong zkevm, mỗi khi một sstore được thực hiện, nó thực hiện hai phép chứng minh merkle. Phép chứng minh đầu tiên chứng minh rằng giá trị hiện tại của lá là x, và phép chứng minh merkle thứ hai tính toán gốc merkle nếu giá trị x được thay thế bằng y. Vì vậy, bạn có thể coi phép chứng minh đầu tiên là việc thu được một phép chứng minh tóm tắt cho tất cả các lá trong cây, và phép chứng minh thứ hai là việc chỉ thay thế một lá (x) bằng y.
Vậy là cửa hàng
- Chứng minh rằng có một giá trị x trong cây
- Thay thế nó bằng y
pstore có thể làm điều tương tự nhưng Bit khác một chút
- Nó loại bỏ x bằng cách lấy x.nullifier và thêm nó vào cây nullifier.
- Nó thay thế x bằng y bằng cách thêm nó vào PST.
Solidity
Solidity biên dịch thành mã lệnh Máy ảo Ethereum (EVM) .
Giả sử chúng ta có hợp đồng thông minh sau
def transfer(sender, reciver, amount) private:bal[sender]= bal[sender] - amountbal[reciver] = bal[reciver] + amount# this is not adding to the users balance directly. Instead it is kind of input out put thing where the user needs to get the received funds to add to their total balance. This nuance is encapsulated in a receiver address abstraction for now. But needs more work to figure out what is needed on zkzkevm side.return(1)Trình biên dịch Solidity (của một số bộ xử lý hậu kỳ) sẽ nhận ra điều này và thay thế tất cả các sloads/sstore bằng ploads/pstores trong mã byte. Nó sẽ chỉ thực hiện điều này cho các hàm có thẻ hoặc trình sửa đổi riêng tư.
Chuỗi cuộc gọi có một số chân riêng tư và một số chân công cộng
Hãy nghĩ về điều này như một phiên bản dễ lập trình hơn của Aztec Connect. Giả sử chúng ta có một ví riêng để ví đó gọi Uniswap. Điều này có thể thực hiện được nhưng chúng ta phải cẩn thận để loại bỏ các rò rỉ message.sender, tx.origin, Nonce , gas_price, gas_limit và các siêu dữ liệu khác. Có một vài cách để thực hiện việc này.
- Tạo hợp đồng proxy cho mỗi cuộc gọi và sau đó cân bằng lại trong một giao dịch khác hoặc ở cuối ngăn xếp cuộc gọi giao dịch hiện tại.
- Sử dụng hợp đồng proxy toàn cầu
Lưu ý: tx.origin có thể cần được khử trùng trong reth change. Nhưng có lẽ nó chỉ là một bundler nên tôi nghĩ cũng không tệ lắm.
Sự đánh đổi
Tất cả những điều này có vẻ Bit phức tạp chỉ để tạo ra Aztec Connect. Nhưng sức mạnh ở đây nằm ở khả năng tái sử dụng hầu hết cơ sở hạ tầng hiện có để hỗ trợ các ứng dụng mạnh mẽ hơn nhiều.
Hợp đồng cartel
Chúng ta đã nói đôi Bit về trạng thái toàn cục riêng tư và việc không thể thực hiện Uniswap cùng nhiều thứ khác. Nhưng giả sử tôi muốn tạo một hợp đồng thông minh cho tôi và bạn bè. Tôi muốn giữ mã nguồn ở chế độ riêng tư công khai nhưng để tôi và bạn bè thực thi nó. Vì vậy, điều này cũng khả thi, chúng ta chỉ cần nới lỏng các đảm bảo về tính khả dụng của dữ liệu trong hợp đồng thông minh sao cho mã hợp đồng thông minh không cần phải được công khai.
Có một số sắc thái về việc đảm bảo tính khả dụng của dữ liệu trong cartel. Tôi cho rằng chúng ta có thể triển khai một số loại ghi nhật ký bắt buộc, trong đó tất cả các bản cập nhật dữ liệu được mã hóa và công bố để chỉ các thành viên cartel mới có thể xem.
Phần kết luận
Có vẻ như ý tưởng này sẽ hữu ích ngay lập tức theo hai cách
- Tạo một bản tổng hợp riêng tư trong đó một máy chủ khổng lồ tạo ra tất cả các bằng chứng mà người dùng cung cấp dữ liệu của họ cho máy chủ này nhưng không phải cho tất cả những người khác
- Một bản cuộn riêng tư nơi người dùng tạo một số bằng chứng để quyền truy cập lưu trữ của họ được ẩn khỏi máy chủ khổng lồ.
Có vẻ như nó hữu ích và dễ thực hiện. Không cần kiến thức về zk, coi zk như một hàng hóa.
TODO
Chúng ta cần phải suy nghĩ nhiều hơn về
- Nếu chúng ta đặt EOA thành private theo mặc định, có vẻ khả thi với một số thủ thuật nullifier, chẳng hạn như yêu cầu họ ký "nullifier" và chuỗi ngẫu nhiên đó trở thành nullfieir của họ, hoặc như nullifier_0 = Hash (sign(“nullfiier”), 0) nullifier_1 = Hash(sign(“nullifier”,1)), v.v. Nhưng để làm được điều này, chúng ta sẽ phải biên dịch tất cả các hợp đồng erc20 để sử dụng pstore và pload cho erc20. Có vẻ như điều này có thể làm hỏng những thứ khác. Nhưng quyền riêng tư EOA thủ công dường như không bao gồm các thay đổi trạng thái vì hầu hết mọi người quan tâm đến erc20 hơn là ETH.
- Có khả thi để tạo bằng chứng zkevm cho một số thứ thoải mái trên thiết bị di động không? Một vài pload
- Nếu giá trị bạn đang lưu trữ được tạo động thì tốt hơn là nên có một trình vô hiệu hóa mà máy chủ quái vật có thể sử dụng để lưu trữ lá đó cho bạn thay vì bạn tạo lá đầy đủ vì điều kiện chạy đua.
- Làm thế nào để cung cấp địa chỉ của tôi để tôi có thể nhận tiền một cách riêng tư mà không cần kết nối tất cả các biên lai của tôi lại với nhau
- Làm thế nào tôi có thể sử dụng nhật ký hoặc các cấu trúc khác để biết mình đã nhận được tiền hay chưa? Có lẽ chỉ cần trả về một nhật ký có chứa một loại "cờ" được mã hóa.




