> ## 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.

# IntentionBFT

> 합의. 순서와 인증된 가격 벡터가 어떻게 함께 커밋되는지, 네트워크는 어떻게 구성되어 있는지.

IntentionBFT는 Intention의 합의 프로토콜로, 금융 인프라를 위해 확장한 HotStuff 계열 BFT 프로토콜입니다. 안전성은 장애 임계값 아래에서 무조건 유지되고, 활성은 네트워크가 안정화된 뒤에 유지됩니다.

여기서 합의는 범용 체인의 합의가 하지 않는 두 가지를 합니다. **순서**를 일급 객체로 커밋하고, 같은 사건 안에서 **인증된 가격 벡터**를 함께 커밋합니다. [커널](/ko/protocol/architecture/kernel)이 실행에 대해 보장할 수 있는 모든 것은 이 둘이 실행 전에 확정되는 데 달려 있습니다.

<h2 id="model">
  모델
</h2>

IntentionBFT는 전체 지분의 3분의 1까지를 통제하는 비잔틴 공격자를 견딥니다. 따라서 정직한 지분은 언제나 3분의 2를 넘고, 표준 정족수는 합산 지분이 3분의 2를 넘는 검증자 집합입니다. 이 문서에서 **$2f+1$ 지분 가중 정족수**라고 부르는 것이 이 집합입니다. 네트워크는 부분 동기입니다. 안정화 시점 이전에는 지연이 임의적이고, 그 이후에는 정직한 검증자 사이의 지연에 상한이 있습니다.

<div className="dg" data-dg="bft-prices">
  <div className="dg-c" style={{aspectRatio:"720 / 318"}}>
    <svg className="dg-w" viewBox="0 0 720 318" aria-hidden="true">
      <path className="dg-wire" d="M 163.00 78.00 L 176.60 78.00" />

      <path className="dg-head" d="M 183.00 78.00 L 176.60 82.40 L 176.60 73.60 Z" />

      <path className="dg-wire" d="M 350.00 78.00 L 363.60 78.00" />

      <path className="dg-head" d="M 370.00 78.00 L 363.60 82.40 L 363.60 73.60 Z" />

      <path className="dg-wire" d="M 537.00 78.00 L 550.60 78.00" />

      <path className="dg-head" d="M 557.00 78.00 L 550.60 82.40 L 550.60 73.60 Z" />
    </svg>

    <div className="dg-b dg--sky" style={{left:"0.0000%",top:"8.1761%",width:"22.0833%",height:"32.7044%"}}><span className="dg-t">오라클 sidecar</span><span className="dg-s">검증자별 하나</span></div>
    <div className="dg-b dg--blue" style={{left:"25.9722%",top:"8.1761%",width:"22.0833%",height:"32.7044%"}}><span className="dg-t">검증자가 검증하고 서명</span><span className="dg-s">설정된 임계값 대비 신선도 포함</span></div>
    <div className="dg-b dg--blue" style={{left:"51.9444%",top:"8.1761%",width:"22.0833%",height:"32.7044%"}}><span className="dg-t">검증자 간 gossip 전파</span><span className="dg-s">합의 네트워크 메시지로</span></div>
    <div className="dg-b dg--green" style={{left:"77.9167%",top:"8.1761%",width:"22.0833%",height:"32.7044%"}}><span className="dg-t">인증 가격</span><span className="dg-s">에포크 · 라운드별</span></div>
    <div className="dg-b dg--orange dg-left" style={{left:"0.0000%",top:"48.4277%",width:"100.0000%",height:"21.3836%"}}><span className="dg-t">가격 가용성이 블록 생성을 좌우</span><span className="dg-s">검증자는 현재 라운드의 유효한 가격 관측을 제시할 수 있을 때만 블록을 제안할 자격을 갖습니다. 따라서 트랜잭션을 커밋하는 서명이 그 트랜잭션이 결제되는 가격까지 함께 커밋합니다.</span></div>
    <div className="dg-b dg-dashed dg-left" style={{left:"0.0000%",top:"75.4717%",width:"100.0000%",height:"19.4969%"}}><span className="dg-t">이것이 주장하지 않는 것</span><span className="dg-s">가격을 트랜잭션에 묶을 뿐, 가격이 옳다는 뜻은 아닙니다. 합의가 인증하는 것은 검증자 정족수가 이 라운드에 이 관측값을 제출했다는 사실, 그뿐입니다.</span></div>
  </div>
