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

# 합의 및 블록 생성

## 목적 및 범위

이 문서는 StableNet의 합의 메커니즘과 블록 생성 프로세스를 설명합니다. Anzeon WBFT 합의 프로토콜, 블록 생성 파이프라인, 검증자 관리, 가스 팁 정책 적용을 다룹니다. 검증자 거버넌스 컨트랙트에 대한 자세한 내용은 [검증자 거버넌스 (GovValidator)](/ko/governance-system/5.3-validator-governance-\(govvalidator\))를 참조하세요. 블록 내 트랜잭션 처리에 대한 내용은 [트랜잭션 처리](/ko/transaction-processing/index)를 참조하세요.

## 합의 아키텍처 개요

StableNet은 **Anzeon WBFT** 합의 엔진을 사용하며, 이는 Wemix Byzantine Fault Tolerance 프로토콜의 Proof-of-Authority(PoA) 변형입니다. 합의 레이어는 블록 생성 레이어(Worker)와 조정하여 블록을 생성, 검증, 최종화합니다.

### 시스템 컴포넌트

## Anzeon WBFT 합의 프로토콜

### 프로토콜 특성

Anzeon WBFT는 StableNet의 WBFT 합의 알고리즘 적용입니다. 주요 특성:

| Property             | Value                                    |
| -------------------- | ---------------------------------------- |
| **Type**             | Byzantine Fault Tolerant (BFT)           |
| **Model**            | Proof-of-Authority (PoA)                 |
| **Block Time**       | 1 second (configurable)                  |
| **Finality**         | Deterministic, immediate                 |
| **Signature Scheme** | BLS (Boneh-Lynn-Shacham)                 |
| **Fault Tolerance**  | Up to f = ⌊(n-1)/3⌋ Byzantine validators |
| **Epoch Length**     | 10 blocks (configurable)                 |

### WBFT와의 차이점

Anzeon WBFT는 StableNet의 스테이블코인 중심 설계에 맞추기 위해 원래 WBFT 구현에서 여러 기능을 제거했습니다:

**주요 수정사항:**

1. **스테이킹 불필요**: 검증자는 토큰 예치 없이 순수하게 거버넌스 투표를 통해 관리됩니다
2. **블록 보상 없음**: 검증자는 트랜잭션 수수료만 획득합니다(1:1 스테이블코인 페그 유지)
3. **Anzeon 포크 활성화**: Anzeon은 제네시스 블록부터 활성화됩니다
4. **BLS 키 저장소**: `GovStaking`에서 `GovValidator` 컨트랙트로 이동
5. **제거된 거버넌스 컨트랙트**: `GovStaking`, `GovConfig`, `GovNCP`, `GovRewardeeImp`가 없습니다

### 합의 구성

Anzeon 구성은 제네시스 블록에 지정됩니다:

**구성 구조** :

* `anzeon.wbft`: 핵심 합의 매개변수(에포크 길이, 블록 주기, 타임아웃)
* `anzeon.init`: 에포크 0에서 활성화 되는 초기 검증자 세트
* `anzeon.systemContracts.govValidator`: 에포크 1+의 검증자 세트를 포함한 검증자 거버넌스 매개변수

**중요:** `init.validators`는 첫 번째 에포크에만 적용됩니다. `govValidator.validators` 매개변수는 에포크 1부터 활성 세트를 정의합니다.

### 블록 최종화 흐름

WBFT 합의는 효율성을 위해 BLS 서명 집계가 있는 2단계 커밋 프로토콜(PREPARE 및 COMMIT)을 따릅니다. `2f+1` 검증자(`f`는 허용 가능한 최대 비잔틴 장애 수)가 두 단계를 모두 서명하면 블록이 최종화된 것으로 간주되며 되돌릴 수 없습니다.

## 블록 생성 파이프라인

