멤풀 아키텍처
멤풀은 입장부터 평가를 거쳐 블록 생성을 위한 드레인까지 대기 중인 트랜잭션을 관리합니다.
파이프라인
네트워크 (gossipsub /savitri/tx/1)
│
▼
사전 검증 (비상태)
│ 서명 형식, 크기 제한
▼
입장 제어
│ 할당량 확인, 발신자별 제한
▼
상태 검증
│ 논스, 잔액, 수수료 제한
▼
SIMD 배치 평가
│ fee * 0.7 + class * 0.3
▼
점수 캐시 (LRU)
│
▼
대기 풀
│
▼
drain_for_block_production()
│ 점수별 상위-N, final_validation
▼
블록 제안자
트랜잭션 클래스
| 클래스 | 우선순위 | 사용 사례 |
|---|---|---|
FederatedUpdate | 1.0 (최고) | FL 모델 업데이트 |
Financial | 0.8 | 토큰 전송 |
Governance | 0.7 | 투표, 제안 |
IoTData | 0.5 | 센서 데이터 |
입장 할당량
| 클래스 | 최대 대기 | 발신자별 제한 |
|---|---|---|
| Financial | 50,000 | 512 |
| IoT | 100,000 | 512 |
| 전체 | 100,000 | 512 |
drain_fair_batch() 함수는 트랜잭션이 드레인될 때 클래스별 카운트를 올바르게 감소시키기 위해 record_removal()을 호출합니다 (Round 6에서 수정됨).
SIMD 평가
점수 공식
score = fee_normalized * fee_weight + class_priority * class_weight
기본값: fee_weight = 0.7, class_weight = 0.3.
아키텍처별 구현
| 아키텍처 | 인트린직 | 레인 수 | 최소 배치 |
|---|---|---|---|
| x86_64 (AVX2+FMA) | _mm256_set1_pd, _mm256_fmadd_pd | double 4개 | 32 |
| ARM (NEON) | vdupq_n_f64, vfmaq_f64 | double 2개 | 32 |
| 폴백 | 스칼라 루프 | 1 | 항상 |
트랜잭션이 32개 미만인 배치에서는 스칼라 계산을 사용합니다. SIMD 초기화 비용이 이점을 초과하기 때문입니다.
적응형 가중치 (선택 사항)
adaptive_weights 기능 플래그를 사용하면 다음을 기반으로 가중치가 조정됩니다:
- 수수료 분포: 수수료가 상위에 집중되면 fee_weight 증가
- 클래스 다양성: 클래스가 많이 다양하면 class_weight 증가
- 과거 처리량: 최근 블록을 기반으로 조정
매개변수:
base_fee_weight = 0.7
base_class_weight = 0.3
adaptation_rate = 0.1 (감쇠)
fee_threshold_high = 2,000,000,000
fee_threshold_low = 500,000,000
class_diversity_threshold = 0.5
점수 캐시
LRU 캐시는 점수 재계산을 방지합니다:
| 매개변수 | 개발 | 운영 |
|---|---|---|
| 캐시 크기 | 항목 100개 | 항목 10,000개 |
| TTL | 60초 | 300초 |
논스 관리
표준 흐름
- TX가 논스 N으로 도착
- 검증:
N >= account.storage_nonce - 드레인 중
pending_noncesHashMap에서 추적 - 블록 최종화 후 논스 커밋
간격 허용
장기 정지 후 복구를 위해 최대 5000의 논스 간격이 허용됩니다 (Round 11에서 1000에서 증가).
콜드 스타트 수정
storage_nonce=0 AND pending_nonces=0이면 사용 가능한 가장 낮은 논스가 시작점으로 수락됩니다. 이는 TX가 드레인되었지만 이전 제안자에 의해 블록이 확인된 적이 없는 경우를 처리합니다.
논스 재설정
TX 생성기는 local_nonce > storage_nonce + 200 (MAX_NONCE_AHEAD)일 때 로컬 논스를 재설정합니다. 이전에는 로컬 논스가 스토리지가 84인 상태에서 2000+까지 올라가 모든 TX가 거부되는 문제가 있었습니다.
리플레이 방지
트랜잭션 해시를 추적하여 리플레이 공격을 방지합니다. TX 해시가 한 번 확인되면 중복 요청은 거부됩니다.
수수료 검증
FeeLimits {
min_fee: 100_000_000_000_000, // 0.0001 SAVT
max_fee: 1_000_000_000_000_000_000, // 1.0 SAVT
}
기능 플래그
| 플래그 | 설명 |
|---|---|
simd | SIMD 최적화 평가 (기본값) |
cache | 점수 캐시 (기본값) |
adaptive_weights | 동적 가중치 조정 |