메인 콘텐츠로 건너뛰기
이 문서는 블록체인 데이터, 스냅샷 및 데이터베이스 내용을 관리하기 위해 StableNet에서 제공하는 데이터 가져오기 및 내보내기 유틸리티를 설명합니다.
이 유틸리티는 파일 기반 체인 동기화, 블록체인 백업, 과거 데이터 아카이빙, 데이터베이스 조작을 가능하게 합니다.
P2P 네트워크를 통한 라이브 체인 동기화에 대한 정보는 체인 동기화를 참고하세요. 데이터베이스 아키텍처 및 저장소 메커니즘은 데이터베이스 레이어 및 Merkle Patricia Trie고대 저장소 및 데이터 라이프사이클을 참고하세요.

개요

StableNet은 다양한 유형의 블록체인 데이터를 가져오고 내보내기 위한 명령줄 유틸리티 세트를 제공합니다.
이 유틸리티는 네트워크 연결이 아닌 파일 기반으로 동작하며 다음과 같은 목적을 가집니다.
  • 오프라인 동기화: 신뢰된 체인 덤프를 통한 노드 부트스트랩
  • 백업 및 복구: 재해 복구를 위한 체인 상태 백업
  • 과거 아카이빙: Era1 형식을 사용한 과거 블록 데이터 보관
  • 데이터베이스 마이그레이션: 노드 간 원시 DB 데이터 이동
  • 테스트 및 개발: 특정 체인 구간의 선택적 가져오기/내보내기
모든 유틸리티는 .gz 확장자를 통해 gzip 압축을 자동 감지하며,
장시간 실행 작업에 대해 인터럽트 기반 중단을 지원합니다.

체인 가져오기 및 내보내기

ImportChain

ImportChain은 RLP 인코딩된 파일에서 블록을 읽어 블록체인에 삽입합니다.
메모리 사용을 제한하기 위해 배치 단위로 처리됩니다.
  • 배치 크기: 2500 블록
  • 제네시스 블록은 자동으로 건너뜁니다
  • 이미 존재하는 블록은 삽입하지 않습니다
  • SIGINT / SIGTERM 신호를 감지하여 안전하게 중단합니다
누락 블록 판별 로직은 다음 기준을 사용합니다.
  • 현재 헤드 이하: HasBlock
  • 현재 헤드 초과: HasBlockAndState

ExportChain

ExportChain은 전체 블록체인을 단일 RLP 파일로 내보냅니다.
  • 기존 파일이 있으면 덮어씁니다
  • .gz 확장자 사용 시 gzip 압축 적용
  • 내부적으로 blockchain.Export를 사용합니다

ExportAppendChain

ExportAppendChain은 지정한 블록 범위를 기존 파일 뒤에 추가로 기록합니다.
  • 증분 백업 또는 구간 분리 내보내기에 적합
  • first부터 last까지(포함) 블록을 기록합니다

Era1 히스토리 형식

Era1은 Ethereum Portal Network 사양에 정의된 표준 과거 데이터 포맷입니다.
하나의 Era1 파일은 약 8192개 블록(1 epoch)과 다음 데이터를 포함합니다.
  • 블록 헤더 및 본문
  • 영수증
  • 총 난이도

ImportHistory

Era1 디렉터리를 사용해 체인을 제네시스부터 복원합니다. 요구 조건:
  • 현재 블록 높이는 반드시 0
  • checksums.txt 파일 존재
  • Era1 파일 명명 규칙 준수
처리 흐름:
  1. 디렉터리 내 Era1 파일 나열
  2. SHA256 체크섬 검증
  3. Era1 파일 단위로 블록 반복 처리
  4. 제네시스 블록 제외
  5. HeaderChain → ReceiptChain 순서로 삽입
  6. 주기적 진행 로그 출력

ExportHistory

체인 데이터를 Era1 형식으로 내보냅니다.
  • step 값은 일반적으로 8192
  • 파일명에 누적기 루트 해시 포함
  • checksums.txt 자동 생성

Preimage 가져오기 및 내보내기

Preimage는 상태 트라이에서 해시되기 전의 원본 키 데이터입니다.

ImportPreimages

RLP 파일에서 preimage 데이터를 데이터베이스로 복원합니다.
  • 배치 단위(1024개)로 처리
  • Keccak256 해시를 키로 사용
  • 해당 기능은 향후 제거 예정(deprecated)

ExportPreimages

DB에 저장된 모든 preimage를 파일로 내보냅니다.

ExportSnapshotPreimages

특정 스냅샷 루트 기준으로 필요한 preimage만 추출합니다.
  • 계정 주소 preimage
  • 해당 계정의 모든 저장소 키 preimage
  • 누락된 preimage가 있으면 오류 발생

LevelDB 데이터 가져오기 및 내보내기

저수준 DB 조작을 통해 노드 간 상태 이전이나 복구를 지원합니다.

LDB Export 헤더 구조

  • Magic: "gethdbdump"
  • Version: 0
  • Kind: 데이터 타입
  • UnixTime: 내보내기 시각

ImportLDBData

원시 키-값 쌍을 DB로 가져옵니다.
  • 작업 코드: Add / Delete
  • 배치 크기 초과 시 즉시 플러시
  • 1000개 단위로 인터럽트 확인

ExportChaindata

일반화된 DB 내보내기 유틸리티입니다.
ChainDataIterator 인터페이스를 통해 다양한 데이터 소스를 처리합니다.
type ChainDataIterator interface {
  Next() (byte, []byte, []byte, bool)
  Release()
}

데이터 무결성 및 검증

체크섬 검증

Era1 가져오기 시 파일 전체를 SHA256으로 검증한 후 처리합니다.
파싱 이전 단계에서 무결성을 보장합니다.

블록 검증

  • 중복 블록 제거
  • 합의 엔진을 통한 헤더/본문 검증
  • 상태 가용성 확인

인터럽트 처리

모든 장시간 작업은 다음 패턴을 따릅니다.
  1. 인터럽트 채널 생성
  2. SIGINT / SIGTERM 핸들링
  3. 신호 수신 시 채널 종료
  4. 메인 루프에서 주기적 확인

파일 형식 요약

FormatExtensionCompressionContentUse Case
RLP Chain.rlpOptional .gzBlock sequenceFull backup
Era1.era1NoneEpoch blocksHistory archive
LDB.ldbOptional .gzRaw KVDB migration
Preimages.rlpOptional .gzTrie preimageState recovery

자동 압축 감지 로직

if strings.HasSuffix(fn, ".gz") {
  reader, _ = gzip.NewReader(reader)
  writer = gzip.NewWriter(writer)
}

진행 상황 보고

  • 기본 로그 주기: 8초
  • 출력 정보:
    • 작업 유형
    • 현재 위치
    • 누적 경과 시간

명령줄 통합

CommandFunctionDescription
gstable importImportChainImport RLP chain
gstable exportExportChainExport full chain
gstable export ‘first’ ‘last’ExportAppendChainExport range
gstable import-historyImportHistoryImport Era1
gstable export-historyExportHistoryExport Era1
gstable import-preimagesImportPreimagesImport preimages
gstable export-preimagesExportPreimagesExport preimages
gstable db importImportLDBDataImport raw DB
gstable db exportExportChaindataExport raw DB