트랜잭션 파이프라인
트랜잭션 파이프라인은 생성부터 최종화까지 전체 수명 주기를 관리합니다.
개요
사용자/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진수로 인코딩된 문자열로 전송됩니다.
멤풀 입장
비상태 가드 (스토리지 접근 없음)
- 서명 형식 유효성 검사 (ed25519 64바이트)
- 공개 키 형식 유효성 검사 (ed25519 32바이트)
- 메시지 해시에 대한 서명 검증
- 트랜잭션 크기 제한
상태 가드 (스토리지 접근 필요)
- 논스 검증:
tx.nonce >= account.nonce(최대 5000 간격 허용) - 잔액 검증:
account.balance >= tx.amount + tx.fee - 할당량 검증: 클래스별 및 발신자별 제한
트랜잭션 클래스
| 클래스 | 우선순위 | 최대 할당량 |
|---|---|---|
| FederatedUpdate | 1.0 (최고) | 50,000 |
| Financial | 0.8 | 50,000 |
| IoTData | 0.5 | 100,000 |
| Governance | 0.7 | 50,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_64 | AVX2 + FMA | double 4개 | TX 32개 |
| ARM (aarch64) | NEON | double 2개 | TX 32개 |
| 폴백 | 스칼라 | 1 | 항상 |
트랜잭션이 32개 미만인 배치에서는 스칼라 계산을 사용합니다 (SIMD 초기화 비용이 이점을 초과).
점수 캐시
LRU 캐시는 블록 간 멤풀에 남아 있는 트랜잭션의 점수 재계산을 방지합니다.
적응형 가중치
adaptive_weights 기능 플래그를 사용하면 다음을 기반으로 가중치가 동적으로 조정됩니다:
- 멤풀의 수수료 분포
- 클래스 다양성
- 과거 처리량
블록 생성
선출된 제안자:
drain_for_block_production(max_block_txs)호출- 점수순 상위-N 트랜잭션 획득
pending_nonces추적과 함께final_validation실행 (오래된 논스로 인한 거부 방지)- 트랜잭션 루트 계산: 리프 태그
"TXv1", 롤링 누산기 - 상태 루트 계산: 시드
"STATEv1-LE", 사전식 스냅샷 - Ed25519로 블록 서명
- gossipsub을 통해 브로드캐스트
논스 관리
final_validation은 드레인되었지만 아직 확인되지 않은 TX를 위한pending_noncesHashMap을 추적합니다- 콜드 스타트 수정:
storage_nonce=0 AND pending_nonces=0일 때 사용 가능한 가장 낮은 논스를 시작점으로 수락합니다 - 논스 재설정: TX 생성기는 로컬 논스 > storage_nonce + 200일 때 재설정합니다
스토리지
확인된 블록은 RocksDB 컬럼 패밀리에 저장됩니다:
| 컬럼 패밀리 | 키 | 값 |
|---|---|---|
CF_BLOCKS | 높이 (u64 LE) | 블록 (bincode) |
CF_TRANSACTIONS | tx_hash | 트랜잭션 (bincode) |
CF_ACCOUNTS | 주소 (32바이트) | 계정 (bincode) |
CF_METADATA | "chain_head" | 마지막 블록 (bincode) |
빈 계정(잔액=0, 논스=0)은 절대 저장되지 않습니다.