Bitcoin 보내기(Send)
간단한 Send 명령 (sendtoaddress)
Bitcoin을 보내는 가장 간단한 명령은 sendtoaddress 메서드이다. sendtoaddress는 많은 파라미터들을 갖는데, 간단하게는 아래와 같이 처음 2개의 파라미터를 사용할 수 있다. 즉, sendtoaddress의 첫번째 파라미터에는 수신자의 비트코인 주소를 지정하고, 두번째 파라미터에는 보내는 BTC 수량을 지정한다.
$ bitcoin-cli sendtoaddress [수신자주소] [BTC수량] $ bitcoin-cli sendtoaddress tb1qglemlu3wau34v4shz6y3fwjcxecw4j8n2xe0s8 0.001 0585656e5221a86c9ecbe76f49d1b9e418f9df356311eba42911e21b9a827ec2
위 명령은 tb1qglemlu3wau34v4shz6y3fwjcxecw4j8n2xe0s8 주소에 0.001 BTC를 보내는 예로서, 0585656e5221a86c9ecbe76f49d1b9e418f9df356311eba42911e21b9a827ec2 은 Transaction Id 이다.
참고로 sendtoaddress 명령은 다음과 같은 파라미터들을 가지고 있다.
sendtoaddress "address" amount ("comment" "comment_to" subtractfeefromamount replaceable conf_target "estimate_mode" avoid_reuse fee_rate verbose )
address | 수신자 비트코인 주소 |
amount | 보내는 코인 수량 (예: 0.001) |
comment | 트랜잭션에 대한 설명/코멘트 (이는 블럭체인 트랜잭션에 포함되지 않고, 단지 Wallet에만 기록됨) |
comment_to | 트랜잭션이 누구에 대한 것인지 표시 (블럭체인 트랜잭션에 포함되지 않고, Wallet에만 기록) |
subtractfeefromamount | true이면 Transaction Fee를 보내는 금액에서 뺀다. (디폴트는 false) |
replaceable | Transaction을 빨리 처리하기 위해 나중에 보다 높은 Fee를 보내는 지정할 수도 있도록 한다. (BIP 125) |
conf_target | Transaction Fee를 계산할 때 다음 n 블럭 안에 내 트랜잭션이 들어가도록 설명하는 값으로 floating fee를 계산할 때 사용된다 (bitcoin.conf: txconfirmtarget). |
estimate_mode | Fee를 계산할 때, 어떤 모드를 사용할 지 결정하는 것으로 unset, economical, conservative 중 하나. |
avoid_reuse | 이미 사용된 주소를 다시 사용하지 않도록 하는 플래그 (디폴트: true)/td> |
fee_rate | 사용할 Transaction Fee 요율로서 바이트(vB) 당 Satoshi로 표시한다. fee_rate=1 은 트랜잭션 데이타의 1 바이트 당 1 사토시(1 sat/vB)를 의미한다. 여기서 바이트(vB)는 virtual byte를 의미하는 것으로, Segwit이 아닌 경우는 1vB는 1 바이트를 의미하고, Segwit인 경우는 1vb = 1/4 byte를 의미한다. 이는 Segwit의 경우 witness 데이타를 빼기 때문에 1/4 비율로 크기가 줄어들기 때문이다. |
예를 들어, 다음은 0.002 BTC를 tb1qglemlu3wau34v4shz6y3fwjcxecw4j8n2xe0s8 에게 보내는 명령인데, 이때 Transaction Fee는 바이트(vB)당 2 사토시를 사용하도록 지정한 것이다.
$ bitcoin-cli -named sendtoaddress address="tb1qglemlu3wau34v4shz6y3fwjcxecw4j8n2xe0s8" amount=0.002 fee_rate=2
모든 코인(max amount)을 하나의 주소로 보내기
만약 현재 여러 개의 UTXO들을 가지고 있을 때, 자신의 모든 코인을 하나의 주소로 보내고 싶으면 다음과 같이 subtractfeefromamount=true (5번째 파라미터)를 설정하여 보낼 수 있다. 이 명령은 전체 코인을 보내면서 Fee를 전체 코인에서 빼고 보내게 된다.
$ bitcoin-cli getbalance 0.1234 $ bitcoin-cli sendtoaddress tb1qxvaa5lcnl44z222mejx5w0f04lvdjx8as3qm83 0.1234 "" "" true
트랜잭션 Fee 설정값
비트코인을 보낼 때, 특히 신경 쓸 부분은 '얼마만큼의 Transaction Fee가 사용될 것인가'라는 문제이다. 왜냐하면, Transaction Fee는 (별도의 명시적 지정이 없으면) 보통 동적으로 결정되기 때문인데, 이 경우 네트워크이 Busy한 경우 Fee가 비싸질 수 있기 때문이다. 예를 들어, $5를 보내는데, $10의 Fee가 붙을 수도 있다.
bitcoin.conf 구성파일에는 minrelaytxfee, mintxfee, txconfirmtarget 등과 같은 Fee와 관련된 파라미터들을 지정할 수 있다. minrelaytxfee는 bitcoin 노드가 어떤 트랜잭션을 mempool에 받아들이기 위한 최소한 Fee를 의미한다. 만약 이 Fee 미만이면 트랜잭션이 Reject 되는데, 현재 디폴트 최소 relay fee는 1000 sats/KB (즉, 1 sat per byte) 로 설정되어 있다.
validation.h:56: static const unsigned int DEFAULT_MIN_RELAY_TX_FEE = 1000; // 1 KB 당 sats
만약 트랜잭션의 Fee가 minrelaytxfee 보다 낮게 설정하면 아래와 같은 에러가 발생한다.
$ bitcoin-cli -named sendtoaddress address="tb1qglemlu3wau34v4shz6y3fwjcxecw4j8n2xe0s8" amount=0.0015 fee_rate=0.1 error code: -6 error message: Fee rate (0.100 sat/vB) is lower than the minimum fee rate setting (1.000 sat/vB)
mintxfee는 월렛의 설정값으로 트랜잭션의 최소 Fee로서 데이타 1 KB 당 sats (sats/kb)를 지정한 값이다. 예를 들어, 아래처럼 mintxfee=0.0001 인 경우 1 KB 당 10,000 사토시(10 sats/byte)가 그 월렛이 사용하는 최소 Fee가 된다.
mintxfee=0.0001 txconfirmtarget=6
만약 트랜잭션의 Fee가 mintxfee 보다 낮게 설정하면 아래와 같은 에러가 발생한다.
$ bitcoin-cli -named sendtoaddress address="tb1qglemlu3wau34v4shz6y3fwjcxecw4j8n2xe0s8" amount=0.0015 fee_rate=2 error code: -6 error message: Fee rate (2.000 sat/vB) is lower than the minimum fee rate setting (10.000 sat/vB)
Bitcoin은 "floating fee" 기능을 사용하여, 트랜잭션이 얼마만큼의 기간 안에 confirm 되어야 하는지(txconfirmtarget 파라미터)를 따져서 Fee를 동적으로 결정할 수 있다. 예를 들어, bitcoin.conf에 txconfirmtarget=6 파라미터를 설정하면, 6개의 블럭이 생성될 때까지 (즉, 10분 * 6 = 60분 안에) 해당 트랜잭션이 블럭에 들어갈 수 있도록 Fee를 동적으로 계산하게 된다.
트랜잭션 확인 (gettransaction)
Send 트랜잭션에 대해 자세한 정보를 얻기 위해서는 아래와 같이 gettransaction 명령을 사용할 수 있다. 이 트랜잭션 정보를 살펴보면, 누구에게 얼마만큼의 비트코인을 보냈는지, 현재 얼마만큼의 블럭 confirmation이 되었는지, 사용되었던 Transaction Fee는 얼마인지 등등을 알 수 있다.
$ bitcoin-cli gettransaction 0585656e5221a86c9ecbe76f49d1b9e418f9df356311eba42911e21b9a827ec2 { "amount": 0.00000000, "fee": -0.00000142, "confirmations": 0, "trusted": true, "txid": "0585656e5221a86c9ecbe76f49d1b9e418f9df356311eba42911e21b9a827ec2", "walletconflicts": [ ], "time": 1645471991, "timereceived": 1645471991, "bip125-replaceable": "no", "details": [ { "address": "tb1qglemlu3wau34v4shz6y3fwjcxecw4j8n2xe0s8", "category": "send", "amount": -0.00100000, "label": "", "vout": 0, "fee": -0.00000142, "abandoned": false }, { "address": "tb1qglemlu3wau34v4shz6y3fwjcxecw4j8n2xe0s8", "category": "receive", "amount": 0.00100000, "label": "", "vout": 0 } ], "hex": "020000000001018f8f5d078b612d8ad37a193640aaac008c70327b68a52c32f140a74b3aba02dc0000000000feffffff02a08601000000000016001447f3bff22eef23565617168914ba583670eac8f3a5cc170000000000160014c08a992d7958572179929d5d2979b7d20bfe26b302473044022067f7130306a1779d18f151b9a0b7e82e3591bfe2f99a78483f367f1dc78dc12f022048b308709e1e90e35d8ea4041312fd5eaa70791b1754402c2ccd248ff007e2e50121037321075dc7e3a49e008f4bac10dfcc8e2bf90c7be326b37126c25c68a0b2422d0a022100" }
send/sendmany 명령
비트코인을 보내는 명령은 위의 sendtoaddress 이외에 send, sendmany, sendrawtransaction 명령이 있다. send 명령은 한 사람에 보낼 때 사용하고, sendmany는 여러 사람에게 보낼 때 사용한다. send 명령은 현재 (v0.20) 실험적으로 사용되는데, 향후 없어질 수도 있다. sendrawtransaction 명령은 (다음 아티클에서 설명하는) Raw Transaction을 만들어 보낼 때 사용한다.
send 는 하나의 수신 주소에 비트코인을 보내는 명령으로 sendtoaddress와 비슷하게 여러 옵션들을 가질 수 있다. send 명령은 다음과 같은 문법을 갖는다. 여기서 {"address":amount} 은 수신자 주소와 보내는 금액을 나타내고, conf_target, estimate_mode, fee_rate 등과 같은 파라미터들을 위에서 설명한 sendtoaddress 옵션과 같다.
$bitcoin-cli send [{"address":amount},{"data":"hex"},...] ( conf_target "estimate_mode" fee_rate options )
예를 들어, 아래는 tb1q03tzfl3pggla5dzaxytatpadn4mufgua2cqqrp 에게 0.001 BTC를 보내는 명령으로, 6 블럭 안에 들어가는 타겟(conf_target)으로 절약형(economical) 모드로 Transaction Fee를 계산하라는 것을 의미한다. 물론 conf_target, estimate_mode 등을 지정하지 않으면, 디폴트로 Free를 계산한다.
$ bitcoin-cli send '{"tb1q03tzfl3pggla5dzaxytatpadn4mufgua2cqqrp":0.001}' 6 "economical" { "txid": "e61f886b202077fe5131b4a5539be81c421d02f134d521137d7bacc9e0ff6b2d", "complete": true }
sendmany 는 send와 비슷하지만 복수 개의 주소에도 비트코인을 보낼 수 있는 명령이다. sendmany 명령은 다음과 같은 문법을 갖는다. 여기서 첫번째 파라미터는 Backward Compatiblity를 위한 것으로 항상 "" 을 넣는다. 두번째 파라미터에는 하나의 이상의 "address":amount 를 지정할 수 있고, 다섯번째 파라미터는 subtractfeefrom 즉 어떤 주소에서 Fee를 지불할 것인 지를 지정하는 것으로 여러 개의 주소를 배열로 쓸 수 있다.
$bitcoin-cli sendmany "" {"address":amount, "address":amount, ...} (minconf "comment" ["address",...] replaceable conf_target "estimate_mode" fee_rate verbose )
예를 들어, 아래는 sendmany를 사용하여 tb1q03tzfl3pggla5dzaxytatpadn4mufgua2cqqrp 에게 0.001 BTC를, tb1qtvnpqxvj49cehxga9l75wagdsclzlqwky4xdsh 에게 0.002 BTC를 보내는 명령이다.
$ bitcoin-cli sendmany "" '{"tb1q03tzfl3pggla5dzaxytatpadn4mufgua2cqqrp":0.001, "tb1qtvnpqxvj49cehxga9l75wagdsclzlqwky4xdsh": 0.002 }'