Jelaskan prinsip desain Tornado Cash V2 secara detail

> Pengembang ameen.eth menggabungkan konsep "Proof-of-Innocence" dengan Tornado Cash untuk memberikan arahan lain bahwa "privasi tidak sama dengan kejahatan".

Ditulis oleh: Albert Lin

Kata Pengantar

TornadoCash adalah layanan transaksi anonim terkenal di dunia cryptocurrency. TornadoCash menggunakan teknologi ZKP (Zero-Knowledge Proof) untuk menyembunyikan sumber dana. Pemerintah A.S. berargumen bahwa mekanisme semacam itu memfasilitasi aktivitas aliran keuangan ilegal, dan akhirnya disetujui oleh Departemen Keuangan A.S. pada Agustus 2022 dan dipaksa untuk menghapusnya. Perlindungan privasi dan pencucian uang sepertinya selalu berjalan seiring dalam banyak kasus. Saat mengejar privasi, penjahat sering menggunakan fitur privasi ini untuk mencuci dana ilegal. Dapatkah ditemukan cara yang memungkinkan orang memiliki privasi sambil secara efektif mengekang pencucian uang? Privacy-Pools oleh ameen.eth, pengembang awal TornadoCash, dapat memberikan arahan. (Hanya situs web front-end dan Repositori GitHub yang terpengaruh untuk bagian penghapusan, dan bagian kontrak tidak terpengaruh karena ada di blockchain. Terakhir, GitHub memulihkan Repositori di bawah upaya Electronic Frontier Foundation. Untuk detailnya, silakan lihat di sini)

Pendahuluan prinsip TornadoCash

Sebelum memperkenalkan Privacy-Pools, Anda perlu memahami prinsip desain yang terkait dengan TornadoCash. Untuk pengenalan detailnya, silakan merujuk ke artikel saya sebelumnya "Menghancurkan TornadoCash: Panduan Pemula untuk Menjelaskan Fungsinya kepada Teman". Berikut ulasan singkat tentang prinsip desain TornadoCash.

TornadoCash menggunakan tanda terima (komitmen) untuk mengontrol akses. Tanda terima dihasilkan dengan hashing rahasia (nilai rahasia) dan nullifier (kode logout), dan setiap tanda terima hanya dapat ditarik satu kali. Gunakan Merkle Tree (hash tree) untuk mencatat informasi deposit, gunakan tanda terima sebagai leaf node dan hitung Merkle Root (hash tree root). Pengguna hanya perlu memberikan data dari daun ke akar untuk membuktikan apakah data tersebut merupakan salah satu daun Pohon Merkle, dan secara tidak langsung membuktikan bahwa ada dana deposit ke TornadoCash sebelumnya. Gunakan Zero-Knowledge Proof untuk menyembunyikan sumber deposit, dan gunakan nullifier untuk mencegah serangan Double Withdrawal.

Tanda terima TornadoCash memiliki dua arti

  • Bukti bahwa pengirim telah menyetor dana sebelumnya
  • Pastikan setiap penerima hanya dapat mengklaim dana satu kali

「Bukti-Tidak Bersalah」

Sesuai dengan prinsip desain TornadoCash, hanya dapat diketahui bahwa dana yang diterima harus berasal dari deposit sebelumnya, tetapi tidak diketahui dari mana deposit itu berasal. Inilah tujuan utama penjahat menggunakan TornadoCash untuk kegiatan pencucian uang ilegal, dan juga alasan mengapa pemerintah AS mengatur TornadoCash. Jika kita dapat mengajukan Bukti lain (ZKP) untuk membuktikan bahwa dana yang diterima bukan dari simpanan pada daftar penolakan, apakah dapat membuktikan bahwa pembayaran itu bukan dari penjahat, ini adalah "Bukti Tidak Bersalah" ("Bukti Kesalahpahaman"). kepolosan") konsep inti.

Konsep "Proof-of-Innocence" dapat dibagi menjadi dua arah

  • Bukti bahwa dana yang diterima berasal dari kumpulan dana yang disetorkan dalam daftar yang diperbolehkan (allowed list)
  • Bukti bahwa dana yang ditarik bukan berasal dari setor dana pada daftar tolak (reject list)

