본문으로 건너뛰기
0%

Mempool이란?

Alchemy team headshot

작성자 Alchemy

2022년 4월 7일에 게시됨3분 읽기

블록체인 트랜잭션에서 멤풀(mempool, memory pool)이란 노드의 검증을 거쳐 블록체인 상의 블록에 커밋되기를 기다리는 대기 중인 트랜잭션의 목록입니다. 이는 전통적인 소프트웨어 개발에서 프로덕션에 배포하기 전 테스트와 품질 관리를 수행하기 위해 'Staging' 환경을 사용하는 것과 유사합니다.

전통적인 'Staging' 환경이 중앙화되어 있는 것과 달리, 각 노드는 자신만의 멤풀을 관리합니다. 멤풀의 목적과, 멤풀에 접근함으로써 어떤 중요한 정보를 얻을 수 있는지 이해하기 위해 트랜잭션 흐름을 살펴보겠습니다.

Ethereum 트랜잭션 흐름

Ethereum 트랜잭션은 3가지 유형으로 나뉩니다:

1) 단순 전송(Simple Transfer) - 한 공개 주소에서 다른 주소로 가치가 전송됩니다. NFT나 서비스에 대한 결제일 수 있습니다.

2) 스마트 컨트랙트 배포 - 스마트 컨트랙트가 블록체인에 배포될 때마다 트랜잭션이 생성됩니다.

3) 스마트 컨트랙트 실행 - 어떤 주소가 스마트 컨트랙트 주소로 자금이나 데이터를 보내고자 하는 경우입니다.

Alchemy의 모니터링 도구를 사용하여 Ethereum 트랜잭션을 모니터링할 수 있으며, Alchemy Transfers API와 같은 도구를 사용하여 특정 주소의 트랜잭션 내역을 찾을 수 있습니다.

모든 유형의 Ethereum 트랜잭션은 동일한 트랜잭션 생명주기를 따릅니다:

1) 사용자가 트랜잭션을 생성하고 자신의 개인 키(private key)로 서명합니다.

2) 노드가 트랜잭션을 수신하여 멤풀에 저장합니다.

3) 멤풀에 있는 동안, 노드는 트랜잭션의 검증 테스트를 수행합니다. 멤풀에서 이 테스트를 통과하면, 트랜잭션 상태는 'Pending'으로 변경됩니다.

4) 노드는 네트워크의 다른 모든 노드에 pending 상태의 트랜잭션을 브로드캐스트하여 각 노드가 자신의 멤풀에 해당 트랜잭션을 추가하도록 합니다.

5) 새 블록이 생성될 때, 블록 생성자(block constructor)는 가스 가격이 가장 높은 트랜잭션들을 포함시킵니다. 이로써 트랜잭션은 'Successful' 상태로 변경됩니다.

6) 트랜잭션이 포함된 블록 이후 노드가 새 블록을 추가할 때마다 트랜잭션은 컨펌(confirmation)을 받습니다. 시간이 지날수록 블록 재구성(reorganizing)의 위험이 감소하므로, 이는 트랜잭션이 블록체인에 영구적으로 추가되었다는 확신을 제공합니다.

서명부터 mempool을 거쳐 컨펌까지, Ethereum 트랜잭션 라이프사이클 다이어그램
Ethereum 트랜잭션 흐름

트랜잭션 전송에 대해 더 알아보고 직접 전송해보려면 여기를 참고하세요.

멤풀의 목적

블록체인은 불변(immutable)하기 때문에, 블록체인에 입력되는 트랜잭션이 유효하고 오류가 없어야 하는 것이 중요합니다. 멤풀을 호스팅하는 노드는 블록체인에 커밋하는 과정이 시작되기 전에 각 트랜잭션을 검증하는 중요한 역할을 합니다.

개발자에게는 트랜잭션이 왜 실패하거나 'Pending' 상태에 머물러 있을 수 있는지 이해하기 위해 이러한 검증 테스트를 이해하는 것이 중요합니다:

1. 자금의 가용성

노드는 발신자 주소가 전송되는 자금과 트랜잭션 완료에 필요한 가스 비용을 모두 충당할 만큼 충분한 자금을 가지고 있는지 검증합니다. 이 검증에 실패하면, 트랜잭션은 멤풀에서 제거됩니다. 이 검증을 통과하려면 전송 및 대상 주소의 올바른 파라미터를 사용하는 것이 중요합니다.

