> ## Documentation Index
> Fetch the complete documentation index at: https://docs.intention.xyz/llms.txt
> Use this file to discover all available pages before exploring further.

# 인덱서

> 커밋된 블록이 질의 가능한 데이터가 되는 과정. 풀 노드에서 REST와 WebSocket 표면까지 이어지는 스트리밍 경로.

체인은 블록을 커밋합니다. 애플리케이션은 *이 계정의 지난주 체결 내역은 무엇인가*, *지금 오더북은 어떤 모양인가* 같은 질문을 던집니다. 블록 형태의 기록이 잘 답하지 못하는 질문입니다. 인덱서는 전자를 후자로 바꾸는 장치입니다.

대부분의 체인에서 인덱서는 인프라의 급소입니다. 체인이 불투명한 이벤트를 내보내고 제3자가 거기에서 의미를 재구성하므로, 애플리케이션이 믿는 내용은 어느 인덱서를 신뢰하느냐에 달라집니다. 여기에는 그 재구성 단계가 없습니다. [커널](/ko/protocol/architecture/kernel)이 타입과 귀속이 붙은 출력을 내보내고, 모든 상태 변경은 이미 원인이 된 트랜잭션에 묶여 있습니다. 그래서 인덱서는 의미를 추론하는 대신 데이터의 형태만 바꿉니다.

그래서 인덱서의 역할 자체가 달라집니다. 인덱서는 진실의 원천이 아니라 **서빙 레이어**입니다. 인덱서가 보고하는 내용은 무엇이든 체인과 대조해 검사할 수 있고, 불일치는 열린 질문이 아니라 인덱서의 버그입니다.

<h2 id="the-path">
  경로
</h2>

<div className="dg" data-dg="indexer-path">
  <div className="dg-c" style={{aspectRatio:"720 / 318"}}>
    <svg className="dg-w" viewBox="0 0 720 318" aria-hidden="true">
      <path className="dg-wire dg--blue dg-soft" d="M 123.00 102.00 L 155.98 75.97" />

      <path className="dg-head dg--blue" d="M 161.00 72.00 L 158.70 79.42 L 153.25 72.51 Z" />

      <path className="dg-wire dg--blue dg-soft" d="M 123.00 102.00 L 156.23 131.73" />

      <path className="dg-head dg--blue" d="M 161.00 136.00 L 153.30 135.01 L 159.16 128.45 Z" />

      <path className="dg-wire dg--sky dg-soft" d="M 349.00 72.00 L 381.98 98.03" />

      <path className="dg-head dg--sky" d="M 387.00 102.00 L 379.25 101.49 L 384.70 94.58 Z" />

      <path className="dg-wire dg--sky dg-soft" d="M 349.00 136.00 L 382.23 106.27" />

      <path className="dg-head dg--sky" d="M 387.00 102.00 L 385.16 109.55 L 379.30 102.99 Z" />

      <path className="dg-wire dg--green" d="M 536.00 102.00 L 551.60 102.00" />

      <path className="dg-head dg--green" d="M 558.00 102.00 L 551.60 106.40 L 551.60 97.60 Z" />
    </svg>

    <div className="dg-band" style={{left:"20.8333%",top:"8.1761%",width:"29.1667%",height:"47.7987%"}}><span className="dg-cap">시점에 따라 분리</span></div>
    <div className="dg-b dg--blue" style={{left:"0.0000%",top:"19.4969%",width:"16.3889%",height:"25.1572%"}}><span className="dg-t">풀 노드</span><span className="dg-s">커밋된 블록 · 타입이 있는 레코드로 스트리밍</span></div>
    <div className="dg-b dg--sky" style={{left:"23.0556%",top:"14.4654%",width:"24.7222%",height:"16.3522%"}}><span className="dg-t">캐시</span><span className="dg-s">최근 — 메모리에서</span></div>
    <div className="dg-b dg--sky" style={{left:"23.0556%",top:"34.5912%",width:"24.7222%",height:"16.3522%"}}><span className="dg-t">파일 저장소</span><span className="dg-s">과거 — 내구성 있게</span></div>
    <div className="dg-b dg--sky" style={{left:"54.4444%",top:"19.4969%",width:"19.4444%",height:"25.1572%"}}><span className="dg-t">데이터 서비스</span><span className="dg-s">둘을 하나의 스트림으로 제시</span></div>
    <div className="dg-b dg--green" style={{left:"78.0556%",top:"19.4969%",width:"21.9444%",height:"25.1572%"}}><span className="dg-t">게이트웨이 → REST · WebSocket</span><span className="dg-s">접근 권한, 할당량, 라우팅</span></div>
    <div className="dg-b dg-dashed dg-left" style={{left:"0.0000%",top:"67.2956%",width:"48.8889%",height:"27.6730%"}}><span className="dg-t">분리가 존재하는 이유</span><span className="dg-s">헤드 추적은 지연에 민감하고 규모가 작습니다. 과거 질의는 처리량에 민감하고 규모가 크며, 경로를 공유하면 큰 백필 하나가 실시간 경로를 멈춰 세웁니다.</span></div>
    <div className="dg-b dg-dashed dg-left" style={{left:"51.1111%",top:"67.2956%",width:"48.8889%",height:"27.6730%"}}><span className="dg-t">진실의 원천이 아니라 서빙 레이어</span><span className="dg-s">커널이 타입과 귀속이 붙은 출력을 내보내므로, 인덱서는 의미를 추론하는 대신 형태만 바꿉니다. 체인과의 불일치는 인덱서의 버그입니다.</span></div>
  </div>