Kedua cara ini dapat membuktikan bahwa penarikan dana bukan dari deposito dalam daftar penolakan. Pendekatan pada gambar di bawah ini adalah dengan menggunakan daftar penolakan untuk membuktikan bahwa dana yang diterima tidak berasal dari simpanan (merah) dalam daftar penolakan.

sumber:

Prinsip desain Privacy-Pools

Privacy-Pools menambahkan konsep "Proof-of-Innocence" ke TornadoCash. Selain arti asli dari tanda terima TorandoCash, tanda terima pembayaran Privacy-Pools memiliki arti ketiga: "untuk membuktikan bahwa dana yang diterima berasal dari simpanan dalam daftar yang diperbolehkan".

Tanda terima Privacy-Pools berarti:

  • Bukti bahwa pengirim telah menyetor dana sebelumnya
  • Pastikan setiap penerima hanya dapat mengklaim dana satu kali
  • Bukti bahwa dana yang akan ditarik berasal dari simpanan dalam daftar yang diperbolehkan

Di sini kami menggunakan Allow Merkle Tree untuk menjelaskan bagaimana Privacy-Pools menggunakan "Proof-of-Innocence" dalam sistem ini (Allow Merkle Tree adalah konsep penggunaan daftar izin). Pertama-tama, Allow Merkle Tree memiliki beberapa karakteristik

  • Izinkan Pohon Merkle sesuai namanya adalah Pohon Merkle
  • Tinggi pohon dan jumlah simpul sama dengan Pohon Deposit Merkle dari Privacy-Pools. *Semua daun Allow Merkle Tree sesuai dengan posisi daun Deposit Merkle Tree (deposit).

Izinkan data daun Pohon Merkle dapat dibagi menjadi dua kategori berikut:

*boleh: Menunjukkan bahwa setoran di lokasi ini diperbolehkan. (Posisi yang belum disetor juga diperbolehkan secara default)

  • diblokir : Menandakan bahwa deposit di lokasi ini ditolak.

Seperti yang ditunjukkan pada gambar di bawah, posisi indeks 0 dan 1 keduanya merupakan dana legal di Deposit Merkle Tree, dan posisi yang sesuai dari daun Allow Merkle Tree juga diperbolehkan.

Dengan asumsi bahwa hari ini seorang penjahat ingin melakukan kegiatan pencucian uang, ia menyetorkan dana ilegal yang diperoleh setelah serangan itu ke dalam Privacy-Pools, dan lokasi penyimpanannya adalah indeks Deposit Merkle Tree: 2. Kami tahu bahwa ini adalah dana ilegal, jadi kami memperbaruinya untuk diblokir pada posisi indeks Allow Merkle Tree: 2 yang sesuai.

Situasi Pengumpulan Daftar Izin

Dengan asumsi bahwa hari ini, pengguna yang menyetor dalam daftar yang diizinkan pemerintah AS ingin menarik dana, dia perlu memberikan "bukti bahwa setoran ada di Dposit Merkle Tree" dan "bukti bahwa yang ada di daftar yang diizinkan AS Diizinkan". Bukti yang sesuai dengan daftar izin AS mencakup Izinkan Merkle Root (disediakan oleh pengguna, subetRoot dalam kode) dan nilai simpul yang akan diteruskan di jalan. Ketika Privacy-Pools memverifikasi tahap ZKP, itu akan menggunakan nilai daun sebagaimana diizinkan (keccak256(diizinkan) dalam kode aktual) dan nilai node yang diberikan untuk dilewati untuk membangun Merkle Root. Verifikasi bahwa Root Merkle ini sama dengan Izinkan Root Merkle yang disediakan oleh pengguna. Jika verifikasi dari perwakilan yang sama lolos, berarti dana penarikan berasal dari deposit yang ada dalam daftar izin pemerintah AS.

Situasi Pengumpulan Daftar Penolakan

Hari ini, pengguna yang tidak termasuk dalam daftar yang diizinkan pemerintah AS ingin menarik dana, dan lokasi setoran terkait ditandai sebagai diblokir dalam daftar yang diizinkan pemerintah AS. Ini akan menyebabkan pengguna tidak dapat menggunakan Izinkan Merkle Root dari daftar izin pemerintah AS untuk menarik dana, karena bukti yang sesuai tidak dapat dibuat dan verifikasi akan gagal (karena Privacy-Pools menggunakan nilai yang diizinkan untuk dilakukan oleh daun perhitungan, dan daftar izin pemerintah AS akan menjadi Lokasi ditandai sebagai diblokir, jadi Merkle Root yang sama tidak dapat dihitung).

