목적 및 범위
이 문서는 StableNet이 블록체인 상태, 블록, 영수증을 유지하기 위해 사용하는 영구 및 메모리 저장소 아키텍처를 설명합니다.고수준 StateDB 캐싱 레이어부터 원시 데이터베이스 백엔드까지의 계층형 저장소 구조를 다루며, Merkle Patricia Trie, 캐싱 전략, 스냅샷 시스템을 포함합니다. 상태 전환 및 EVM 실행에 대한 내용은 State Transitions and Gas를 참고하세요.
블록체인 관리 및 정식 체인 유지에 대한 내용은 Blockchain Management를 참고하세요.
고대 저장소와 데이터 라이프사이클에 대한 상세 설명은 Ancient Store and Data Lifecycle을 참고하세요.
저장소 레이어 계층
StableNet의 저장소 아키텍처는 각기 다른 추상화 수준과 성능 최적화를 제공하는 여러 레이어로 구성됩니다.StateDB: 상태 캐싱 레이어
StateDB는 블록체인 상태를 조회하고 수정하기 위한 핵심 인터페이스입니다.저널링 기반의 원자성 보장과 스냅샷을 이용한 롤백 기능을 제공하는 고급 캐싱 레이어입니다.
StateDB 구조
| Component | Type | Purpose |
|---|---|---|
db | Database | Trie 데이터베이스 인터페이스 |
trie | Trie | 계정 트라이 루트 |
snaps | *snapshot.Tree | 빠른 접근을 위한 스냅샷 트리 |
snap | snapshot.Snapshot | 현재 활성 스냅샷 |
stateObjects | map[common.Address]*stateObject | 활성 계정 객체 |
stateObjectsPending | map[common.Address]struct{} | 최종화되었으나 커밋되지 않은 객체 |
stateObjectsDirty | map[common.Address]struct{} | 실행 중 수정된 객체 |
stateObjectsDestruct | map[common.Address]*types.StateAccount | 소멸된 객체 |
accounts | map[common.Hash][]byte | 수정된 계정 데이터 |
storages | map[common.Hash]map[common.Hash][]byte | 수정된 저장소 슬롯 |
accountsOrigin | map[common.Address][]byte | 원본 계정 값 |
storagesOrigin | map[common.Address]map[common.Hash][]byte | 원본 저장소 값 |
journal | *journal | 상태 변경 로그 |
validRevisions | []revision | 스냅샷 리비전 |
refund | uint64 | 가스 환불 카운터 |
상태 객체 관리
각 계정은 기본types.StateAccount를 래핑한 stateObject로 관리되며, 실행 중 변경 사항을 추적합니다.
| Field | Type | Purpose |
|---|---|---|
address | common.Address | 계정 주소 |
addrHash | common.Hash | Keccak256(address) |
origin | *types.StateAccount | 원본 계정 데이터 |
data | types.StateAccount | 현재 계정 데이터 |
trie | Trie | 저장소 트라이 |
code | Code | 컨트랙트 바이트코드 |
originStorage | Storage | 원본 저장소 |
pendingStorage | Storage | 커밋 대기 저장소 |
dirtyStorage | Storage | 실행 중 변경된 저장소 |
dirtyCode | bool | 코드 변경 여부 |
selfDestructed | bool | 소멸 표시 |
deleted | bool | 삭제 표시 |
created | bool | 현재 트랜잭션에서 생성 |
저널링 및 스냅샷
StateDB는 모든 상태 변경을 저널에 기록하여 롤백 가능성을 보장합니다.각 저널 항목은
revert() 메서드를 구현하며 다음과 같은 변경 유형을 포함합니다.
balanceChangenonceChangestorageChangecodeChangeextraChangecreateObjectChangeselfDestructChangetouchChangeaddLogChange
Merkle Patricia Trie 구현
Merkle Patricia Trie(MPT)는 상태를 저장하는 핵심 암호화 데이터 구조입니다.StableNet은 해시 기반 스키마와 경로 기반 스키마를 모두 지원합니다.
Trie 노드 타입
| Node Type | Purpose | Structure |
|---|---|---|
fullNode | 16개 자식 분기 | Children [17]node |
shortNode | 경로 압축 | Key []byte, Val node |
valueNode | 리프 값 | []byte |
hashNode | 해시 참조 | []byte |
저장소 스키마: Hash vs Path
StableNet은 두 가지 trie 저장 방식을 지원합니다.| Scheme | Key Format | Purpose |
|---|---|---|
| Hash Scheme | 노드 해시 | 콘텐츠 주소 기반 |
| Path Scheme | 트라이 경로 | 히스토리 및 프루닝 지원 |
해시 스키마는 단순하지만 히스토리를 내장하지 않습니다.
BlockChain 캐싱 전략
BlockChain은 다수의 LRU 캐시를 사용해 데이터베이스 접근을 최소화합니다.| Cache | Size | Purpose |
|---|---|---|
| bodyCache | 256 | 블록 본문 |
| blockCache | 256 | 전체 블록 |
| receiptsCache | 32 | 영수증 |
| txLookupCache | 1024 | 트랜잭션 조회 |
| headerCache | 512 | 블록 헤더 |
| tdCache | 1024 | 총 난이도 |
| numberCache | 2048 | 해시 → 블록 번호 |
스냅샷 시스템
스냅샷은 상태 트라이를 순회하지 않고 계정과 저장소에 빠르게 접근하기 위한 평면화된 뷰를 제공합니다.스냅샷 레이어
| Layer | Purpose | Storage |
|---|---|---|
difflayer | 최근 변경 | 메모리 |
disklayer | 기준 상태 | 디스크 |
스냅샷 구성
| Field | Default | Purpose |
|---|---|---|
SnapshotLimit | 256MB | 스냅샷 캐시 |
SnapshotNoBuild | false | 백그라운드 생성 비활성화 |
SnapshotWait | true | 시작 시 대기 |
상태 커밋 및 최종화
상태 변경은 수정 → 최종화 → 트라이 업데이트 → 커밋 단계를 거칩니다.최종 결과는 새로운 상태 루트 해시로 반환됩니다.
원시 데이터베이스 및 고대 저장소
저수준에서는 키-값 데이터베이스를 사용하며, 오래된 데이터는 고대 저장소로 이동됩니다.고대 저장소 특징
- 데이터베이스 크기 감소
- 과거 데이터의 빠른 순차 접근
- 활성 DB 프루닝 가능
- Era1 아카이브 생성 지원
캐시 구성 요약
| Configuration | Default | Purpose |
|---|---|---|
TrieCleanLimit | 256MB | Clean trie 캐시 |
TrieDirtyLimit | 256MB | Dirty trie 캐시 |
TrieTimeLimit | 5분 | 플러시 지연 |
SnapshotLimit | 256MB | 스냅샷 캐시 |
StateHistory | 0 | 상태 히스토리 |
bodyCacheLimit | 256 | 블록 본문 |
blockCacheLimit | 256 | 전체 블록 |
receiptsCacheLimit | 32 | 영수증 |
txLookupCacheLimit | 1024 | 트랜잭션 조회 |

