Blockchain

Celestia 데이터 가용성 샘플링(DAS) 분석

2025-12-274 min read

데이터 가용성 샘플링(DAS)에서 샘플 수량 결정 방식

  1. 라이트 노드의 샘플링 설정
  • share/availability/light/options.go 파일에서, 라이트 노드의 기본 샘플 수량이 16개로 정의되어 있습니다.
// DefaultSampleAmount는 라이트 노드가 블록이 사용 가능하다고 선언하기 전에 수행해야 하는 최소 샘플 수를 지정합니다.
var (
    DefaultSampleAmount uint = 16
)
  1. DAS 관련 주요 매개변수
  • das/options.go 파일의 DefaultParameters() 함수에서 DAS의 기본 설정을 확인할 수 있습니다.
// DefaultParameters는 daser(샘플링 모듈)의 기본 설정값을 반환합니다.
func DefaultParameters() Parameters {
    concurrencyLimit := 16
    return Parameters{
        SamplingRange: 100,
        ConcurrencyLimit: concurrencyLimit,
        BackgroundStoreInterval: 10 * time.Minute,
        SampleFrom: 1,
        SampleTimeout: 15 * time.Second * time.Duration(concurrencyLimit),
    }
}

여기서 SamplingRange: 100은 한 번의 샘플링 작업에서 최대 100개의 헤더를 처리할 수 있음을 의미하지만, 블록당 샘플 수량을 직접적으로 정의하는 것은 아닙니다.

  1. 무작위 샘플링 구현 방식
  • share/availability/light/sample.go 파일의 selectRandomSamples 함수는 데이터 정사각형(squares)에서 무작위로 샘플을 선택하는 방식을 보여줍니다.
// selectRandomSamples는 주어진 크기의 정사각형에서 무작위로 고유한 좌표를 선택합니다.
func selectRandomSamples(squareSize, sampleCount int) []shwap.SampleCoords {
    total := squareSize * squareSize
    if sampleCount > total {
        sampleCount = total
    }
    
    samples := make(map[shwap.SampleCoords]struct{}, sampleCount)
    for len(samples) < sampleCount {
        s := shwap.SampleCoords{
            Row: randInt(squareSize),
            Col: randInt(squareSize),
        }
        samples[s] = struct{}{}
    }
    return slices.Collect(maps.Keys(samples))
}

위 코드에서 샘플링 개수는 블록 데이터의 정사각형 크기에 따라 다르며, 주어진 개수만큼 무작위로 선택됩니다.

  1. 라이트 노드의 데이터 가용성 확인 과정
  • share/availability/light/availability.go 파일의 SharesAvailable 메서드를 살펴보면, 특정 블록 헤더에 대한 기존 샘플링 결과가 없을 경우 새로운 샘플링을 수행하는 것을 확인할 수 있습니다.
samples = NewSamplingResult(len(dah.RowRoots), int(la.params.SampleAmount))

여기서 dah.RowRoots의 길이(즉, 데이터 정사각형의 크기)와 설정된 샘플 수량(기본값: 16개) 을 기반으로 샘플링이 이루어집니다.


16KB 블록의 샘플 수량 분석

Celestia에서 16KB 블록의 샘플링 방식은 다음과 같습니다.

  1. 라이트 노드의 기본 샘플 수량
  • 기본적으로 라이트 노드는 블록 크기에 상관없이 16개의 샘플을 사용합니다.
  1. 16KB 블록의 경우 샘플링 과정
  • 16KB 블록은 주어진 블록 크기에 따라 정사각형 형태로 변환됩니다.
  • 보통 4×4(16개)의 공유 데이터(share)로 나뉘어 저장됩니다.
  • 라이트 노드는 이 16개의 공유 데이터 중 16개를 무작위로 선택하여 샘플링합니다.
  • 이렇게 선택된 샘플을 통해 블록이 네트워크에서 제대로 전파되었는지를 확인합니다.
  1. 풀 노드(Full Node) vs. 라이트 노드(Light Node)
  • share/doc.go 파일에 따르면, 라이트 노드는 16개의 샘플만 사용하여 가용성을 확인하지만, 풀 노드는 전체 데이터를 다운로드하여 가용성을 검증합니다.
