Child-Pays-For-Parent (CPFP) 기능
Child-Pays-For-Parent
만약 Bitcoin 트랜잭션이 낮은 Transaction Fee 때문에 MemPool 에 Stuck 되어 있다면, 받는 사람(Receiver)이 대신 Fee를 높게 지불하고 트랜잭션을 Confirm하도록 할 수 있는데, 이것을 Child-Pays-For-Parent (CPFP) 기능이라 한다. 앞에서 소개한 Replace By Fee는 Sender가 Fee를 올리는 것이라면, Child-Pays-For-Parent(CPFP)는 반대로 Receiver가 Fee를 올리는 것이다. CPFP는 v0.13.0 에서 구현된 기능이다.
CPFP는 다음과 같이 동작한다. Sender가 보낸 트랜잭션이 낮은 Fee로 인해 Stuck되어 있을 때, 이는 Unconfirmed Transaction (Parent)이 되는데, Receiver는 이때 이 Unconfirmed Parent Transaction의 UTXO로 사용하는 새로운 Child Transaction을 만들게 된다. 이때 Receiver가 Child Transaction에 높은 Fee를 지정하면 Miner는 높은 Fee를 가진 Child Transaction을 처리하길 원하게 된다. 이때 Miner는 (Child Transaction만 Confirm할 수 없으므로) Parent Transaction도 함께 포함해서 처리하게 된다.
Child-Pays-For-Parent 사용예
Receiver가 Child-Pays-For-Parent를 사용하기 위해서는 Parent의 UTXO (즉, txid + vout)를 알 필요가 있다. 이 정보는 Sender가 보내주거나 혹은 "bitcoin-cli getrawmempool true"을 사용하여 현재 MemPool에 있는 Transaction 정보를 조사해서 얻을 수 있다.
먼저 다음은 Child가 사용할 Parent Transaction을 만든 것이다. 이 트랜잭션은 150 sats 만큼의 Fee를 사용하였다.
$ parent_txid=""0ebcfcbe1382a10f79a2cec609b43b470c3bed926f905b9a316d00608138e8b8"" $ parent_vout=0 $ receiver=$(bitcoin-cli getnewaddress) // tb1qldu8sefdx0960f2ns505q56dlfkdfsdyw7a06t $ rawtx=$(bitcoin-cli -named createrawtransaction inputs='''[{"txid":"'$parent_txid'","vout":'$parent_vout'}]''' outputs='''[{"'$receiver'":0.01956700 }]''' ) $ bitcoin-cli walletpassphrase "mypassword" 300 $ bitcoin-cli signrawtransactionwithwallet $rawtx { "hex": "0200000000010115235c91d138c68e1cced275a7864c408718d508e4ce00ecebeaae99232817460000000000ffffffff01f2db1d0000000000160014074bc90ceee888a2991dc436d2f08fa2cb5ecf1102473044022069bac3b1a819f3e36baad5d4fe1a09c377a0e70c6516c9e120952f7bc3881f2a0220312d183d927483640f7e41f10446d4520ba6fc2b49d89380895a39d57d41af96012102dbf242912a3af28e09306289cbf570ef54e74a51d6312671cb93a0c20d8ac50800000000", "complete": true } $ bitcoin-cli sendrawtransaction 0200000000010115235c91d138c68e1... 0ebcfcbe1382a10f79a2cec609b43b470c3bed926f905b9a316d00608138e8b8 // parent txid
Parent Transaction이 Confirm 되지 않고 계속 Stuck 되었다고 가정하고, 다음과 같은 Child Transaction을 생성하여 보낼 수 있을 것이다. 이 Child 트랜잭션은 1700 sats 만큼의 Fee를 사용하였다. 트랜잭션의 Fee와 Confirmation 정보는 bitcoin-cli gettransaction {txid}를 사용하여 체크할 수 있다.
$ child_txid=""0ebcfcbe1382a10f79a2cec609b43b470c3bed926f905b9a316d00608138e8b8"" $ child_vout=0 $ receiver2=$(bitcoin-cli getnewaddress) // tb1qxkxuyg24gwsvyl3f6x83s2dz8gxm286caqv3rj $ rawtx=$(bitcoin-cli -named createrawtransaction inputs='''[{"txid":"'$child_txid'","vout":'$child_vout'}]''' outputs='''[{"'$receiver2'":0.01955000 }]''' ) $ bitcoin-cli signrawtransactionwithwallet $rawtx { "hex": "020000000001017db52b0ccaf2f0edc9e2c32acdf3...", "complete": true } $ bitcoin-cli sendrawtransaction 020000000001017db52b0ccaf2f0edc9e2c32acdf3... 461e99d223b56c9b53188b20c1e721167aefefb2aebd4aa3253406376fd334b0 // child txid $ bitcoin-cli gettransaction 461e99d223b56c9b53188b20c1e721167aefefb2aebd4aa3253406376fd334b0
Child-Pays-For-Parent(CPFP) 기능은 Receiver 뿐만 아니라, 만약 Sender의 change address가 Transaction Output에 포함되어 있다면 Sender도 사용할 수 있다. 즉, Sender는 change address로 보내진 UTXO를 사용하여 Child Transaction을 만들 수 있을 것이다.