5-3 비트코인의 트랜잭션 구조

트랜잭션(거래)는 소유권의 이동을 표현한 데이터 구조로 되어 있고 주요 필드 내용은 아래와 같이 정리할 수 있습니다.

Input 목록 및 Output목록은 크기가 1~9로 되어있지만, 이는 가변적인 길이의 정수이며, 데이터길이를 결정하는 프리픽스가 정수앞에 부여됩니다. 값의 범위당 바이트수와 타입은 아래와 같습니다.

그럼 이전에 이야기한 트랜잭션B’에 매핑해 봅시다. (Locktime에 대해서는 별도로 설명할 예정입니다)

  • Version no: 어떤 버전을 따르고 있는지 설정합니다. 현재 1또는 2로 설정합니다.
  • Input Counter: 입력이 2개이기 때문에 2가 설정됩니다.
  • Input 목록: 입력 요소수를 가지는 목록으로 “FROM 트랜잭션 A: #0”, “FROM 이전에 문재인이 비트코인을 받은 트랜잭션 출력” 두가지 요소가 됩니다.
  • Output Counter: 출력은 2개이기 때문에 2가 설정됩니다.
  • Output 목록: 출력 요소수를 가지는 목록으로 “출력 #0: 이순신 1.5BTC”, “출력 #1: 이도 0.4995BTC” 두가지 요소가 됩니다.

주의해야할 점은 수수료가 출력에 명시적으로 표함되지 않다는 것을 기억해야 합니다. 수수료는 출력 형태로는 표현되지 않고, 암시적으로 다음과 같이 표현합니다.

수수료 = 입력총액 — 출력총액

죽, 잔금 출력을 트랜잭션으로 설정하지 않으면, 잔금 부분을 포함하여 수수료로 마이너에게 회수되어 버립니다. 수수료는 출력에 명시적으로 포함되지 않는다는 것을 주의하십시오.

[Tip] 트랜잭션 확인하기

비트코인 네트워크에서 발생하는 모든 거래는 아래 사이트에서 확인할 수 있습니다.

관련 링크: https://blockexplorer.com/

이 사이트에 접속하고 Latest Transactions에서 모든 트랜잭션을 선택하면 아래 화면처럼 상세내용을 확인할 수 있습니다.

Locktime 필드에 대해

Locktime트랜잭션은 언젠가 될때까지 잠금(사용금지)를 하기 위한 필드에서 설정한 값에 따라 해석이 달라집니다.

Locktime 필드는 부호없는 정수로 기본 0으로 설정됩니다. 0은 잠금이 안되어 있다는 것을 의미하여 바로 네트워크 내에서 전파해서 블록에 포함됩니다.

500,000,000미만의 경우, 블록 높이가 잠금으로 해석하여 트랜잭션이 차단 높이가 될때까지 유효하다고 판단되지 않으면 전파되지 않습니다. 500,000,000이상의 경우, UNIX타임 자금 해석이 되어 그 시간까지 유효한 것으로 판단되지 않으면 전파도 되지 않습니다.

앞으로의 블록이 높거나 UNIX시간을 지정하여 조건을 만족하지 않으면 전파되었다고 해도, 첫번째 노드에서 거절되어 다른 노드에 전파되지 않기 때문에 생성 후, 보류하고 Locktime이 지난후 전파해야 합니다. 예로, 이도가 Locktime을 3개월간 처리되도록 설정하고 이순신에게 송금하는 서명된 트랜잭션을 생성하고 이순신은 해당 트랜잭션을 어떤 방법으로 전달하면 이순신이 Locktime이 지난후 비트코인 네트워크에 전달하는 형태가 됩니다.

Locktime의 일반적인 사용예제

(1) 이도가 이순신에게 송금거래(TxA)를 생성합니다. 이떄 Locktime 필드에 3개월 후 활성화하도록 합니다.

(2) 이도는 생성된 트랜잭션을 이순신에게 연계시킵ㄴ다.

(3) 이순신 TxA을 3개월 후, 비트코인 네트워크에 전파합니다.

그러나, 이 로직도 문제가 있습니다. 이순신은 3개월후 트랜잭션 출력을 이용할 수 있게 되지만, 이는 “반드시 해당 거래가 보장되는가?”라는 문제가 발생합니다. 정답은 아니오입니다. 이도가 이순신에게 전달한 트랜잭션을 설정한 것과 동일한 출력을 3개월이 지난후, 이용하면 이순신이 보류중인 트랜잭션을 입력하여 설정한 과거 출력이 사용되는 형태가 되어버려 3개월 후 잘못된 것으로 간주되어 버립니다.

이도가 Locktime 이전에 입력을 사용하는 경우

(1) 이도가 이순신에게 송금거래(TxA)를 생성합니다. 이때 Locktime은 3개월 후 활성화되도록 합니다.

(2) 이도는 생성된 트랜잭션을 이순신에게 연계합니다.

(3) 이도는 TxA에 이용한 것과 동일한 출력을 입력하여 김명준에게 송금거래(TxB)를 생성하고 비트코인 네트워크에 전파합니다.

(4) 김명준에게 송금이 완료됩니다. 이 시점에서 TxA입력은 사용된 출력을 참고하고 있는 상태가 됩니다.

(5) 3개월 후, 이순신 TxA를 비트코인 네트워크에 전달하지만 잘못된 거래로 처리됩니다.

이런 문제를 해결하기 위해 CLTV(Check LockTime Verify)와 CSV(Check Sequence Verify)가 도입되었습니다. Locktime은 트랜잭션 수준에서 사용시 시작에서 제어하지만, CLTV, CLV에 따라 트랜잭션 출력별로 활성화하여 시작을 제어할 수 있습니다. OP_CHECKLOCKTIMEVERIFY, OP_CHECKSEQUENCEVERIFY는 OPCODE(차후 설명함)을 사용하여 유효한 시작을 제어합니다. 이는 BIP 0065, BIP 0129에 정의되어 있습니다.