Worker 컴포넌트([`miner/worker.go`](https://github.com/stable-net/go-stablenet/blob/master/miner/worker.go))는 블록을 조립하고 생성하는 역할을 합니다. 트랜잭션 선택, 상태 전환, 합의 엔진 통합을 조정합니다.

### Worker 아키텍처

### Worker 이벤트 루프(WBFT 모드)

WBFT 모드에서 worker는 표준 Ethereum 마이닝과 비교하여 단순화된 이벤트 루프를 사용합니다:

**표준 마이닝과의 주요 차이점**

1. **주기적 재커밋 없음**: 표준 Ethereum 마이너는 더 높은 수수료 트랜잭션을 포함하기 위해 주기적으로 블록을 재생성합니다. WBFT는 합의 엔진의 타이밍에 의존합니다.
2. **합의 주도 타이밍**: `readyToCommitCh`는 블록을 생성할 시간이 되면 WBFT 엔진에 의해 신호됩니다.
3. **라운드 기반**: 각 합의 라운드는 하나의 블록 생성 시도를 트리거합니다.

### 블록 조립 프로세스

`commitWork()` 함수는 전체 블록 조립 프로세스를 조정합니다:

**핵심 함수**

* **`commitWork(interrupt, timestamp)`**: 메인 조정자, 인터럽트 신호 처리
* **`generateWork(params)`**: 작업 환경 및 상태 구축
* **`commitTransactions(txs, coinbase)`**: 가스 제한을 준수하면서 트랜잭션을 순차적으로 적용
* **`commit(env, interval)`**: finalize를 위해 합의 엔진에 작업 제출

### 트랜잭션 선택 및 순서 지정

**트랜잭션 선택 알고리즘**

1. **대기 중인 트랜잭션 가져오기**: 최소 가스 팁 요구사항을 충족하는 풀의 모든 트랜잭션 검색
2. **로컬 우선순위**: 로컬 트랜잭션을 먼저 처리합니다
3. **가스 팁 적용**: Anzeon 모드에서 일반 계정은 `GovValidator`에서 정해진 가스 팁을 사용해야 합니다. 단, 승인된 계정은 사용자 정의 팁을 지정할 수 있습니다
4. **Nonce 순서 지정**: 각 계정 내에서 트랜잭션은 nonce별로 순차적이어야 합니다
5. **가격 순서 지정**: 계정 간에 더 높은 유효 가스 가격 트랜잭션이 우선순위를 가집니다
6. **가스 제한**: 블록 가스 제한에 도달하면 중지합니다

### 가스 팁 관리

StableNet의 가스 팁 정책은 Worker의 `GovValidator` 컨트랙트 통합을 통해 적용됩니다:

**구현 세부사항**

* **초기화**: Worker 생성 시 가스 팁은 `GovValidator`에서 읽습니다
* **콜백 등록**: 블록체인은 각 블록 가져오기 후 호출되는 `updateGasTipFromContract`를 콜백으로 등록합니다
* **동기화**: Worker의 내부 `tip` 필드와 트랜잭션 풀의 최소 가격이 함께 업데이트됩니다
* **락 없는 업데이트**: 콜백은 상태만 수신하여 worker의 메인 루프와의 락 경합을 피합니다

## 검증자 관리

### 키 관리

StableNet 검증자는 거버넌스, 블록 생성, 합의 메시지를 위해 세 가지 키(운영 키, 검증자 키, BLS 키)를 사용합니다.\
각 키의 역할, 사용 위치, 파생 방식에 대한 자세한 설명은 운영 가이드의 [검증자 운영](/ko/operations-guide/11.2-validator-operations)을 참고하세요.

### 검증자 등록 및 순환

**검증자 세트 업데이트**

1. **에포크 블록**: 검증자 세트 변경은 에포크 블록에서만 적용됩니다
2. **컨트랙트 읽기**: 에포크 블록 생성 시 WBFT 엔진은 `GovValidator`에서 현재 검증자 목록을 읽습니다
3. **멤버 버전**: `memberVersion` 필드는 변경사항을 추적하며, WBFT 엔진은 버전을 비교하여 업데이트를 감지합니다
4. **즉시 효과**: 에포크가 새 검증자 세트로 시작되면 해당 세트는 에포크 기간 동안 변경할 수 없습니다

### 제네시스 vs 런타임 검증자 세트

StableNet은 제네시스 구성에 두 가지 검증자 세트 사양을 가집니다:

**중요한 구성 참고사항**

* **에포크 0**: 블록 1부터 첫 번째 에포크까지 활성인 검증자 세트는 `anzeon.init.validators`에 의해 결정됩니다
* **에포크 1+**: `epochLength + 1` 블록부터 검증자 세트는 `GovValidator` 컨트랙트의 `validators` 매개변수에서 읽습니다
* **모범 사례**: 제어된 검증자 마이그레이션을 수행하지 않는 한 이 두 목록은 동일해야 합니다

## 통합 지점

### Worker-WBFT 통합

Worker와 WBFT 엔진은 콜백 메커니즘을 통해 조정됩니다:

**코드 흐름**

1. **시작**: `eth.StartMining()`이 `miner.Start()`를 호출하고, 이는 `worker.start()`를 호출합니다
2. **엔진 시작**: `worker.start()`는 `readyToCommit` 콜백을 전달하여 `wbftEngine.Start()`를 호출합니다
3. **합의 트리거**: WBFT 코어가 블록을 제안할 시간이라고 판단하면 `readyToCommit(round)`를 호출합니다
4. **블록 생성**: 콜백은 `readyToCommitCh`에 신호를 보내 `commitWork()`를 트리거합니다
5. **봉인**: 조립된 블록은 합의 처리를 위해 `engine.Seal()`로 전송됩니다

### 마이너 초기화

마이너는 Ethereum 백엔드 설정 중에 초기화됩니다:

**Anzeon 특정 설정**

* **강제 Etherbase**: Anzeon 모드에서 etherbase는 자동으로 노드키 주소로 설정됩니다(사용자 구성 불가)
* **가스 팁 초기화**: Worker는 구성 중에 `GovValidator`에서 초기 가스 팁을 읽습니다

## 요약

StableNet의 합의 및 블록 생성 시스템은 다음 특징을 가집니다:

1. **결정적 최종성**: Anzeon WBFT는 BFT 합의를 통해 즉각적이고 되돌릴 수 없는 최종성을 제공합니다
2. **거버넌스 주도 검증자**: 검증자 세트는 온체인 거버넌스(GovValidator 컨트랙트)를 통해 완전히 관리됩니다
3. **스테이블코인 정렬 경제학**: 블록 보상 없음, 토큰 소각 없음, 수수료만 검증자 수입
4. **동적 가스 팁 정책**: GovValidator에서 적용되는 네트워크 전체 가스 팁, 자동 업데이트
5. **키 보안 모델**: 거버넌스, 블록 생성, 합의 서명 키의 분리
6. **에포크 기반 순환**: 검증자 세트 변경은 안정성을 위해 에포크 블록에서만 적용됩니다

Worker 컴포넌트는 중앙 조정자 역할을 하며, 트랜잭션 풀 관리, 상태 전환, 합의 엔진 상호 작용, 거버넌스 정책 적용을 일관된 블록 생성 파이프라인으로 통합합니다.
