EVM 기반의 스마트 컨트랙트 개발 시, 가스비를 절감하기 위해 고려해야 하는 패턴과 최적화 기법을 정리해 보았습니다. 

 


가스비 절감을 위한 기본 최적화 기법

  1. 상태 변수의 최소화
    • 상태 변수(state variable)는 영구적으로 저장되며, 이를 수정하거나 읽는 작업은 가스비가 많이 소모됩니다.
    • 해결 방법: 자주 변경되지 않는 데이터는 constant나 immutable 키워드를 사용하거나 memory 변수로 저장.
    • 레퍼런스: Solidity Documentation - Storage Layout
  2. 구조체와 배열의 효울적 사용
    • 구조체와 배열은 필요 이상의 데이터를 포함하지 않도록 설계합니다. 
    • 해결 방법: 크기를 작게 설계하고, 동적으로 확장할 경우 gas 효율을 고려합니다. 
    • 레퍼런스: Solidity Documentation - Structs
  3. External 함수와 Public 함수 구분
  4. 루프 최소화
    • 루프는 가스비를 빠르게 증가시키는 주요 원인 중 하나입니다. 
    • 해결 방법: 루프 내부 연산을 간소화하고, 데이터 크기를 줄이기 위해 적합한 알고리즘을 사용합니다. 
    • 레퍼런스: Solidity Patterns - Gas Optimization
  5. Storage 와 Memory의 효율적 사용
    • storage 는 memory 에 비해 비용이 더 많이 소모됩니다. 
    • 해결 방법: 자주 사용되는 값을 memory 에 저장 후 재사용
    • 레퍼런스: Solidity Documentation - Data Locations

스마트 컨트랙트 설계 패턴

  1. Pull-Payment 패턴
    • 한 번에 여러 사용자가 받을 금액을 저장하지 않고, 사용자가 직접 요청하도록 설계
    • 장점: 불필요한 연산 감소
    • 레퍼런스: OpenZeppelin Documentation - PullPayment
  2. 업그레이드 가능한 컨트랙트
    • 컨트랙트를 분리하여 주요 데이터를 보존하면서 논리만 교체
    • 장점: 변경 사항에 따라 새로운 배포로 발생하는 가스비 절감
    • 레퍼런스: OpenZeppelin - Proxy Contracts
  3. 비트 연산 사용
    • 간단한 연산에서 비트 연산 사용을 고려
    • 해결 방법: x * 2 대신 x << 1 사용
    • 레퍼런스: Solidity Bitwise Operators
  4. Event 사용 최소화
    • 이벤트는 로그를 저장하는데 추가 가스비가 발생
    • 해결 방법: 정말 필요한 경우에만 이벤트 발생
    • 레퍼런스: Solidity Documentation - Events

 


솔리디티 버전 및 검파일러 옵션

  1. 최신 Solidity 컴파일러 사용
    • 최신 컴파일러는 더 나은 최적화 기능을 제공합니다. 
    • 레퍼런스: Solidity Releases
  2. 최적화 옵션 활성화

가스비 최적화 툴

  1. Gas Reporter
    • 트랜잭션별 가스 소비를 분석할 수 있는 도구
    • 레퍼런스: eth-gas-reporter
  2. Slither

+ Recent posts