미리 알아야 할 내용들
트랜잭션 생성
이번 글에서는 비트코인 테스트넷 트랜잭션을 생성해보겠습니다. 가장 먼저 필요한 것은 테스트넷 비트코인을 보유하고 있는 비트코인 주소입니다. Faucet을 통해 비트코인을 전송받았던 비트코인 테스트넷 주소와 개인키, 공개키 그리고 이전 트랜잭션은 다음과 같습니다.
테스트넷 주소: mnZ4kAYXibVyRs31rC57NH1gMooYDaKQMw
개인키: 42d219444915828585a35b44849417b6eeb604bd0c7afda058c78319481d0055
공개키: 02eb6033f9e7446731e50e75b099ed5439698f3d5a59e89b1f64c2445c2a245bf0
이전 트랜잭션 정보
이제부터 주소, 개인키, 공개키, 이전 트랜잭션 정보를 이용하여 본격적으로 트랜잭션을 생성해보겠습니다.
1. 트랜잭션 입력
가장 먼저 생성할 것은 트랜잭션의 입력입니다. 이번에 생성될 트랜잭션에서 사용될 입력은 1개이므로 가변 길이 정수 '01'을 먼저 생성합니다.
(1)결과: 01
그다음 사용할 이전 트랜잭션의 해시값을 리틀 엔디안 값으로 뒤에 붙입니다. 아래 코드는 해시값을 리틀 엔디안 값으로 변환해주는 코드입니다.
이전 트랜잭션 해시(빅 엔디안): 0a3c39699b0a5f0eaade23647e6ba2a9bb573f26a948be670137b77e7cf5bf3b
h = '0a3c39699b0a5f0eaade23647e6ba2a9bb573f26a948be670137b77e7cf5bf3b'
b = bytes.fromhex(h)
print(b[::-1].hex())
이전 트랜잭션 해시(리틀 에디안): 3bbff57c7eb7370167be48a9263f57bba9a26b7e6423deaa0e5f0a9b69393c0a
이제 위의 값을 결과 뒤에 붙입니다.
(2)결과: 013bbff57c7eb7370167be48a9263f57bba9a26b7e6423deaa0e5f0a9b69393c0a
다음으로 이전 트랜잭션에서 가져올 출력의 번호를 리틀 엔디안으로 뒤에 붙입니다. 사용할 이전 트랜잭션 출력의 번호가 00000001이므로 리틀 엔디안 값 01000000을 뒤에 붙입니다.
(3)결과: 013bbff57c7eb7370167be48a9263f57bba9a26b7e6423deaa0e5f0a9b69393c0a01000000
이제부터는 해제 스크립트를 작성해야 합니다. 이전 출력이 P2PKH이므로 P2PKH 해제 스크립트를 작성해야 합니다. P2PKH의 해제 스크립트는 다음과 같습니다.
P2PKH 해제 스크립트: <서명> <공개키>
공개키 값은 이미 알고 있는 값이므로 서명 값을 구해야 합니다. 이전 글에서 DER 형식 서명을 구하는 과정에서 서명 해시(z) 값을 생성하는 부분을 생략하였습니다. 그 이유는 서명 해시값이 트랜잭션을 이용해야만 구할 수 있기 때문이었습니다. 하지만 서명해시 값을 구하기 위해서는 전체 트랜잭션이 필요합니다. 따라서 해제 스크립트는 비운 상태로 계속해서 진행하겠습니다.
(4)결과: 013bbff57c7eb7370167be48a9263f57bba9a26b7e6423deaa0e5f0a9b69393c0a01000000<해제 스크립트>
마지막으로 시퀀스를 결과 값 뒤에 붙입니다. 록타임을 사용하지 않을 것이기 때문에 시퀀스를 ffffffff로 사용합니다.
(5)결과: 013bbff57c7eb7370167be48a9263f57bba9a26b7e6423deaa0e5f0a9b69393c0a01000000<해제 스크립트>ffffffff
해제 스크립트를 제외한 트랜잭션의 입력이 완성되었습니다.
트랜잭션 입력: 013bbff57c7eb7370167be48a9263f57bba9a26b7e6423deaa0e5f0a9b69393c0a01000000<해제 스크립트>ffffffff
2. 트랜잭션 출력
트랜잭션 입력에 이어 트랜잭션 출력을 구해보겠습니다. 출력을 생성하기 전에 전송할 비트코인 개수, 전송할 주소, 수수료를 정해야 합니다. 전송할 비트코인의 개수부터 생각해보겠습니다. 비트코인의 입력과 출력에서의 비트코인의 개수는 다음과 같이 나타낼 수 있습니다.
입력 비트코인 = 전송할 비트코인 + 내 주소로 다시 전송할 비트코인(거스름돈) + 수수료
먼저 이전 트랜잭션의 출력 비트코인이자 이번 트랜잭션의 입력 비트코인을 가져오겠습니다.
입력 비트코인: 0.00067000 BTC
그다음 수수료를 가져오겠습니다. 수수료는 현재 테스트넷 거래들에서 사용되고 있는 수수료를 사용하겠습니다.
수수료: 0.00001000 BTC
마지막으로 전송할 비트코인의 개수만 정해주면 거스름돈을 계산할 수 있습니다.
전송할 비트코인: 0.00060000 BTC
내 주소로 다시 전송할 비트코인(거스름돈): 0.00006000
입력 비트코인과 출력 비트코인 + 수수료가 같은지 최종 확인합니다.
0.00060000 + 0.00006000 + 0.00001000 = 0.00067000 BTC
이제 테스트넷 비트코인을 전송할 주소를 정하겠습니다.
아래 비트코인 테스트넷 Faucet 서비스의 비트코인 테스트넷 주소로 전송하겠습니다.
전송할 주소: mohjSavDdQYHRYXcS3uS6ttaHP8amyvX78
전송할 금액과 전송할 주소가 정해졌으므로 본격적으로 트랜잭션의 출력을 생성해보겠습니다.
가장 먼저 가변 길이 정수 형식의 출력 개수를 생성합니다. 출력은 총 2개이므로 '02'를 생성합니다.
(1)결과: 02
그다음 출력 0번의 비트코인 개수를 뒤에 붙입니다. 출력 0번은 Faucet으로의 출력으로 정하겠습니다. 따라서 0.00060000을 리틀 엔디안 16진수로 변환하겠습니다. 트랜잭션에서의 비트코인은 소수점 단위(BTC)가 아닌 1 사토시(1/100000000 BTC) 단위로 진행됩니다. 따라서 60000을 8바이트 리틀 엔디안 16진수로 변환해줍니다. 그리고 이 값을 결괏값 뒤에 붙입니다.
(2)결과: 0260ea000000000000
이어서 출력 0번의 잠금 스크립트를 생성합니다. Faucet의 주소가 P2PKH 주소(레거시 주소)이므로 P2PKH 잠금 스크립트를 생성합니다. 기본적인 P2PKH 잠금 스크립트는 다음과 같습니다.
P2PKH 잠금 스크립트: [OP_DUP] [OP_HASH160] <hash160 공개키> [OP_EQUALVERIFY] [OP_CHECKSIG]
이제 잠금 스크립트를 생성해보겠습니다. 가장 먼저 OP_DUP의 16진수 값을 불러옵니다.
출력 0 잠금 스크립트: 76
같은 방식으로 OP_HAHS160의 16진수 값을 불러옵니다.
출력 0 잠금 스크립트: 76a9
이제 Base58Check로 인코딩 된 주소를 디코딩하여 hash160 공개키 해시값을 구해야 합니다. 아래 코드는 해당 작업을 진행하는 코드입니다.
a = 'mohjSavDdQYHRYXcS3uS6ttaHP8amyvX78'
BASE58_CODE = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
def decode_base58_check(a):
num = 0
for c in a:
num *= 58
num += BASE58_CODE.index(c)
b = num.to_bytes(25, byteorder='big')
b = b[1:] # 메인넷 테스트넷 구분자 제
return b[:-4].hex() # 체크섬 확인 생략
h = decode_base58_check(a)
print(h)
체크섬으로 주소를 확인하는 과정은 생략했습니다. 얻은 hash160 공개키의 바이트 길이를 먼저 붙인 후에 공개키를 붙입니다.
출력 0 잠금 스크립트: 76a914
출력 0 잠금 스크립트: 76a91459cada50314c829e19f5a7786f8ee0d4987f429d
이어서 더해야 할 것들은 모두 opcode 이므로 opcode OP_EQUALVERIFY, OP_CHECKSIG에 맞는 16진수 값을 뒤에 붙입니다.
출력 0 잠금 스크립트: 76a91459cada50314c829e19f5a7786f8ee0d4987f429d88
출력 0 잠금 스크립트: 76a91459cada50314c829e19f5a7786f8ee0d4987f429d88ac
마지막으로 잠금 스크립트의 바이트 길이를 16 진수로 맨 앞에 붙입니다.
출력 0 잠금 스크립트: 1976a91459cada50314c829e19f5a7786f8ee0d4987f429d88ac
최종적으로 생성한 출력 0의 잠금 스크립트는 다음과 같습니다.
출력 0 잠금 스크립트: 1976a91459cada50314c829e19f5a7786f8ee0d4987f429d88ac
이 결과를 기존 출력 결과 뒤에 붙입니다.
(3)결과: 0260ea0000000000001976a91459cada50314c829e19f5a7786f8ee0d4987f429d88ac
출력 0에 이어서 거스름돈 출력인 출력 1의 비트코인 개수와 잠금 스크립트를 생성하겠습니다.
먼저 비트코인 개수는 이전과 같이 0.00006000 BTC 즉, 6000 사토시를 16진수로 변환한 뒤 이 값을 리틀 엔디안으로 바꿉니다. 그리고 이 값을 이전 결과 뒤에 붙입니다.
(4)결과: 0260ea0000000000001976a91459cada50314c829e19f5a7786f8ee0d4987f429d88ac7017000000000000
출력 0의 잠금 스크립트를 생성했던 방식과 같은 방식으로 출력 1의 잠금 스크립트를 생성합니다.
출력 1 잠금 스크립트: 76
출력 1 잠금 스크립트: 76a9
출력 1 잠금 스크립트: 76a914
출력 1 잠금 스크립트: 76a9144d2f18c566944ff7ce000b657d237e8a2fecbf87
출력 1 잠금 스크립트: 76a9144d2f18c566944ff7ce000b657d237e8a2fecbf8788
출력 1 잠금 스크립트: 76a9144d2f18c566944ff7ce000b657d237e8a2fecbf8788ac
출력 1 잠금 스크립트: 1976a9144d2f18c566944ff7ce000b657d237e8a2fecbf8788ac
최종적으로 생성한 출력 1의 잠금 스크립트는 다음과 같습니다.
출력 1 잠금 스크립트: 1976a9144d2f18c566944ff7ce000b657d237e8a2fecbf8788ac
이 값을 이전 결과 뒤에 붙입니다.
(5)결과: 0260ea0000000000001976a91459cada50314c829e19f5a7786f8ee0d4987f429d88ac70170000000000001976a9144d2f18c566944ff7ce000b657d237e8a2fecbf8788ac
트랜잭션의 출력이 완성되었습니다.
트랜잭션 출력: 0260ea0000000000001976a91459cada50314c829e19f5a7786f8ee0d4987f429d88ac70170000000000001976a9144d2f18c566944ff7ce000b657d237e8a2fecbf8788ac
3. 전체 트랜잭션 생성
비트코인 전체 트랜잭션은 버전, 입력, 출력, 록타임으로 구성되어 있습니다. 가장 먼저 버전을 입력합니다.
트랜잭션: 01000000
그다음 트랜잭션 입력을 뒤에 붙입니다.
트랜잭션: 01000000013bbff57c7eb7370167be48a9263f57bba9a26b7e6423deaa0e5f0a9b69393c0a01000000<해제 스크립트>ffffffff
이어서 트랜잭션 출력을 뒤에 붙입니다.
트랜잭션: 01000000013bbff57c7eb7370167be48a9263f57bba9a26b7e6423deaa0e5f0a9b69393c0a01000000<해제 스크립트>ffffffff0260ea0000000000001976a91459cada50314c829e19f5a7786f8ee0d4987f429d88ac70170000000000001976a9144d2f18c566944ff7ce000b657d237e8a2fecbf8788ac
마지막으로 록타임을 뒤에 붙입니다. 생성할 트랜잭션은 록타임을 사용하지 않기 때문에 00000000으로 설정합니다.
트랜잭션: 01000000013bbff57c7eb7370167be48a9263f57bba9a26b7e6423deaa0e5f0a9b69393c0a01000000<해제 스크립트>ffffffff0260ea0000000000001976a91459cada50314c829e19f5a7786f8ee0d4987f429d88acc81a0000000000001976a9144d2f18c566944ff7ce000b657d237e8a2fecbf8788ac00000000
해제 스크립트를 제외한 전체 트랜잭션은 다음과 같습니다.
트랜잭션: 01000000013bbff57c7eb7370167be48a9263f57bba9a26b7e6423deaa0e5f0a9b69393c0a01000000<해제 스크립트>ffffffff0260ea0000000000001976a91459cada50314c829e19f5a7786f8ee0d4987f429d88ac70170000000000001976a9144d2f18c566944ff7ce000b657d237e8a2fecbf8788ac00000000
4. 서명 해시와 서명
이제 서명 해시를 구해 서명을 생성하고 해제 스크립트를 작성하여 트랜잭션을 완성하겠습니다.
비트코인에서 사용하는 디지털 서명 알고리즘인 ECDSA는 r값과 s값 그리고 서명 해시를 이용하여 서명을 검증합니다. 여기에서 r은 무작위 값 k를 생성점 G에 스칼라 곱셈하여 계산한 값의 x 좌표 값이며, s값은 r값과 개인키값 그리고 서명해시(z)를 이용하여 계산한 값입니다. 비트코인에서는 이 값들을 DER 형식 서명으로 만들어 사용합니다. 이전 DER 형식 서명 글에서 다른 값들은 모두 구하였지만 서명해시 z만큼은 구하지 못했습니다. 그 이유는 트랜잭션을 이용해야만 서명해시를 구할 수 있기 때문입니다. 이번 글에서는 트랜잭션을 생성하였기 때문에 서명해시 값을 구할 수 있습니다.
서명해시를 이용하여 구한 서명은 트랜잭션의 해제 스크립트에 포함됩니다. 그런데 서명 해시는 트랜잭션을 통해 구합니다. 따라서 서명 해시에는 해제 스크립트를 포함해서는 안됩니다. 해제 스크립트를 구하기 위해 생성할 서명 해시가 해제 스크립트 자신을 포함하고 있다는 모순이 발생하기 때문입니다. 이 문제 때문에 지금까지 해제 스크립트를 비우고 진행하였습니다.
본격적으로 서명 해시를 구해보겠습니다. 구하는 방법은 생각보다 간단합니다. 먼저 미리 비워두었던 트랜잭션의 모든 해제 스크립트 자리에 이전 트랜잭션의 잠금 스크립트를 넣습니다. 이번에 생성하고 있는 트랜잭션의 입력은 한 개 이므로 입력 0번의 해제 스크립트 자리의 내용만 변경하면 됩니다.
이전 트랜잭션의 잠금 스크립트: 1976a9144d2f18c566944ff7ce000b657d237e8a2fecbf8788ac
위 값이 들어간 트랜잭션: 01000000013bbff57c7eb7370167be48a9263f57bba9a26b7e6423deaa0e5f0a9b69393c0a010000001976a9144d2f18c566944ff7ce000b657d237e8a2fecbf8788acffffffff0260ea0000000000001976a91459cada50314c829e19f5a7786f8ee0d4987f429d88ac70170000000000001976a9144d2f18c566944ff7ce000b657d237e8a2fecbf8788ac00000000
그다음 트랜잭션 맨 뒤에 4바이트 리틀 엔디안의 해시 유형을 덧붙입니다. 일반적인 경우 사용하는 값은 01000000입니다.
결과: 01000000013bbff57c7eb7370167be48a9263f57bba9a26b7e6423deaa0e5f0a9b69393c0a010000001976a9144d2f18c566944ff7ce000b657d237e8a2fecbf8788acffffffff0260ea0000000000001976a91459cada50314c829e19f5a7786f8ee0d4987f429d88ac70170000000000001976a9144d2f18c566944ff7ce000b657d237e8a2fecbf8788ac0000000001000000
마지막으로 위 값의 hash256 값을 구합니다. 이때 구해진 값이 바로 서명 해시 z입니다. 아래는 hash256 코드입니다.
import hashlib
h = '01000000013bbff57c7eb7370167be48a9263f57bba9a26b7e6423deaa0e5f0a9b69393c0a010000001976a9144d2f18c566944ff7ce000b657d237e8a2fecbf8788acffffffff0260ea0000000000001976a91459cada50314c829e19f5a7786f8ee0d4987f429d88ac70170000000000001976a9144d2f18c566944ff7ce000b657d237e8a2fecbf8788ac0000000001000000'
h1 = hashlib.sha256(bytes.fromhex(h))
h2 = hashlib.sha256(h1.digest())
print(h2.hexdigest())
서명 해시(z): 672ba6ff9b2719bdb1374c7627e12d129801fe3335c76b072582e5bc12686b1a
다음으로 서명 생성에 필요한 k값을 구해보겠습니다. 이전에 DER 형식 서명을 생성하는 과정에선 직접 정한 k값을 사용했습니다. 하지만 k값을 생성하는 표준안이 존재합니다. 이를 위해서는 서명 해시(z)와 개인키(d)가 필요합니다. 아래는 표준안에 따라 k값을 생성하는 파이썬 코드입니다.
#https://github.com/jimmysong/programmingbitcoin/blob/master/code-ch13/ecc.py
import hashlib
import hmac
N = 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141
def deterministic_k(d, z):
k = b'\x00' * 32
v = b'\x01' * 32
if z > N:
z -= N
z_bytes = z.to_bytes(32, 'big')
d_bytes = d.to_bytes(32, 'big')
s256 = hashlib.sha256
k = hmac.new(k, v + b'\x00' + d_bytes + z_bytes, s256).digest()
v = hmac.new(k, v, s256).digest()
k = hmac.new(k, v + b'\x01' + d_bytes + z_bytes, s256).digest()
v = hmac.new(k, v, s256).digest()
while True:
v = hmac.new(k, v, s256).digest()
candidate = int.from_bytes(v, 'big')
if candidate >= 1 and candidate < N:
return candidate
k = hmac.new(k, v + b'\x00', s256).digest()
v = hmac.new(k, v, s256).digest()
d = 0x42d219444915828585a35b44849417b6eeb604bd0c7afda058c78319481d0055
z = 0x672ba6ff9b2719bdb1374c7627e12d129801fe3335c76b072582e5bc12686b1a
k = deterministic_k(d,z)
print(hex(k))
k값: 0x61d23061fba0b56bc9be6794f4bbcb711a262ff112ebecacbef113430f30ba19
k값을 구했으니 r값을 구해야 합니다. r값을 구하는 방법은 이전 DER 형식 서명 글에서 다뤘으므로 생략하겠습니다.
r값: 0xd43aba603c3cf29cb814d35a152f4a659e7063ef2e284139ca0fe1e9543c9828
그다음 s값을 구합니다. s값을 구하는 방법은 r값과 같이 이전 글에서 다뤘으므로 생략하겠습니다.
s값: 0x2485f9ff80b9bad4f0245315be872f9333fbc1e3e1e1922cfdad6b97ddeacf32
DER 형식 서명을 구하기 위한 r값과 s값을 모두 구했습니다. 이제 DER 형식 서명을 생성해보겠습니다. 서명 생성 방법은 이전 글에서 이미 다뤘으므로 간단하게 넘어가겠습니다.
(1)결과: 00d43aba603c3cf29cb814d35a152f4a659e7063ef2e284139ca0fe1e9543c9828
(2)결과: 2100d43aba603c3cf29cb814d35a152f4a659e7063ef2e284139ca0fe1e9543c9828
(3)결과: 022100d43aba603c3cf29cb814d35a152f4a659e7063ef2e284139ca0fe1e9543c9828
(4)결과: 2485f9ff80b9bad4f0245315be872f9333fbc1e3e1e1922cfdad6b97ddeacf32
(5)결과: 202485f9ff80b9bad4f0245315be872f9333fbc1e3e1e1922cfdad6b97ddeacf32
(6)결과: 02202485f9ff80b9bad4f0245315be872f9333fbc1e3e1e1922cfdad6b97ddeacf32
(7)결과: 022100d43aba603c3cf29cb814d35a152f4a659e7063ef2e284139ca0fe1e9543c982802202485f9ff80b9bad4f0245315be872f9333fbc1e3e1e1922cfdad6b97ddeacf32
(8)결과: 45022100d43aba603c3cf29cb814d35a152f4a659e7063ef2e284139ca0fe1e9543c982802202485f9ff80b9bad4f0245315be872f9333fbc1e3e1e1922cfdad6b97ddeacf32
(9)최종결과: 3045022100d43aba603c3cf29cb814d35a152f4a659e7063ef2e284139ca0fe1e9543c982802202485f9ff80b9bad4f0245315be872f9333fbc1e3e1e1922cfdad6b97ddeacf32
DER 형식 서명: 3045022100d43aba603c3cf29cb814d35a152f4a659e7063ef2e284139ca0fe1e9543c982802202485f9ff80b9bad4f0245315be872f9333fbc1e3e1e1922cfdad6b97ddeacf32
서명을 구했으니 이제 마지막으로 해제 스크립트를 구해보겠습니다.
5. 해제 스크립트
P2PKH 해제 스크립트는 다음과 같았습니다.
P2PKH 해제 스크립트: <서명> <공개키>
해제 스크립트의 생성은 잠금 스크립트 생성 방식과 같습니다.
입력 0 해제 스크립트: 48(서명 바이트 길이 + 해시 유형 길이(1바이트))
입력 0 해제 스크립트: 483045022100d43aba603c3cf29cb814d35a152f4a659e7063ef2e284139ca0fe1e9543c982802202485f9ff80b9bad4f0245315be872f9333fbc1e3e1e1922cfdad6b97ddeacf32(서명)
입력 0 해제 스크립트: 483045022100d43aba603c3cf29cb814d35a152f4a659e7063ef2e284139ca0fe1e9543c982802202485f9ff80b9bad4f0245315be872f9333fbc1e3e1e1922cfdad6b97ddeacf3201(해시 유형) - 여기서의 해시 유형은 서명 해시 계산 과정에서 사용한 해시 유형입니다.
입력 0 해제 스크립트: 483045022100d43aba603c3cf29cb814d35a152f4a659e7063ef2e284139ca0fe1e9543c982802202485f9ff80b9bad4f0245315be872f9333fbc1e3e1e1922cfdad6b97ddeacf320121(공개키 바이트 길이)
입력 0 해제 스크립트: 483045022100d43aba603c3cf29cb814d35a152f4a659e7063ef2e284139ca0fe1e9543c982802202485f9ff80b9bad4f0245315be872f9333fbc1e3e1e1922cfdad6b97ddeacf32012102eb6033f9e7446731e50e75b099ed5439698f3d5a59e89b1f64c2445c2a245bf0(공개키)
마지막으로 해제 스크립트 전체 길이를 맨 앞에 붙입니다.
입력 0 해제 스크립트: 6b483045022100d43aba603c3cf29cb814d35a152f4a659e7063ef2e284139ca0fe1e9543c982802202485f9ff80b9bad4f0245315be872f9333fbc1e3e1e1922cfdad6b97ddeacf32012102eb6033f9e7446731e50e75b099ed5439698f3d5a59e89b1f64c2445c2a245bf0
최종적인 입력 0의 해제 스크립트는 다음과 같습니다.
해제 스크립트: 6b483045022100d43aba603c3cf29cb814d35a152f4a659e7063ef2e284139ca0fe1e9543c982802202485f9ff80b9bad4f0245315be872f9333fbc1e3e1e1922cfdad6b97ddeacf32012102eb6033f9e7446731e50e75b099ed5439698f3d5a59e89b1f64c2445c2a245bf0
6. 최종 트랜잭션 생성
이제 생성한 해제 스크립트를 트랜잭션에 넣으면 트랜잭션이 완성됩니다. 완성된 트랜잭션은 아래와 같습니다.
트랜잭션: 01000000013bbff57c7eb7370167be48a9263f57bba9a26b7e6423deaa0e5f0a9b69393c0a010000006b483045022100d43aba603c3cf29cb814d35a152f4a659e7063ef2e284139ca0fe1e9543c982802202485f9ff80b9bad4f0245315be872f9333fbc1e3e1e1922cfdad6b97ddeacf32012102eb6033f9e7446731e50e75b099ed5439698f3d5a59e89b1f64c2445c2a245bf0ffffffff0260ea0000000000001976a91459cada50314c829e19f5a7786f8ee0d4987f429d88ac70170000000000001976a9144d2f18c566944ff7ce000b657d237e8a2fecbf8788ac00000000
이제 생성한 트랜잭션을 테스트넷으로 보내 실제 테스트넷 거래를 시도해보겠습니다. 아래 사이트와 같은 서비스를 이용하면 비트코인 테스트넷 트랜잭션을 직접 보낼 수 있습니다.
아래는 트랜잭션 전송 결과입니다.
트랜잭션 해시: 01fbe468b42e52e878c6834e03b36227ddfd55d965ec69e9bfd6dfa48e6093c1
트랜잭션이 정상 처리되었음을 알 수 있습니다.
지금까지 비트코인 테스트넷 트랜잭션을 생성하고 전송하여 결과를 확인해봤습니다. 이번 글에서 생성한 트랜잭션은 테스트넷 트랜잭션이었지만, 전송 주소를 메인넷 주소로 변경하면 메인넷 트랜잭션을 생성할 수 있습니다.
감사합니다.
이어지는 글들
'비트코인 > 비트코인 구조' 카테고리의 다른 글
[비트코인 구조] P2SH 스크립트에서 리딤 스크립트를 전송하는 방식 (0) | 2022.11.19 |
---|---|
[비트코인 구조] 0x4c 이상 크기의 데이터를 스크립트에 저장하는 방법 (0) | 2022.11.15 |
[비트코인 구조] 비트코인 테스트넷 Faucet (0) | 2022.10.24 |
[비트코인 구조] 가변 길이 정수(VarInt) (0) | 2022.10.21 |
[비트코인 구조] 트랜잭션 기본 규칙 (0) | 2022.09.30 |