Peringatan
Regast belum dipertahankan sejak Maret 2023. Jika Anda mencoba menjalankannya, itu kemungkinan besar akan melakukan kesalahan selama tahap parsing.
Namun demikian, jangan ragu untuk melihat -lihat kode untuk mendapatkan gambaran tentang cara mengimplementasikan penganalisa statis Anda sendiri.
Regast adalah penganalisa statis untuk mengidentifikasi kerentanan keamanan dan optimisasi gas dalam basis kode soliditas.
Ini sangat terinspirasi oleh alat -alat seperti Slither, Solstat dan 4Naly3er, tetapi memiliki perbedaan berikut:
Regast membutuhkan Python 3.10 atau lebih.
Pertama, klon repositori ini dan submodulesnya:
git clone --recurse-submodules https://github.com/MiloTruck/regast.git
cd regast Instal regast menggunakan pip atau setuptools :
# Using pip
pip3 install .
# Using setuptools
python3 setup.py installSetelah instalasi, repositori dapat dihapus:
cd ..
rm -r regast Perintah regast dapat digunakan pada file .sol atau folder yang berisi file soliditas:
$ regast --help
usage: __main__.py [-h] [-d <detector>] [-c <classifications>] [-s <scope>] [-r <filename>] <contract>
Scan for vulnerabilities based on regex or AST queries.
positional arguments:
<contract> .sol file or folder containing .sol files to scan
options:
-h, --help show this help message and exit
-d <detector>, --detectors <detector>
.py file or folder containing .py files which implement detectors
-c <classifications>, --classifications <classifications>
Comma-separated list of classifications: GAS, NC, LOW, MEDIUM, HIGH
-s <scope>, --scope <scope>
Text file containing a list of contracts in scope
-r <filename>, --report <filename>
Generate a markdown report in <filename>.md
Di bawah ini adalah detektor yang saat ini diimplementasikan yang dijalankan Regast secara default. Sebagian besar detektor dari 4Naly3er dan Solstat akan dimasukkan di masa depan.
| Detektor | Keterangan | Klasifikasi |
|---|---|---|
address_balance | Gunakan selfbalance() alih -alih address(this).balance . | Gas |
address_zero | Gunakan perakitan untuk memeriksa address(0) . | Gas |
assign_update_array_value | Perbarui Nilai Array Menggunakan arr[i] += n Alih -alih arr[i] = arr[i] + n . | Gas |
bool_comparison | Jangan membandingkan boolean dengan true atau false . | Gas |
bool_storage | Menggunakan bool untuk penyimpanan yang dikeluarkan di atas kepala. | Gas |
byte_constant | Konstanta bytes lebih efisien daripada konstanta string . | Gas |
cache_array_length | Panjang susunan cache di luar for-loop. | Gas |
custom_error | Gunakan kesalahan khusus alih -alih require pernyataan. | Gas |
initialize_default_value | Inisialisasi variabel yang tidak perlu dengan nilai default | Gas |
long_revert_string | require pernyataan dengan pesan kesalahan panjang. | Gas |
post_increment | ++i harganya lebih murah daripada i++ atau i += 1 . | Gas |
private_constant | Menyatakan konstanta sebagai private bukan non-publik untuk menghemat gas. | Gas |
shift_arithmetic | Gunakan << dan >> alih -alih penggandaan/divisi jika memungkinkan. | Gas |
split_require_statements | Gunakan pernyataan require yang terpisah alih -alih && . | Gas |
unchecked_increment | 'Peningkatan dapat dinyatakan unchecked dalam for-loop'. | Gas |
unsigned_comparison | Gunakan != 0 bukan > 0 untuk perbandingan integer yang tidak ditandatangani. | Gas |
Untuk informasi tentang cara menulis detektor kustom, silakan merujuk ke docs/writing-custom-detectors.md .
Regast dapat menghasilkan laporan penurunan harga dengan masalah yang ditemukan. Sebagai contoh, silakan merujuk ke laporan sampel berikut:
Regast dibangun di atas python-python, yang menyediakan ikatan ularahan untuk perpustakaan parsing pengasuh pohon. Tata bahasa untuk soliditas diambil dari soliditas pengasuh pohon.
tree-sitter terlebih dahulu mengubah kode sumber soliditas menjadi beberapa pohon sintaks abstrak (AST). Regast kemudian mem -parsing setiap node dalam AST ini ke dalam kelas Python yang sesuai. Setelah parsing selesai, detektor individu meminta AST melalui kelas -kelas Python ini untuk mengidentifikasi pola kerentanan umum.
Sebagian besar kode Regast ada di direktori berikut:
regast/core berisi kelas Python yang mewakili bagian dari AST.regast/detectors berisi detektor yang dijalankan Regast secara default.regast/parsing berisi logika untuk mem-parsing AST dari tree-sitter ke kelas Python.