# 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 정책]], [[트랜잭션 수수료 체계]]