거래(Transaction)은 입력과 출력으로 구성이 되어 있습니다.
먼저 Bitcoin의 거래를 보도록 하겠습니다.
다음과 같이 각각의 거래는 입력주소에서 출력주소로의 비트코인이 이동하는 형태로 구성되어 있습니다.
거래의 입력값은 이전거래의 출력값의 형태로 구성이 됩니다.
즉, 어떤 거래에서 사용해야할 입력값은 그 이전거래에서 받은 출력값이 된다는 것입니다.
아래 그림과 같이 A로부터 입력으로 받은 10개의 비트코인이 B에게 출력의 형태로 10개가 이동이 되고, 이전거래의 출력값이었던 10개가 다시 입력값이 되어 C에게 10개가 이동하는 형태입니다.
그럼 개념적으로 거래는 어떠한 형태로 구성될수 있는지 보도록 하겠습니다.
1. 하나의 입력값과 2개의 출력값이 있는 경우
이 형태는 가장 일반적인 거래를 표현하는 거래로 볼수 있습니다.
아래와 같이 입력으로 10개의 비트코인을 사용하여 B에게 2개를 전달하고 나머지는 다시 A로 출력하는 형태로 현실에서의 거래에서 거스름돈을 받는 형태라고 볼수 있습니다.
즉, 10개의 비트코인을 2개만 전달하여 8개는 거스름돈으로 다시 받는 형태입니다.
여기서 출력값으로 받은 [A : 8]의 거래는 이후 다른 거래의 입력값으로 사용되게 됩니다.
2. 다수의 입력값과 하나의 출력값이 있는 경우
이 거래는 두가지 형태로 나누어볼수 있는 하나의 경우는 자신의 지갑에 여러주소로 나누어져있는 비트코인을 하나로 합쳐서 20개의 거래에 사용하는것입니다.
현실에서 볼때 10만원짜리 제품을 구입하기위해 5만원 1장, 만원 3장, 5천원 3장, 천원 5장을 전달하는것으로 볼수 있습니다.
그리고 또하나의 경우는 자신의 지갑에 분산되어있는 잔돈을 합쳐 하나의 주소에 모으는 것입니다.
즉 다음 거래에서 20개의 비트코인을 거래를 하기위해 작은단위를 합쳐 하나의 큰 단위로 만드는것입니다.
현실에서 저금통의 동전을 지폐로 교환하는것으로 볼수 있습니다.
3. 하나의 입력값과 다수의 출력값이 있는 경우
이 거래는 20개의 비트코인을 4명에게 각각 나누어주는 거래로 볼수 있습니다.
4. 입력값이 없고 출력값만 있는 경우
이 거래는 특별한 거래로 채굴에 성공한경우 채굴자에게 보상으로 비트코인을 제공하는 거래입니다.
이 거래는 이후 채굴에서 다시한번 업급하도록 하겠습니다.
블록체인상에서 거래의 단위는 소비되지 않은 거래출력값(Unspent Transaction Output) 즉 UTXO 입니다.
블록체인에서의 거래를 이해할려면 이 UTXO의 개념을 잘 이해해야합니다.
UTXO는 말 그대로 거래의 출력값으로 아직 사용되지않고, 암호화되어 블록체인상에 저장되어 있는 단위입니다.
암호화된 UTXO는 사용시점에 소유자만이 암호를 해제하여 거래의 입력값으로 사용할수 있습니다.
이전에 지갑을 설명할때에 지갑은 비트코인을 실제 저장하고있는것이 아니고, 개인키와 공개키를 저장하고 관리하고 있다는 것이 이것으로 어느정도 설명이 될수 있습니다.
예를 들어, 자신 소유의 비트코인의 전체 잔액을 확인하고자 한다면, 지갑에 저장되어 있다고 생각되는 비트코인의 갯수를 확인하는것이 아니라, 블록체인상에 자신의 소유로 저장되어 있는 UTXO의 출력값을 모두 합한것이 되는것입니다.
거래를 하기 위해서는 해당 거래가 유효한지 검증이 되어야 합니다.
즉 발생된 거래가 블록체인상에 전송되어 각 사용자가 유효한지 검증을 해주어야 합니다.
이렇게 검증이 된 거래만이 채굴을 통해 메인체인에 포함이 될수 있습니다.
거래의 유효성 검증은 다음과 같이 동작됩니다.
먼저 거래의 송신자는 거래메세지를 작성하고 해당 메세지를 자신의 개인키로 암호화하여 서명을 만듭니다.
이렇게 만든 서명은 자신의 공개키로만 복호화가 가능합니다.
다음에 이렇게 만든 서명을 자신의 거래 메세지와 함께 블록체인상에 전송하고 암호화에 사용한 공개키도 함께 공개를 합니다.
이 거래메세지를 수신한 수신자들은 해당 거래에 포함된 서명을 공개된 공개키로 복호화 하여 포함된 메세지와 비교를 하게 됩니다.
이렇게 비교하여 메세지와 공개키로 복호화된 메세지가 동일하다면 해당 거래는 정상적인 개인키로 암호화된것으로 판단할수 있기 때문에 유효한 거래로 판명되어 연속적으로 블록체인상에 전파가 되게 됩니다.
마지막으로 전송된 거래가 UTXO 형태에서 실제 소비되는 과정을 보도록 하겠습니다.
거래의 출력값은 다음과 같이 거래총액과 잠금스크립트로 구성이 됩니다.
잠금 스크립트는 해당 거래가 소비가능한 조건을 명시해놓는것으로 일반적으로 공개키나 비트코인 주소가 됩니다.
필드 |
설명 |
총액 |
사토시 단위의 거래금액(1사토시는 1억분의 1 비트코인) |
잠금 스크립트 크기 |
잠금 스크립트 길이 |
잠금 스크립트 |
출력값을 소비하는데 필요한 조건 |
거래 입력값은 다음과 같이 구성됩니다.
해제 스크립트는 지갑에서 생성되며, UTXO의 잠금 스크립트 조건을 만족할수 있도록 개인키로부터 생성한 서명을 담고 있습니다.
필드 |
설명 |
거래 해시 |
소비될 UTXO를 담고있는 거래에 대한 ID (TxID) |
출력값 인덱스 |
소비될 UTXO의 인덱스 번호 |
해제 스크립트 크기 |
해제 스크립트 길이 |
해제 스크립트 |
UTXO의 소비조건을 충족하는 스크립트 |
일련번호 |
사용하지않음, 0xFFFFFFFF로 설정 |
실제 입력과 출력으로 구성된 거래의 포맷은 다음과 같이 구성이 됩니다.
하기 포맷은 일반적으로 사용되는 주소기반의 P2PKH(Pay-to-public-key-hash) 거래입니다.
[참조 : https://klmoney.wordpress.com/bitcoin-dissecting-transactions-part-1/]
'비트코인 > Bitcoin Core' 카테고리의 다른 글
블록체인 네트워크를 구성하는 노드의 종류 (0) | 2018.03.07 |
---|---|
비트코인 테스트넷 사용하기 (0) | 2018.03.05 |
블록체인의 키를 관리하는 지갑 (Wallet) (0) | 2018.03.03 |
개인키/공개키와 지갑 주소 (7) | 2018.03.02 |
블록체인에서 블록이란? (0) | 2018.03.01 |