1. 트랜잭션 읽는 법
전체 구조
| 필드 | 설명 |
|---|---|
| version | 트랜잭션 형식 버전 (대부분 1 또는 2) version 2는 BIP 68(상대적 시간 잠금)을 지원 |
| inputs | 소비할 이전 출력(UTXO)의 목록 |
| outputs | 새로 생성할 출력(금액 + 잠금 스크립트)의 목록 |
| locktime | 트랜잭션이 유효해지는 최소 블록 높이 또는 시간을 의미 값이 0이면 즉시 유효 |
- 트랜잭션의 핵심은 inputs와 outputs이며, 이 두 가지가 "누가 누구에게 얼마를 보냈는가"에 대한 정보를 담고 있음.
입력(Input) 읽기
- 입력은 “어디서 비트코인을 가져오는가”를 명시
{
"txid": "이전 트랜잭션 ID",
"vout": 0, // 이전 트랜잭션의 몇 번째 출력인지 (0부터 시작)
"scriptSig": "서명 데이터(레거시)",
"witness": ["서명 데이터(SegWit)"],
"sequence": 4294967295
}
| 필드 | 의미 |
|---|---|
| txid | 소비할 UTXO가 생성된 이전 트랜잭션의 해시 |
| vout | 이전 트랜잭션에서 몇 번째 출력인지 |
| scriptSig / witness | "이 출력을 소비할 권한이 있다"는 증명 (서명) |
| sequence | 기본값 0xFFFFFFFF 0xFFFFFFFE 이하면 RBF(Replace-By-Fee) 가능 |
출력(Output) 읽기
- 출력은 “비트코인을 어디로 보내는가”를 정의
{
"value": 0.01500000, // BTC 금액
"scriptPubKey": {
"type": "witness_v0_keyhash",
"address": "bc1q..."
}
}
| 주소 유형 | 접두사 | 스크립트 유형 | 특징 |
|---|---|---|---|
| P2PKH | 1.. |
pubkeyhash | 레거시 |
| P2SH | 3.. |
scripthash | 멀티시그 등에 사용 |
| P2WPKH | bc1q.. |
witness_v0_keyhash | SegWit (크기 효율적) |
| P2TR | bc1p.. |
witness_v1_taproot | Taproot (프라이버시·효율 개선) |
- 일반적인 송금은 출력이 2개 이상 발생함.
- 하나는 수신자 주소, 나머지는 잔돈(change) 주소
- UTXO는 부분 소비가 불가능하므로, 남는 금액은 반드시 자신(발신자)에게 다시 돌려보내야 함.
수수료 계산법
- 비트코인 트랜잭션에는 수수료를 명시하는 필드가 없음. 수수료는 암묵적으로 계산됨.
- 수수료 = 입력 합계 − 출력 합계
- 차이가 0이 아니면 전부 채굴자 수입이 됨
- 잔돈 출력을 빼먹으면 차액 전부가 수수료로 날아감
- 현대 지갑은 이런 실수를 막는 경고 기능을 갖추고 있음
컨펌(Confirmation)
| 컨펌 수 | 상태 | 평균 소요 시간 |
|---|---|---|
| 0 | 미확인 (mempool 대기) | - |
| 1 | 블록에 포함됨 | 약 10분 |
| 3 | 소액 거래에 충분 | 약 30분 |
| 6 | 관행적으로 “최종 확정” | 약 1시간 |
- 6컨펌 관행은 사토시 백서에서 유래.
- 공격자가 블록을 되돌릴 확률이 기하급수적으로 0에 수렴함 (대부분의 거래소가 입금 시 6컨펌을 요구, 고액 거래에서는 더 많은 컨펌을 기다리기도 함.)
특수한 트랜잭션들
| 유형 | 특징 |
|---|---|
| 코인베이스 | 각 블록의 첫 번째 트랜잭션. 이전 UTXO 참조 없음 블록 보상(신규 발행 + 수수료)을 채굴자에게 생성 입력 txid가 전부 0 생성된 코인은 100블록 후부터 소비 가능 scriptSig 영역에 채굴자가 임의의 데이터를 넣을 수 있음(사토시의 제네시스 블록 메시지가 여기 들어감) |
| 멀티시그 | 여러 개인키 중 일정 수 이상의 서명이 필요 (예: 2-of-3) 기업 자금 관리나 공동 계좌에 사용됨 주로 P2SH(3으로 시작)로 구현 |
| OP_RETURN | 출력의 스크립트에 OP_RETURN이 포함되면, 해당 출력은 소비 불가능 대신 최대 80바이트의 임의 데이터를 블록체인에 영구히 기록 가능 출력의 value는 항상 0 |
2. 수수료 계산 가이드
- 크기 비례 원칙
- 송금 금액(BTC 단위)과 무관하게 트랜잭션의 데이터 크기(가상바이트, vbyte)에 비례하여 수수료가 책정됨
- 채굴자는 블록 공간이 한정되어 있으므로, 바이트당 더 높은 수수료를 지불하는 트랜잭션을 먼저 포함시킴
- 단위: 수수료율의 단위는 sat/vbyte(가상바이트당 사토시)를 사용
- 가상바이트는 SegWit 도입 이후 서명 데이터에 할인을 적용해 계산된 크기 단위
- 지갑 소프트웨어가 vbyte를 자동 계산하므로, 개념 정도만 이해하면 충분함
- 계산 공식
- 트랜잭션 크기 = 오버헤드 + (입력 수 × 입력 크기) + (출력 수 × 출력 크기)
- 총 수수료 = 트랜잭션 크기(vbytes) × 수수료율(sat/vbyte)
- 입력(UTXO) 개수의 영향: 입력(소비할 이전 출력) 개수가 많아질수록 트랜잭션 크기가 급증하여 수수료가 크게 높아짐. (예: UTXO 5개를 모아 송금하면 1개일 때보다 약 2.7배 수수료 증가)
- 멤풀 혼잡도 확인: 적정 수수료율은 고정되어 있지 않음. 실시간 멤풀(미확인 트랜잭션 대기열)의 혼잡도에 따라 1 sat/vbyte에서 수백 sat/vbyte까지 변동함. 빠른 확정(약 10분)을 원할수록 높은 수수료를, 1시간 이상 기다릴 수 있다면 낮은 수수료를 설정함
수수료율 절감 전략
- SegWit/Taproot 주소 사용: 레거시(P2PKH) 대비 최대 60%가량 크기(vbyte)를 줄일 수 있어 수수료가 절감됨
- 잔돈 출력 최소화 및 배치 처리: 불필요한 출력을 줄이고 여러 지불 건을 하나로 묶어 송금함
- 한산한 시간대 활용: 네트워크 혼잡이 덜한 주말이나 한국시간 기준 새벽에 낮은 수수료로 트랜잭션을 제출함
- RBF(Replace-By-Fee) 활용: 낮은 수수료로 먼저 제출한 후, 처리가 지연되면 수수료를 높여 교체하는 방법
참고


댓글