Scan to Download Gate App
qrCode
More Download Options
Don't remind me again today

Wake Printer betiği kullanarak Solidity denetimini otomatikleştirme

Önkoşullar ve Ayarlar

Bu eğitimde, örnek proje olarak workshop deposunu kullanacağız:

wake up

Bash

Kopyala

wake print

Bash

Kopyala

Belirli bir yazıcıyı ada göre çalıştırmak:

Eğitim 1: İlk Yazıcınızı Oluşturun – Sözleşmeleri Listeleme

Basit bir yazıcıyla başlayalım; bu yazıcı, projedeki tüm sözleşmeleri listeler. Bu örnek, daha karmaşık analizlerde kullanacağınız temel kavramları tanıtır.

Yazıcı yapısı oluşturma

İşte ilk yazıcınızı kurmak için kullanacağınız komutlar:

from future import annotations import networkx as nx import rich_click as click import wake.ir as ir import wake.ir.types as types from rich import print from wake.cli import SolidityName from wake.printers import Printer, printer

class ListContractsPrinter(Printer): (def print)self( -> None: pass @printer.command)name=“list-contracts” (def cli)self( -> None: pass

Python

Kopyala

Aşağıda şablonun her bölümünün işlevi açıklanmıştır:

  • print)(: Analiz sonuçlarını gösteren ana yürütme yöntemi
  • cli)(: Özelleştirilmiş komut satırı parametreleri için işlemci

Ziyaretçi modelini uygulama

Wake, sözleşmenin soyut sözdizimi ağacını dolaşmak için ziyaretçi modelini kullanır )AST(. Ziyaretçi modeli, Wake’in kod yapınızı otomatik olarak gezinmesine olanak tanır ve belirli öğelere (örneğin sözleşme veya fonksiyon tanımları) tepki vermenizi sağlar.

Sözleşmeleri listelemek için, visit_contract_definition yöntemini geçersiz kılacağız; bu yöntem, her sözleşme için çağrılır.

Bu yöntemi ListContractsPrinter sınıfınıza ekleyin:

wake print list-contracts

Bash

Kopyala

Bu komut, yazıcınızı çalıştırır ve projenizde bulunan tüm sözleşme isimlerini yazdırır.

Çıktıyı geliştirme

Temel uygulama, arayüzler ve kalıtımlı sözleşmeler dahil olmak üzere tüm sözleşmeleri gösterir. Bunu, yalnızca dağıtılabilir sözleşmeleri gösterecek şekilde geliştirelim:

def visit_contract_definition)self, node: ir.ContractDefinition( -> None: if len)node.child_contracts( != 0: return if node.kind != ir.enums.ContractKind.CONTRACT: return print)node.name(

Python

Kopyala

ContractDefinition sınıfı, sonuçları filtrelemek için kullanılabilecek özellikler içerir. Tam referans için bakınız:

Tam uygulama

İşte, uygun sorumlulukların ayrılmasıyla son versiyon; dolaşma sırasında veri toplayıp, print)### metodunda gösterir:

Eğitim 2: Sözleşme Fonksiyonlarını Analiz Etmek

Hangi fonksiyonların dışarıdan çağrılabilir olduğunu bilmek güvenlik açısından kritiktir: genel ‘withdraw’ veya ‘transfer’ fonksiyonları genellikle sözleşmenin saldırı yüzeyini belirler. Bir yazıcı oluşturalım ve tüm genel ve dış fonksiyonları listeleyerek saldırı yüzeyini haritalayalım.

(## Fonksiyon Yazıcısı Kurulumu

Yeni bir yazıcı oluşturun:

class ListFunctionsPrinter)Printer(: contracts: list[ir.ContractDefinition] = []

def visit_contract_definition)self, node: ir.ContractDefinition( -> None:
    self.contracts.append)node###

Python

Kopyala

