bitcoin-cli Send

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 }'
본 웹사이트는 광고를 포함하고 있습니다. 광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.