메인 콘텐츠로 건너뛰기

스토리지 아키텍처

Savitri Network는 데이터 격리와 효율적인 접근 패턴을 위해 컬럼 패밀리와 함께 RocksDB를 기본 스토리지 백엔드로 사용합니다.

컬럼 패밀리

컬럼 패밀리목적
CF_BLOCKS높이 (u64 LE)블록 (bincode)블록 스토리지
CF_TRANSACTIONStx_hash (32바이트)트랜잭션 (bincode)트랜잭션 조회
CF_ACCOUNTS주소 (32바이트)계정 (24바이트)잔액 + 논스
CF_METADATA문자열 키다양체인 헤드, 설정
CF_RECEIPTStx_hash영수증 (bincode)트랜잭션 영수증
CF_CONTRACTS주소ContractInfo스마트 컨트랙트 상태
CF_GOVERNANCEproposal_id제안 (bincode)거버넌스 제안
CF_ORACLEfeed_idOracleData오라클 피드
CF_BONDS주소보증금 금액검증자 보증금
CF_VOTE_TOKENS주소VoteToken 잔액거버넌스 투표 토큰
CF_TREASURY재무부 상태네트워크 재무부
CF_VESTINGschedule_idVestingSchedule토큰 베스팅
CF_REWARD_COINS주소보상 잔액노드 보상
CF_FEE_METRICS수수료 데이터수수료 모니터링
CF_SUPPLY_METRICS공급량 데이터토큰 공급량
CF_ACTIVE_NODESnode_id활동노드 활성 상태
CF_MONOLITHSmonolith_idMonolith블록 압축
CF_FLFL 데이터연합 학습
CF_POUnode_idPoU 점수합의 점수

계정 인코딩

계정은 24바이트 고정 너비 컴팩트 인코딩을 사용합니다:

바이트 0-15:  잔액 (u128, little-endian)
바이트 16-23: 논스 (u64, little-endian)

하위 호환성: 이전 16바이트 형식(잔액만, 논스=0)도 지원됩니다.

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

상태 루트

상태 루트는 데이터베이스의 사전식 스냅샷을 통해 계산됩니다:

seed  = H("STATEv1-LE")
leaf = H("STATE" || key || value) 각 키-값 쌍에 대해
root = rolling_accumulate(seed, leaf_1, leaf_2, ..., leaf_n)

결정론을 보장하기 위해 키는 사전식 순서로 반복됩니다.

스토리지 트레이트

모든 스토리지 백엔드는 StorageTrait을 구현합니다:

pub trait StorageTrait: Send + Sync {
fn get_cf(&self, cf: &str, key: &[u8]) -> Result<Option<Vec<u8>>>;
fn put_cf(&self, cf: &str, key: &[u8], value: &[u8]) -> Result<()>;
fn delete_cf(&self, cf: &str, key: &[u8]) -> Result<()>;
fn get_cf_prefix(&self, cf: &str, prefix: &[u8]) -> Result<Vec<(Vec<u8>, Vec<u8>)>>;
// ... 배치 작업, 반복 등
}

안전한 역직렬화

모든 bincode 역직렬화는 메모리 고갈을 방지하기 위해 최대 크기 제한을 사용합니다:

const MAX_BINCODE_SIZE: u64 = 16 * 1024 * 1024; // 16MB

캐싱

자주 접근하는 데이터를 위한 LRU 캐시 레이어:

  • 계정 캐시: 잔액/논스 확인을 위한 RocksDB 읽기 감소
  • 컨트랙트 스토리지 캐시: 컨트랙트 실행 시 SLOAD 결과 메모이제이션
  • 점수 캐시: 멤풀에서 TX 평가를 위한 LRU 캐시 (재계산 방지)

RocksDB 설정

매개변수개발운영
캐시 크기256 MB1024 MB
쓰기 버퍼16 MB64 MB
최대 열린 파일1001000
동기화 간격5초30초
압축비활성화활성화

배치 작업

원자적 배치 쓰기로 일관성 보장:

let mut batch = storage.batch();
batch.put_cf(CF_ACCOUNTS, &addr, &account.encode());
batch.put_cf(CF_TRANSACTIONS, &tx_hash, &tx_bytes);
batch.put_cf(CF_BLOCKS, &height_key, &block_bytes);
batch.commit()?;

베스팅 시스템

토큰 베스팅 일정은 세 가지 유형을 지원합니다:

유형동작
Linear시간에 따라 선형적으로 토큰 해제
Cliff클리프 기간 전에는 토큰 없음, 이후 선형 해제
Staged제네시스 호환 모드

기능 플래그

플래그설명
rocksdbRocksDB 백엔드 (기본값)
memory메모리 내 백엔드 (테스트)
prometheusPrometheus 메트릭 내보내기
tempfile테스트용 임시 스토리지