Memverifikasi kontrak pintar
Pembaruan terakhir halaman: 22 Oktober 2025
Kontrak pintar dirancang untuk menjadi "trustless" (tanpa perlu kepercayaan), yang berarti pengguna tidak perlu mempercayai pihak ketiga (misalnya, pengembang dan perusahaan) sebelum berinteraksi dengan sebuah kontrak. Sebagai syarat untuk menjadi trustless, pengguna dan pengembang lain harus dapat memverifikasi kode sumber kontrak pintar. Verifikasi kode sumber meyakinkan pengguna dan pengembang bahwa kode kontrak yang dipublikasikan adalah kode yang sama yang berjalan di alamat kontrak pada blockchain Ethereum.
Penting untuk membedakan antara "verifikasi kode sumber" dan "verifikasi formal". Verifikasi kode sumber, yang akan dijelaskan secara rinci di bawah ini, mengacu pada verifikasi bahwa kode sumber yang diberikan dari sebuah kontrak pintar dalam bahasa tingkat tinggi (misalnya, Solidity) dikompilasi menjadi bytecode yang sama untuk dieksekusi di alamat kontrak. Namun, verifikasi formal menjelaskan verifikasi kebenaran sebuah kontrak pintar, yang berarti kontrak tersebut berperilaku seperti yang diharapkan. Meskipun bergantung pada konteks, verifikasi kontrak biasanya mengacu pada verifikasi kode sumber.
Apa itu verifikasi kode sumber?
Sebelum menerapkan kontrak pintar di Mesin Virtual Ethereum (EVM), pengembang mengkompilasi kode sumber kontrak—instruksi yang ditulis dalam Solidity atau bahasa pemrograman tingkat tinggi lainnya—menjadi bytecode. Karena EVM tidak dapat menafsirkan instruksi tingkat tinggi, mengkompilasi kode sumber menjadi bytecode (yaitu, instruksi mesin tingkat rendah) diperlukan untuk mengeksekusi logika kontrak di EVM.
Verifikasi kode sumber adalah membandingkan kode sumber kontrak pintar dan bytecode yang dikompilasi yang digunakan selama pembuatan kontrak untuk mendeteksi adanya perbedaan. Memverifikasi kontrak pintar penting karena kode kontrak yang diiklankan mungkin berbeda dari apa yang berjalan di blockchain.
Verifikasi kontrak pintar memungkinkan penyelidikan tentang apa yang dilakukan kontrak melalui bahasa tingkat tinggi yang digunakannya, tanpa harus membaca kode mesin. Fungsi, nilai, dan biasanya nama variabel serta komentar tetap sama dengan kode sumber asli yang dikompilasi dan diterapkan. Hal ini membuat membaca kode menjadi jauh lebih mudah. Verifikasi sumber juga menyediakan dokumentasi kode, sehingga pengguna akhir tahu apa yang dirancang untuk dilakukan oleh sebuah kontrak pintar.
Apa itu verifikasi penuh?
Ada beberapa bagian dari kode sumber yang tidak memengaruhi bytecode yang dikompilasi seperti komentar atau nama variabel. Itu berarti dua kode sumber dengan nama variabel yang berbeda dan komentar yang berbeda keduanya akan dapat memverifikasi kontrak yang sama. Dengan itu, aktor jahat dapat menambahkan komentar yang menipu atau memberikan nama variabel yang menyesatkan di dalam kode sumber dan membuat kontrak diverifikasi dengan kode sumber yang berbeda dari kode sumber aslinya.
Hal ini dapat dihindari dengan menambahkan data ekstra ke bytecode untuk berfungsi sebagai jaminan kriptografi untuk ketepatan kode sumber, dan sebagai sidik jari dari informasi kompilasi. Informasi yang diperlukan ditemukan dalam metadata kontrak Solidity (opens in a new tab), dan hash dari file ini ditambahkan ke bytecode dari sebuah kontrak. Anda dapat melihatnya beraksi di taman bermain metadata (opens in a new tab)
File metadata berisi informasi tentang kompilasi kontrak termasuk file sumber dan hash-nya. Artinya, jika salah satu pengaturan kompilasi atau bahkan satu byte di salah satu file sumber berubah, file metadata akan berubah. Akibatnya hash dari file metadata, yang ditambahkan ke bytecode, juga berubah. Itu berarti jika bytecode kontrak + hash metadata yang ditambahkan cocok dengan kode sumber dan pengaturan kompilasi yang diberikan, kita dapat yakin bahwa ini adalah kode sumber yang sama persis yang digunakan dalam kompilasi asli, tidak ada satu byte pun yang berbeda.
Jenis verifikasi yang memanfaatkan hash metadata ini disebut sebagai "verifikasi penuh (opens in a new tab)" (juga "verifikasi sempurna"). Jika hash metadata tidak cocok atau tidak dipertimbangkan dalam verifikasi, itu akan menjadi "kecocokan parsial", yang saat ini merupakan cara yang lebih umum untuk memverifikasi kontrak. Sangat mungkin untuk menyisipkan kode berbahaya (opens in a new tab) yang tidak akan tercermin dalam kode sumber yang diverifikasi tanpa verifikasi penuh. Sebagian besar pengembang tidak menyadari verifikasi penuh dan tidak menyimpan file metadata dari kompilasi mereka, oleh karena itu verifikasi parsial telah menjadi metode de facto untuk memverifikasi kontrak sejauh ini.
Mengapa verifikasi kode sumber penting?
Trustlessness (Tanpa Perlu Kepercayaan)
Trustlessness bisa dibilang merupakan premis terbesar untuk kontrak pintar dan aplikasi terdesentralisasi (dapps). Kontrak pintar bersifat "tetap" dan tidak dapat diubah; sebuah kontrak hanya akan mengeksekusi logika bisnis yang didefinisikan dalam kode pada saat penerapan. Ini berarti pengembang dan perusahaan tidak dapat merusak kode kontrak setelah menerapkannya di Ethereum.
Agar sebuah kontrak pintar menjadi trustless, kode kontrak harus tersedia untuk verifikasi independen. Meskipun bytecode yang dikompilasi untuk setiap kontrak pintar tersedia untuk umum di blockchain, bahasa tingkat rendah sulit dipahami—baik oleh pengembang maupun pengguna.
Proyek mengurangi asumsi kepercayaan dengan mempublikasikan kode sumber kontrak mereka. Namun hal ini menimbulkan masalah lain: sulit untuk memverifikasi bahwa kode sumber yang dipublikasikan cocok dengan bytecode kontrak. Dalam skenario ini, nilai trustlessness hilang karena pengguna harus mempercayai pengembang untuk tidak mengubah logika bisnis kontrak (yaitu, dengan mengubah bytecode) sebelum menerapkannya di blockchain.
Alat verifikasi kode sumber memberikan jaminan bahwa file kode sumber kontrak pintar cocok dengan kode assembly. Hasilnya adalah ekosistem yang trustless, di mana pengguna tidak secara membabi buta mempercayai pihak ketiga dan sebaliknya memverifikasi kode sebelum menyetorkan dana ke dalam sebuah kontrak.
Keamanan Pengguna
Dengan kontrak pintar, biasanya ada banyak uang yang dipertaruhkan. Hal ini menuntut jaminan keamanan yang lebih tinggi dan verifikasi logika kontrak pintar sebelum menggunakannya. Masalahnya adalah pengembang yang tidak bermoral dapat menipu pengguna dengan menyisipkan kode berbahaya dalam sebuah kontrak pintar. Tanpa verifikasi, kontrak pintar yang berbahaya dapat memiliki pintu belakang (backdoors) (opens in a new tab), mekanisme kontrol akses yang kontroversial, kerentanan yang dapat dieksploitasi, dan hal-hal lain yang membahayakan keamanan pengguna yang tidak akan terdeteksi.
Mempublikasikan file kode sumber kontrak pintar memudahkan mereka yang tertarik, seperti auditor, untuk menilai kontrak dari potensi vektor serangan. Dengan berbagai pihak yang secara independen memverifikasi sebuah kontrak pintar, pengguna memiliki jaminan yang lebih kuat atas keamanannya.
Cara memverifikasi kode sumber untuk kontrak pintar Ethereum
Menerapkan kontrak pintar di Ethereum memerlukan pengiriman transaksi dengan muatan data (bytecode yang dikompilasi) ke alamat khusus. Muatan data dihasilkan dengan mengkompilasi kode sumber, ditambah argumen konstruktor (opens in a new tab) dari instans kontrak yang ditambahkan ke muatan data dalam transaksi. Kompilasi bersifat deterministik, yang berarti selalu menghasilkan output yang sama (yaitu, bytecode kontrak) jika file sumber yang sama, dan pengaturan kompilasi (misalnya, versi kompiler, pengoptimal) digunakan.
Memverifikasi kontrak pintar pada dasarnya melibatkan langkah-langkah berikut:
-
Masukkan file sumber dan pengaturan kompilasi ke kompiler.
-
Kompiler mengeluarkan bytecode dari kontrak
-
Dapatkan bytecode dari kontrak yang diterapkan pada alamat tertentu
-
Bandingkan bytecode yang diterapkan dengan bytecode yang dikompilasi ulang. Jika kodenya cocok, kontrak diverifikasi dengan kode sumber dan pengaturan kompilasi yang diberikan.
-
Selain itu, jika hash metadata di akhir bytecode cocok, itu akan menjadi kecocokan penuh.
Perhatikan bahwa ini adalah deskripsi verifikasi yang disederhanakan dan ada banyak pengecualian yang tidak akan berfungsi dengan ini seperti memiliki variabel tetap (opens in a new tab).
Alat verifikasi kode sumber
Proses tradisional untuk memverifikasi kontrak bisa jadi rumit. Inilah sebabnya kami memiliki alat untuk memverifikasi kode sumber untuk kontrak pintar yang diterapkan di Ethereum. Alat-alat ini mengotomatiskan sebagian besar verifikasi kode sumber dan juga mengkurasi kontrak yang diverifikasi untuk kepentingan pengguna.
Etherscan
Meskipun sebagian besar dikenal sebagai penjelajah blok Ethereum, Etherscan juga menawarkan layanan verifikasi kode sumber (opens in a new tab) untuk pengembang dan pengguna kontrak pintar.
Etherscan memungkinkan Anda untuk mengkompilasi ulang bytecode kontrak dari muatan data asli (kode sumber, alamat pustaka, pengaturan kompiler, alamat kontrak, dll.) Jika bytecode yang dikompilasi ulang dikaitkan dengan bytecode (dan parameter konstruktor) dari kontrak onchain, maka kontrak tersebut diverifikasi (opens in a new tab).
Setelah diverifikasi, kode sumber kontrak Anda menerima label "Verified" dan dipublikasikan di Etherscan untuk diaudit oleh orang lain. Ini juga ditambahkan ke bagian Verified Contracts (opens in a new tab)—sebuah repositori kontrak pintar dengan kode sumber yang diverifikasi.
Etherscan adalah alat yang paling banyak digunakan untuk memverifikasi kontrak. Namun, verifikasi kontrak Etherscan memiliki kelemahan: ia gagal membandingkan hash metadata dari bytecode onchain dan bytecode yang dikompilasi ulang. Oleh karena itu, kecocokan di Etherscan adalah kecocokan parsial.
Lebih lanjut tentang memverifikasi kontrak di Etherscan (opens in a new tab).
Blockscout
Blockscout (opens in a new tab) adalah penjelajah blok sumber terbuka yang juga menyediakan layanan verifikasi kontrak (opens in a new tab) untuk pengembang dan pengguna kontrak pintar. Sebagai alternatif sumber terbuka, Blockscout menawarkan transparansi dalam cara verifikasi dilakukan dan memungkinkan kontribusi komunitas untuk meningkatkan proses verifikasi.
Mirip dengan layanan verifikasi lainnya, Blockscout memungkinkan Anda untuk memverifikasi kode sumber kontrak Anda dengan mengkompilasi ulang bytecode dan membandingkannya dengan kontrak yang diterapkan. Setelah diverifikasi, kontrak Anda menerima status verifikasi dan kode sumber menjadi tersedia untuk umum untuk audit dan interaksi. Kontrak yang diverifikasi juga terdaftar di repositori kontrak terverifikasi (opens in a new tab) Blockscout untuk penjelajahan dan penemuan yang mudah.
Sourcify
Sourcify (opens in a new tab) adalah alat lain untuk memverifikasi kontrak yang bersumber terbuka dan terdesentralisasi. Ini bukan penjelajah blok dan hanya memverifikasi kontrak di berbagai jaringan berbasis EVM (opens in a new tab). Ini bertindak sebagai infrastruktur publik untuk alat lain untuk dibangun di atasnya, dan bertujuan untuk memungkinkan interaksi kontrak yang lebih ramah manusia menggunakan komentar ABI dan NatSpec (opens in a new tab) yang ditemukan dalam file metadata.
Tidak seperti Etherscan, Sourcify mendukung kecocokan penuh dengan hash metadata. Kontrak yang diverifikasi disajikan di repositori publiknya (opens in a new tab) melalui HTTP dan IPFS (opens in a new tab), yang merupakan penyimpanan terdesentralisasi dan beralamat konten (opens in a new tab). Hal ini memungkinkan pengambilan file metadata dari sebuah kontrak melalui IPFS karena hash metadata yang ditambahkan adalah hash IPFS.
Selain itu, seseorang juga dapat mengambil file kode sumber melalui IPFS, karena hash IPFS dari file-file ini juga ditemukan dalam metadata. Sebuah kontrak dapat diverifikasi dengan menyediakan file metadata dan file sumber melalui API-nya atau UI (opens in a new tab), atau menggunakan plugin. Alat pemantauan Sourcify juga mendengarkan pembuatan kontrak pada blok baru dan mencoba memverifikasi kontrak jika metadata dan file sumbernya dipublikasikan di IPFS.
Lebih lanjut tentang memverifikasi kontrak di Sourcify (opens in a new tab).
Tenderly
Platform Tenderly (opens in a new tab) memungkinkan pengembang web3 untuk membangun, menguji, memantau, dan mengoperasikan kontrak pintar. Menggabungkan alat debugging dengan observabilitas dan blok bangunan infrastruktur, Tenderly membantu pengembang mempercepat pengembangan kontrak pintar. Untuk sepenuhnya mengaktifkan fitur Tenderly, pengembang perlu melakukan verifikasi kode sumber (opens in a new tab) menggunakan beberapa metode.
Sangat mungkin untuk memverifikasi kontrak secara pribadi atau publik. Jika diverifikasi secara pribadi, kontrak pintar hanya terlihat oleh Anda (dan anggota lain dalam proyek Anda). Memverifikasi kontrak secara publik membuatnya terlihat oleh semua orang yang menggunakan platform Tenderly.
Anda dapat memverifikasi kontrak Anda menggunakan Dasbor (opens in a new tab), plugin Tenderly Hardhat (opens in a new tab), atau CLI (opens in a new tab).
Saat memverifikasi kontrak melalui Dasbor, Anda perlu mengimpor file sumber atau file metadata yang dihasilkan oleh kompiler Solidity, alamat/jaringan, dan pengaturan kompiler.
Menggunakan plugin Tenderly Hardhat memungkinkan kontrol lebih besar atas proses verifikasi dengan lebih sedikit usaha, memungkinkan Anda untuk memilih antara verifikasi otomatis (tanpa kode) dan manual (berbasis kode).