Desain seperti itu memaksa pengguna untuk memberikan Allow Merkle Root lain untuk menarik dana ( Allow Merkle Tree lain perlu menandai lokasi penyimpanan yang diizinkan untuk menghitung Allow Merkle Root yang sama untuk lulus verifikasi). Pohon Izinkan Merkle lain ini dapat dikelola oleh pemerintah atau lembaga lain, atau bahkan dibuat oleh pengguna ini sendiri. Saat ini, pemerintah AS dapat menggunakan Izinkan Merkle Root yang digunakan saat penarikan untuk menentukan apakah dana pengguna mematuhi undang-undang dan peraturan pemerintah AS, untuk mencapai tujuan pelacakan. Jika pengguna menggunakan Allow Merkle Tree yang dibuat sendiri atau tidak kredibel, pada dasarnya dana penarikan sangat mungkin berasal dari deposit yang bermasalah (setiap Allow Merkle Tree pihak ketiga yang kredibel menandai lokasi deposit sebagai diblokir).

Pertanyaan yang Sering Diajukan

**Q: Jika Allowroot disediakan oleh withdraw, apakah Allow Merkle Root palsu dapat dipalsukan untuk membuktikan bahwa leaf tersebut merupakan deposit dalam daftar yang diizinkan, apakah itu berarti uangnya masih dapat diambil? **

A: Jawabannya ya, uangnya memang bisa dibawa pergi. Penulis secara khusus menunjukkan bahwa mekanisme seperti itu bukan untuk mencegah para penjahat mengambil uang itu, tetapi bahkan jika mereka dapat mengambilnya, akan diketahui bahwa dana tersebut adalah dana dalam daftar penolakan. Ketika penarikan memberikan Izin Merkle Root yang tidak meyakinkan, pada dasarnya dapat dianggap sebagai penarikan dari daftar penolakan. Penulis menduga bahwa alasan mengizinkan ini adalah untuk mempertahankan sifat terdesentralisasi dari layanan ini. Karena setiap Izinkan Pohon Merkle memerlukan manajemen otoritas tertentu untuk memperbarui status setiap daun. Jika suatu izin akar pohon bersifat wajib, berarti seseorang memiliki kewenangan tertentu untuk mengontrol penarikan dana, yang tidak sejalan dengan semangat desentralisasi.

**T: Siapa yang akan memutuskan apakah transaksi berasal dari dana daftar tolak? **

J: Bagian yang saya lihat tidak disebutkan secara spesifik, dan pemahaman saya adalah bahwa bagian ini harus dilakukan oleh masing-masing badan pengawas. Dengan asumsi bahwa hari ini pemerintah AS ingin memeriksa uang kotor Privacy-Pools, dia dapat memeriksa apakah dia adalah uang kotor dengan mencentang Allow Merkle Root dari setiap transaksi. Adapun jenis Izinkan Merkle Root apa yang diizinkan, masing-masing badan pengatur menilai sendiri.

Kode Privacy-Pools

Kode utama dan komentar penulis sendiri dilampirkan di sini, berharap dapat membantu semua orang memahami logika utama melalui kode tersebut.

// sirkuit/penarikan_dari_subset.circom

templat WithdrawFromSubset(tingkat, nilai yang diharapkan) {

// publik

akar input sinyal;

subset input sinyalRoot;

pembatal input sinyal;

input asetMetadata sinyal; // abi.encode(token, jumlah).snarkHash();

sinyal masukan penarikanMetadata; // abi.encode(penerima, pengembalian uang, penyalur, biaya).snarkHash();

// pribadi

rahasia input sinyal;

jalur input sinyal; // Tunjukkan apakah data mewakili daun kiri atau daun kanan.

input sinyal bukti utama [levels] ; // Bangun data yang diperlukan untuk deposit root.

subset input sinyalBukti [levels] ; // Bangun data yang diperlukan untuk mengizinkan root.

// Hitung nullifier dan komitmen.

hasher komponen = CommitmentNullifierHasher();

hasher.rahasia <== rahasia;

hash.jalur <== jalur;

hasher.assetMetadata <== asetMetadata;

nullifier === hasher.nullifier;

// Nilai yang diharapkan: keccak256("diizinkan") % p

komponen doubleTree = DoubleMerkleProof(levels, expectedValue);

doubleTree.daun <== hasher.komitmen;

// Ubah jalur menjadi bit untuk menentukan apakah itu daun kiri atau daun kanan.

// Dapat diamati bahwa pohon deposit dan pohon izin berbagi jalur yang sama.

doubleTree.path <== jalur;

untuk ( i = 0; i < level; i++) {

doubleTree.mainProof [i] <== bukti utama [i] ;

doubleTree.subsetProof [i] <== subsetProof [i] ;

}

root === doubleTree.root; // Verifikasi root deposit.

subsetRoot === doubleTree.subsetRoot; // Verifikasi izin root.

penarikan sinyalMetadataSquare;

withdrawMetadataSquare <== withdrawMetadata * withdrawMetadata;

}