(## Kalıtım hiyerarşisini işleme

print)( metodunda, temel sözleşmeden türemiş sözleşmeye kadar olan kalıtım yapısını dolaşırız ve her seviyedeki çağrılabilir fonksiyonları gösteririz:

def get_callable_final_functions)self, contract: ir.ContractDefinition( -> list[ir.FunctionDefinition]: return [func for func in contract.functions if len)func.child_functions### == 0 # En sonunda and func.visibility in [ir.enums.Visibility.PUBLIC, ir.enums.Visibility.EXTERNAL]]

Python

Kopyala

Fonksiyon yazıcısını çalıştırma

Yazıcıyı çalıştırıp, kalıtım yapısı ve çağrılabilir fonksiyonları görselleştirelim:

Contract: ContextContract: Ownable Functions: owner, renounceOwnership, transferOwnership Contract: SingleTokenVault Functions: constructor, deposit, withdraw, emergencyWithdraw, balanceOf, setDepositLimits

Contract: EIP712Example Functions: constructor, DOMAIN_SEPARATOR, castVoteBySignature, getVoteCounts

Contract: ContextContract: IERC20 Contract: IERC20Metadata Contract: IERC20 ErrorsContract: ERC20 Functions: name, symbol, decimals, totalSupply, balanceOf, transfer, allowance, approve, transferFrom Contract: IERC20Permit Contract: IERC5267 Contract: EIP712 Functions: eip712Domain, Nonces Contract: ERC20Permit Functions: permit, nonces, DOMAIN_SEPARATOR Contract: PermitToken Functions: constructor

Contract: Token Functions: constructor, mintTokens, transfer, transferWithBytes, getBalance

Contract: Context Contract: IERC20 Contract: IERC20Metadata Contract: IERC20 ErrorsContract: ERC20 Functions: name, symbol, decimals, totalSupply, balanceOf, transfer, allowance, approve, transferFrom Contract: MockERC20 Functions: constructor

Kopyala

Bu çıktı, her sözleşmenin kalıtım ve çağrılabilir giriş noktalarının hızlı görselleştirilmiş haritasını sağlar.

(# @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

Kopyala

Koşullu filtreleme mantığı

print)## 分析所有可部署的合约wake print list-functions# yöntemi artık belirli bir sözleşmenin talep edilip edilmediğini kontrol eder. Eğer sözleşme adı belirtilmemişse, yazıcı tüm dağıtılabilir sözleşmeleri listeler. Eğer isim belirtilmişse, yalnızca o sözleşmenin yapısına derinlemesine iner; bu, sözleşme yapısında bir yaprak olmasa bile geçerlidir.

Tam uygulama ve CLI seçeneği

İşte, isteğe bağlı sözleşme filtresi içeren son yazıcı:

Belirli bir sözleşmeye odaklanma wake print list-functions --contract-name Token

Kopyala

Gelecek adımlar

Yazıcı, size harita sağlar; analizörler ise açıkları bulur. Bunlar birlikte, Solidity denetimini manuel zorluktan yapılandırılmış ve içgörülü bir sürece dönüştürür. Yazdığınız her yazıcı, karmaşık kodu daha net hale getirir ve incelemenizdeki akıllı sözleşmelerin güvenliğini artırır.

Açıklar için, Wake ayrı bir denetleyici sistemi sunar; bu sistem, görselleştirmenin ötesine geçerek gerçek güvenlik sorunlarını tanımlar. Yazıcılar size harita sağlar; denetleyiciler ise sorunları tespit eder.

Yazıcılarınızı topluluğa katkıda bulunmayı düşünün. Analiz araçları paylaşıldığında en güçlü hale gelir; ve sizin özelleştirilmiş yazıcılarınız, diğer denetleyicilerin karmaşık kodları daha etkili anlamasına yardımcı olabilir.

View Original
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
  • Reward
  • Comment
  • Repost
  • Share
Comment
0/400
No comments
  • Pin
Trade Crypto Anywhere Anytime
qrCode
Scan to download Gate App
Community
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)