Beberapa bulan yang lalu, tim kripto di a16z menerbitkan Tantangan Nakamoto, daftar masalah paling penting untuk dipecahkan di blockchain. Yang keempat secara khusus menarik perhatian kami: "Compliant Programmable Privacy", karena kami telah secara aktif memikirkan hal ini selama beberapa waktu. Hari ini, kami mengusulkan solusi pertama menggunakan enkripsi homomorfik dan protokol kontrak pintar rahasia fhEVM kami (jika Anda tidak terbiasa dengan fhEVM, Anda dapat membaca artikel kami tentang rahasia token ERC20danlelang buta.
fhEVM adalah EVM biasa dengan beberapa precompile yang memungkinkan komputasi pada status terenkripsi menggunakan perpustakaan enkripsi homomorfik TFHE-rs kami. Dari sudut pandang pengembang, tidak ada kriptografi yang terlibat: mereka hanya menulis kode Solidity menggunakan jenis data terenkripsi yang kami sediakan (euint32, ebool, dll). Salah satu keuntungan besar fhEVM dibandingkan dengan solusi privasi lainnya adalah bahwa semua data dan komputasi terjadi onchain. Ini berarti Anda dapat memiliki tingkat komposabilitas dan ketersediaan data yang sama seperti kontrak reguler, teks polos.
Properti ini adalah kunci untuk membangun privasi yang dapat diprogram, karena semua logika kontrol akses dapat ditentukan dalam kontrak itu sendiri. Tidak ada yang perlu dimasukkan secara kaku ke dalam protokol, dan tidak ada yang harus dilakukan pengguna di luar rantai untuk patuh. Aplikasi dapat menegakkan kepatuhan secara langsung, hanya dengan beberapa baris kode Solidity!
Dalam artikel ini, kami akan menunjukkan cara membangun token ERC20 yang patuh, menggunakan DIDs onchain. Kode sumber untuk tutorial ini dapat ditemukan di folder contoh dari repositori fhEVM.
Pengenal Terdesentralisasi (DID) adalah identitas digital unik yang dikeluarkan oleh entitas seperti pemerintah, pendaftar, perusahaan, atau pengguna itu sendiri. DID ini dapat dikaitkan dengan kunci kriptografi yang membuktikan pengguna memiliki DID, seperti dompet EVM. Tetapi juga dapat menyimpan sejumlah besar atribut, seperti usia pengguna, kebangsaan, nomor jaminan sosial, dll. Atribut-atribut ini pada gilirannya kemudian dapat digunakan untuk membuktikan bahwa Anda memenuhi beberapa kondisi (disebut "pengesahan"), seperti berusia di atas 18 tahun atau tidak menjadi warga negara Narnia.
Sebagian besar DIDs diimplementasikan oleh klien, dan menggunakan bukti pengetahuan nol untuk menghasilkan pernyataan. Meskipun hal ini baik dalam banyak kasus, namun menjadi rumit dengan cepat ketika Anda memiliki banyak pengguna yang terlibat dalam transaksi, ketika Anda harus menerapkan aturan kompleks pada DID, atau ketika Anda perlu mempertahankan seperangkat aturan umum untuk semua orang mengikuti. Ini pada dasarnya adalah tradeoff yang sama seperti dalam aplikasi edge vs cloud.
Namun, memiliki registri DID terpusat akan menyelesaikan masalah ini, karena Anda dapat meminta registri untuk memeriksa apakah semua orang patuh. Ini juga akan membuatnya lebih mudah untuk melacak peraturan, karena Anda hanya perlu menerapkannya di satu tempat. Blockchain akan menjadi infrastruktur yang sempurna untuk ini, karena akan memungkinkan komposabilitas antara DID dan aplikasi yang memerlukan kepatuhan, serta komposabilitas antara peraturan itu sendiri.
Masalah: semua orang akan melihat identitas semua orang!
Untungnya, kita memiliki solusi: enkripsi homomorfik, dan lebih khusus lagi fhEVM! Berkat kemampuan untuk memiliki komposabilitas pada status terenkripsi, kita dapat menyimpan DIDs pengguna langsung di rantai dalam bentuk terenkripsi, dan memiliki aplikasi yang patuh memverifikasi atribut menggunakan panggilan kontrak sederhana. Kemampuan untuk mengelola identitas melalui kontrak pintar, yang kita sebut 'Abstraksi Identitas', mirip dengan bagaimana seseorang dapat mengelola dana melalui kontrak pintar dengan Abstraksi Akun.
Tutorial ini terdiri dari 3 bagian:
Arsitektur Protokol DID Rahasia Onchain Kami
Kontrak IdentityRegistry adalah register DID pengguna yang diterbitkan oleh registrar dan mencakup seperangkat pengidentifikasi terenkripsi, seperti kewarganegaraan, usia, nomor kartu identitas, dll. Pengidentifikasi ini disimpan sebagai nilai 32 bit terenkripsi (euint32).
Kontrak juga menangani izin, seperti:
Sebagai langkah pertama, mari kita implementasikan logika untuk membuat dan mengelola DIDs:
Sekarang langkah berikutnya adalah mengimplementasikan logika untuk pengidentifikasi dan kontrol akses.
Pengenal hanyalah string (misalnya "tanggal lahir") dan nilai 32 bit terenkripsi. Itu dapat dibuat atau diperbarui hanya oleh registrar. Pengguna tidak dapat membuat ID mereka sendiri, karena kami ingin mereka disertifikasi oleh registrar.
Karena pengidentifikasi terenkripsi, pengguna perlu memberikan izin kepada kontrak untuk mengakses nilai-nilai tertentu, yang akan kami atasi melalui mekanisme kontrol akses sederhana yang mirip dengan cara Anda dapat mengizinkan kontrak untuk menghabiskan token ERC20 Anda.
kontrak IdentityRegistry adalah EIP712WithModifier, Ownable
Sekarang kita dapat menyelesaikan kontrak registri identitas kami dengan menambahkan getter yang diperlukan, dengan beberapa kondisi dan penanganan kesalahan.
kontrak IdentityRegistry adalah EIP712WithModifier, Ownable
Langkah selanjutnya adalah membuat kontrak regulasi kita.
Ketika mengimplementasikan seperangkat aturan untuk transfer antara dua individu, penting untuk menyadari bahwa aturan-aturan ini dapat berkembang seiring waktu. Memiliki kontrak pintar tunggal yang menentukan semua regulasi untuk konteks tertentu seperti transfer uang berarti bahwa kontrak ERC20 tidak perlu melacak regulasi itu sendiri. Pemerintah dapat dengan mudah memperbarui kontrak ini, dan secara otomatis akan menyebar ke semua token yang mengimplementasikannya.
Pada intinya, kontrak regulasi hanyalah sekumpulan kondisi yang dicocokkan dengan atribut identitas yang dienkripsi. Untuk menghindari penyalahgunaan, pengguna tidak akan langsung memberikan akses ke kontrak regulasi, tetapi lebih memilih memberikan akses ke kontrak token ERC20, yang kemudian melakukan panggilan delegasi ke kontrak regulasi. Pendekatan ini memastikan bahwa hanya kontrak ERC20, yang dipercayai oleh pengguna, yang dapat mengakses informasi mereka. Ingatlah bahwa baik pengirim maupun penerima harus memberikan izin kepada kontrak ERC20 sebelum transfer dapat terjadi di antara mereka.
Pada contoh ini, kami akan menerapkan beberapa aturan dasar:
Daripada kegagalan transaksi, yang dapat mengungkap informasi sensitif, kami akan hanya menetapkan jumlah transfer ke 0 jika salah satu kondisi tidak terpenuhi. Ini menggunakan operator ternary homomorfik yang disebut cmux: nilai = TFHE.cmux(encryptedCondition, valueIfTrue, valueIfFalse
Sekarang bahwa kami memiliki register identitas dan kontrak regulasi, kami akhirnya dapat membuat kontrak token yang patuh dan menjaga privasi. Kontrak ini akan disebut CompliantERC20 dan memiliki fitur kunci berikut:
Kontrak regulasi dipanggil melalui panggilan sederhana. Ini berarti bahwa pengguna harus memberikan akses ke kontrak ERC20 sebelum memulai transfer apa pun; jika tidak, transfer akan dikembalikan.
Akhirnya, sekarang kita dapat membuat kontrak ERC20 kita:
Sama seperti pengguna memberikan izin kepada protokol DeFi untuk menghabiskan token mereka, mereka akan perlu memberikan izin kepada kontrak untuk mengakses pengenal yang diperlukan oleh kontrak regulasi. Ini dilakukan melalui panggilan ke Identity.grantAccess(contractAddress, pengenal), yang dapat diambil dengan memanggil metode tampilan ERC20.identifiers(). Daftar ini berasal langsung dari kontrak ERC20Rules untuk memungkinkan pembaruan properti.
Semoga tutorial ini telah menunjukkan kepada Anda bahwa kepatuhan bukanlah hal yang sulit untuk dibangun jika alat-alat yang tepat tersedia. Ketika awalnya kami membangun fhEVM untuk memungkinkan privasi dalam blockchain, kami dengan cepat menyadari bahwa teknologi ini dapat digunakan untuk manajemen identitas dan dengan demikian kepatuhan yang dapat diprogram.
Rancangan yang diusulkandi sinijauh dari sempurna, tetapi kami percaya itu dapat dengan mudah ditingkatkan dan diluncurkan sebagai kasus penggunaan dunia nyata, sehingga kepatuhan tidak lagi harus menjadi sinonim dari surveilans!
Beberapa bulan yang lalu, tim kripto di a16z menerbitkan Tantangan Nakamoto, daftar masalah paling penting untuk dipecahkan di blockchain. Yang keempat secara khusus menarik perhatian kami: "Compliant Programmable Privacy", karena kami telah secara aktif memikirkan hal ini selama beberapa waktu. Hari ini, kami mengusulkan solusi pertama menggunakan enkripsi homomorfik dan protokol kontrak pintar rahasia fhEVM kami (jika Anda tidak terbiasa dengan fhEVM, Anda dapat membaca artikel kami tentang rahasia token ERC20danlelang buta.
fhEVM adalah EVM biasa dengan beberapa precompile yang memungkinkan komputasi pada status terenkripsi menggunakan perpustakaan enkripsi homomorfik TFHE-rs kami. Dari sudut pandang pengembang, tidak ada kriptografi yang terlibat: mereka hanya menulis kode Solidity menggunakan jenis data terenkripsi yang kami sediakan (euint32, ebool, dll). Salah satu keuntungan besar fhEVM dibandingkan dengan solusi privasi lainnya adalah bahwa semua data dan komputasi terjadi onchain. Ini berarti Anda dapat memiliki tingkat komposabilitas dan ketersediaan data yang sama seperti kontrak reguler, teks polos.
Properti ini adalah kunci untuk membangun privasi yang dapat diprogram, karena semua logika kontrol akses dapat ditentukan dalam kontrak itu sendiri. Tidak ada yang perlu dimasukkan secara kaku ke dalam protokol, dan tidak ada yang harus dilakukan pengguna di luar rantai untuk patuh. Aplikasi dapat menegakkan kepatuhan secara langsung, hanya dengan beberapa baris kode Solidity!
Dalam artikel ini, kami akan menunjukkan cara membangun token ERC20 yang patuh, menggunakan DIDs onchain. Kode sumber untuk tutorial ini dapat ditemukan di folder contoh dari repositori fhEVM.
Pengenal Terdesentralisasi (DID) adalah identitas digital unik yang dikeluarkan oleh entitas seperti pemerintah, pendaftar, perusahaan, atau pengguna itu sendiri. DID ini dapat dikaitkan dengan kunci kriptografi yang membuktikan pengguna memiliki DID, seperti dompet EVM. Tetapi juga dapat menyimpan sejumlah besar atribut, seperti usia pengguna, kebangsaan, nomor jaminan sosial, dll. Atribut-atribut ini pada gilirannya kemudian dapat digunakan untuk membuktikan bahwa Anda memenuhi beberapa kondisi (disebut "pengesahan"), seperti berusia di atas 18 tahun atau tidak menjadi warga negara Narnia.
Sebagian besar DIDs diimplementasikan oleh klien, dan menggunakan bukti pengetahuan nol untuk menghasilkan pernyataan. Meskipun hal ini baik dalam banyak kasus, namun menjadi rumit dengan cepat ketika Anda memiliki banyak pengguna yang terlibat dalam transaksi, ketika Anda harus menerapkan aturan kompleks pada DID, atau ketika Anda perlu mempertahankan seperangkat aturan umum untuk semua orang mengikuti. Ini pada dasarnya adalah tradeoff yang sama seperti dalam aplikasi edge vs cloud.
Namun, memiliki registri DID terpusat akan menyelesaikan masalah ini, karena Anda dapat meminta registri untuk memeriksa apakah semua orang patuh. Ini juga akan membuatnya lebih mudah untuk melacak peraturan, karena Anda hanya perlu menerapkannya di satu tempat. Blockchain akan menjadi infrastruktur yang sempurna untuk ini, karena akan memungkinkan komposabilitas antara DID dan aplikasi yang memerlukan kepatuhan, serta komposabilitas antara peraturan itu sendiri.
Masalah: semua orang akan melihat identitas semua orang!
Untungnya, kita memiliki solusi: enkripsi homomorfik, dan lebih khusus lagi fhEVM! Berkat kemampuan untuk memiliki komposabilitas pada status terenkripsi, kita dapat menyimpan DIDs pengguna langsung di rantai dalam bentuk terenkripsi, dan memiliki aplikasi yang patuh memverifikasi atribut menggunakan panggilan kontrak sederhana. Kemampuan untuk mengelola identitas melalui kontrak pintar, yang kita sebut 'Abstraksi Identitas', mirip dengan bagaimana seseorang dapat mengelola dana melalui kontrak pintar dengan Abstraksi Akun.
Tutorial ini terdiri dari 3 bagian:
Arsitektur Protokol DID Rahasia Onchain Kami
Kontrak IdentityRegistry adalah register DID pengguna yang diterbitkan oleh registrar dan mencakup seperangkat pengidentifikasi terenkripsi, seperti kewarganegaraan, usia, nomor kartu identitas, dll. Pengidentifikasi ini disimpan sebagai nilai 32 bit terenkripsi (euint32).
Kontrak juga menangani izin, seperti:
Sebagai langkah pertama, mari kita implementasikan logika untuk membuat dan mengelola DIDs:
Sekarang langkah berikutnya adalah mengimplementasikan logika untuk pengidentifikasi dan kontrol akses.
Pengenal hanyalah string (misalnya "tanggal lahir") dan nilai 32 bit terenkripsi. Itu dapat dibuat atau diperbarui hanya oleh registrar. Pengguna tidak dapat membuat ID mereka sendiri, karena kami ingin mereka disertifikasi oleh registrar.
Karena pengidentifikasi terenkripsi, pengguna perlu memberikan izin kepada kontrak untuk mengakses nilai-nilai tertentu, yang akan kami atasi melalui mekanisme kontrol akses sederhana yang mirip dengan cara Anda dapat mengizinkan kontrak untuk menghabiskan token ERC20 Anda.
kontrak IdentityRegistry adalah EIP712WithModifier, Ownable
Sekarang kita dapat menyelesaikan kontrak registri identitas kami dengan menambahkan getter yang diperlukan, dengan beberapa kondisi dan penanganan kesalahan.
kontrak IdentityRegistry adalah EIP712WithModifier, Ownable
Langkah selanjutnya adalah membuat kontrak regulasi kita.
Ketika mengimplementasikan seperangkat aturan untuk transfer antara dua individu, penting untuk menyadari bahwa aturan-aturan ini dapat berkembang seiring waktu. Memiliki kontrak pintar tunggal yang menentukan semua regulasi untuk konteks tertentu seperti transfer uang berarti bahwa kontrak ERC20 tidak perlu melacak regulasi itu sendiri. Pemerintah dapat dengan mudah memperbarui kontrak ini, dan secara otomatis akan menyebar ke semua token yang mengimplementasikannya.
Pada intinya, kontrak regulasi hanyalah sekumpulan kondisi yang dicocokkan dengan atribut identitas yang dienkripsi. Untuk menghindari penyalahgunaan, pengguna tidak akan langsung memberikan akses ke kontrak regulasi, tetapi lebih memilih memberikan akses ke kontrak token ERC20, yang kemudian melakukan panggilan delegasi ke kontrak regulasi. Pendekatan ini memastikan bahwa hanya kontrak ERC20, yang dipercayai oleh pengguna, yang dapat mengakses informasi mereka. Ingatlah bahwa baik pengirim maupun penerima harus memberikan izin kepada kontrak ERC20 sebelum transfer dapat terjadi di antara mereka.
Pada contoh ini, kami akan menerapkan beberapa aturan dasar:
Daripada kegagalan transaksi, yang dapat mengungkap informasi sensitif, kami akan hanya menetapkan jumlah transfer ke 0 jika salah satu kondisi tidak terpenuhi. Ini menggunakan operator ternary homomorfik yang disebut cmux: nilai = TFHE.cmux(encryptedCondition, valueIfTrue, valueIfFalse
Sekarang bahwa kami memiliki register identitas dan kontrak regulasi, kami akhirnya dapat membuat kontrak token yang patuh dan menjaga privasi. Kontrak ini akan disebut CompliantERC20 dan memiliki fitur kunci berikut:
Kontrak regulasi dipanggil melalui panggilan sederhana. Ini berarti bahwa pengguna harus memberikan akses ke kontrak ERC20 sebelum memulai transfer apa pun; jika tidak, transfer akan dikembalikan.
Akhirnya, sekarang kita dapat membuat kontrak ERC20 kita:
Sama seperti pengguna memberikan izin kepada protokol DeFi untuk menghabiskan token mereka, mereka akan perlu memberikan izin kepada kontrak untuk mengakses pengenal yang diperlukan oleh kontrak regulasi. Ini dilakukan melalui panggilan ke Identity.grantAccess(contractAddress, pengenal), yang dapat diambil dengan memanggil metode tampilan ERC20.identifiers(). Daftar ini berasal langsung dari kontrak ERC20Rules untuk memungkinkan pembaruan properti.
Semoga tutorial ini telah menunjukkan kepada Anda bahwa kepatuhan bukanlah hal yang sulit untuk dibangun jika alat-alat yang tepat tersedia. Ketika awalnya kami membangun fhEVM untuk memungkinkan privasi dalam blockchain, kami dengan cepat menyadari bahwa teknologi ini dapat digunakan untuk manajemen identitas dan dengan demikian kepatuhan yang dapat diprogram.
Rancangan yang diusulkandi sinijauh dari sempurna, tetapi kami percaya itu dapat dengan mudah ditingkatkan dan diluncurkan sebagai kasus penggunaan dunia nyata, sehingga kepatuhan tidak lagi harus menjadi sinonim dari surveilans!