EVM 기반의 스마트 컨트랙트 개발 시, 가스비를 절감하기 위해 고려해야 하는 패턴과 최적화 기법을 정리해 보았습니다.
가스비 절감을 위한 기본 최적화 기법
- 상태 변수의 최소화
- 상태 변수(state variable)는 영구적으로 저장되며, 이를 수정하거나 읽는 작업은 가스비가 많이 소모됩니다.
- 해결 방법: 자주 변경되지 않는 데이터는 constant나 immutable 키워드를 사용하거나 memory 변수로 저장.
- 레퍼런스: Solidity Documentation - Storage Layout
- 구조체와 배열의 효울적 사용
- 구조체와 배열은 필요 이상의 데이터를 포함하지 않도록 설계합니다.
- 해결 방법: 크기를 작게 설계하고, 동적으로 확장할 경우 gas 효율을 고려합니다.
- 레퍼런스: Solidity Documentation - Structs
- External 함수와 Public 함수 구분
- external 함수는 호출 시 더 적은 가스를 소모합니다.
- 해결 방법: 함수가 외부에서만 호출된다면 external 키워드를 사용.
- 레퍼런스: Solidity Best Practices - External Functions
- 루프 최소화
- 루프는 가스비를 빠르게 증가시키는 주요 원인 중 하나입니다.
- 해결 방법: 루프 내부 연산을 간소화하고, 데이터 크기를 줄이기 위해 적합한 알고리즘을 사용합니다.
- 레퍼런스: Solidity Patterns - Gas Optimization
- Storage 와 Memory의 효율적 사용
- storage 는 memory 에 비해 비용이 더 많이 소모됩니다.
- 해결 방법: 자주 사용되는 값을 memory 에 저장 후 재사용
- 레퍼런스: Solidity Documentation - Data Locations
스마트 컨트랙트 설계 패턴
- Pull-Payment 패턴
- 한 번에 여러 사용자가 받을 금액을 저장하지 않고, 사용자가 직접 요청하도록 설계
- 장점: 불필요한 연산 감소
- 레퍼런스: OpenZeppelin Documentation - PullPayment
- 업그레이드 가능한 컨트랙트
- 컨트랙트를 분리하여 주요 데이터를 보존하면서 논리만 교체
- 장점: 변경 사항에 따라 새로운 배포로 발생하는 가스비 절감
- 레퍼런스: OpenZeppelin - Proxy Contracts
- 비트 연산 사용
- 간단한 연산에서 비트 연산 사용을 고려
- 해결 방법: x * 2 대신 x << 1 사용
- 레퍼런스: Solidity Bitwise Operators
- Event 사용 최소화
- 이벤트는 로그를 저장하는데 추가 가스비가 발생
- 해결 방법: 정말 필요한 경우에만 이벤트 발생
- 레퍼런스: Solidity Documentation - Events
솔리디티 버전 및 검파일러 옵션
- 최신 Solidity 컴파일러 사용
- 최신 컴파일러는 더 나은 최적화 기능을 제공합니다.
- 레퍼런스: Solidity Releases
- 최적화 옵션 활성화
- Solidity 컴파일러의 최적화 옵션(--optimize)을 활성화
- 레퍼런스: Solidity Documentation - Compiler Options
가스비 최적화 툴
- Gas Reporter
- 트랜잭션별 가스 소비를 분석할 수 있는 도구
- 레퍼런스: eth-gas-reporter
- Slither
- 코드 보안 및 최적화 검사 도구
- 레퍼런스: Slither - GitHub
'Solidity' 카테고리의 다른 글
| 저수준 호출(low-level call) 문법 - call, staticCall, delegateCall (0) | 2025.02.20 |
|---|---|
| assembly ("memory-safe"){} 문법 (1) | 2025.02.01 |
| Ethereum 에서 사용할 수 있는 주요 오라클 서비스 (2) | 2025.01.03 |
| 외부 오라클을 사용한 난수 생성 방법 (5) | 2025.01.03 |
| delegate call 이란? (1) | 2025.01.03 |