Multi-signature wallet — Gnosis Safe
Sejauh ini kontrak-kontrak latihanmu punya satu owner — satu private key yang, kalau bocor atau hilang, berarti kontrak lumpuh atau dikuasai penyerang. Untuk dana bernilai signifikan, ini risiko yang tidak bisa diterima institusi mana pun.
Intisari
- Safe (dulu Gnosis Safe) adalah smart contract wallet — bukan Externally Owned Account (EOA) biasa — yang membutuhkan N dari M tanda tangan pemilik sebelum transaksi dieksekusi.
- Kepemilikan kontrak (
Ownable/AccessControldari Fase 1) bisa dipindahkan ke address Safe, bukan ke satu EOA — sekarang aksi admin butuh persetujuan bersama. - Tanda tangan dikumpulkan off-chain dulu (lewat Safe Transaction Service API atau antarmuka Safe{Wallet}) sebelum transaksi akhirnya dikirim on-chain — hanya satu transaksi yang benar-benar dieksekusi, bukan N transaksi terpisah.
- Cocok untuk: treasury organisasi, kunci upgrade kontrak, penambahan/pencabutan role admin — kapan pun keputusan seharusnya butuh konsensus, bukan satu orang.
- Bukan pengganti KMS — keduanya dipakai bersama: tiap pemilik Safe idealnya menyimpan key-nya sendiri di HSM/KMS terpisah, supaya kompromi satu sistem tidak otomatis mengompromikan semua pemilik.
Masalah satu private key admin
Kontrak GoldToken di Fase 2 punya DEFAULT_ADMIN_ROLE yang bisa memberi dan mencabut
role apa pun. Kalau role itu dipegang satu address dengan satu private key, dua skenario buruk sama-sama
mungkin: private key itu bocor (penyerang menguasai seluruh sistem role), atau private key itu hilang
(tidak ada yang bisa lagi mengelola role sama sekali). Safe menyelesaikan keduanya sekaligus.
Cara kerja: kontrak sebagai "pemilik"
Safe sendiri adalah smart contract yang di-deploy dengan daftar owners (address EOA atau
kontrak lain) dan threshold (berapa banyak tanda tangan yang dibutuhkan). Transaksi apa pun
yang ingin dieksekusi atas nama Safe harus dikumpulkan tanda tangannya dulu dari cukup banyak
owner sebelum benar-benar dikirim.
Safe dengan 5 owner, threshold 3 ("3-of-5"):
├── Direktur teknologi
├── Direktur keuangan
├── Direktur operasional
├── Auditor independen
└── Key cadangan disimpan terpisah (cold storage)
Transaksi apa pun butuh persetujuan MINIMAL 3 dari 5 — satu key
bocor atau hilang TIDAK cukup untuk mengendalikan atau mengunci dana.
Memindahkan kepemilikan kontrak ke Safe
// Setelah deploy GoldToken (Fase 2) dan deploy Safe terpisah lewat
// antarmuka Safe{Wallet} atau SDK, pindahkan admin role ke address Safe:
goldToken.grantRole(DEFAULT_ADMIN_ROLE, alamatSafe);
goldToken.revokeRole(DEFAULT_ADMIN_ROLE, alamatDeployerAwal);
Setelah ini, tidak ada satu pun individu yang bisa sendirian mengubah role di GoldToken.
Setiap perubahan — menambah KYC officer baru, mencabut akses custodian yang keluar — butuh persetujuan
ambang batas yang sudah disepakati. Ini konsekuensi langsung dari pola onlyRole(DEFAULT_ADMIN_ROLE)
yang kamu tulis di Fase 1 dan 2: siapa pun yang memegang role admin (sekarang: Safe itu sendiri)
yang berkuasa, bukan siapa yang menulis kodenya.
Alur mengumpulkan tanda tangan
- Salah satu owner mengajukan transaksi (mis. "grant KYC_OFFICER_ROLE ke address baru") lewat antarmuka Safe{Wallet} atau SDK.
- Transaksi ini belum dikirim on-chain — baru tersimpan sebagai draft di Safe Transaction Service, menunggu tanda tangan.
- Owner lain login, meninjau detail transaksi (address, data yang dipanggil), lalu menandatangani secara off-chain.
- Begitu jumlah tanda tangan mencapai
threshold, siapa pun (owner atau relayer) bisa mengirim satu transaksi on-chain yang membawa seluruh tanda tangan terkumpul sekaligus.
| EOA biasa (1 private key) | Safe (N-of-M) | |
|---|---|---|
| Satu key bocor | Kontrol penuh langsung diambil alih | Tidak cukup — butuh threshold key |
| Satu key hilang | Kontrol atas kontrak hilang total | Owner lain masih bisa lanjut beroperasi |
| Perlu persetujuan berjenjang? | Tidak bisa | Bawaan lewat threshold |
| Biaya gas per transaksi | Lebih rendah | Sedikit lebih tinggi (verifikasi N tanda tangan on-chain) |
Latihan: deploy satu Safe testnet 2-of-3 lewat Safe{Wallet}
memakai tiga akun testnet-mu sendiri. Pindahkan DEFAULT_ADMIN_ROLE kontrak
GoldToken (Fase 2) ke address Safe itu, lalu ajukan transaksi grantRole dari satu
akun, tanda tangani dari akun kedua, dan verifikasi transaksinya baru benar-benar tereksekusi setelah
ambang batas terpenuhi.
Rangkuman ini sengaja dipangkas ke bagian yang dipakai di roadmap. Buka sumber aslinya saat kamu butuh detail lengkap atau referensi parameter.