</div>

라운드마다 지정된 리더가 있습니다. 한 라운드 안에서 제안은 연속된 $2f+1$ 서명 집계를 모으고, 각 단계는 인접한 라운드에 걸쳐 파이프라인으로 겹쳐 돌아갑니다. 그래서 일반적인 경우 블록은 두 번의 네트워크 왕복 만에 최종성에 이릅니다. 낙관적 응답성 아래에서는 실제 메시지 지연이 진행 속도를 정하고, pacemaker의 백오프는 네트워크가 적대적이거나 분할되었을 때만 개입합니다.

<h2 id="committing-an-ordering">
  순서를 커밋하기
</h2>

블록 안의 트랜잭션 순서는 실행의 부산물로 남지 않고 합의가 커밋하는 객체로 격상됩니다. 블록 해시가 순서 지어진 페이로드까지 포괄하므로, 합의 이후에 순서를 다시 바꾸면 그 순서를 커밋한 서명이 곧바로 무효가 됩니다.

그 효과는 이렇습니다. 블록이 최종화되고 나면 $2f+1$ 지분 가중 정족수가 바로 그 순서에 대한 약속에 서명한 상태이고, 정직한 검증자라면 같은 라운드에서 같은 트랜잭션 집합의 다른 순서에 서명했을 리가 없습니다. 커밋된 순서를 따르는 순차 실행과 결합되면, 이것이 결정론적 재실행을 구현상의 관행에서 누구나 검사할 수 있는 성질로 바꿉니다.

<Note>
  하나의 제안 안에서 리더가 갖는 재량, 즉 가용한 배치 중 무엇을 넣고 어떻게 배열할지는 여전히 남아 있는 표면입니다. 리더 평판과, 유효한 가격 관측 없이는 리더가 애초에 블록을 만들 수 없다는 사실이 이를 완화합니다. 더 강한 공정 순서 구성은 향후 업그레이드 후보로 관리되고 있습니다.
</Note>

<h2 id="batch-availability">
  배치 가용성
</h2>

소박한 프로토콜에서는 리더가 그 라운드의 트랜잭션 전부를 페이로드에 담아 블록을 제안하고, 그 결과 합의 메시지 크기가 처리량에 묶입니다. IntentionBFT는 데이터 전파와 순서 결정을 분리합니다.

검증자는 배경에서 트랜잭션 배치를 계속 전파합니다. 각 배치는 원 발신자가 $2f+1$ 지분 가중 가용성을 증명할 수 있을 때까지 확인을 받고, 그 뒤에야 제안이 그 배치를 참조할 수 있습니다. 내용이 아니라 다이제스트로 참조합니다. 합의 메시지는 처리량과 무관하게 작게 유지되고, 커밋된 블록은 언제나 재실행할 수 있습니다. 비잔틴 소수만 쥐고 있던 데이터를 어떤 블록도 참조할 수 없기 때문입니다.

<h2 id="certifying-prices">
  가격 인증
</h2>

검증자는 가격 관측자이기도 하며, 블록은 자신이 실행 기준으로 삼은 가격을 함께 담고 갑니다.

