암호학 사양
Savitri Network에서 사용되는 모든 암호학적 기본 요소의 전체 사양입니다.
서명 스키마
| 속성 | 값 |
|---|---|
| 알고리즘 | Ed25519 |
| 라이브러리 | ed25519-dalek |
| 개인 키 | 32바이트 |
| 공개 키 | 32바이트 (압축된 Edwards 점) |
| 서명 | 64바이트 |
| 주소 | 16진수 인코딩된 공개 키 (64자 hex) |
트랜잭션 서명
message = from_hex_bytes || to_hex_bytes || amount_le_u64 || nonce_le_u64 || fee_le_u128
hash = SHA-256(message)
sig = Ed25519_sign(signing_key, hash)
블록 서명
블록은 제안자가 블록 헤더 해시 (SHA-512)에 Ed25519로 서명합니다.
피어 신원
libp2p 피어는 자신의 피어 신원 키에 Ed25519를 사용합니다 (계정 키와 별도).
해시 함수
SHA-256
| 사용 | 입력 | 출력 |
|---|---|---|
| 트랜잭션 서명 메시지 | 정규 TX 바이트 | 32바이트 |
| Monolith 커밋 | 헤더 필드 | 32바이트 |
| ZKP 문 해시 | 문 필드 | 32바이트 |
| AES 키 파생 | 비밀번호 | 32바이트 |
SHA-512
| 사용 | 입력 | 출력 |
|---|---|---|
| 블록 해시 | "BLK" + 버전 바이트 + 헤더 바이트 | 64바이트 |
| 헤더 커밋 | 블록 헤더의 이진 트리 | 64바이트 |
BLAKE3
| 사용 | 입력 | 출력 |
|---|---|---|
| 빠른 해시 | 범용 | 가변 |
| 상태 계산 | 상태 데이터 | 32바이트 |
Keccak256
| 사용 | 입력 | 출력 |
|---|---|---|
| 컨트랙트 스토리지 슬롯 | address || base_slot | 8바이트 (u64) |
| 중첩 매핑 | key || inner_hash | 8바이트 (u64) |
도메인 분리
모든 해시 계산은 도메인 간 충돌을 방지하기 위해 도메인 태그를 포함합니다:
| 도메인 | 태그 | 해시 | 출력 |
|---|---|---|---|
| 블록 | "BLK" + version: u8 | SHA-512 | 64바이트 |
| TX 루트 | 리프 태그 "TXv1" | 롤링 누산기 | 32바이트 |
| 상태 루트 | 시드 "STATEv1-LE" + 리프 "STATE" | 사전 순서 스냅샷 | 32바이트 |
트랜잭션 루트
정규 bincode 트랜잭션에 대한 롤링 누산기로 계산됩니다:
accumulator = H("TXv1")
for tx in transactions:
leaf = bincode::serialize(tx)
accumulator = H(accumulator || leaf)
tx_root = accumulator
상태 루트
데이터베이스의 사전 순서 스냅샷으로 계산됩니다:
seed = H("STATEv1-LE")
for (key, value) in storage.iter_sorted():
leaf = H("STATE" || key || value)
seed = H(seed || leaf)
state_root = seed
암호화
AES-256-GCM (저장 시)
다음에 사용됩니다:
- SDK의 개인 키 암호화
- 모바일 데이터베이스 컬럼 암호화
- IoT 커넥터의 기기 데이터 암호화
| 속성 | 값 |
|---|---|
| 알고리즘 | AES-256-GCM |
| 키 크기 | 256비트 |
| 논스 크기 | 96비트 (12바이트) |
| 태그 크기 | 128비트 (16바이트) |
| 키 파생 | 비밀번호 기반 |
P2P 암호화
| 속성 | 값 |
|---|---|
| 프로토콜 | Noise (XX 핸드셰이크 패턴) |
| 키 교환 | X25519 |
| 암호 | ChaChaPoly |
| 멀티플렉싱 | Yamux |
키 파생 (모바일)
BIP-39
- 단어 목록: 영어 (2048 단어)
- 엔트로피: 128비트 (12 단어) 또는 256비트 (24 단어)
- 니모닉 → 시드: PBKDF2-HMAC-SHA512 (2048 반복)
BIP-44
- 경로:
m/44'/1337'/0'/0/0 - 코인 유형: 1337 (Savitri)
- 계정: 0
- 변경: 0 (외부)
- 인덱스: 0
키 계층 구조
mnemonic → seed (512 bits)
→ master_key (via HMAC-SHA512)
→ m/44' → m/44'/1337' → m/44'/1337'/0'
→ m/44'/1337'/0'/0 → m/44'/1337'/0'/0/0
→ ed25519_private_key (32 bytes)
→ ed25519_public_key (32 bytes)
→ address (hex-encoded, 64 chars)
영지식 증명
자세한 내용은 ZKP 아키텍처를 참조하세요.
| 백엔드 | 커브 | 증명 시스템 | 사용 사례 |
|---|---|---|---|
| Mock | N/A | 항상 유효 | 테스트 |
| Arkworks | BN254 | Groth16 | 프로덕션 |
| PLONK | BN254 | PLONK | 범용 |
보안 속성
상수 시간 연산
모든 서명 검증은 타이밍 기반 사이드 채널 공격을 방지하기 위해 상수 시간 비교를 사용합니다 (subtle 크레이트를 통해).
키 제로화
개인 키는 SDK와 모바일 앱 모두에서 zeroize 크레이트를 통해 drop 시 제로화됩니다.
재생 방지
- 트랜잭션: 논스 기반 (계정당 단조 증가)
- FL 업데이트: 트레이너별 라운드당 논스
- 오라클 피드: 시퀀스 번호 추적
- P2P 메시지: Gossipsub 중복 제거