메인 콘텐츠로 건너뛰기

목적 및 범위

이 문서는 StableNet에서 트랜잭션이 시스템에 제출된 이후 블록체인에 최종 포함(finalized) 되기까지의 전체 라이프사이클을 설명합니다.
RPC 또는 P2P를 통한 제출, 트랜잭션 풀 검증 및 수락, 마이닝 후보 선정, 상태 전이(EVM 실행), 블록 봉인, 합의 기반 최종화까지의 전 과정을 포괄합니다.
트랜잭션 타입 및 인코딩에 대한 세부사항은 트랜잭션 유형 및 인코딩을 참조하세요.
트랜잭션 풀 관리 정책은 트랜잭션 풀을 참조하세요.
EVM 실행 내부 동작은 EVM 실행을 참조하세요.
가스 수수료 및 팁 정책은 가스 수수료 정책을 참조하세요.

트랜잭션 라이프사이클 개요

StableNet의 트랜잭션은 다음 7단계 라이프사이클을 순차적으로 거칩니다. 트랜잭션 라이프사이클 단계
  1. 트랜잭션 제출
  2. 풀 수준 검증 및 수락
  3. 마이닝 후보 선정
  4. 트랜잭션 실행(상태 전이)
  5. 블록 봉인 및 전파
  6. 블록 검증 및 체인 삽입
  7. 합의 기반 최종성 획득

단계 1: 트랜잭션 제출

트랜잭션은 두 가지 경로를 통해 StableNet 노드로 유입됩니다.

진입점

PathEntry PointDescription
RPC APIinternal/ethapi/api.go (TransactionAPI)JSON-RPC eth_sendTransaction 또는 eth_sendRawTransaction 호출을 통해 트랜잭션을 제출하며, 내부적으로 SubmitTransaction → 백엔드 SendTx를 거쳐 txpool로 전달됩니다
P2P Networketh/handler.go (txFetcher)피어가 브로드캐스트한 트랜잭션을 수신한 후 txpool.Add(tx, remote) 경로로 풀에 추가합니다
RPC 경로에서는 TransactionArgs.setDefaults를 통해 nonce, gas limit, fee 필드가 보완되며,
지갑 또는 키스토어 기반 서명(SignTx) 이후 완전한 서명 트랜잭션이 txpool로 전달됩니다.

단계 2: 풀 수준 검증 및 수락

txpool은 제출된 트랜잭션을 즉시 실행하지 않고, 풀 레벨 검증 파이프라인을 통해 선별합니다. 주요 검증 항목은 다음과 같습니다.
  • 트랜잭션 타입 유효성(포크 활성화 여부 포함)
  • 가스 한도 및 최소 가스 가격 조건
  • EIP-1559 수수료 필드(maxFeePerGas, maxPriorityFeePerGas) 일관성
  • nonce 순서 및 계정별 nonce 갭 여부
  • replacement 규칙(동일 nonce 재제출 시 가격 상승 조건)
  • 계정별 queue / pending 슬롯 제한
  • 수수료 위임 트랜잭션 타입 허용 여부
검증을 통과한 트랜잭션만 pending 또는 queued 서브풀에 저장되며, 조건을 만족하지 못한 트랜잭션은 즉시 거부되거나 queue 단계에서 대기 상태로 유지됩니다.

단계 3: 마이닝 후보 선정

마이닝 워커(miner/worker.go)는 다음 시점에 트랜잭션을 블록 후보로 선택합니다.
  • NewTxsEvent 수신 시
  • 새로운 블록 빌드를 위한 작업 루프 시작 시
선정 과정은 다음 흐름을 따릅니다.
  • 현재 블록의 baseFee, GovValidator에서 가져온 거버넌스 가스 팁, blob 수수료(EIP-4844) 등을 반영하여 txpool.PendingFilter를 구성합니다.
  • TxPool().Pending(filter)를 호출하여 조건을 만족하는 후보 트랜잭션을 조회합니다.
  • 로컬 트랜잭션을 우선 처리한 뒤 원격 트랜잭션을 고려합니다.
  • newTransactionsByPriceAndNonce를 통해 다음 기준으로 정렬합니다:
    • 유효 가스 팁 및 수수료 수준
    • 계정별 nonce 연속성
    • Anzeon 환경에서의 승인 계정 여부
  • commitTransactions가 블록 가스 한도에 도달할 때까지 탐욕적으로 트랜잭션을 선택합니다.
이 단계에서는 실제 실행 전 사전 필터링만 수행되며, 상태 변경은 아직 발생하지 않습니다.

단계 4: 트랜잭션 실행 (상태 전이)

선택된 각 트랜잭션은 core.StateTransition을 통해 순차적으로 실행됩니다. 실행 흐름은 다음과 같습니다.
  • NewStateTransition(evm, msg, gasPool) 생성
  • TransitionDb() 호출로 상태 전이 시작
  • preCheck()에서 실행 전 검증 수행:
    • nonce 정확성(TooLow / TooHigh / Max)
    • 발신자가 EOA인지 여부(일반 컨트랙트 계정은 거부, EIP-7702 위임 코드 예외)
    • gasFeeCap, gasTipCap과 블록 baseFee의 관계
    • blob 수수료(EIP-4844) 및 authorization(EIP-7702) 형식 검증
  • buyGas()에서 가스 한도 기준 선차감 수행:
    • 수수료 위임이 없는 경우 발신자 잔액 차감
    • 수수료 위임이 있는 경우 FeePayer 잔액 차감
  • EVM 실행을 통해 컨트랙트 호출 또는 생성 수행
  • 사용 가스, 환불 가스, 실행 결과 및 로그 계산
EVM 오류(revert, out-of-gas 등)는 트랜잭션 실패로 기록되지만 블록은 유효하며, 합의 오류(preCheck 실패 등)는 트랜잭션 자체를 블록에서 제외시킵니다.

단계 5: 블록 봉인 및 전파

모든 선택된 트랜잭션 실행이 완료되면 워커는 다음을 수행합니다.
  • 상태 루트, 영수증 루트, 로그 블룸을 계산하여 블록 헤더를 완성합니다.
  • WBFT 합의 규칙에 따라 블록을 봉인합니다(BLS 서명 집계).
  • 봉인된 블록을 로컬 체인에 기록하고,
    eth/handler 및 P2P 서브프로토콜을 통해 네트워크에 브로드캐스트합니다.
이 시점에서 블록은 제안(proposed) 상태로 네트워크에 전파됩니다.

단계 6: 블록 검증 및 체인 삽입

다른 노드들은 수신한 블록에 대해 다음 검증을 수행합니다.
  • 헤더 검증(부모 해시, 타임스탬프, 가스 한도, extra 데이터)
  • 트랜잭션 머클 루트 및 영수증 루트 검증
  • 상태 재실행을 통한 상태 루트 검증
  • WBFT 합의 서명 유효성 검증
검증이 성공하면 블록은 체인에 삽입되며 canonical chain 갱신이 발생할 수 있습니다.

단계 7: 최종성 및 확인

WBFT 합의에서 요구하는 조건(2/3 이상 검증자 서명)이 충족되면 블록은 finalized 상태로 표시됩니다.
  • finalized 블록은 되돌릴 수 없습니다.
  • 클라이언트 및 애플리케이션은 이 시점을 기준으로 트랜잭션을 확정(confirm) 된 것으로 판단합니다.
  • Safe / Final 헤더 개념을 통해 UI 및 API에서 신뢰 수준을 구분할 수 있습니다.
이로써 트랜잭션은 StableNet 상에서 완전한 라이프사이클을 종료합니다.