Quét để tải ứng dụng Gate
qrCode
Thêm tùy chọn tải xuống
Không cần nhắc lại hôm nay

Sử dụng kịch bản Wake Printer để tự động hóa kiểm toán Solidity

Tiền đề và cài đặt

Trong hướng dẫn này, chúng ta sẽ sử dụng kho lưu trữ workshop làm ví dụ dự án:

wake up

Bash

Sao chép

wake print

Bash

Sao chép

Chạy theo tên để chọn máy in cụ thể:

Hướng dẫn 1: Tạo máy in đầu tiên của bạn – Liệt kê hợp đồng

Hãy bắt đầu với một máy in đơn giản, liệt kê tất cả các hợp đồng trong dự án của bạn. Ví dụ này giới thiệu các khái niệm cốt lõi mà bạn sẽ sử dụng trong các phân tích phức tạp hơn.

Tạo cấu trúc máy in

Chạy lệnh sau để xây dựng máy in đầu tiên của bạn:

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

Sao chép

Dưới đây là chức năng của từng phần trong mẫu:

  • print)(: phương thức thực thi chính để hiển thị kết quả phân tích
  • cli)(: xử lý giao diện dòng lệnh để tùy chỉnh tham số

Triển khai mẫu khách truy cập

Wake sử dụng mẫu khách truy cập để duyệt cây cú pháp trừu tượng của hợp đồng )AST(. Mẫu khách truy cập cho phép Wake tự động điều hướng cấu trúc mã của bạn, giúp phản ứng với các phần tử cụ thể (ví dụ: hợp đồng hoặc định nghĩa hàm).

Để liệt kê hợp đồng, chúng ta sẽ ghi đè phương thức visit_contract_definition, sẽ được gọi cho mỗi hợp đồng trong thư viện mã.

Thêm phương thức này vào lớp ListContractsPrinter của bạn:

wake print list-contracts

Bash

Sao chép

Lệnh này chạy máy in của bạn và in ra tất cả các tên hợp đồng tìm thấy trong dự án của bạn.

Cải tiến đầu ra

Triển khai cơ bản hiển thị tất cả các hợp đồng, bao gồm cả giao diện và hợp đồng kế thừa. Hãy cải tiến để chỉ hiển thị các hợp đồng có thể triển khai:

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

Sao chép

Lớp ContractDefinition chứa các thuộc tính để lọc kết quả. Tham khảo đầy đủ tại:

Hoàn chỉnh mã

Đây là phiên bản cuối cùng, có sự phân tách rõ ràng các mối quan tâm — thu thập dữ liệu trong quá trình duyệt và hiển thị trong phương thức print)###:

Hướng dẫn 2: Phân tích hàm hợp đồng

Hiểu rõ các hàm có thể gọi từ bên ngoài là điều tối quan trọng đối với an ninh: các hàm công khai ‘withdraw’ hoặc ‘transfer’ thường xác định mặt trận tấn công của hợp đồng. Hãy tạo một máy in để liệt kê tất cả các hàm công khai và bên ngoài nhằm vẽ ra mặt trận tấn công.

(## Thiết lập máy in hàm

Tạo một máy in mới:

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

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

Python

Sao chép

(## Xử lý cấu trúc kế thừa

Trong phương thức print)(, chúng ta duyệt từ hợp đồng cơ sở đến hợp đồng dẫn xuất, hiển thị các hàm có thể gọi được ở mỗi cấp:

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 # là hàm cuối cùng and func.visibility in [ir.enums.Visibility.PUBLIC, ir.enums.Visibility.EXTERNAL] ]

Python

Sao chép

Chạy máy in hàm

Chạy máy in để xem sơ đồ kế thừa và các hàm có thể gọi:

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: IERC20Errors Contract: 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: IERC20Errors Contract: ERC20 Functions: name, symbol, decimals, totalSupply, balanceOf, transfer, allowance, approve, transferFrom

Contract: MockERC20 Functions: constructor

Bash

Sao chép

Kết quả cung cấp sơ đồ nhanh về kế thừa và các điểm vào có thể gọi của từng hợp đồng.

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

Sao chép

Logic lọc điều kiện

Phương thức print)## 分析所有可部署的合约wake print list-functions# hiện kiểm tra xem có yêu cầu lọc theo hợp đồng cụ thể hay không. Nếu không cung cấp tên hợp đồng, máy in sẽ liệt kê tất cả các hợp đồng có thể triển khai. Nếu có tên, nó sẽ chỉ đi sâu vào cấu trúc của hợp đồng đó, ngay cả khi nó không phải là hợp đồng cuối cùng.

Hoàn chỉnh mã và tùy chọn CLI

Dưới đây là phiên bản cuối cùng với chức năng lọc hợp đồng tùy chọn:

Tập trung vào hợp đồng cụ thể

wake print list-functions --contract-name Token

Bash

Sao chép

Các bước tiếp theo

Máy in cung cấp bản đồ; bộ dò tìm phát hiện lỗ hổng. Chúng cùng nhau biến quá trình kiểm tra Solidity từ thủ công thành có cấu trúc, có chiều sâu. Mỗi máy in bạn viết ra giúp mã phức tạp trở nên rõ ràng hơn — và tăng cường an ninh cho các hợp đồng thông minh bạn xem xét.

Về phát hiện lỗ hổng, Wake cung cấp hệ thống bộ dò riêng biệt vượt ra ngoài trực quan để xác định các vấn đề an ninh thực tế. Máy in cung cấp bản đồ; bộ dò tìm phát hiện vấn đề.

Hãy xem xét đóng góp máy in của bạn trở lại cộng đồng. Các công cụ phân tích khi chia sẻ sẽ mạnh mẽ hơn, và máy in tùy chỉnh của bạn có thể giúp các nhà kiểm tra khác hiểu rõ hơn về các mã phức tạp.

Xem bản gốc
Trang này có thể chứa nội dung của bên thứ ba, được cung cấp chỉ nhằm mục đích thông tin (không phải là tuyên bố/bảo đảm) và không được coi là sự chứng thực cho quan điểm của Gate hoặc là lời khuyên về tài chính hoặc chuyên môn. Xem Tuyên bố từ chối trách nhiệm để biết chi tiết.
  • Phần thưởng
  • Bình luận
  • Đăng lại
  • Retweed
Bình luận
0/400
Không có bình luận
  • Gate Fun hotXem thêm
  • Vốn hóa:$4.2KNgười nắm giữ:1
    0.00%
  • Vốn hóa:$4.21KNgười nắm giữ:1
    0.00%
  • Vốn hóa:$4.23KNgười nắm giữ:1
    0.00%
  • Vốn hóa:$4.22KNgười nắm giữ:1
    0.00%
  • Vốn hóa:$4.23KNgười nắm giữ:1
    0.00%
  • Ghim
Giao dịch tiền điện tử mọi lúc mọi nơi
qrCode
Quét để tải xuống ứng dụng Gate
Cộng đồng
Tiếng Việt
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)