
솔리디티 스니펫과 스마트 계약 보안 감사를 위한 Foundry 스크립트 모음
evm-audit-helpers는 EVM 스마트 계약 보안 감사를 가속화하기 위해 설계된 Solidity 스니펫, Foundry 스크립트, 테스트 템플릿의 선별된 모음입니다. 이 저장소는 재진입(reentrancy), 스토리지 레이아웃 불일치, 가스 최적화 함정과 같은 일반적인 감사 문제에 대한 재사용 가능한 빌딩 블록을 번들로 제공하여, 감사자와 개발자가 보일러플레이트보다는 로직에 집중할 수 있게 합니다.
주요 목표:
| 카테고리 | 설명 | 주요 파일 |
|---|
| 재진입 검사기 | 헬퍼 모디파이어, nonReentrant 패턴, 런타임 탐지 스크립트. | src/helpers/Reentrancy.sol, scripts/reentrancy_check.sol |
| 스토리지 레이아웃 분석기 | 스토리지 슬롯 비교, 레이아웃 다이어그램 생성, 안전하지 않은 업그레이드 탐지 유틸리티. | src/helpers/StorageLayout.sol, scripts/storage_analyzer.sol |
| Foundry 테스트 템플릿 | 일반적인 취약점(접근 제어, 산술, delegatecall 등)을 다루는 보일러플레이트 테스트 스위트. | test/templates/* |
| 가스 및 Opcode 감사 | 가스 사용량 프로파일링 및 고비용 opcode 플래그 지정 스크립트. | scripts/gas_profiler.sol |
| 보고 헬퍼 | CI 대시보드로 파이프할 수 있는 JSON/Markdown 리포터. | scripts/report_generator.sol |
| CI 통합 | 자동 감사 실행을 위한 GitHub Actions 워크플로 예시. | .github/workflows/ci.yml |
모든 헬퍼는 Solidity ^0.8.20용으로 작성되었으며 **Foundry (forge, cast)**와 호환됩니다.
# 1️⃣ 저장소 클론
git clone https://github.com/your-org/evm-audit-helpers.git
cd evm-audit-helpers
# 2️⃣ Foundry 설치 (아직 설치되지 않은 경우)
curl -L https://foundry.paradigm.xyz | bash
foundryup
# 3️⃣ 의존성 설치
forge install
# 4️⃣ 기본 테스트 스위트 실행 (재진입, 스토리지, 가스 검사 포함)
forge test
팁: CI 최적화 컴파일러 설정을 사용하려면 셸에
export FOUNDRY_PROFILE=ci를 추가하세요.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "evm-audit-helpers/src/helpers/Reentrancy.sol";
contract MyVault is ReentrancyGuard {
mapping(address => uint256) private balances;
function deposit() external payable nonReentrant {
balances[msg.sender] += msg.value;
}
function withdraw(uint256 amount) external nonReentrant {
require(balances[msg.sender] >= amount, "Insufficient");
balances[msg.sender] -= amount;
(bool ok,) = msg.sender.call{value: amount}("");
require(ok, "Transfer failed");
}
}
컴파일된 컨트랙트에서 런타임 탐지기를 실행:
forge script scripts/reentrancy_check.sol:ReentrancyChecker --rpc-url $RPC_URL --broadcast
# 컴파일된 컨트랙트의 스토리지 레이아웃에 대한 JSON 설명 생성
cast abi-storage --contract MyUpgradeable.sol:MyUpgradeable > storage.json
# 참조 레이아웃과 비교 (예: 이전 버전)
forge script scripts/storage_analyzer.sol:StorageComparator \
--sig "compare(string memory, string memory)" storage.json reference.json
이 스크립트는 불일치 슬롯, 잠재적 섀도잉, @custom:oz-upgrades-unsafe-allow 주석에 대한 제안을 출력합니다.
감사 저장소에 템플릿 복사:
cp -r test/templates/reentrancy/ my-audit/tests/
MyContract.t.sol을 편집하여 감사 대상 컨트랙트를 임포트하고 실행:
forge test --match-contract MyContract
제공된 워크플로를 저장소에 추가:
# .github/workflows/audit.yml
name: EVM Audit
on:
push:
branches: [main]
pull_request:
jobs:
audit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Foundry
run: curl -L https://foundry.paradigm.xyz | bash && foundryup
- name: Run Audit Suite
run: |
forge install
forge test -vv
forge script scripts/reentrancy_check.sol:ReentrancyChecker --rpc-url ${{ secrets.RPC_URL }}
forge script scripts/storage_analyzer.sol:StorageComparator --sig "compare(string,string)" storage.json reference.json
이 워크플로는 실패를 자동으로 플래그하고 PR 댓글로 마크다운 보고서를 게시합니다.
기여를 환영합니다! 다음 단계를 따라주세요:
git checkout -b feat/<name>).forge coverage).npm run lint – solhint 및 prettier 사용).pragma solidity ^0.8.20;snake_case, public/external에는 camelCase 사용.///)로 문서화.# 린팅 도구 설치
npm install
# solhint 실행
npx solhint 'src/**/*.sol' 'test/**/*.sol'
# 자동 포맷
npx prettier --write '**/*.sol'
evm-audit-helpers는 MIT 라이선스에 따라 배포됩니다. 자세한 내용은 LICENSE 파일을 참조하세요.
즐거운 감사 되세요!