// Light Availability 구현은 블록 데이터의 16개 샘플을 확인하여 가용성을 검증합니다.
// Full Availability 구현은 데이터를 완전히 복구할 수 있을 만큼의 샘플을 다운로드합니다.

결론: 샘플 수량 분석 요약

  1. 라이트 노드의 기본 샘플 수량은 16개
  • share/availability/light/options.go에서 기본값으로 16개 설정
  • 블록 크기와 상관없이 동일한 수량으로 샘플링 진행
  1. 16KB 블록에서는 전체 데이터 공유 개수가 16개이므로, 전체를 샘플링
  • 블록이 4×4 정사각형으로 변환되며, 16개 중 16개를 샘플링
  • 16개만 샘플링해도 충분한 확률로 가용성을 검증할 수 있음

👉 결론적으로, Celestia의 라이트 노드는 기본적으로 블록당 16개의 샘플을 추출하여 데이터 가용성을 검증하도록 설계되어 있습니다. 🚀

데이터 가용성 샘플링의 확률적 보장

Celestia의 데이터 가용성 샘플링(DAS)에서 16개의 샘플은 다음과 같은 확률적 보장을 제공합니다:

이론적 배경

데이터 가용성 샘플링은 정보 이론과 확률론에 기반합니다. 특히 "샘플링 게임" 이론에 따르면:

  • 블록 생성자가 데이터의 일부(예: 50%)를 숨기면, 무작위로 선택된 각 샘플이 그 숨겨진 부분을 발견할 확률은 50%입니다.

  • 16개의 독립적인 샘플을 선택할 경우, 숨겨진 데이터를 하나도 발견하지 못할 확률은 (0.5)16=0.0000152587890625(0.5)^{16} = 0.0000152587890625, 즉 약 0.0015%입니다.

  • 이는 반대로 말하면, 데이터의 50%가 누락된 경우 16개의 샘플로 99.9985%의 확률로 최소 하나 이상의 문제를 발견할 수 있다는 뜻입니다.

샘플 수와 보안성 사이의 관계

실제 코드에서 DefaultSampleAmount가 16으로 설정된 이유는 다음과 같습니다:

  1. 공격자의 데이터 은닉 비율에 따른 탐지 확률:

    • 25% 데이터 은닉: 16개 샘플로 약 99.9999% 탐지 확률

    • 10% 데이터 은닉: 16개 샘플로 약 82% 탐지 확률

  2. 효율성과 보안성의 균형:
    샘플 수가 증가할수록 보안성은 향상되지만, 네트워크 부하와 처리 시간도 증가합니다. 16개의 샘플은 다음을 고려한 균형점입니다:

    • 네트워크 부하 최소화

    • 충분한 보안 레벨 제공

    • 경량 노드에 적합한 계산 부담

  3. 네트워크 전체의 집단적 검증:
    개별 노드는 16개 샘플만 검사하지만, 수천 개의 노드가 각각 다른 무작위 샘플을 검사함으로써 네트워크 전체적으로는 모든 데이터가 검증됩니다.

실제 보안성

실제 Celestia 네트워크에서는 공격자가 데이터의 작은 부분만 숨기더라도, 충분한 수의 노드가 샘플링을 수행하면 높은 확률로 탐지됩니다. 여러 노드에서 각각 16개의 샘플을 취하면, 네트워크 전체적으로는 훨씬 더 높은 보안성을 달성합니다.

따라서 16개의 샘플은 단일 라이트 노드에서 리소스 효율성과 적절한 보안성을 균형 있게 제공하는 수치이며, 네트워크 전체적으로는 매우 높은 수준의 데이터 가용성 보장을 제공합니다.

Share

Related Articles

Comments

이 블로그는 제가 알고 있는 것들을 잊지 않기 위해 기록하는 공간입니다.
직접 작성한 글도 있고, AI의 도움을 받아 정리한 글도 있습니다.
정확하지 않은 내용이 있을 수 있으니 참고용으로 봐주세요.

© 2026 Seogyu Kim