Raw Transaction
단순히 bitcoin-cli로 transaction을 보내기 위해선 sendtoaddress를 사용해서 원하는 주소로 bitcoin을 보낼 수 있다. 하지만 data를 담는등 raw transaction로 다루기 위해선, createrawtransaction, signrawtransactionwithwallet, sendrawtransaction을 사용해서 생성, 서명, 전송의 과정을 해줘야한다.
생성
- createrawtransaction 메서드를 사용해서 raw transaction을 생성할 수 있다.
- 2개의 필수적인 JSON 인자를 필요로한다. 순서대로 사용할 UTXO, 보낼 정보나 bitcoin이다.
bitcoin-cli createrawtransaction "[{\"txid\":\"f8cbd46d943758b620f305bd426c80eddb93058b596e5ddd93a60f983dad2710\",\"vout\":0}]" "[{\"bcrt1qcs2msk2xmpuv5stwgr85tlmc3uazcuamtuazve\":48},{\"data\":\"48454c4c4f203535363034\"}]"
# Result: 02000000011027ad3d980fa693dd5d6e598b0593dbed806c42bd05f320b65837946dd4cbf80000000000fdffffff0200301a1e01000000160014c415b85946d878ca416e40cf45ff788f3a2c73bb00000000000000000d6a0b48454c4c4f20353536303400000000
- 아래는 위 명령어의 인자를 보기 좋게 바꾼 것이다.
// 사용할 UTXO
[
{
"txid": "f8cbd46d943758b620f305bd426c80eddb93058b596e5ddd93a60f983dad2710",
"vout": 0
}
]
// 보낼 주소 & bitcoin 양, 데이터
[
{
"bcrt1qcs2msk2xmpuv5stwgr85tlmc3uazcuamtuazve": 28
},
{
"data": "48454c4c4f203535363034"
}
]
- 생성된 raw transaction을 다음과 같이 보기 좋게 출력할 수 있다.
bitcoin-cli decoderawtransaction 02000000011027ad3d980fa693dd5d6e598b0593dbed806c42bd05f320b65837946dd4cbf80000000000fdffffff0200301a1e01000000160014c415b85946d878ca416e40cf45ff788f3a2c73bb00000000000000000d6a0b48454c4c4f20353536303400000000
// Result:
{
"txid": "2629cfe5770f9bbcafc7986f854a9229dfcacb9d27653e86c3114764907b209f",
"hash": "354f9cefa04083180f6d4865c8fd150a41c4790d1dccc4aae87685be7878a88a",
"version": 2,
"size": 213,
"vsize": 132,
"weight": 525,
"locktime": 0,
"vin": [
{
"txid": "f8cbd46d943758b620f305bd426c80eddb93058b596e5ddd93a60f983dad2710",
"vout": 0,
"scriptSig": {
"asm": "",
"hex": ""
},
"txinwitness": [
"304402203ba419bf80438f9c0ae99961c986f94d6beb8de2d53bf57c323b40fdc7d4c07902202df151e7ac4f16007847151afda00cdea142a98020be54bb40b3fd8a706ed1a301",
"02614742f3b7af24b2323947c65e6252cbea3bb5e3c2e53524f7a60813d173e2ba"
],
"sequence": 4294967293
}
],
"vout": [
{
"value": 48.00000000,
"n": 0,
"scriptPubKey": {
"asm": "0 c415b85946d878ca416e40cf45ff788f3a2c73bb",
"desc": "addr(bcrt1qcs2msk2xmpuv5stwgr85tlmc3uazcuamtuazve)#cjf0f8mh",
"hex": "0014c415b85946d878ca416e40cf45ff788f3a2c73bb",
"address": "bcrt1qcs2msk2xmpuv5stwgr85tlmc3uazcuamtuazve",
"type": "witness_v0_keyhash"
}
},
{
"value": 0.00000000,
"n": 1,
"scriptPubKey": {
"asm": "OP_RETURN 48454c4c4f203535363034",
"desc": "raw(6a0b48454c4c4f203535363034)#zh7ur9l5",
"hex": "6a0b48454c4c4f203535363034",
"type": "nulldata"
}
}
]
}
서명
- raw transaction을 사용하기 위해선 private key로 서명을 진행해야한다. bitcoin-cli에선 wallet이 관리하는 private key로 서명을 진행할 수 있다.
bitcoin-cli signrawtransactionwithwallet 02000000011027ad3d980fa693dd5d6e598b0593dbed806c42bd05f320b65837946dd4cbf80000000000fdffffff0200301a1e01000000160014c415b85946d878ca416e40cf45ff788f3a2c73bb00000000000000000d6a0b48454c4c4f20353536303400000000
# Result:
# {
# "hex": "020000000001011027ad3d980fa693dd5d6e598b0593dbed806c42bd05f320b65837946dd4cbf80000000000fdffffff0200301a1e01000000160014c415b85946d878ca416e40cf45ff788f3a2c73bb00000000000000000d6a0b48454c4c4f2035353630340247304402203ba419bf80438f9c0ae99961c986f94d6beb8de2d53bf57c323b40fdc7d4c07902202df151e7ac4f16007847151afda00cdea142a98020be54bb40b3fd8a706ed1a3012102614742f3b7af24b2323947c65e6252cbea3bb5e3c2e53524f7a60813d173e2ba00000000",
# "complete": true
# }
전송
- 서명된 transaction은 Bitcoin network에 보낼 수 있다.
- 첫번째 인자는 서명된 transaction 문자열이다.
- 두번째 인자는 최대 비용 비율이다. (비용을 너무 많이 내지 않도록 제한해준다.)
bitcoin-cli sendrawtransaction "020000000001011027ad3d980fa693dd5d6e598b0593dbed806c42bd05f320b65837946dd4cbf80000000000fdffffff0200301a1e01000000160014c415b85946d878ca416e40cf45ff788f3a2c73bb00000000000000000d6a0b48454c4c4f2035353630340247304402203ba419bf80438f9c0ae99961c986f94d6beb8de2d53bf57c323b40fdc7d4c07902202df151e7ac4f16007847151afda00cdea142a98020be54bb40b3fd8a706ed1a3012102614742f3b7af24b2323947c65e6252cbea3bb5e3c2e53524f7a60813d173e2ba00000000" 0