2. 트랜잭션 서명의 유효성

각 트랜잭션은 발신자 주소로 서명되어야 합니다. 이는 발신자가 실제로 해당 주소의 소유자임을 확인하기 위한 것입니다. 노드는 발신자 주소에 첨부된 서명이 올바른 것인지 검증합니다.

노드가 발신자 주소에 대해 트랜잭션 서명을 검증하는 다이어그램
트랜잭션 서명의 유효성 [출처]

3. 올바른 nonce 값

nonce 값은 발신자 주소에서 전송된 트랜잭션의 개수입니다. 발신 주소가 새 트랜잭션을 보낼 때마다 nonce 값은 1씩 증가합니다. nonce 값은 특정 주소에서 발생하는 각 트랜잭션이 전송된 순서대로 처리되도록 강제하기 때문에 중요합니다.

노드가 트랜잭션의 nonce 값을 검증하는 다이어그램
Nonce 값에 대한 노드 검증

트랜잭션의 nonce 값이 중복되거나 건너뛰어질 수 없기 때문에, 이는 이중 지불(double-spending)이나 가용 자금의 초과 지출 문제를 방지합니다. 노드는 pending 상태의 트랜잭션에 올바른 nonce 값이 첨부되어 있는지 검증합니다. 이 테스트에 실패하면, 트랜잭션은 진행되지 않습니다.

4. 가스 가격

멤풀에 따라, 한 번에 멤풀에 있을 수 있는 트랜잭션 수에는 제한이 있습니다. 대중적인 Ethereum 클라이언트인 Geth는 기본적으로 pending 트랜잭션 4096개, queued 트랜잭션 1024개로 제한을 두고 있습니다. 이 한도에 도달하면, 공간을 관리하기 위해 가스 가격이 가장 낮은 트랜잭션들이 풀에서 제거됩니다.

멤풀 접근하기

멤풀 구조의 큰 장점 중 하나는 대체 트랜잭션(replacement transaction)을 통해 pending 상태의 트랜잭션을 덮어써서 수정하거나, 속도를 높이거나, 아예 취소할 수 있다는 점입니다.

멤풀에 멈춰 있는 pending 트랜잭션을 수정하는 것 외에도, 멤풀에 접근하는 것은 다음과 같은 다른 경우에도 유용할 수 있습니다:

1. 가스 비용 추정(Estimating Gas Fees)

현재 pending 상태의 트랜잭션 목록과 그에 연결된 수수료를 살펴보면 수수료를 과다 지불하는 것을 방지하는 데 도움이 됩니다.

2. NFT 마이닝(NFT Mining)

멤풀 스캐너를 사용하면, 사용자는 NFT 컨트랙트와 상호작용하는 pending 트랜잭션에 대한 정보를 얻고 더 높은 가스 수수료로 해당 트랜잭션을 앞지를 수 있습니다.

**3. 성능 인사이트(Performance Insights)**‍

Notify API와 같은 서비스를 사용하면, 스마트 컨트랙트 개발자는 멤풀에서 스마트 컨트랙트 활동에 대한 인사이트를 얻을 수 있습니다. pending 트랜잭션은 스마트 컨트랙트의 버그와 취약점에 대한 정보를 제공할 수 있습니다.

결론

멤풀은 블록체인의 기능과 상태(health)에서 중요한 역할을 합니다. 노드가 트랜잭션을 검증하고 마이너가 가스 수수료에 따라 pending 트랜잭션의 우선순위를 정할 수 있도록 하는 것은 트랜잭션 흐름에 필수적인 부분입니다.

개발자는 또한 멤풀이 제공하는 데이터를 사용하여 스마트 컨트랙트의 비용과 문제를 줄일 수 있습니다. 멤풀은 종종 블록체인의 "다크 포레스트(dark forest)"로 묘사되어 왔지만, Alchemy Monitoring과 같은 도구를 제공하는 플랫폼은 사용자가 이 중요한 단계에 대해 더 명확하게 파악할 수 있게 해줍니다.

Background gradient

블록체인 매직을 만드세요

Alchemy는 가장 강력한 Web3 개발자 제품 및 도구를 리소스, 커뮤니티, 그리고 전설적인 지원과 결합합니다.