메인 콘텐츠로 건너뛰기

핵심 타입 및 암호화

savitri-core는 Savitri Network의 모든 크레이트에서 사용되는 기본 타입, 암호화 프리미티브 및 유틸리티를 제공합니다.

핵심 타입

Transaction

pub struct Transaction {
pub from: String, // 발신자 주소 (16진수 64자)
pub to: String, // 수신자 주소 (16진수 64자)
pub amount: u64, // 전송 금액
}

Account

pub struct Account {
pub balance: u128, // 최소 단위 잔액 (소수점 18자리)
pub nonce: u64, // 트랜잭션 카운터
}

인코딩: 24바이트 고정 형식 (잔액 16바이트 LE + 논스 8바이트 LE). 이전 16바이트 형식(잔액만)과 호환됩니다.

보안: credit()debit()은 오버플로우/언더플로우를 방지하기 위해 검사된 산술 연산을 사용합니다.

수수료 한도

pub struct FeeLimits {
pub min_fee: u128, // 기본값: 0.0001 SAVT (10^14)
pub max_fee: u128, // 기본값: 1.0 SAVT (10^18)
}

암호화 프리미티브

서명

알고리즘라이브러리용도
Ed25519ed25519-dalek트랜잭션 서명, 블록 서명, 피어 신원

키 크기:

  • 개인 키: 32바이트
  • 공개 키: 32바이트
  • 서명: 64바이트
  • 주소: 16진수로 인코딩된 공개 키 (16진수 64자)

해시 함수

함수라이브러리용도
SHA-256sha2트랜잭션 서명 메시지 해시
SHA-512sha2블록 해시 (도메인 태그 "BLK" + 버전 바이트 포함)
BLAKE3blake3상태 루트 계산, 고속 해싱
Keccak256sha3컨트랙트 스토리지 슬롯 파생

도메인 태그 해싱

서로 다른 도메인 간의 해시 충돌을 방지하기 위해 모든 해시에 도메인 태그가 포함됩니다:

도메인태그설명
블록"BLK" + 버전 바이트블록 해시
트랜잭션 루트"TXv1" 리프 태그bincode에 대한 롤링 누산기
상태 루트"STATEv1-LE" 시드사전식 DB 스냅샷

키 관리

pub struct KeyManager {
// 신원 키 쌍 로드 또는 생성
pub fn load_or_generate(path: &Path) -> Result<KeyPair>;
// 새 키 쌍 생성
pub fn generate() -> KeyPair;
}

pub struct KeyPair {
pub signing_key: SigningKey,
pub verifying_key: VerifyingKey,
}

키는 32바이트 원시 형식으로 디스크에 저장됩니다. MemoryKeyStorage는 테스트를 위한 메모리 내 스토리지를 제공합니다.

암호화

민감한 데이터의 저장 시 AES-GCM 암호화:

// 비밀번호에서 파생된 키로 암호화
let encrypted = encrypt_aes_gcm(plaintext, password)?;

// 복호화
let plaintext = decrypt_aes_gcm(ciphertext, password)?;

슬롯 스케줄러

리더 교체를 위한 결정론적 슬롯 스케줄링:

pub struct SlotScheduler {
slot_duration_ms: u64,
base_ms: u64,
validators: Vec<String>,
local_id: String,
}

pub enum SlotRole {
Leader, // 이 슬롯에서 블록 생성
Follower, // 블록 검증
Observer, // 관찰만 (guardian 노드)
}

pub struct SlotInfo {
pub slot: u64,
pub round: u32,
pub leader: Option<String>,
pub role: SlotRole,
pub start_ms: u64,
pub end_ms: u64,
}

리더 배정: leader_index = slot % validators.len(). 동일한 검증자 집합과 슬롯 번호가 주어지면 결정론적입니다.

Monolith

Monolith는 효율적인 저장 및 동기화를 위해 여러 블록을 하나의 구조로 압축합니다:

pub struct MonolithHeader {
pub exec_height: u64, // 실행 높이
pub window_start: u64, // monolith의 첫 번째 블록
pub epoch_id: u64, // 에포크 식별자
pub block_count: u64, // 포함된 블록 수
pub size_bytes: u64, // 전체 크기
pub monolith_id: String, // 고유 식별자
pub produced_at_ms: u64, // 생성 타임스탬프
pub cosignatures: Vec<..>, // 검증자 공동 서명
}

메트릭

메트릭 시스템은 Prometheus 호환 메트릭을 제공합니다:

pub struct MetricsProvider {
// 카운터, 게이지, 히스토그램 등록
pub fn register_counter(name: &str, help: &str) -> Counter;
pub fn register_gauge(name: &str, help: &str) -> Gauge;
}

카테고리: 블록체인, 멤풀, 네트워크, 스토리지, 실행, 시스템, 보안, 토큰이코노믹스.

엔드포인트: http://127.0.0.1:9090/metrics (5초 업데이트 간격).

이중 코어 구조

두 개의 savitri-core 디렉터리가 존재합니다:

경로목적의존성
Savitri-core/Savitri-core/독립형 (crates.io 배포 가능)내부 의존성 없음
Savitri-core/확장 버전savitri-storage, savitri-zkp

독립형 버전은 MIT 라이선스로 외부 사용에 적합합니다. 확장 버전은 RocksDB 통합, 압축, libp2p 지원과 같은 기능을 추가합니다.