<div className="dg" data-dg="bft-topology">
  <div className="dg-c" style={{aspectRatio:"720 / 322"}}>
    <svg className="dg-w" viewBox="0 0 720 322" aria-hidden="true">
      <path className="dg-wire dg-soft" d="M 215.00 95.00 L 215.00 99.00" />

      <path className="dg-wire dg-soft" d="M 215.00 167.00 L 215.00 171.00" />

      <path className="dg-wire dg-soft" d="M 215.00 239.00 L 215.00 243.00" />
    </svg>

    <div className="dg-b dg--blue dg-left" style={{left:"0.0000%",top:"9.3168%",width:"59.7222%",height:"19.2547%"}}><span className="dg-t">검증자</span><span className="dg-s">합의 · 멤풀 · 오라클 sidecar · 커널 · 저장소</span></div>
    <div className="dg-b dg-plain dg-left" style={{left:"63.6111%",top:"9.3168%",width:"36.3889%",height:"19.2547%"}}><span className="dg-s">투표하는 참여자는 이들뿐</span></div>
    <div className="dg-b dg--sky dg-left" style={{left:"0.0000%",top:"31.6770%",width:"59.7222%",height:"19.2547%"}}><span className="dg-t">검증자 풀 노드</span><span className="dg-s">커밋된 블록을 따라가며 실행 · 투표하지 않음</span></div>
    <div className="dg-b dg-plain dg-left" style={{left:"63.6111%",top:"31.6770%",width:"36.3889%",height:"19.2547%"}}><span className="dg-s">차단 — 공개 읽기 트래픽과 피어 연결을 대신 받아 검증자가 열린 인터넷에 직접 노출되지 않게 함</span></div>
    <div className="dg-b dg--sky dg-left" style={{left:"0.0000%",top:"54.0373%",width:"59.7222%",height:"19.2547%"}}><span className="dg-t">퍼블릭 풀 노드</span><span className="dg-s">누구나 운영 가능 · 따라가고, 실행하고, 읽기에 응답</span></div>
    <div className="dg-b dg-plain dg-left" style={{left:"63.6111%",top:"54.0373%",width:"36.3889%",height:"19.2547%"}}><span className="dg-s">개방된 계층</span></div>
    <div className="dg-b dg--green dg-left" style={{left:"0.0000%",top:"76.3975%",width:"59.7222%",height:"19.2547%"}}><span className="dg-t">클라이언트</span><span className="dg-s">프런트엔드 · 거래 에이전트 · 마켓 메이커 · 인덱서</span></div>
    <div className="dg-b dg-plain dg-left" style={{left:"63.6111%",top:"76.3975%",width:"36.3889%",height:"19.2547%"}}><span className="dg-s">검증자가 아니라 풀 노드에 연결합니다. 가장 낮은 지연과 가장 완전한 뷰가 필요하면 자기 노드를 운영합니다.</span></div>
    <div className="dg-free" style={{left:"0.0000%",top:"0.0000%",width:"59.7222%"}}><div className="dg-n">합의에서 바깥으로, 네 개 계층</div></div>
    <div className="dg-free" style={{left:"63.6111%",top:"0.0000%",width:"36.3889%"}}><div className="dg-n">그 계층이 존재하는 이유</div></div>
  </div>
</div>

검증자는 각자 자신의 [오라클 sidecar](/ko/protocol/architecture/oracle)를 실행하며, 이 sidecar는 거래소 데이터를 수집해 종목별 인덱스 가격을 만듭니다. 검증자는 그 가격을 가져와 설정된 임계값 대비 신선도를 포함해 검증하고, 서명한 뒤, 서명된 제출을 합의 네트워크 메시지로 다른 검증자에게 gossip으로 전파합니다. 인증 가격은 에포크와 라운드별로 취합되어 블록에 실리며, 그래서 트랜잭션을 커밋하는 서명이 그 트랜잭션이 결제되는 가격까지 함께 커밋합니다.

검증자는 현재 라운드에 대한 유효한 가격 관측을 제시할 수 있을 때만 블록을 제안할 자격을 갖습니다. 따라서 가격 가용성은 실행이 있기를 바라며 찾는 입력이 아니라 블록 생성의 전제 조건입니다.

