# Mempool(메모풀)
메모풀(Mempool, memory pool)은 블록체인 네트워크에서 아직 블록에 포함되지 않고 노드의 메모리상에 대기 중인 트랜잭션의 모음이다. 각 노드는 독립적으로 자신의 mempool을 관리하며, 네트워크 전파 및 블록 생성 과정에서 트랜잭션의 우선순위와 포함 여부를 결정한다. mempool은 거래의 유효성, 수수료 정책, 네트워크 상태 등에 따라 다르게 구성될 수 있다. 일반적으로 mempool은 다음과 같은 역할과 특성을 가진다.
- 거래 대기열: 블록에 포함되기를 기다리는 트랜잭션의 일시적 저장소.
- 정책 기반 수용: 각 노드는 자신의 정책에 따라 어떤 트랜잭션을 메모풀에 저장할지 결정한다.
- 우선순위 및 포함 판단: 채굴자(miner)는 mempool에서 수수료가 높은 트랜잭션을 선호하거나, 부모-자식 관계를 고려해 트랜잭션을 선택한다.
- 보안 및 운영적 고려: DoS 방어, 메모리 제한 관리, 중첩된 의존성(transaction dependencies) 처리 등이 포함된다.
정의: mempool은 블록 생성자와 노드가 블록에 포함될 트랜잭션을 임시로 보유하는 로컬 풀이다. 일반적으로 mempool은 각 노드에서 독립적으로 관리되며, 글로벌하게 일관된 mempool 구성이 보장되지 않는다.
# 구성 요소와 용어
- Transaction (TX): 네트워크에서 전달되어 아직 블록에 포함되지 않은 트랜잭션.
- Fee (수수료): 트랜잭션이 블록에 포함되길 원하는 정도를 반영하는 보상. 보통 고정된 수수료가 아니라 바이트당 수수료($r=f/s$)로 측정된다.
- Fee rate ($r$): 트랜잭션의 수수료를 바이트 수로 나눈 값. 단위는 보통 sat/vB 또는 sat/kB이다. 예: $r = \dfrac{f}{s}$.
- Size ($s$): 트랜잭션의 바이트 수.
- Fee ($f$): 트랜잭션에 부과된 총 수수료(사토시 단위).
- Ancestor/Descendant: 트랜잭션 간 의존성으로, 하나의 트랜잭션이 다른 트랜잭션의 출력(UTXO)을 필요로 할 때 연결된다. CPFP나 RBF와 같은 정책에서 중요한 역할을 한다.
- RBF (Replace-By-Fee): 더 높은 수수료를 제시하는 거래로 교체 가능하도록 하는 정책.
- CPFP (Child Pays For Parent): 자식 거래의 수수료를 통해 부모 거래의 우선순위를 상승시키는 메커니즘.
# 동작 원리
1) 트랜잭션 수신과 검증
- 노드가 트랜잭션을 네트워크로부터 수신하면, 먼저 트랜잭션의 유효성(서명, UTXO 가용성, 중복 여부 등)을 검증한다.
- 유효한 트랜잭션은 mempool에 추가될 수 있는지 정책으로 판단한다.
2) mempool 정책에 따른 수용
- 메모리 사용량, 정책 규칙, 트랜잭션의 의존성 등을 고려하여 mempool에 수용 여부를 결정한다.
- 수용 시, 필요한 경우 연관 트랜잭션을 함께 관리한다(부모-자식 관계 등).
3) 메모리 관리 및 Eviction
- mempool의 총 용량은 한계가 있으며, 이를 초과하면 일부 트랜잭션을 제거(evict)해야 한다.
- 일반적으로 낮은 수수료율의 트랜잭션부터 제거하는 것이 일반적이다. 이때 우선순위는 보통 수수료율 $r$과 의존성에 의해 결정된다.
- Eviction 정책 예시: 남은 공간이 없을 때, $r_i$가 최솟값인 트랜잭션을 우선 제거한다. 수식으로 표현하면 $r_\text{min} = \min_i r_i$ 이다.
4) 블록 생성 및 트랜잭션 선택
- 채굴자/miner는 mempool에서 수수료가 높은 트랜잭션 위주로 블록을 구성하거나, 의존관계와 CPFP/RBF 정책을 고려하여 트랜잭션들을 선택한다.
5) 전파 및 동기화
- 새로운 블록이 생성되거나 다른 노드로부터 업데이트가 도착하면 mempool은 해당 상태를 반영하도록 갱신한다.
# 수수료 정책과 트랜잭션 우선순위
- 수수료 기반 정책
- 트랜잭션의 수수료율 $r=f/s$은 바이트당 수수료를 나타낸다. 채굴자는 대개 높은 $r$ 값을 가진 트랜잭션을 더 빨리 포함시키려 한다.
- 수수료 정책은 네트워크의 혼잡도, 블록 용량, 노드의 메모리 한계 등에 따라 동적으로 달라질 수 있다.
- RBF (Replace-By-Fee)
- 이미 mempool에 들어간 트랜잭션을 더 높은 수수료의 트랜잭션으로 교체하는 기능이다.
- 정책에 따라 교체 조건이 다르며, 네트워크의 채굴자 수용 정책에 좌우된다.
- 수식적으로는 교체 시점의 새로운 트랜잭션의 수수료율 $r'$이 기존 트랜잭션의 $r$보다 충분히 큰 경우 교체가 허용된다.
- CPFP (Child Pays For Parent)
- 부모 트랜잭션의 포함을 용이하게 하기 위해 자식 트랜잭션의 수수료를 통해 전체 의합 수수료 비율을 상승시키는 기법이다.
- 전체 트랜잭션 세트의 평균 수수료율은
- $r_\text{eff} = \dfrac{\sum f_i}{\sum s_i}$,
- 여기서 $i$는 부모+자식 트랜잭션들의 집합이다.
- CPFP는 부모의 빠른 확인을 원할 때 자식의 높은 수수료로 보완하는 방식이다.
- Eviction 정책과 메모리 한계
- mempool의 용량을 넘길 경우, 일반적으로 수수료율이 낮은 트랜잭션부터 제거한다.
- 최적의 Eviction는 의존성(Ancestor/Descendant)와 함께 고려되어야 한다. 예를 들어, 특정 트랜잭션이 많은 자식 트랜잭션의 부모인 경우, 단순히 작은 $r$의 트랜잭션 하나를 제거하는 것이 전체 네트워크에 불리할 수 있다.
# 데이터 구조와 운영상의 고려사항
- 데이터 구조
- 트랜잭션 정보: TXID, 버전, 입력/출력, 수수료, 바이트 크기, 생성 시각, 부모-자식 관계, 상태
- 의존성 그래프: Ancestor-Descendant 관계를 효율적으로 관리하기 위한 그래프 구조
- 정책 파라미터: 최대 mempool 크기, 수수료 최저 임계치, RBF/CPFP 활성화 여부 등
- 보안 고려사항
- DoS/DDoS에 대한 방어: 지나치게 큰 트랜잭션 풀이나 의존성 폭주를 악용한 공격에 대비
- 메모리 남용 방지: 노드의 물리적 메모리 제약에 따른 안전장치
- 중복 트랜잭션 및 위조 트랜잭션 탐지
- 실세계 운영 이슈
- 네트워크 혼잡 시 수수료 경쟁 증가
- 일부 채굴자 채굴 정책에 따른 블록 구성 편차
- 특정 트랜잭션의 순간적 지연 및 대기 시간 증가
# 구현과 정책 설정의 실용적 가이드
- 기본 정책 수립
- 최대 mempool 크기 설정
- 최소 수수료 임계치 또는 가변 수수료 모델 도입
- RBF, CPFP의 활성화 여부 및 사용 정책 정의
- 모니터링 지표
- mempool 크기(현재 바이트 단위), 평균 수수료율, 의존성 비율, 미처리 트랜잭션 수
- 각 트랜잭션의 대기 시간, 포함 시간의 평균 및 분산
- 운영상의 권고사항
- 혼잡 시나리오에 대한 예비 정책 마련
- 보안 업데이트 및 정책 변경 시 네트워크 전파 영향 고려
# 예시 수식 정리
- 트랜잭션 수수료율
- $r = \dfrac{f}{s}$, 단위: sat/vB 또는 sat/kB
- CPFP의 평균 수수료율
- $r_\text{eff} = \dfrac{\sum f_i}{\sum s_i}$, i는 부모+자식 트랜잭션 묶음
- 메모리 관리에서의 최소 수수료율
- $r_\text{min} = \min_i r_i$
- 교체 조건 예시 (RBF)
- 새 트랜잭션의 수수료율 $r'$이 기존 트랜잭션의 $r$보다 충분히 커야 교체 허용
# 관련 용어의 한글화 주석
- Mempool: 메모풀
- TX: 트랜잭션
- TXID: 트랜잭션 식별자
- UTXO: 사용되지 않은 출력(Unspent Transaction Output)
- RBF: Replace-By-Fee
- CPFP: Child Pays For Parent
---
관련 문서: [[Mempool 정책]], [[트랜잭션 수수료 체계]]