메인 콘텐츠로 건너뛰기

트랜잭션 파이프라인

트랜잭션 파이프라인은 생성부터 최종화까지 전체 수명 주기를 관리합니다.

개요

사용자/SDK
│ 구성 + 서명 (Ed25519)

JSON-RPC (savitri_sendRawTransaction)
│ 16진수 디코딩 → bytes_to_raw_tx

멤풀 입장
│ 비상태 가드 → 상태 가드

SIMD 배치 평가
│ fee * 0.7 + class_priority * 0.3

블록 제안자 (drain_for_block_production)
│ 점수별 상위-N, 발신자별 논스 순 정렬

블록 생성
│ tx_root, state_root 계산

Gossipsub 브로드캐스트 (/savitri/block/1)


BFT 투표 (쿼럼 2f+1)
│ 블록 수락 인증서

RocksDB 커밋
│ CF_BLOCKS, CF_TRANSACTIONS, CF_ACCOUNTS

최종화 완료

트랜잭션 형식

정규 서명 메시지

from (16진수 바이트) || to (16진수 바이트) || amount (u64 LE) || nonce (u64 LE) || fee (u128 LE)

이 메시지는 SHA-256으로 해시된 후 Ed25519로 서명됩니다.

와이어 형식 (raw_tx_hex)

from_hex_bytes || to_hex_bytes || amount_le_u64 || nonce_le_u64 || fee_le_u128 || pubkey (32B) || signature (64B) || data (선택 사항)

savitri_sendRawTransaction에 16진수로 인코딩된 문자열로 전송됩니다.

멤풀 입장

비상태 가드 (스토리지 접근 없음)

  1. 서명 형식 유효성 검사 (ed25519 64바이트)
  2. 공개 키 형식 유효성 검사 (ed25519 32바이트)
  3. 메시지 해시에 대한 서명 검증
  4. 트랜잭션 크기 제한

상태 가드 (스토리지 접근 필요)

  1. 논스 검증: tx.nonce >= account.nonce (최대 5000 간격 허용)
  2. 잔액 검증: account.balance >= tx.amount + tx.fee
  3. 할당량 검증: 클래스별 및 발신자별 제한

트랜잭션 클래스

클래스우선순위최대 할당량
FederatedUpdate1.0 (최고)50,000
Financial0.850,000
IoTData0.5100,000
Governance0.750,000

할당량 시스템

  • 클래스별 제한: Financial 50K, IoT 100K, 전체 100K
  • 발신자별 제한: 발신자당 512개 대기 트랜잭션
  • 공정 드레인: drain_fair_batch()는 할당량을 준수하고 record_removal()을 호출합니다

SIMD 평가

디스패처는 SIMD 최적화된 배치 계산을 사용하여 트랜잭션을 평가합니다:

score = fee_normalized * fee_weight + class_priority * class_weight

기본 가중치: fee_weight = 0.7, class_weight = 0.3.

SIMD 구현

아키텍처명령어 세트레인 수임계값
x86_64AVX2 + FMAdouble 4개TX 32개
ARM (aarch64)NEONdouble 2개TX 32개
폴백스칼라1항상

트랜잭션이 32개 미만인 배치에서는 스칼라 계산을 사용합니다 (SIMD 초기화 비용이 이점을 초과).

점수 캐시

LRU 캐시는 블록 간 멤풀에 남아 있는 트랜잭션의 점수 재계산을 방지합니다.

적응형 가중치

adaptive_weights 기능 플래그를 사용하면 다음을 기반으로 가중치가 동적으로 조정됩니다:

  • 멤풀의 수수료 분포
  • 클래스 다양성
  • 과거 처리량

블록 생성

선출된 제안자:

  1. drain_for_block_production(max_block_txs) 호출
  2. 점수순 상위-N 트랜잭션 획득
  3. pending_nonces 추적과 함께 final_validation 실행 (오래된 논스로 인한 거부 방지)
  4. 트랜잭션 루트 계산: 리프 태그 "TXv1", 롤링 누산기
  5. 상태 루트 계산: 시드 "STATEv1-LE", 사전식 스냅샷
  6. Ed25519로 블록 서명
  7. gossipsub을 통해 브로드캐스트

논스 관리

  • final_validation은 드레인되었지만 아직 확인되지 않은 TX를 위한 pending_nonces HashMap을 추적합니다
  • 콜드 스타트 수정: storage_nonce=0 AND pending_nonces=0일 때 사용 가능한 가장 낮은 논스를 시작점으로 수락합니다
  • 논스 재설정: TX 생성기는 로컬 논스 > storage_nonce + 200일 때 재설정합니다

스토리지

확인된 블록은 RocksDB 컬럼 패밀리에 저장됩니다:

컬럼 패밀리
CF_BLOCKS높이 (u64 LE)블록 (bincode)
CF_TRANSACTIONStx_hash트랜잭션 (bincode)
CF_ACCOUNTS주소 (32바이트)계정 (bincode)
CF_METADATA"chain_head"마지막 블록 (bincode)

빈 계정(잔액=0, 논스=0)은 절대 저장되지 않습니다.