<Warning>
  이것은 가격을 트랜잭션에 묶을 뿐, 가격이 옳다는 뜻은 아닙니다. 합의가 인증하는 것은 검증자 정족수가 이 라운드에 이 관측값을 제출했다는 사실입니다. 기반이 되는 거래소가 정확했는지는 별개의 문제이며, [오라클](/ko/protocol/architecture/oracle) 페이지의 집계 규칙이 다루고 [리스크 고지](/ko/protocol/security/risks)가 그 한계를 밝힙니다.
</Warning>

<h2 id="leader-reputation">
  리더 평판
</h2>

리더는 결정론적 지분 가중 순환으로 라운드마다 선정되며, 여기에 슬라이딩 윈도 기반 평판 휴리스틱이 더해집니다. 제안에 반복해서 실패하는 검증자는 가용하지 않거나 적대적으로 행동한다는 신호이므로, 이후 선정에서 강등되고 그 슬롯은 최근 응답이 좋은 검증자에게 재분배됩니다. 그래서 가용하지 않은 검증자가 자기 몫의 슬롯에 대한 리더 자리를 붙들고 진행을 멈춰 세우지 못합니다.

가격 관측이 제안 자격을 좌우하므로, 평판 역시 시장 데이터 연결이 가장 좋은 검증자에게 리더 자리가 몰리는 일을 피해야 합니다. 종목마다 여러 독립 소스에서 관측을 가져오도록 하는 거래소 다양성 요건이 그 경로를 막습니다.

<h2 id="epochs-and-reconfiguration">
  에포크와 재구성
</h2>

시간은 에포크 단위로 조직됩니다. 한 에포크 안에서 검증자 집합과 대부분의 파라미터는 고정입니다. 에포크 경계에서는 거버넌스가 승인한 재구성을 거쳐 이 값이 바뀔 수 있습니다. 검증자 집합 변경, 합의 파라미터 변경, 리스크 파라미터 갱신, 긴급 조치가 여기에 해당합니다. 전환은 원자적입니다. 정직한 검증자는 모두 같은 블록 높이에서 같은 전환을 봅니다.

<h2 id="network-topology">
  네트워크 토폴로지
</h2>

<div className="dg" data-dg="bft-round">
  <div className="dg-c" style={{aspectRatio:"720 / 318"}}>
    <svg className="dg-w" viewBox="0 0 720 318" aria-hidden="true">
      <path className="dg-rule dg-dash" d="M 90 40 L 90 266" />

      <path className="dg-rule dg-dash" d="M 360 40 L 360 266" />

      <path className="dg-rule dg-dash" d="M 630 40 L 630 266" />

      <path className="dg-wire dg--blue" d="M 94.00 64.00 L 349.60 64.00" />

      <path className="dg-head dg--blue" d="M 356.00 64.00 L 349.60 68.40 L 349.60 59.60 Z" />

      <path className="dg-wire dg--sky" d="M 364.00 92.00 L 414.00 92.00 L 414.00 114.00 L 374.40 114.00" />

      <path className="dg-head dg--sky" d="M 368.00 114.00 L 374.40 109.60 L 374.40 118.40 Z" />

      <path className="dg-wire dg--sky dg-dash" d="M 356.00 146.00 L 100.40 146.00" />

      <path className="dg-head dg--sky" d="M 94.00 146.00 L 100.40 141.60 L 100.40 150.40 Z" />

      <path className="dg-wire dg--blue" d="M 94.00 218.00 L 349.60 218.00" />

      <path className="dg-head dg--blue" d="M 356.00 218.00 L 349.60 222.40 L 349.60 213.60 Z" />

      <path className="dg-wire dg--green dg-dash" d="M 364.00 254.00 L 619.60 254.00" />

      <path className="dg-head dg--green" d="M 626.00 254.00 L 619.60 258.40 L 619.60 249.60 Z" />
    </svg>

    <div className="dg-b dg--blue" style={{left:"2.2222%",top:"0.0000%",width:"20.5556%",height:"9.4340%"}}><span className="dg-t">리더</span></div>
    <div className="dg-b dg--sky" style={{left:"39.7222%",top:"0.0000%",width:"20.5556%",height:"9.4340%"}}><span className="dg-t">검증자</span></div>
    <div className="dg-b dg--green" style={{left:"77.2222%",top:"0.0000%",width:"20.5556%",height:"9.4340%"}}><span className="dg-t">체인</span></div>
    <div className="dg-b dg-dashed dg-tight dg-solid" style={{left:"14.4444%",top:"52.2013%",width:"33.6111%",height:"8.1761%"}}><span className="dg-s">2f+1 지분 가중 집계</span></div>
    <div className="dg-b dg--green" style={{left:"68.8889%",top:"86.7925%",width:"31.1111%",height:"11.9497%"}}><span className="dg-s">이제 순서와 가격은 바뀌지 않습니다</span></div>
    <div className="dg-lbl" style={{left:"31.2500%",top:"15.0943%",width:"34.4444%",whiteSpace:"normal"}}>블록 제안 — 배치 다이제스트와 인증 가격</div>
    <div className="dg-lbl" style={{left:"72.7778%",top:"32.3899%",width:"26.3889%",whiteSpace:"normal"}}>가용성 · 순서 · 가격 검증</div>
    <div className="dg-lbl" style={{left:"31.2500%",top:"40.8805%"}}>투표</div>
    <div className="dg-lbl" style={{left:"31.2500%",top:"63.5220%"}}>라운드 인증</div>
    <div className="dg-lbl" style={{left:"68.7500%",top:"74.8428%"}}>커밋</div>
  </div>