##TLDR

  • "Bukti Tidak Bersalah" adalah dengan menggunakan Bukti lain untuk membuktikan bahwa pembayaran berasal dari setoran dalam daftar yang diizinkan. "Proof-of-Innocence" dapat dibangun dari dua perspektif: daftar yang diizinkan dan daftar yang ditolak.
  • Privacy-Pools melapiskan konsep "Proof-of-Innocence" berdasarkan TornadoCash. Tanda terima asli mewakili arti ketiga: "Bukti bahwa dana yang diterima berasal dari simpanan dalam daftar yang diizinkan."
  • Adanya Pohon Izinkan Merkle dapat membuktikan bahwa penarikan dana ada dalam daftar yang diizinkan. Posisi daun Pohon Merkle Izinkan sesuai dengan posisi daun deposit Pohon Merkle Deposit. Izinkan data daun Pohon Merkle diizinkan dan diblokir.
  • Selain informasi yang diperlukan untuk membuat Deposit Merkle Root, penerima juga perlu memberikan informasi Allow Merkle Root dan konstruksi Allow Merkle Root untuk membuktikan bahwa penarikan dana ada dalam daftar yang diizinkan.
  • Karena Allow Merkle Root disediakan oleh penerima, penjahat masih memiliki cara untuk mengambil dana ilegal melalui Allow Merkle Root palsu. Izinkan Merkle Root palsu masih akan muncul di rantai dan dianggap oleh orang lain sebagai keraguan tentang penerimaan uang, untuk melacak aliran dana ilegal.

Pengembang ameen.eth menggabungkan konsep "Proof-of-Innocence" dengan TornadoCash untuk memberikan arahan lain bahwa "privacy is not equal to crime". Penulis merasa menarik untuk menggunakan ZKP lain untuk membuktikan fakta lain, yang mirip dengan penambahan ZKP. Cara penggunaan ini akan lebih sederhana dan lebih efisien daripada membangun ZKP yang lebih besar dan kompleks. Mengenai pilihan Izinkan Pohon Merkle, saya rasa ini akan dibangun oleh unit yang lebih adil di masa mendatang, yang akan lebih persuasif kepada orang lain.

Terakhir, terima kasih kepada Chih-Cheng Liang dan Ping Chen yang telah membantu meninjau artikel dan memberikan pendapat yang berharga!

> Referensi:

> Alamat Stealth

> Analisis contoh Tornado Cash

> Pengantar pengembangan ZKP dan kontrak pintar

> [Klub Baca ZKP] TornadoCash

> Tornado Cash — Cara Kerjanya | DeFi + Nol Bukti Pengetahuan

> Pemahaman mendalam tentang detail teknis TornadoCash

> 0xhhh Utas memperkenalkan fitur baru dan prinsipnya

> video demo

> Pembicaraan Vitalik tentang cara meningkatkan Tornadov2

> kumpulan privasi v0tweet

> Memperkenalkan Bukti Tidak Bersalah yang dibangun di atas TornadoCash

Lihat Asli
Konten ini hanya untuk referensi, bukan ajakan atau tawaran. Tidak ada nasihat investasi, pajak, atau hukum yang diberikan. Lihat Penafian untuk pengungkapan risiko lebih lanjut.
  • Hadiah
  • Komentar
  • Bagikan
Komentar
0/400
Tidak ada komentar
  • Sematkan
Perdagangkan Kripto Di Mana Saja Kapan Saja
qrCode
Pindai untuk mengunduh aplikasi Gate.io
Komunitas
Indonesia
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)