목적 및 범위
테스트 프레임워크는 핵심 프로토콜 동작을 검증하기 위한 표준화된 Ethereum JSON 테스트 픽스처를 실행하는 인프라를 제공합니다.이 프레임워크는 다양한 하드 포크 구성에 걸쳐 트랜잭션 처리, 블록 검증, 상태 전환 및 합의 규칙이 정확히 동작하는지를 검증하는 데 목적이 있습니다. 테스트 픽스처는 StableNet 코드베이스에 포함된
tests 디렉터리의 데이터를 사용하며, StableNet 구현 위에서 직접 실행됩니다.
EVM 전용 테스트 도구에 대한 내용은 EVM 테스트 도구를 참고하세요.
일반적인 빌드 및 CI/CD 흐름은 빌드 및 CI/CD를 참고하세요.
테스트 타입 개요
테스트 프레임워크는 프로토콜의 서로 다른 측면을 검증하기 위해 다음 네 가지 주요 테스트 범주를 지원합니다.| Test Type | Purpose | JSON Structure | Execution |
|---|---|---|---|
| State Tests | 블록 컨텍스트 없이 트랜잭션 처리 검증 | 사전 상태, 트랜잭션, 사후 상태를 포함한 stJSON | 제네시스 기준 단일 트랜잭션 실행 |
| Block Tests | 블록 헤더·본문·상태 전환 포함 전체 블록 검증 | 제네시스와 블록 시퀀스를 포함한 btJSON | 블록 순차 삽입 |
| Transaction Tests | RLP 인코딩 및 발신자 파생 검증 | 포크별 예상 발신자가 포함된 트랜잭션 RLP | 디코딩 후 발신자 검증 |
| Difficulty Tests | 난이도 계산 규칙 검증 | 부모 헤더와 예상 난이도 | 합의 엔진 계산 결과 비교 |
테스트 인프라 아키텍처
testMatcher 패턴 매칭
testMatcher는 정규식 기반 규칙을 통해 테스트 선택, 구성 오버라이드 및 예상 실패 처리를 제어합니다.
| Pattern Type | Method | Purpose |
|---|---|---|
skiploadpat | skipLoad(pattern) | JSON 로딩 자체를 건너뛰어 메모리 사용 절감 |
slowpat | slow(pattern) | -short 모드 또는 32bit 환경에서 제외 |
failpat | fails(pattern, reason) | 알려진 실패 테스트 표시 |
configpat | config(pattern, cfg) | 특정 테스트에 체인 설정 오버라이드 |
runonlylistpat | runonly(pattern) | 지정 패턴에 일치하는 테스트만 실행 |
State 테스트 실행
State 테스트는 사전 상태에 대해 단일 트랜잭션을 실행하고, 결과 상태 루트와 로그를 검증하여 트랜잭션 처리 로직을 격리된 환경에서 검증합니다.StateTest 구현 개요
State 테스트는 포크 조합과 입력 인덱스별로 하위 테스트를 생성하여 실행합니다. 주요 메서드 역할은 다음과 같습니다.| Method | Purpose |
|---|---|
Subtests() | 모든 포크/인덱스 조합 열거 |
Run(...) | 실행 및 결과 검증 |
RunNoVerify(...) | 검증 없이 실행(벤치마크 용도) |
checkError(...) | 예상 오류 여부 검증 |
실행 흐름 요약
- 포크 문자열 파싱 및 체인 설정 로드
- 제네시스 블록 생성 및 사전 상태 구성
- 트랜잭션을
core.Message로 변환 - EVM 컨텍스트 생성 후 트랜잭션 실행
- 상태 커밋 및 상태 루트 계산
- 예상 상태 루트·로그·예외와 비교
저장소 스키마 변형 실행
각 State 테스트는 다음 네 가지 조합으로 반복 실행됩니다.hash / trie: 스냅샷 미사용 해시 기반hash / snap: 스냅샷 사용 해시 기반path / trie: 스냅샷 미사용 경로 기반path / snap: 스냅샷 사용 경로 기반
Block 테스트 실행
Block 테스트는 블록 시퀀스를 실제로 체인에 삽입하고, 최종 상태와 헤더 체인을 검증하여 전체 블록체인 동작을 확인합니다.BlockTest 구현 개요
Block 테스트는 다음 작업을 포함합니다.- 테스트 데이터로부터 제네시스 블록 생성
- 테스트 블록을 순차적으로 삽입
- 유효·무효 블록 구분 처리
- 최종 상태 및 헤더 체인 검증
BlockHeader, transactions, UncleHeaders가 없는 경우 해당 블록은 유효하지 않은 블록으로 간주되며, 삽입 실패가 기대 동작입니다.
실행 흐름 요약
- 제네시스 상태를 DB에 커밋
- 합의 엔진과 캐시 설정을 포함한 블록체인 초기화
- 테스트 블록 순차 삽입
- 최종 StateDB 기준 계정 상태 검증
- 체인 헤드부터 역방향으로 헤더 일관성 검증
Transaction 테스트
Transaction 테스트는 다양한 포크 규칙에서 트랜잭션 RLP 디코딩과 발신자 파생이 정확히 동작하는지를 검증합니다. 검증 항목은 다음과 같습니다.- RLP 디코딩 성공 여부
- ECDSA 서명을 통한 발신자 복구
- 본질적 가스 계산의 유효성
- 트랜잭션 해시 일관성
포크 구성
테스트 프레임워크는 모든 Ethereum 하드 포크에 대한 체인 설정을 사전에 정의합니다. 주요 포크 예시는 다음과 같습니다.| Fork | 주요 특징 |
|---|---|
| Frontier | 초기 릴리스 |
| Byzantium | 난이도 폭탄 지연 |
| Istanbul | 가스 비용 조정 |
| London | EIP-1559 BaseFee |
| Merge | PoS 전환 |
| Cancun | Blob 트랜잭션 |
| Anzeon | WBFT 합의 |
"Berlin+1884+1283"과 같이 EIP 오버라이드를 포함할 수 있으며, 테스트 실행 시 동적으로 구성됩니다.
테스트 디렉터리 구조
테스트 데이터는 표준화된 디렉터리 구조로 관리됩니다.EVM 명령 통합
cmd/evm 도구는 Block 테스트를 실행하기 위한 CLI 인터페이스를 제공합니다.
blocktest 명령 개요
주요 플래그는 다음과 같습니다.--run: 정규식으로 테스트 선택--machine: JSON 기반 EVM 트레이스 출력--dump: 실행 후 최종 상태 덤프
벤치마킹 지원
State 테스트는 성능 측정을 위한 벤치마크 실행을 지원합니다. 벤치마크는 다음 항목을 측정합니다.- 가스 처리량(mgas/s)
- 총 실행 시간
- 가스 환불을 고려한 실효 처리량
오류 처리 및 검증
예상 예외 처리
테스트는 예상 예외와 실제 실행 결과를 비교하여 성공 여부를 판단합니다.| 기대값 | 실제 결과 | 판정 |
|---|---|---|
| 예외 없음 | 오류 없음 | 성공 |
| 예외 기대 | 오류 발생 | 성공 |
| 예외 없음 | 오류 발생 | 실패 |
| 예외 기대 | 오류 없음 | 실패 |
실패 시 진단 출력
테스트 실패 시 다음 정보가 제공됩니다.- 실패한 테스트의 전체 EVM 실행 추적
- JSON 형식의 단계별 연산 로그
- 과도한 출력 방지를 위한 가스 제한 조건 적용