</div>

**검증자**는 합의에 참여합니다. 각 검증자는 합의, 멤풀, 오라클 sidecar, 커널 실행, 저장소까지 전체 스택을 운영합니다. 투표하는 참여자는 이들뿐입니다.

**검증자 풀 노드**는 검증자 바로 뒤에 놓입니다. 커밋된 블록을 따라가며 실행하지만 투표하지는 않습니다. 이 계층의 목적은 차단입니다. 공개 읽기 트래픽과 피어 연결을 대신 받아 내어 검증자가 열린 인터넷에 직접 노출되지 않게 합니다.

**퍼블릭 풀 노드**는 개방된 계층입니다. 누구나 운영할 수 있습니다. 체인을 따라가고, 커밋된 블록을 실행하고, 읽기 요청에 응답하며, 하위 시스템에 데이터를 공급합니다.

**클라이언트**, 즉 프런트엔드와 거래 에이전트, 마켓 메이커, 인덱서는 검증자가 아니라 풀 노드에 연결합니다. 가장 낮은 지연과 가장 완전한 뷰가 필요한 클라이언트는 남의 노드에 의존하는 대신 자기 풀 노드를 운영합니다.

네트워크에 새로 합류하는 노드는 기본적으로 제네시스부터 재실행하지 않습니다. 새 노드가 따라잡는 방식은 [상태 동기화](/ko/protocol/architecture/state/sync)를 참고하십시오.

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

<CardGroup cols={2}>
  <Card title="멤풀" href="/ko/protocol/architecture/mempool">
    무엇이 어떤 순서로 합의에 도달하고, 무엇이 버려지는지 설명합니다.
  </Card>

  <Card title="IntentionKernel" href="/ko/protocol/architecture/kernel">
    순서와 가격이 커밋된 뒤 블록에 무슨 일이 일어나는지 설명합니다.
  </Card>

  <Card title="오라클" href="/ko/protocol/architecture/oracle">
    검증자가 서명하기 전에 인덱스 가격이 만들어지는 과정입니다.
  </Card>

  <Card title="노드 운영" href="/ko/developers/run-a-node">
    검증자 집합이 닫혀 있는 이유와, 합류를 문의하는 방법입니다.
  </Card>
</CardGroup>
