핵심 타입 및 암호화
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)
}
암호화 프리미티브
서명
| 알고리즘 | 라이브러리 | 용도 |
|---|---|---|
| Ed25519 | ed25519-dalek | 트랜잭션 서명, 블록 서명, 피어 신원 |
키 크기:
- 개인 키: 32바이트
- 공개 키: 32바이트
- 서명: 64바이트
- 주소: 16진수로 인코딩된 공개 키 (16진수 64자)
해시 함수
| 함수 | 라이브러리 | 용도 |
|---|---|---|
| SHA-256 | sha2 | 트랜잭션 서명 메시지 해시 |
| SHA-512 | sha2 | 블록 해시 (도메인 태그 "BLK" + 버전 바이트 포함) |
| BLAKE3 | blake3 | 상태 루트 계산, 고속 해싱 |
| Keccak256 | sha3 | 컨트랙트 스토리지 슬롯 파생 |
도메인 태그 해싱
서로 다른 도메인 간의 해시 충돌을 방지하기 위해 모든 해시에 도메인 태그가 포함됩니다:
| 도메인 | 태그 | 설명 |
|---|---|---|
| 블록 | "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 지원과 같은 기능을 추가합니다.