> Nhà phát triển ameen.eth kết hợp khái niệm "Proof-of-Innocence" với Tornado Cash để đưa ra một hướng khác là "riêng tư không bằng phạm tội".
Được viết bởi: Albert Lin
Lời nói đầu
TornadoCash là một dịch vụ giao dịch ẩn danh nổi tiếng trong thế giới tiền điện tử. TornadoCash sử dụng công nghệ ZKP (Zero-Knowledge Proof) để che giấu nguồn tiền. Chính phủ Hoa Kỳ lập luận rằng một cơ chế như vậy đã tạo điều kiện thuận lợi cho các hoạt động luân chuyển tài chính bất hợp pháp và cuối cùng đã bị Bộ Tài chính Hoa Kỳ xử phạt vào tháng 8 năm 2022 và buộc phải đưa nó ra khỏi kệ. Bảo vệ quyền riêng tư và rửa tiền dường như luôn song hành trong nhiều trường hợp. Trong khi theo đuổi quyền riêng tư, bọn tội phạm thường sử dụng các tính năng quyền riêng tư này để rửa tiền bất hợp pháp. Có thể tìm ra một cách cho phép mọi người có quyền riêng tư trong khi hạn chế rửa tiền một cách hiệu quả không? Privacy-Pools của ameen.eth, một nhà phát triển ban đầu của TornadoCash, có thể đưa ra hướng đi. (Chỉ trang web giao diện người dùng và Kho lưu trữ GitHub bị ảnh hưởng trong phần về việc hủy niêm yết và phần hợp đồng không bị ảnh hưởng vì nó nằm trên chuỗi khối. Cuối cùng, dưới sự nỗ lực của Electronic Frontier Foundation, GitHub đã khôi phục Kho lưu trữ. Để biết chi tiết , vui lòng tham khảo tại đây)
Giới thiệu nguyên tắc TornadoCash
Trước khi giới thiệu Privacy-Pools, bạn cần hiểu các nguyên tắc thiết kế liên quan đến TornadoCash. Để có phần giới thiệu chi tiết, vui lòng tham khảo bài viết trước của tôi "Breaking Down TornadoCash: Hướng dẫn cho người mới bắt đầu giải thích chức năng của nó cho bạn bè". Dưới đây là một đánh giá ngắn gọn về các nguyên tắc thiết kế của TornadoCash.
TornadoCash sử dụng biên lai (cam kết) để kiểm soát quyền truy cập. Biên lai được tạo bằng cách băm bí mật (giá trị bí mật) và bộ vô hiệu hóa (mã đăng xuất) và mỗi biên nhận chỉ có thể được rút một lần. Sử dụng Merkle Tree (cây băm) để ghi lại thông tin tiền gửi, sử dụng biên lai làm nút lá và tính toán Merkle Root (gốc cây băm). Người dùng chỉ cần cung cấp dữ liệu từ lá đến gốc để chứng minh liệu dữ liệu có phải là một trong những lá của Cây Merkle hay không và gián tiếp chứng minh rằng đã có tiền gửi vào TornadoCash trước đó. Sử dụng Zero-Knowledge Proof để ẩn nguồn tiền gửi và sử dụng bộ vô hiệu hóa để ngăn chặn cuộc tấn công Rút tiền kép.
Biên lai của TornadoCash có hai ý nghĩa
Bằng chứng rằng người gửi đã gửi tiền trước đó
Đảm bảo rằng mỗi người nhận chỉ có thể yêu cầu tiền một lần
「Bằng chứng vô tội」
Theo nguyên tắc thiết kế của TornadoCash, chỉ có thể biết rằng số tiền nhận được phải đến từ khoản tiền gửi trước đó, nhưng không biết số tiền đó đến từ khoản tiền gửi nào. Đây là mục đích chính của bọn tội phạm sử dụng TornadoCash cho các hoạt động rửa tiền bất hợp pháp và đó cũng là lý do tại sao chính phủ Hoa Kỳ điều chỉnh TornadoCash. Nếu chúng tôi có thể đề xuất một Bằng chứng khác (ZKP) để chứng minh rằng số tiền nhận được không phải từ các khoản tiền gửi trong danh sách từ chối, liệu nó có thể chứng minh rằng khoản thanh toán đó không phải từ bọn tội phạm hay không, thì đây là "Bằng chứng Vô tội" (" Bằng chứng về vô tội") khái niệm cốt lõi.
Khái niệm "Bằng chứng vô tội" có thể được chia thành hai hướng
Bằng chứng cho thấy số tiền nhận được là từ việc thu tiền gửi trong danh sách được phép (danh sách được phép)
Bằng chứng cho thấy số tiền được rút không đến từ tập hợp các khoản tiền gửi trong danh sách từ chối (danh sách từ chối)
Cả hai phương pháp này đều có thể chứng minh rằng tiền rút không phải từ các khoản tiền gửi trong danh sách từ chối. Cách tiếp cận trong hình dưới đây là sử dụng danh sách từ chối để chứng minh rằng số tiền nhận được không đến từ khoản tiền gửi (màu đỏ) trong danh sách từ chối.
nguồn:
Nguyên tắc thiết kế Privacy-Pools
Privacy-Pools thêm khái niệm "Proof-of-Innocence" vào TornadoCash. Ngoài ý nghĩa ban đầu của biên lai TorandoCash, biên lai thanh toán Privacy-Pools còn có ý nghĩa thứ ba: "để chứng minh rằng số tiền nhận được đến từ các khoản tiền gửi trong danh sách được phép".
Biên nhận Privacy-Pool có nghĩa là:
Bằng chứng rằng người gửi đã gửi tiền trước đó
Đảm bảo rằng mỗi người nhận chỉ có thể yêu cầu tiền một lần
Bằng chứng cho thấy số tiền được rút đến từ tiền gửi trong danh sách được phép
Ở đây chúng tôi sử dụng Allow Merkle Tree để giải thích cách Privacy-Pools sử dụng "Proof-of-Innocence" trong hệ thống này (Allow Merkle Tree là khái niệm sử dụng danh sách quyền). Trước hết, Allow Merkle Tree có một số đặc điểm
Cho phép Merkle Tree như tên gợi ý là Merkle Tree
Chiều cao và số lượng nút của cây giống như Cây ký gửi Merkle của Nhóm riêng tư.
*Tất cả các lá của Allow Merkle Tree tương ứng với vị trí (đặt cọc) của lá Deposit Merkle Tree.
Cho phép dữ liệu lá Merkle Tree có thể được chia thành hai loại sau:
được phép: Cho biết rằng khoản tiền gửi tại vị trí này được cho phép. (Các vị trí chưa được ký gửi cũng được cho phép theo mặc định)
bị chặn: Cho biết khoản tiền gửi tại vị trí này bị từ chối.
Như thể hiện trong hình bên dưới, các vị trí của chỉ số 0 và 1 đều là tiền hợp pháp trong Cây Merkle ký gửi và các vị trí tương ứng của lá Allow Merkle Tree cũng được cho phép.
Giả sử rằng một tên tội phạm muốn thực hiện các hoạt động rửa tiền ngày hôm nay và anh ta gửi số tiền bất hợp pháp có được sau cuộc tấn công vào Privacy-Pools và vị trí gửi tiền là Deposit Merkle Tree index: 2. Chúng tôi biết rằng đó là tiền bất hợp pháp, vì vậy chúng tôi cập nhật nó thành bị chặn ở vị trí Allow Merkle Tree index: 2 tương ứng.
Tình huống thu thập danh sách quyền
Giả sử rằng ngày nay, một người dùng gửi tiền trong danh sách được phép của chính phủ Hoa Kỳ muốn rút tiền, anh ta cần cung cấp "bằng chứng rằng khoản tiền gửi nằm trong Cây Merkle Dposit" và "bằng chứng rằng tài khoản trong danh sách được phép của Hoa Kỳ là Được phép". Bằng chứng tương ứng với danh sách cho phép của Hoa Kỳ bao gồm Allow Merkle Root (được cung cấp bởi người dùng, subetRoot trong mã) và giá trị nút sẽ được chuyển trên đường. Khi Nhóm bảo mật xác minh giai đoạn ZKP, nó sẽ sử dụng giá trị lá như được phép (keccak256(được phép) trong mã thực tế) và giá trị nút đã cho để chuyển qua để tạo Merkle Root. Xác minh rằng Merkle Root này giống với Allow Merkle Root do người dùng cung cấp. Nếu việc xác minh của cùng một người đại diện được thông qua, điều đó có nghĩa là quỹ rút tiền là từ một khoản ký gửi tồn tại trong danh sách cho phép của chính phủ Hoa Kỳ.
Tình huống thu thập danh sách từ chối
Hôm nay, một người dùng không nằm trong danh sách được phép của chính phủ Hoa Kỳ muốn rút tiền và vị trí gửi tiền tương ứng được đánh dấu là bị chặn trong danh sách được phép của chính phủ Hoa Kỳ. Điều này sẽ khiến người dùng không thể sử dụng Allow Merkle Root trong danh sách cấp phép của chính phủ Hoa Kỳ để rút tiền, vì không thể tạo bằng chứng tương ứng và quá trình xác minh sẽ không thành công (vì Nhóm bảo mật sử dụng giá trị được phép cho lá để thực hiện các tính toán và danh sách cho phép của chính phủ Hoa Kỳ sẽ là Vị trí được đánh dấu là bị chặn, vì vậy không thể tính được Merkle Root tương tự).
Thiết kế như vậy buộc người dùng phải cung cấp một Allow Merkle Root khác để rút tiền (Các Allow Merkle Tree khác cần đánh dấu vị trí gửi tiền là được phép để tính toán cùng một Allow Merkle Root để vượt qua xác minh). Cây Allow Merkle khác này có thể được duy trì bởi các chính phủ hoặc tổ chức khác, hoặc thậm chí do chính người dùng này tạo ra. Ngày nay, chính phủ Hoa Kỳ có thể sử dụng Allow Merkle Root được sử dụng khi rút tiền để xác định xem tiền của người dùng có tuân thủ luật pháp và quy định của chính phủ Hoa Kỳ hay không, nhằm đạt được mục đích theo dõi. Nếu người dùng đang sử dụng Allow Merkle Tree do chính họ tạo ra hoặc không đáng tin cậy, thì về cơ bản, quỹ rút tiền rất có thể đến từ một khoản tiền gửi có vấn đề (mọi Allow Merkle Tree của bên thứ ba đáng tin cậy đều đánh dấu vị trí gửi tiền là bị chặn).
Các câu hỏi thường gặp
**Hỏi: Nếu Allowroot được cung cấp bởi người rút tiền, liệu có thể giả mạo Allow Merkle Root giả để chứng minh rằng lá là một khoản tiền gửi trong danh sách được phép, điều đó có nghĩa là tiền vẫn có thể bị lấy đi? **
A: Câu trả lời là có, thực sự có thể lấy tiền đi. Tác giả đặc biệt chỉ ra rằng cơ chế như vậy không phải là cấm bọn tội phạm lấy tiền, nhưng ngay cả khi chúng có thể lấy đi, người ta sẽ biết rằng số tiền đó là tiền nằm trong danh sách từ chối. Khi người rút tiền đưa ra một Allow Merkle Root không thuyết phục, về cơ bản nó có thể được coi là rút tiền khỏi danh sách từ chối. Tác giả đoán rằng lý do cho phép điều này là để duy trì tính chất phi tập trung của dịch vụ này. Vì mỗi Allow Merkle Tree cần có quyền quản lý nhất định để cập nhật trạng thái của từng lá. Nếu một gốc cây cho phép nhất định là bắt buộc, điều đó có nghĩa là ai đó có thẩm quyền nhất định để kiểm soát việc rút tiền, điều này không phù hợp với tinh thần phân quyền.
**Hỏi: Ai sẽ quyết định liệu giao dịch có phải từ quỹ danh sách từ chối hay không? **
Đáp: Phần tôi thấy không được đề cập cụ thể và tôi hiểu rằng phần này nên được thực hiện bởi từng cơ quan quản lý. Giả sử rằng ngày nay chính phủ Hoa Kỳ muốn kiểm tra tiền bẩn của Nhóm bảo mật, anh ta có thể kiểm tra xem mình có phải là tiền bẩn hay không bằng cách kiểm tra Allow Merkle Root của mỗi giao dịch. Còn về việc Allow Merkle Root loại nào được cho phép, đó là để mỗi cơ quan quản lý tự đánh giá.
Mã nhóm riêng tư
Code chính và nhận xét riêng của tác giả được đính kèm ở đây, hy vọng sẽ giúp mọi người hiểu được logic của main thông qua code.
// mạch/rút_từ_subset.circom
mẫu WithdrawFromSubset(levels,expectedValue) {
// công cộng
gốc đầu vào tín hiệu;
tín hiệu đầu vào subsetRoot;
bộ khử tín hiệu đầu vào;
siêu dữ liệu tài sản đầu vào tín hiệu; // abi.encode(token,mount).snarkHash();
rút tín hiệu đầu vàoSiêu dữ liệu; // abi.encode(người nhận, tiền hoàn lại, người chuyển tiếp, phí).snarkHash();
// riêng tư
bí mật đầu vào tín hiệu;
đường vào tín hiệu; // Cho biết dữ liệu đại diện cho lá bên trái hay lá bên phải.
đầu vào tín hiệu mainProof [levels] ; // Xây dựng dữ liệu cần thiết cho root tiền gửi.
tập hợp con đầu vào tín hiệuProof [levels] ; // Xây dựng dữ liệu cần thiết để cho phép root.
// Tính giá trị vô hiệu và cam kết.
máy băm thành phần =CommitionNullifierHasher();
hasher.secret <== bí mật;
hash.path <== đường dẫn;
hasher.assetMetadata <== tài sảnMetadata;
bộ vô hiệu hóa === hasher.nullifier;
// giá trị dự kiến: keccak256("được phép") %p
thành phần doubleTree = DoubleMerkleProof(levels,expectedValue);
doubleTree.leaf <== hasher.commitment;
// Chuyển đổi đường dẫn thành bit để chỉ định xem đó là lá bên trái hay lá bên phải.
// Có thể thấy rằng cây ký gửi và cây cho phép có cùng đường dẫn.
doubleTree.subsetProof [i] <== tập hợp conBằng chứng [i] ;
}
gốc === doubleTree.root; // Xác minh gốc ký gửi.
subsetRoot === doubleTree.subsetRoot; // Xác minh root cho phép.
rút tín hiệuMetadataSquare;
rútMetadataSquare <== rútMetadata * rútMetadata;
}
TLDR
"Proof-of-Innocence" là sử dụng một Bằng chứng khác để chứng minh rằng khoản thanh toán đến từ khoản tiền gửi trong danh sách được phép. "Proof-of-Innocence" có thể được xây dựng từ hai quan điểm: danh sách cho phép và danh sách từ chối.
Privacy-Pools áp đặt khái niệm "Proof-of-Innocence" trên cơ sở TornadoCash. Biên lai ban đầu thể hiện ý nghĩa thứ ba: "Bằng chứng rằng số tiền nhận được đến từ các khoản tiền gửi trong danh sách được phép."
Sự tồn tại của Allow Merkle Tree có thể chứng minh rằng việc rút tiền tồn tại trong danh sách được phép. Vị trí lá của Allow Merkle Tree tương ứng với vị trí lá ký gửi của Deposit Merkle Tree. Cho phép dữ liệu lá Merkle Tree được cho phép và bị chặn.
Ngoài thông tin cần thiết để xây dựng Deposit Merkle Root, người nhận cũng cần cung cấp thông tin Allow Merkle Root và cấu trúc Allow Merkle Root để chứng minh rằng việc rút tiền tồn tại trong danh sách được phép.
Vì Allow Merkle Root được cung cấp bởi người nhận, bọn tội phạm vẫn có cách để lấy đi số tiền bất hợp pháp thông qua Allow Merkle Root giả mạo. Allow Merkle Root giả sẽ vẫn xuất hiện trên chuỗi và bị những người khác coi là đáng ngờ về khoản thanh toán, để theo dõi dòng tiền bất hợp pháp.
Nhà phát triển ameen.eth kết hợp khái niệm "Proof-of-Innocence" với TornadoCash để đưa ra một hướng khác là "riêng tư không bằng phạm tội". Tác giả thấy thú vị khi sử dụng một ZKP khác để chứng minh một thực tế khác, điều này hơi giống với việc bổ sung ZKP. Cách sử dụng này sẽ đơn giản và hiệu quả hơn so với việc xây dựng một ZKP lớn hơn và phức tạp hơn. Về việc lựa chọn Allow Merkle Tree, tôi cảm thấy rằng nó sẽ được thi công bởi một đơn vị công bằng hơn trong tương lai, điều này sẽ thuyết phục người khác hơn.
Cuối cùng xin cảm ơn Chih-Cheng Liang và Ping Chen đã giúp duyệt bài và đưa ra những ý kiến quý báu!
> Tham khảo:
> Địa chỉ tàng hình
> Phân tích phiên bản Tornado Cash
> Giới thiệu về sự phát triển của ZKP và hợp đồng thông minh
> [ZKP Reading Club] TornadoCash
> Tiền mặt Tornado — Cách thức hoạt động | DeFi + Zero Knowledge Proof
> Hiểu biết sâu về các chi tiết kỹ thuật của TornadoCash
> 0xhhh Chủ đề giới thiệu các tính năng mới và nguyên tắc của chúng
> video giới thiệu
> Cuộc nói chuyện của Vitalik về cách cải thiện Tornadov2
> nhóm riêng tư v0tweet
> Giới thiệu Proof of Innocence được xây dựng trên TornadoCash
Xem bản gốc
Nội dung chỉ mang tính chất tham khảo, không phải là lời chào mời hay đề nghị. Không cung cấp tư vấn về đầu tư, thuế hoặc pháp lý. Xem Tuyên bố miễn trừ trách nhiệm để biết thêm thông tin về rủi ro.
Giải thích chi tiết nguyên lý thiết kế của Tornado Cash V2
> Nhà phát triển ameen.eth kết hợp khái niệm "Proof-of-Innocence" với Tornado Cash để đưa ra một hướng khác là "riêng tư không bằng phạm tội".
Được viết bởi: Albert Lin
Lời nói đầu
TornadoCash là một dịch vụ giao dịch ẩn danh nổi tiếng trong thế giới tiền điện tử. TornadoCash sử dụng công nghệ ZKP (Zero-Knowledge Proof) để che giấu nguồn tiền. Chính phủ Hoa Kỳ lập luận rằng một cơ chế như vậy đã tạo điều kiện thuận lợi cho các hoạt động luân chuyển tài chính bất hợp pháp và cuối cùng đã bị Bộ Tài chính Hoa Kỳ xử phạt vào tháng 8 năm 2022 và buộc phải đưa nó ra khỏi kệ. Bảo vệ quyền riêng tư và rửa tiền dường như luôn song hành trong nhiều trường hợp. Trong khi theo đuổi quyền riêng tư, bọn tội phạm thường sử dụng các tính năng quyền riêng tư này để rửa tiền bất hợp pháp. Có thể tìm ra một cách cho phép mọi người có quyền riêng tư trong khi hạn chế rửa tiền một cách hiệu quả không? Privacy-Pools của ameen.eth, một nhà phát triển ban đầu của TornadoCash, có thể đưa ra hướng đi. (Chỉ trang web giao diện người dùng và Kho lưu trữ GitHub bị ảnh hưởng trong phần về việc hủy niêm yết và phần hợp đồng không bị ảnh hưởng vì nó nằm trên chuỗi khối. Cuối cùng, dưới sự nỗ lực của Electronic Frontier Foundation, GitHub đã khôi phục Kho lưu trữ. Để biết chi tiết , vui lòng tham khảo tại đây)
Giới thiệu nguyên tắc TornadoCash
Trước khi giới thiệu Privacy-Pools, bạn cần hiểu các nguyên tắc thiết kế liên quan đến TornadoCash. Để có phần giới thiệu chi tiết, vui lòng tham khảo bài viết trước của tôi "Breaking Down TornadoCash: Hướng dẫn cho người mới bắt đầu giải thích chức năng của nó cho bạn bè". Dưới đây là một đánh giá ngắn gọn về các nguyên tắc thiết kế của TornadoCash.
TornadoCash sử dụng biên lai (cam kết) để kiểm soát quyền truy cập. Biên lai được tạo bằng cách băm bí mật (giá trị bí mật) và bộ vô hiệu hóa (mã đăng xuất) và mỗi biên nhận chỉ có thể được rút một lần. Sử dụng Merkle Tree (cây băm) để ghi lại thông tin tiền gửi, sử dụng biên lai làm nút lá và tính toán Merkle Root (gốc cây băm). Người dùng chỉ cần cung cấp dữ liệu từ lá đến gốc để chứng minh liệu dữ liệu có phải là một trong những lá của Cây Merkle hay không và gián tiếp chứng minh rằng đã có tiền gửi vào TornadoCash trước đó. Sử dụng Zero-Knowledge Proof để ẩn nguồn tiền gửi và sử dụng bộ vô hiệu hóa để ngăn chặn cuộc tấn công Rút tiền kép.
Biên lai của TornadoCash có hai ý nghĩa
「Bằng chứng vô tội」
Theo nguyên tắc thiết kế của TornadoCash, chỉ có thể biết rằng số tiền nhận được phải đến từ khoản tiền gửi trước đó, nhưng không biết số tiền đó đến từ khoản tiền gửi nào. Đây là mục đích chính của bọn tội phạm sử dụng TornadoCash cho các hoạt động rửa tiền bất hợp pháp và đó cũng là lý do tại sao chính phủ Hoa Kỳ điều chỉnh TornadoCash. Nếu chúng tôi có thể đề xuất một Bằng chứng khác (ZKP) để chứng minh rằng số tiền nhận được không phải từ các khoản tiền gửi trong danh sách từ chối, liệu nó có thể chứng minh rằng khoản thanh toán đó không phải từ bọn tội phạm hay không, thì đây là "Bằng chứng Vô tội" (" Bằng chứng về vô tội") khái niệm cốt lõi.
Khái niệm "Bằng chứng vô tội" có thể được chia thành hai hướng
Cả hai phương pháp này đều có thể chứng minh rằng tiền rút không phải từ các khoản tiền gửi trong danh sách từ chối. Cách tiếp cận trong hình dưới đây là sử dụng danh sách từ chối để chứng minh rằng số tiền nhận được không đến từ khoản tiền gửi (màu đỏ) trong danh sách từ chối.
Nguyên tắc thiết kế Privacy-Pools
Privacy-Pools thêm khái niệm "Proof-of-Innocence" vào TornadoCash. Ngoài ý nghĩa ban đầu của biên lai TorandoCash, biên lai thanh toán Privacy-Pools còn có ý nghĩa thứ ba: "để chứng minh rằng số tiền nhận được đến từ các khoản tiền gửi trong danh sách được phép".
Biên nhận Privacy-Pool có nghĩa là:
Ở đây chúng tôi sử dụng Allow Merkle Tree để giải thích cách Privacy-Pools sử dụng "Proof-of-Innocence" trong hệ thống này (Allow Merkle Tree là khái niệm sử dụng danh sách quyền). Trước hết, Allow Merkle Tree có một số đặc điểm
Cho phép dữ liệu lá Merkle Tree có thể được chia thành hai loại sau:
Như thể hiện trong hình bên dưới, các vị trí của chỉ số 0 và 1 đều là tiền hợp pháp trong Cây Merkle ký gửi và các vị trí tương ứng của lá Allow Merkle Tree cũng được cho phép.
Giả sử rằng một tên tội phạm muốn thực hiện các hoạt động rửa tiền ngày hôm nay và anh ta gửi số tiền bất hợp pháp có được sau cuộc tấn công vào Privacy-Pools và vị trí gửi tiền là Deposit Merkle Tree index: 2. Chúng tôi biết rằng đó là tiền bất hợp pháp, vì vậy chúng tôi cập nhật nó thành bị chặn ở vị trí Allow Merkle Tree index: 2 tương ứng.
Tình huống thu thập danh sách quyền
Giả sử rằng ngày nay, một người dùng gửi tiền trong danh sách được phép của chính phủ Hoa Kỳ muốn rút tiền, anh ta cần cung cấp "bằng chứng rằng khoản tiền gửi nằm trong Cây Merkle Dposit" và "bằng chứng rằng tài khoản trong danh sách được phép của Hoa Kỳ là Được phép". Bằng chứng tương ứng với danh sách cho phép của Hoa Kỳ bao gồm Allow Merkle Root (được cung cấp bởi người dùng, subetRoot trong mã) và giá trị nút sẽ được chuyển trên đường. Khi Nhóm bảo mật xác minh giai đoạn ZKP, nó sẽ sử dụng giá trị lá như được phép (keccak256(được phép) trong mã thực tế) và giá trị nút đã cho để chuyển qua để tạo Merkle Root. Xác minh rằng Merkle Root này giống với Allow Merkle Root do người dùng cung cấp. Nếu việc xác minh của cùng một người đại diện được thông qua, điều đó có nghĩa là quỹ rút tiền là từ một khoản ký gửi tồn tại trong danh sách cho phép của chính phủ Hoa Kỳ.
Tình huống thu thập danh sách từ chối
Hôm nay, một người dùng không nằm trong danh sách được phép của chính phủ Hoa Kỳ muốn rút tiền và vị trí gửi tiền tương ứng được đánh dấu là bị chặn trong danh sách được phép của chính phủ Hoa Kỳ. Điều này sẽ khiến người dùng không thể sử dụng Allow Merkle Root trong danh sách cấp phép của chính phủ Hoa Kỳ để rút tiền, vì không thể tạo bằng chứng tương ứng và quá trình xác minh sẽ không thành công (vì Nhóm bảo mật sử dụng giá trị được phép cho lá để thực hiện các tính toán và danh sách cho phép của chính phủ Hoa Kỳ sẽ là Vị trí được đánh dấu là bị chặn, vì vậy không thể tính được Merkle Root tương tự).
Thiết kế như vậy buộc người dùng phải cung cấp một Allow Merkle Root khác để rút tiền (Các Allow Merkle Tree khác cần đánh dấu vị trí gửi tiền là được phép để tính toán cùng một Allow Merkle Root để vượt qua xác minh). Cây Allow Merkle khác này có thể được duy trì bởi các chính phủ hoặc tổ chức khác, hoặc thậm chí do chính người dùng này tạo ra. Ngày nay, chính phủ Hoa Kỳ có thể sử dụng Allow Merkle Root được sử dụng khi rút tiền để xác định xem tiền của người dùng có tuân thủ luật pháp và quy định của chính phủ Hoa Kỳ hay không, nhằm đạt được mục đích theo dõi. Nếu người dùng đang sử dụng Allow Merkle Tree do chính họ tạo ra hoặc không đáng tin cậy, thì về cơ bản, quỹ rút tiền rất có thể đến từ một khoản tiền gửi có vấn đề (mọi Allow Merkle Tree của bên thứ ba đáng tin cậy đều đánh dấu vị trí gửi tiền là bị chặn).
Các câu hỏi thường gặp
**Hỏi: Nếu Allowroot được cung cấp bởi người rút tiền, liệu có thể giả mạo Allow Merkle Root giả để chứng minh rằng lá là một khoản tiền gửi trong danh sách được phép, điều đó có nghĩa là tiền vẫn có thể bị lấy đi? **
A: Câu trả lời là có, thực sự có thể lấy tiền đi. Tác giả đặc biệt chỉ ra rằng cơ chế như vậy không phải là cấm bọn tội phạm lấy tiền, nhưng ngay cả khi chúng có thể lấy đi, người ta sẽ biết rằng số tiền đó là tiền nằm trong danh sách từ chối. Khi người rút tiền đưa ra một Allow Merkle Root không thuyết phục, về cơ bản nó có thể được coi là rút tiền khỏi danh sách từ chối. Tác giả đoán rằng lý do cho phép điều này là để duy trì tính chất phi tập trung của dịch vụ này. Vì mỗi Allow Merkle Tree cần có quyền quản lý nhất định để cập nhật trạng thái của từng lá. Nếu một gốc cây cho phép nhất định là bắt buộc, điều đó có nghĩa là ai đó có thẩm quyền nhất định để kiểm soát việc rút tiền, điều này không phù hợp với tinh thần phân quyền.
**Hỏi: Ai sẽ quyết định liệu giao dịch có phải từ quỹ danh sách từ chối hay không? **
Đáp: Phần tôi thấy không được đề cập cụ thể và tôi hiểu rằng phần này nên được thực hiện bởi từng cơ quan quản lý. Giả sử rằng ngày nay chính phủ Hoa Kỳ muốn kiểm tra tiền bẩn của Nhóm bảo mật, anh ta có thể kiểm tra xem mình có phải là tiền bẩn hay không bằng cách kiểm tra Allow Merkle Root của mỗi giao dịch. Còn về việc Allow Merkle Root loại nào được cho phép, đó là để mỗi cơ quan quản lý tự đánh giá.
Mã nhóm riêng tư
Code chính và nhận xét riêng của tác giả được đính kèm ở đây, hy vọng sẽ giúp mọi người hiểu được logic của main thông qua code.
// mạch/rút_từ_subset.circom
mẫu WithdrawFromSubset(levels,expectedValue) {
// công cộng
gốc đầu vào tín hiệu;
tín hiệu đầu vào subsetRoot;
bộ khử tín hiệu đầu vào;
siêu dữ liệu tài sản đầu vào tín hiệu; // abi.encode(token,mount).snarkHash();
rút tín hiệu đầu vàoSiêu dữ liệu; // abi.encode(người nhận, tiền hoàn lại, người chuyển tiếp, phí).snarkHash();
// riêng tư
bí mật đầu vào tín hiệu;
đường vào tín hiệu; // Cho biết dữ liệu đại diện cho lá bên trái hay lá bên phải.
đầu vào tín hiệu mainProof [levels] ; // Xây dựng dữ liệu cần thiết cho root tiền gửi.
tập hợp con đầu vào tín hiệuProof [levels] ; // Xây dựng dữ liệu cần thiết để cho phép root.
// Tính giá trị vô hiệu và cam kết.
máy băm thành phần =CommitionNullifierHasher();
hasher.secret <== bí mật;
hash.path <== đường dẫn;
hasher.assetMetadata <== tài sảnMetadata;
bộ vô hiệu hóa === hasher.nullifier;
// giá trị dự kiến: keccak256("được phép") %p
thành phần doubleTree = DoubleMerkleProof(levels,expectedValue);
doubleTree.leaf <== hasher.commitment;
// Chuyển đổi đường dẫn thành bit để chỉ định xem đó là lá bên trái hay lá bên phải.
// Có thể thấy rằng cây ký gửi và cây cho phép có cùng đường dẫn.
doubleTree.path <== đường dẫn;
for ( i = 0; i < cấp độ; i++) {
doubleTree.mainProof [i] <== chínhBằng chứng [i] ;
doubleTree.subsetProof [i] <== tập hợp conBằng chứng [i] ;
}
gốc === doubleTree.root; // Xác minh gốc ký gửi.
subsetRoot === doubleTree.subsetRoot; // Xác minh root cho phép.
rút tín hiệuMetadataSquare;
rútMetadataSquare <== rútMetadata * rútMetadata;
}
TLDR
Nhà phát triển ameen.eth kết hợp khái niệm "Proof-of-Innocence" với TornadoCash để đưa ra một hướng khác là "riêng tư không bằng phạm tội". Tác giả thấy thú vị khi sử dụng một ZKP khác để chứng minh một thực tế khác, điều này hơi giống với việc bổ sung ZKP. Cách sử dụng này sẽ đơn giản và hiệu quả hơn so với việc xây dựng một ZKP lớn hơn và phức tạp hơn. Về việc lựa chọn Allow Merkle Tree, tôi cảm thấy rằng nó sẽ được thi công bởi một đơn vị công bằng hơn trong tương lai, điều này sẽ thuyết phục người khác hơn.
Cuối cùng xin cảm ơn Chih-Cheng Liang và Ping Chen đã giúp duyệt bài và đưa ra những ý kiến quý báu!
> Tham khảo:
> Địa chỉ tàng hình
> Phân tích phiên bản Tornado Cash
> Giới thiệu về sự phát triển của ZKP và hợp đồng thông minh
> [ZKP Reading Club] TornadoCash
> Tiền mặt Tornado — Cách thức hoạt động | DeFi + Zero Knowledge Proof
> Hiểu biết sâu về các chi tiết kỹ thuật của TornadoCash
> 0xhhh Chủ đề giới thiệu các tính năng mới và nguyên tắc của chúng
> video giới thiệu
> Cuộc nói chuyện của Vitalik về cách cải thiện Tornadov2
> nhóm riêng tư v0tweet
> Giới thiệu Proof of Innocence được xây dựng trên TornadoCash