Dalam tutorial ini, kita akan menggunakan repositori workshop sebagai contoh proyek:
bangun tidur
Bash
Salin
bangun print
Bash
Salin
Jalankan printer tertentu berdasarkan nama:
Tutorial 1: Membuat Printer Pertama Anda – Menampilkan Kontrak
Mari kita mulai dengan printer sederhana yang menampilkan semua kontrak dalam proyek. Contoh ini memperkenalkan konsep inti yang akan Anda gunakan dalam analisis yang lebih kompleks.
Membuat Struktur Printer
Jalankan perintah berikut untuk membangun printer pertama Anda:
from future import annotationsimport networkx as nximport rich_click as clickimport wake.ir as irimport wake.ir.types as typesfrom rich import printfrom wake.cli import SolidityNamefrom wake.printers import Printer, printerclass ListContractsPrinter(Printer):def print(self) -> None:pass @printer.command(name=“list-contracts”)def cli(self) -> None:pass
Python
Salin
Berikut adalah fungsi dari setiap bagian dalam template:
print(): metode utama untuk menampilkan hasil analisis
cli(): pengelola antarmuka baris perintah untuk kustomisasi parameter
Mengimplementasikan Pola Visitor
Wake menggunakan pola visitor untuk menavigasi pohon sintaks abstrak kontrak (AST). Pola visitor memungkinkan Wake secara otomatis menavigasi struktur kode Anda, sehingga Anda dapat bereaksi terhadap elemen tertentu (misalnya kontrak atau definisi fungsi).
Untuk menampilkan kontrak, kita akan menimpa metode visit_contract_definition yang akan dipanggil untuk setiap kontrak dalam kode.
Tambahkan metode ini ke kelas ListContractsPrinter Anda:
wake print list-contracts
Bash
Salin
Perintah ini menjalankan printer Anda dan menampilkan semua nama kontrak yang ditemukan dalam proyek Anda.
Meningkatkan Output
Implementasi dasar menampilkan semua kontrak, termasuk antarmuka dan kontrak yang diwariskan. Mari kita tingkatkan agar hanya menampilkan kontrak yang dapat dideploy:
Kelas ContractDefinition memiliki atribut yang dapat digunakan untuk memfilter hasil. Untuk referensi lengkap, lihat:
Implementasi Lengkap
Ini adalah versi final dengan pemisahan perhatian yang tepat—mengumpulkan data selama traversal dan menampilkannya di metode print():
Tutorial 2: Menganalisis Fungsi Kontrak
Memahami fungsi mana yang dapat dipanggil dari luar sangat penting untuk keamanan: fungsi publik ‘withdraw’ atau ‘transfer’ biasanya menentukan permukaan serangan kontrak. Mari kita buat printer yang menampilkan semua fungsi publik dan eksternal untuk memetakan permukaan serangan.
Metode print() sekarang memeriksa apakah pengguna meminta kontrak tertentu. Jika tidak ada nama kontrak yang diberikan, printer akan menampilkan semua kontrak yang dapat dideploy. Jika nama diberikan, hanya akan menyelami struktur kontrak tersebut, meskipun bukan kontrak daun.
Implementasi lengkap dengan opsi CLI
Ini adalah versi akhir dari printer dengan fitur filter kontrak opsional.
Printer memberi Anda peta; detector mencari kerentanan. Bersama-sama, mereka mengubah audit Solidity dari proses manual yang melelahkan menjadi proses yang terstruktur dan penuh wawasan. Setiap printer yang Anda buat dapat membuat kode yang kompleks menjadi lebih jelas—dan meningkatkan keamanan kontrak cerdas yang Anda tinjau.
Untuk deteksi kerentanan, Wake menyediakan sistem detector terpisah yang melampaui visualisasi untuk mengidentifikasi masalah keamanan nyata. Printer memberi Anda peta; detector mencari masalah.
Pertimbangkan untuk berkontribusi kembali printer Anda ke komunitas. Alat analisis paling kuat saat dibagikan, dan printer kustom Anda dapat membantu auditor lain memahami kode yang kompleks dengan lebih efektif.
Lihat Asli
Halaman ini mungkin berisi konten pihak ketiga, yang disediakan untuk tujuan informasi saja (bukan pernyataan/jaminan) dan tidak boleh dianggap sebagai dukungan terhadap pandangannya oleh Gate, atau sebagai nasihat keuangan atau profesional. Lihat Penafian untuk detailnya.
Menggunakan skrip Wake Printer untuk otomatisasi audit Solidity
Prasyarat dan Pengaturan
Dalam tutorial ini, kita akan menggunakan repositori workshop sebagai contoh proyek:
bangun tidur
Bash
Salin
bangun print
Bash
Salin
Jalankan printer tertentu berdasarkan nama:
Tutorial 1: Membuat Printer Pertama Anda – Menampilkan Kontrak
Mari kita mulai dengan printer sederhana yang menampilkan semua kontrak dalam proyek. Contoh ini memperkenalkan konsep inti yang akan Anda gunakan dalam analisis yang lebih kompleks.
Membuat Struktur Printer
Jalankan perintah berikut untuk membangun printer pertama Anda:
from future import annotationsimport networkx as nximport rich_click as clickimport wake.ir as irimport wake.ir.types as typesfrom rich import printfrom wake.cli import SolidityNamefrom wake.printers import Printer, printerclass ListContractsPrinter(Printer):def print(self) -> None:pass @printer.command(name=“list-contracts”)def cli(self) -> None:pass
Python
Salin
Berikut adalah fungsi dari setiap bagian dalam template:
Mengimplementasikan Pola Visitor
Wake menggunakan pola visitor untuk menavigasi pohon sintaks abstrak kontrak (AST). Pola visitor memungkinkan Wake secara otomatis menavigasi struktur kode Anda, sehingga Anda dapat bereaksi terhadap elemen tertentu (misalnya kontrak atau definisi fungsi).
Untuk menampilkan kontrak, kita akan menimpa metode visit_contract_definition yang akan dipanggil untuk setiap kontrak dalam kode.
Tambahkan metode ini ke kelas ListContractsPrinter Anda:
wake print list-contracts
Bash
Salin
Perintah ini menjalankan printer Anda dan menampilkan semua nama kontrak yang ditemukan dalam proyek Anda.
Meningkatkan Output
Implementasi dasar menampilkan semua kontrak, termasuk antarmuka dan kontrak yang diwariskan. Mari kita tingkatkan agar hanya menampilkan kontrak yang dapat dideploy:
def visit_contract_definition(self, node: ir.ContractDefinition) -> None:iflen(node.child_contracts) != 0:returnif node.kind != ir.enums.ContractKind.CONTRACT:returnprint(node.name)
Python
Salin
Kelas ContractDefinition memiliki atribut yang dapat digunakan untuk memfilter hasil. Untuk referensi lengkap, lihat:
Implementasi Lengkap
Ini adalah versi final dengan pemisahan perhatian yang tepat—mengumpulkan data selama traversal dan menampilkannya di metode print():
Tutorial 2: Menganalisis Fungsi Kontrak
Memahami fungsi mana yang dapat dipanggil dari luar sangat penting untuk keamanan: fungsi publik ‘withdraw’ atau ‘transfer’ biasanya menentukan permukaan serangan kontrak. Mari kita buat printer yang menampilkan semua fungsi publik dan eksternal untuk memetakan permukaan serangan.
Membuat Printer Fungsi
Buat printer baru:
class ListFunctionsPrinter(Printer): contracts: list[ir.ContractDefinition] = []def visit_contract_definition(self, node: ir.ContractDefinition) -> None: self.contracts.append(node)
Python
Salin
Menangani Hierarki Pewarisan
Dalam metode print(), kita menavigasi dari kontrak dasar ke kontrak turunan, menampilkan fungsi yang dapat dipanggil di setiap tingkat:
def get_callable_final_functions(self, contract: ir.ContractDefinition) -> list[ir.FunctionDefinition]:return [\ func for func in contract.functions\iflen(func.child_functions) == 0# adalah implementasi akhir\and func.visibility in [ir.enums.Visibility.PUBLIC, ir.enums.Visibility.EXTERNAL]\ ]
Python
Salin
Menjalankan Printer Fungsi
Jalankan printer untuk melihat hierarki pewarisan dan fungsi yang dapat dipanggil:
Contract: ContextContract: OwnableFunctions: owner renounceOwnership transferOwnershipContract: SingleTokenVaultFunctions: constructor deposit withdraw emergencyWithdraw balanceOf setDepositLimits--------------------Contract: EIP712ExampleFunctions: constructor DOMAIN_SEPARATOR castVoteBySignature getVoteCounts--------------------Contract: ContextContract: IERC20Contract: IERC20MetadataContract: IERC20ErrorsContract: ERC20Functions: name symbol decimals totalSupply balanceOf transfer allowance approve transferFromContract: IERC20PermitContract: IERC5267Contract: EIP712Functions: eip712DomainContract: NoncesContract: ERC20PermitFunctions: permit nonces DOMAIN_SEPARATORContract: PermitTokenFunctions: constructor--------------------Contract: TokenFunctions: constructor mintTokens transfer transferWithBytes getBalance--------------------Contract: ContextContract: IERC20Contract: IERC20MetadataContract: IERC20ErrorsContract: ERC20Functions: name symbol decimals totalSupply balanceOf transfer allowance approve transferFromContract: MockERC20Functions: constructor--------------------
Bash
Salin
Output ini memberikan visualisasi cepat tentang hierarki pewarisan dan titik masuk yang dapat dipanggil di setiap kontrak.
@printer.command(name=“list-functions”)@click.option(“–contract-name”, type=str, required=False)def cli(self, contract_name: str | None) -> None: self.contract_name = contract_name
Python
Salin
Logika Penyaringan Kondisional
Metode print() sekarang memeriksa apakah pengguna meminta kontrak tertentu. Jika tidak ada nama kontrak yang diberikan, printer akan menampilkan semua kontrak yang dapat dideploy. Jika nama diberikan, hanya akan menyelami struktur kontrak tersebut, meskipun bukan kontrak daun.
Implementasi lengkap dengan opsi CLI
Ini adalah versi akhir dari printer dengan fitur filter kontrak opsional.
分析所有可部署的合约wake print list-functions## Fokus pada kontrak tertentuwake print list-functions --contract-name Token
Bash
Salin
Langkah Selanjutnya
Printer memberi Anda peta; detector mencari kerentanan. Bersama-sama, mereka mengubah audit Solidity dari proses manual yang melelahkan menjadi proses yang terstruktur dan penuh wawasan. Setiap printer yang Anda buat dapat membuat kode yang kompleks menjadi lebih jelas—dan meningkatkan keamanan kontrak cerdas yang Anda tinjau.
Untuk deteksi kerentanan, Wake menyediakan sistem detector terpisah yang melampaui visualisasi untuk mengidentifikasi masalah keamanan nyata. Printer memberi Anda peta; detector mencari masalah.
Pertimbangkan untuk berkontribusi kembali printer Anda ke komunitas. Alat analisis paling kuat saat dibagikan, dan printer kustom Anda dapat membantu auditor lain memahami kode yang kompleks dengan lebih efektif.