비트코인 트랜잭션 전송 시 수수료를 낮게 책정해서 해당 트랜잭션이 오랜 시간 블록에 포함되지 않는 경우가 종종 발생한다. 특히 요즘과 같이 오디널스와 같은 이슈로 트랜잭션 수수료가 치솟는 상황에서 자주 발생한다.
트랜잭션이 오랜 시간 대기 상태일 때 사용자의 선택지는 다음과 같다.
먼저 RBF, CPFP의 개념을 이해하고 각각 bitcoind에서 어떻게 처리할 수 있는지 알아보자.
RBF는 트랜잭션을 보낸 사람이 수수료를 올리는 방법이다. 기존에 전송했던 트랜잭션을 조금 수정하고 수수료를 인상해서 네트워크로 전파한다. 채굴자는 수수료가 높은 트랜잭션을 채굴해야 이득이므로 수정된 트랜잭션을 블록에 포함시키고 이전 트랜잭션은 멤풀에서 삭제한다.
RBF에는 몇 가지 종류가 있지만 이 글에서는 주로 opt-in RBF에 대해 설명한다. opt-in RBF는 BIP-125에 명시되어 있으므로 사실상의 표준이라 할 수 있다.
opt-in RBF는 트랜잭션마다 활성화 여부를 결정할 수 있으며 활성화 되어 있어야 사용할 수 있다. 트랜잭션 각 입력의 sequence 필드를 통해 opt-in RBF 활성화 여부를 결정할 수 있다.
sequence 값이 0 보다 크고 0xffffffff-1(4294967294)
보다 작다면 opt-in RBF를 사용할 수 있다.
이전 트랜잭션의 입력에 사용된 UTXO가 반드시 하나 이상 포함되어야 한다. 그렇지 않으면 다른 트랜잭션으로 인식된다.
만약 이전 트랜잭션의 입력을 사용하지 않고 모두 새로운 UTXO를 사용한다면 수신자에게 같은 금액을 두 번 전송하는 사태가 발생할 수 있다. 따라서 bitcoind를 이용해서 수동으로 opt-in RBF를 사용할 때는 주의가 필요하다.
당연한 얘기지만 이전 트랜잭션이 블록에 포함되면 RBF를 사용할 수 없다. 수신자 입장에서 반드시 트랜잭션 confirmation을 기다려야 하는 이유도 여기에 있다. unconfirmed 트랜잭션은 언제든지 수정 가능하므로 수신자는 반드시 confirmation을 확인하고 거래를 진행해야 한다.
송신자 입장에서는 opt-in RBF를 활성화해야 유연하므로 장점만 존재한다. 하지만 수신자 입장에서는 opt-in RBF 활성화 시 해당 트랜잭션은 수정 가능하므로 반드시 confirmation을 기다려야 한다. 따라서 빠르게 결제를 확정하기 위해 opt-in RBF를 비활성화할 수 있다.
하지만 Full RBF 등 opt-in RBF 비활성화 상태에서도 여전히 트랜잭션 수정에 대한 가능성이 열려있으므로 opt-in RBF 비활성화 상태라고 하더라도 confirmation을 기다리는 것이 안전하다.
BIP-125 등의 문서는 비트코인 커뮤니티 내에서 장려되는 방식일 뿐이며 어떤 트랜잭션을 블록에 포함시킬지 판단하는 것은 각 채굴자이다. 많은 채굴자가 BIP를 따르고 있지만, 채굴자 입장에서는 단순히 수수료가 높은 트랜잭션을 블록에 포함시키는 것이 이득이며 이를 막을 수 있는 방법은 없다.
트랜잭션에서 비트코인을 받는 사람이 수수료를 올리는 방법이다. 이전 트랜잭션의 수수료를 높인다는 목적은 RBF와 같지만 CPFP는 이를 실행하는 주체가 다르다.
RBF는 이전 트랜잭션을 수정하는 방식이므로 기존 수수료에 추가되는 수수료만 지불하면 된다. 하지만 CPFP는 이전 트랜잭션은 그대로 두고 새로운 트랜잭션을 만들어서 함께 블록에 포함시키는 방식이므로 두 트랜잭션 수수료를 모두 지불하게 된다.
예를 들어, A 사용자가 B 사용자에게 보내는 a 트랜잭션을 만들었고 수수료로 10 sats를 설정했다고 가정해보자. 현재 시점 적정 수수료는 30 sats라고 하면 20 sats가 부족하다. B 사용자는 트랜잭션 처리를 빠르게 하기 위해 a 트랜잭션의 output을 다른 주소로 보내는 b 트랜잭션을 만든다. b 트랜잭션은 수수료로 60sats를 설정하는데, 이는 적정 수수료보다 30 sats가 초과된 금액이다. 이 초과된 금액은 a 트랜잭션의 수수료를 올리기 위한 것이며 여기서 b 트랜잭션이 CPFP을 활용한 것이다. 채굴자는 적정 수수료보다 많은 수수료를 받을 수 있으므로 a, b 트랜잭션 모두를 블록에 포함시키게 된다. (b 트랜잭션만 포함시킬 수는 없다)
CPFP에서 새로운 트랜잭션은 반드시 이전 트랜잭션의 출력을 입력으로 사용해야 한다. CPFP는 BIP로 정의된 스펙은 아니지만 채굴자에게 이득이 되는 방식이므로 많은 채굴자가 처리를 해준다.
모든 지갑 소프트웨어가 CPFP를 지원하지는 않는다. 참고로 sparrow 월렛에서는 지원하고 있다.
초기 설정은 이전 글에서 다룬 내용을 참고하자.
이번 글에서도 로컬에서 비트코인 노드 2개를 띄운 상태를 가정한다. 아래와 같이 각 노드에서 편하게 명령어를 실행해보기 위해 별칭을 등록하자.
bc1에서 bc2로 비트코인을 보내고 해당 트랜잭션의 수수료를 올려보자.
먼저 bc2의 주소를 확인한다.
bc1의 UTXO를 확인해보고 이어서 트랜잭션을 생성한다.
gettransaction 명령어로 트랜잭션 정보를 확인한다.
bip125-replaceable 필드를 통해 opt-in RBF가 활성화 되어 있는 것을 확인할 수 있다. 따로 설정을 하지 않으면 sendtoaddress 명령어가 opt-in RBF를 활성화 한다는 것을 알 수 있다.
decoderawtransaction 명령어를 이용해서 트랜잭션의 세부 정보를 확인해보자.
입력의 sequence 필드가 4294967293
이므로 0xffffffff-1(4294967294)
보다 작다. 따라서 opt-in RBF가 활성화 되어 있다는 것을 다시 한 번 확인할 수 있다.
이제 RBF를 이용해서 이전 트랜잭션의 수수료를 올리는 트랜잭션을 생성해보자.
bumpfee 명령어를 이용하면 쉽게 RBF 트랜잭션을 생성할 수 있다.
수수료가 2,820 sats에서 3,526 sats로 변경되었다.
getrawmempool 명령어를 통해 이전 트랜잭션이 멤풀에서 삭제되고 수수료를 인상한 트랜잭션만 남았다는 것을 알 수 있다.
fee_rate 옵션을 사용하면 원하는 수수료율를 직접 입력할 수 있다. fee_rate의 단위는 sat/vB
이며 vB는 decoderawtransaction 결과의 vsize 필드에서 확인할 수 있다. 하지만 vsize 대신 weight 필드를 사용하는 것이 좀 더 정확하다.
sat/vB = sat/(weight/4)
위 decoderawtransaction 결과에서 이전 트랜잭션의 weight는 561이므로 수수료와 함께 계산하면 이전 트랜잭션의 fee_rate는 다음과 같다.
다음과 같이 fee_rate 옵션을 이용해서 40 sat/vB 수수료율을 갖는 새로운 트랜잭션을 생성할 수 있다.
마지막에 생성한 트랜잭션의 세부 내용을 확인해보자.
이제 createrawtransaction 명령어를 이용해서 RBF 트랜잭션을 생성해보자. 입력과 출력을 거의 그대로 입력하고 잔돈의 수량만 조절해서 수수료를 높이자.
잔돈 0.04821540를 0.04로 변경하면서 수수료를 821,540 sat 만큼 올렸다.
멤풀에 잘 등록되었는지 확인해보자.
먼저 부모 트랜잭션을 생성한다.
gettransaction 명령어로 수수료를 확인해보자.
수수료가 2,820 sats라는 것을 확인했다.
출력 인덱스 번호를 확인하기 위해 getrawtransaction 명령어를 실행하자.
1번 출력에서 bc2의 주소를 확인할 수 있다.
현재 평균 수수료를 5,000 sats라고 가정하면 2,180(5000-2820) sats가 추가로 필요하다. 이를 위해 7,180(5000+2180) sats를 새로운 트랜잭션의 수수료로 결정하자.
bc2 자신에게 보내는 트랜잭션을 생성하자.
입력은 0.01 BTC 이므로 수수료를 7,180 sats로 설정하기 위해 0.00992820 BTC를 입력했다.
0.00992820 = 0.01 - 0.00007180
이제 채굴을 진행해보자.
두 개의 트랜잭션이 동시에 블록에 포함된 것을 확인할 수 있다.
보통은 잔돈 때문에 보낸 사람의 UTXO도 부모 트랜잭션의 출력에 존재한다. 따라서 보낸 사람도 자신의 출력을 이용해서 CPFP를 활용할 수 있다. 하지만 두 개의 트랜잭션 수수료를 모두 지불해야 한다는 단점은 존재한다.
부모 트랜잭션을 생성한다.
출력에서 보낸 사람의 잔돈이 있는지 확인해보자.
1번 출력에서 잔돈을 확인할 수 있다.
getaddressinfo 명령어로 내 주소가 맞는지 한 번 더 확인해보자.
ismine 필드를 통해 내 주소가 맞다는 것을 알 수 있다.
새로운 트랜잭션의 수수료를 4,360 sats로 하는 트랜잭션을 생성하자.
채굴을 통해 두 트랜잭션이 동시에 처리되는 것을 확인해보자.
RBF/CPFP 외에도 비트코인 채굴자들이 제공하는 Accelerator 서비스를 사용할 수도 있다. Accelerator 서비스에 트랜잭션 ID와 함께 일정 금액을 지불하면 마치 RBF로 추가 수수료를 지불한 것과 비슷한 효과를 낼 수 있다. 채굴자는 실제 비트코인 트랜잭션에서 해당 트랜잭션이 지불하는 수수료에 Accelerator 서비스에서 추가로 받은 금액을 더해서 총 수수료를 계산한다. 이 서비스는 RBF/CPFP 기능을 사용하기 힘든 경우에 사용하기 좋다.
다양한 Accelerator 서비스가 있는데 아래는 antpool의 Accelerator 서비스다.
트랜잭션 ID를 입력하면 아래와 같은 화면이 나오는데, 출력되는 비용을 USDT로 지불하면 된다.