Memory Pool
MemPool (Memory Pool)
Bitcoin 노드에서 새로운 트랜잭션을 Peer 노드들에게 보내게 되면, 그 Unconfirmed Transaction은 bitcoind 의 MemPool (Memory Pool)에 들어간다. Miner들은 이 MemPool에 있는 Unconfirmed Transaction들을 뽑아서 하나의 블럭을 만들고, 그 블럭의 Nonce 값을 찾아내는 일을 한다. 만약 Miner가 블럭을 생성하게 되면, 블럭 안에 들어간 Transaction은 1 confirmation을 갖게 되며, 이러한 트랜잭션들은 Mempool에서 제거된다.
만약 어떤 트랜잭션이 너무 낮은 Transaction Fee를 갖거나 혹은 0 Transaction Fee를 넣은 경우에는, Miner들이 다른 비용이 높은 트랜잭션들을 먼저 처리하기 때문에, MemPool에 꽤 오랜 시간 머무를 수가 있다. 특히 Bitcoin Network이 Busy할 때 낮은 Transaction Fee를 낸 경우, 트랜잭션이 처리되지 못하고 오랜 기간 Stuck 될 수 있다.
Bitcoin Core의 초기 버전에서는 이렇게 Stuck 될 경우라도 트랜잭션이 영원히 계속 Mempool에 남아 언젠가는 처리되도록 하였는데, 트랜잭션의 양이 증가하면서 v0.12 버젼부터는 3일 (72시간) 동안 Mempool에 저장하고 이 기간이 지나면 Stuck된 트랜잭션이 Mempool에서 Expire 되도록 하였다. 이후 v0.14 버전부터는 이 Expiry 기간을 14일로 (336 시간) 늘리게 되었으며, 이것이 현재까지 유지되고 있다.
(file: validation.h, Bitcoin Core v0.21) /** Default for -mempoolexpiry, expiration time for mempool transactions in hours */ static const unsigned int DEFAULT_MEMPOOL_EXPIRY = 336;
따라서, 만약에 너무 낮은 Transaction Fee로 어떤 트랜잭션을 보냈는데 이것이 계속 처리되지 않고 있다면, 14일 후에 이 트랜잭션이 Mempool에서 Expire 될 것이고 이 경우 다시 높은 Transaction Fee로 트랜잭션을 생성해서 보낼 수 있다. 트랜잭션이 Expire 된 경우, 코인은 미사용 상태로 된다.
비트코인은 여러 분산 노드들이 동기화하면서 동작하는 분산 시스템이기 때문에 특정 싯점에 각 노드들의 MemPool 안에 있는 트랜잭션 데이타는 약간씩 다를 수 있다. 또한, 모든 노드들이 Bitcoin Core를 사용하는 것이 아니기 때문에 어떤 노드는 Stuck 된 트랜잭션을 계속 가질 수도 있으며, MemPool의 크기를 제한하는 작은 노드의 경우 메모리 크기가 작기 때문에 밑에 있는 낮은 비용의 트랜잭션들이 Expiry 날짜 이전에 제거될 수도 있다. 특히, Miner들의 경우 mempoolexpiry 를 다르게 설정하여 Expiry 기간을 바꾸기도 한다.
mempoolexpiry 파라미터
Bitcoin Core에는 Mempool Expire 기간을 조정할 수 있는 mempoolexpiry 파라미터가 있는데, 이는 디폴트값 336을 다른 값으로 변경할 때 사용한다. mempoolexpiry는 bitcoind.conf 혹은 bitcoind 실행시 아규먼트로서 지정할 수 있다.
# bitcoin.conf mempoolexpiry=2400 # 100 days