Pindai untuk Mengunduh Aplikasi Gate
qrCode
Opsi Unduhan Lainnya
Jangan ingatkan saya lagi hari ini

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:

  • 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:

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.

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.
  • Hadiah
  • Komentar
  • Posting ulang
  • Bagikan
Komentar
0/400
Tidak ada komentar
  • Sematkan
Perdagangkan Kripto Di Mana Saja Kapan Saja
qrCode
Pindai untuk mengunduh aplikasi Gate
Komunitas
Bahasa Indonesia
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)