</div>

**풀 노드**가 출발점입니다. 거래 기록은 해석이 필요한 원시 트랜잭션이 아니라 타입이 있는 데이터로 노드에서 흘러나옵니다.

**캐시와 파일 저장소**는 스트림을 시점에 따라 나눕니다. 최근 데이터는 메모리에서 제공됩니다. 대부분의 소비자가 찾는 데이터가 최근 데이터이고 지연 시간이 중요하기 때문입니다. 과거 데이터는 내구성 있는 파일 저장소에 기록됩니다. 전부를 메모리에 두는 것은 전략이 아니기 때문입니다. 오래된 데이터를 요청하는 소비자와 체인 헤드를 따라가는 소비자는 서로 다른 곳에서 응답을 받지만, 어느 쪽도 그 사실을 알아차리지 못합니다.

**데이터 서비스**는 둘을 하나의 스트림으로 제시합니다. 클라이언트는 어느 지점에서 시작하는 구간이든 요청할 수 있고, 그 구간이 캐시에서 오는지 파일에서 오는지 양쪽에서 오는지는 클라이언트가 신경 쓸 문제가 아닙니다.

**게이트웨이**는 서비스와 공개 인터넷 사이에 놓이는 문제들을 처리합니다. 접근 권한, 할당량, 라우팅입니다.

**REST와 WebSocket 표면**이 애플리케이션이 실제로 사용하는 부분입니다. 시장 데이터, 주문과 체결 내역, 포지션, 계정 상태, 펀딩 지급, 실시간 구독을 제공합니다. 엔드포인트 수준의 세부 사항은 [API 레퍼런스](https://testnet-openapi.intention.xyz/)를 참고하십시오.

<h2 id="why-the-split-exists">
  분리가 존재하는 이유
</h2>

체인 헤드를 따라가면서 동시에 과거 질의에도 답하는 단일 서비스는 어느 쪽도 잘하지 못합니다. 헤드 추적은 지연에 민감하고 규모가 작습니다. 과거 질의는 처리량에 민감하고 규모가 크며, 큰 백필 하나가 실시간 경로를 멈춰 세웁니다.

둘을 분리하면 몇 달 전부터 새 소비자를 백필하더라도 헤드를 따라가는 마켓 메이커의 피드가 나빠지지 않고, 각각을 독립적으로 확장할 수 있습니다. 부하 특성이 전혀 다르므로 실제로 그래야 합니다.

<h2 id="what-it-is-safe-to-rely-on">
  믿고 써도 되는 범위
</h2>

**안전합니다.** 인덱서가 제공하는 것 중 커밋된 블록에서 도출된 모든 것이 여기에 해당합니다. 체결, 주문, 포지션, 펀딩 지급, 이체, 시장 데이터입니다. 전부 체인 출력의 형태를 바꾼 것입니다.

**같은 이야기가 아닙니다.** 아직 커밋되지 않은 것은 다릅니다. [멤풀](/ko/protocol/architecture/mempool)에 받아들여진 주문은 아직 순서가 정해지지 않았고, 인덱서는 그에 대해 할 말이 없습니다. 인덱서에 없다는 것은 아직 커밋되지 않았다는 뜻이지 거부되었다는 뜻이 아닙니다.

**검증 가능합니다.** 결제 분쟁이나 감사, 회계 대사처럼 답이 충분히 중요한 경우라면 인덱서에서 가져오는 대신 체인과 직접 대조할 수 있습니다. 직접 풀 노드를 운영하는 것이 가장 강력한 형태이며, 틀릴 여유가 없는 참여자라면 그렇게 해야 합니다. 이 방법은 [노드 운영](/ko/developers/run-a-node)에서 다룹니다.

<Note>
  같은 커밋 구간을 읽는 두 소비자는 같은 답을 받아야 합니다. 그렇지 않다면 그 차이는 서빙 경로에 있으며, 인덱서를 통해 체인을 읽는 일에 내재된 성질이 아니라 신고해야 할 버그입니다.
</Note>

<h2 id="where-to-go-next">
  다음으로 읽을 문서
</h2>

<CardGroup cols={2}>
  <Card title="상태 모델" href="/ko/protocol/architecture/state/model">
    인덱서가 무엇을 읽고 있으며, 어느 표현이 권위를 갖는지 설명합니다.
  </Card>

  <Card title="개발자" href="/ko/developers/overview">
    REST와 WebSocket 표면, SDK, 도구입니다.
  </Card>

  <Card title="노드 운영" href="/ko/developers/run-a-node">
    직접 체인과 대조하는 방법과, 검증자 집합이 닫혀 있는 이유입니다.
  </Card>

  <Card title="프로그램 서비스" href="/ko/protocol/architecture/programs">
    이 스트림을 소비해 파생 계정 상태를 계산하는 구성 요소입니다.
  </Card>
</CardGroup>
