
Tanda tangan permit: persetujuan yang bukan transaksi
Persetujuan token on-chain adalah sebuah transaksi: Anda membayar gas, dan sebuah kontrak mendapat hak untuk memindahkan token Anda. Persetujuan token menjelaskan mengapa izin semacam itu tetap berlaku lama setelah Anda melupakannya.
Tanda tangan permit memberikan jenis izin yang sama tanpa transaksi apa pun. Tanpa gas, tanpa jejak di riwayat — hanya tombol "Tandatangani". Justru karena itulah teknik ini menjadi favorit para drainer.
Apa itu permit
Permit adalah pesan off-chain, dalam format data bertipe standar EIP-712, yang menyatakan: "Saya mengizinkan alamat ini membelanjakan hingga jumlah ini dari token ini, sampai waktu ini." Anda menandatanganinya, bukan mengirimkannya. Siapa pun yang memegang tanda tangan itu dapat mengirimkannya sendiri ke blockchain nanti, membayar gasnya, dan izin pun berlaku.
Ada dua bentuk yang umum:
- Permit EIP-2612. Tertanam di dalam kontrak token itu sendiri (banyak stablecoin dan token baru mendukungnya). Token memeriksa tanda tangan dan mencatat izin belanja biasa — persis seolah Anda mengirim transaksi
approve. - Permit2 dari Uniswap. Kontrak terpisah yang dipakai banyak aplikasi untuk ERC-20 apa pun. Anda menyetujui Permit2 sekali secara on-chain, sering kali untuk jumlah tak terbatas; setelah itu, aplikasi mendapat akses lewat pesan Permit2 yang ditandatangani, dan izin tersebut tersimpan di dalam Permit2, bukan di token.
Keduanya menghemat satu transaksi dan memungkinkan aplikasi menggabungkan "setujui lalu tukar" dalam satu langkah. Masalahnya adalah bagaimana sebuah tanda tangan terasa: permintaan transaksi tampak seperti uang yang berpindah, sedangkan permintaan tanda tangan tampak seperti login.
Mengapa drainer menyukainya
Halaman airdrop, mint, atau "klaim" palsu meminta Anda menghubungkan dompet, lalu menampilkan permintaan tanda tangan. Anda menandatangani, sepertinya tidak terjadi apa-apa, lalu Anda menutup tab. Beberapa menit kemudian penyerang mengirimkan permit Anda, menjadikan alamatnya sebagai spender, lalu memanggil transferFrom untuk mengambil token. Anda tidak pernah mengirim transaksi, tidak ada peringatan gas dan tidak ada yang bisa dibatalkan, tetapi saldo Anda lenyap.
Kolom yang penting
Jika muncul permintaan data bertipe, cari kolom-kolom ini di bagian message:
- spender — siapa yang menerima hak membelanjakan. Jika itu alamat yang tidak Anda kenal, bukan kontrak aplikasi yang sudah dikenal, berhenti.
- value (atau amount) — berapa banyak. Angka raksasa seperti
115792089237316195423570985008687907853269984665640564039457584007913129639935berarti tak terbatas. - deadline (atau expiration / sigDeadline) — sampai kapan tanda tangan bisa dipakai. Tenggat bertahun-tahun ke depan adalah tanda bahaya.
- nonce — penghitung agar setiap tanda tangan hanya berfungsi sekali. Nonce tidak membuat permit menjadi aman.
domain.name dan verifyingContract menunjukkan token mana (atau Permit2) yang berlaku, dan primaryType membuka kedoknya: Permit, PermitSingle, PermitBatch, dan PermitTransferFrom semuanya adalah izin membelanjakan.
Halaman "login" yang meminta data bertipe
Permintaan login yang asli biasanya berupa pesan teks biasa yang menyebut situs, alamat Anda, dan sebuah nonce; menandatangani pesan menjelaskan apa yang dibuktikannya. Login tidak punya alasan untuk memuat kontrak token, spender, jumlah, atau tenggat.
Jadi, jika sebuah halaman berkata "login untuk melanjutkan" atau "verifikasi dompet Anda" dan permintaannya berupa data bertipe terstruktur dengan primaryType mirip Permit, anggap itu permintaan persetujuan yang menyamar sebagai login. Tolak.
Mencabut permit
Tergantung apakah tanda tangan sudah digunakan:
- Permit EIP-2612 yang sudah dipakai — kini menjadi izin on-chain biasa di token. Cabut seperti persetujuan lainnya, dengan mengaturnya ke nol. Mencabut persetujuan token dari SSP menjelaskan cara memeriksa dan menghapusnya.
- Izin Permit2 — tersimpan di kontrak Permit2. Mencabut persetujuan token untuk Permit2 memutus semua aplikasi yang bergantung padanya; alat pencabutan yang memahami Permit2 juga dapat menghapus spender satu per satu.
- Sudah ditandatangani tetapi belum dipakai — tanda tangan tetap berlaku sampai tenggatnya atau sampai nonce-nya terpakai. Tanda tangan bisa dibatalkan dengan memakai nonce tersebut lebih dulu secara on-chain (untuk EIP-2612, dengan mengirim permit tak berbahaya milik Anda sendiri; Permit2 punya fungsi untuk membatalkan nonce), tetapi itu adalah perlombaan melawan pihak yang sudah memegang tanda tangan. Memindahkan token ke alamat yang aman sering kali lebih cepat. Pertahanan yang andal adalah tidak menandatangani sejak awal.
Cara SSP menangani data bertipe
Akun EVM SSP adalah smart account ERC-4337 yang disetujui oleh dua perangkat, dan ini mengubah gambarannya.
Apa yang Anda lihat. Mulai SSP Wallet dan SSP Key 2.2.0, permintaan data bertipe (melalui WalletConnect) menampilkan situs peminta, alamat dan jaringan Anda, nama domain, kontrak pemverifikasi, dan primaryType, dengan data EIP-712 lengkap di bawahnya. Jika permintaan tampak seperti persetujuan token — Permit, Permit2, dan tipe serupa — kedua aplikasi menyatakannya dengan jelas: menandatanganinya mengizinkan spender memindahkan token dari alamat ini tanpa konfirmasi lagi. Order trading dan marketplace mendapat peringatan tersendiri. Bagaimanapun juga, Anda harus mencentang pernyataan sebelum bisa menyetujui, dan kedua perangkat harus menyetujui sebelum apa pun ditandatangani.
Apakah permit berfungsi. Sebagian besar permit EIP-2612 diperiksa dengan ecrecover, yang hanya bekerja untuk alamat biasa dengan satu kunci, sehingga smart account seperti brankas EVM SSP tidak dapat memenuhinya. Kontrak yang menerima tanda tangan smart account — termasuk Permit2 — meminta akun itu sendiri untuk mengonfirmasi tanda tangan, dan mulai 2.2.0 SSP menandatangani data bertipe atas hash EIP-712 standar, sehingga pemeriksaan itu lolos. Dengan kata lain, permit yang ditandatangani di SSP dapat dipakai, oleh aplikasi yang Anda maksud maupun oleh siapa pun yang memegang tanda tangan tersebut. Perlakukan setiap permintaan data bertipe seolah-olah akan berhasil, karena memang akan berhasil.
Ringkasan jujur
Permit adalah persetujuan yang dikirim dalam bentuk tanda tangan: gratis, senyap, dan sepenuhnya mampu mengosongkan saldo begitu seseorang mengirimkannya. Baca spender, jumlah, dan tenggat sebelum menandatangani, curigai setiap "login" yang memuatnya, dan cabut izin — di token atau di Permit2 — yang tidak lagi Anda perlukan.
Persetujuan dua perangkat di SSP memberi Anda pemeriksaan kedua, dan mulai 2.2.0 kedua aplikasi menandai permit dan order sebelum Anda menandatangani — tetapi peringatan tidak bisa membedakan aplikasi tepercaya dari drainer. Membaca, dan memutuskan, tetap tugas Anda.


