본문 바로가기
Bitcoin

비트코인의 transaction과 script language

by PudgeKim 2021. 3. 27.

이번 글의 선수지식으로는 비트코인의 UTXO 개념에 대해 알고있어야 합니다. 잘 모르시는 분은 아래 링크를 참고해주세요.

비트코인의 UTXO: up-to-date-items.tistory.com/91

 

사실 비트코인은 서로 주고 받는 개념이 아닙니다. 단순히 생각해보았을 때 내가 누군가에게 1BTC를 보냈다면 내 계좌에서 1BTC가 빠져나가서 상대방에게 전달되는 것을 생각하겠지만 엄밀히 따지면 내가 누군가에게 보냈다는 문서를 쓰는게 비트코인을 보냈다고 합니다.

이 부분에 대해서는 노마드코더라는 유튜버가 알기 쉽게 설명을 했는데 그 분의 비유를 빌리자면 우리가 집을 사고 팔 때 실제로는 집 문서의 소유주를 바꾸고 집을 팔거나 샀다고 합니다. 이거랑 비슷하다고 생각하시면 됩니다.

그러나 아래에서는 편의상 보냈다는 표현을 하겠습니다.

 

transaction은 input과 output이 있는데 예를 들어서 Alice가 Tony에게 0.1BTC를 보낸다고 가정해보겠습니다.

그런데 Alice가 가지고 있는 UTXO들 중에 0.1BTC가 없어서 0.3BTC를 보낸다고 한다면 input은 Alice의 0.3BTC가 될 것이고
output은 Tony에게 주는 0.1BTC와 다시 Alice에게 돌아오는 차액인 0.2BTC 이렇게 2가지일 것입니다. (이 부분이 이해가 안가면 위 링크로가서 UTXO에 대해 읽어보시면 될 것입니다.) (이 예제에서 수수료 부분은 제외하였습니다.)

비트코인의 실제 transaction은 아래 같은 형태로 이루어져 있습니다.

{
  "version": 1,
  "locktime": 0,
  "vin" : [
    {
        "txid": "7495743af80facd08080...",
        "vout": 0,
        "scriptSig" : "234abc8080808d34240235802ef..."
        "sequence" : 42979793
     }
],
"vout" : [
    {
        "value": 0.015000,
        "scriptPubKey" : "OP_DUP OP_HASH160 a68686bcd7977 OP _EQUALVERIFY OP_CHECKSIG"
    },
    {
        "value": 0.0845000,
        "scriptPubKey" : "OP_DUP OP_HASH160 a68686bcd7977 OP _EQUALVERIFY OP_CHECKSIG"
    }
 ]
}

 

우선 transaction output("vout"에 해당)은 두 가지로 이루어져있습니다. 비트코인 값과, locking script라고도 불리는 scriptPubKey입니다.

 

transaction input("vin"에 해당)은 어떠한 UTXO가 소비될지를 나타내고, 또 unlocking script를 이용해 소유권을 제공합니다.

input에 대해 더 자세히 알아보겠습니다.

"txid"는 해당 UTXO가 있는 transaction의 포인터를 나타냅니다. "vout"은 "txid"가 가리키는 transaction에서 해당 UTXO가 몇번째 인덱스인지를 나타냅니다.

여기서 알 수 있는 점은 우리가 transaction을 보고 얼마의 BTC가 input값으로 오는지 바로 알 수 없습니다. "txid"에 해당한 포인터를 따라가보아야 알 수 있습니다. 

"scriptSig"와 "sequence"는 아래에서 다루겠습니다.

 

 

이제 locking script와 unlocking script에 대해 자세히 알아보기전에 script에 대해 먼저 알아보겠습니다.

비트코인도 이더리움의 스마트컨트랙트 같이 transaction에서 작동되는 것이 있습니다. 바로 script language인데요 이는 튜링불완전하며 stack기반으로 이더리움의 스마트컨트랙트에 비하면 정말 간단하게만 작동됩니다. 

튜링불완전하다는 뜻은 쉽게 말해서 반복문 같은 것을 쓸 수 없어서 우리가 원하는 프로그래밍을 마음대로 하지는 못한다는 것을 뜻합니다. 그 이유는 블록체인 기반의 네트워크에서 의도적으로 무한 반복문이 작성된 코드 등이 네트워크에 악영향을 끼치는 것을 방지하기 때문입니다. 모든 transaction은 비트코인 네트워크 상의 모든 노드들에 의해 유효한지 확인되어지는데 엄청난 반복문 등의 코드는 많은 부하를 발생시킬 것입니다. (이더리움은 튜링완전하지만 gas시스템을 도입하여 이를 해결하려합니다.)

 

이제 locking script와 unlocking script에 대해 알아보겠습니다.

locking script는 위에서 봤던 scriptPubKey로 output에 들어있는 spending condition입니다. 즉, 누군가 보낸 BTC를 받기위해 풀어야 하는 조건으로 볼 수 있습니다. scriptPubKey로 불리는 이유는 주로 public key 또는 비트코인 주소를 포함하기 때문입니다.

unlocking script는 output을 받기위해 locking script를 풀기 위한 것이라고 보면됩니다. unlocking script는 모든 transaction input에 들어있습니다. 이는 주로 scriptSig라고도 불리는데 주로 디지털 서명(digital signature)를 가지고 있기 때문입니다.

디지털 서명에 관한 것은 아래 링크를 참고해주세요.
비트코인의 디지털 서명: up-to-date-items.tistory.com/115

 

그럼 transaction을 어떻게 검증하는지 알아보겠습니다. 먼저 input에 대해 알아보겠습니다.

모든 input에는 unlocking script가 들어있다고 하였습니다. 우선 이 unlocking script를 복사합니다. 

그리고 "txid"에 써있는 포인터를 따라 해당 UTXO를 가져오고 해당 UTXO의 locking script를 복사합니다.

이렇게 복사한 unlocking script가 locking script의 조건을 만족하면 해당 input은 유효한 input입니다.

이러한 검증은 stack 구조로 검증을 하게 됩니다. (script language는 stack기반이라고 위에서 말했습니다.)

* 하나의 transaction에서 input은 1개가 아닐 수도 있습니다. 예를 들어 누군가에게 0.5BTC를 보내야하는데 사용자가 가지고 있는 UTXO가 0.2BTC, 0.4BTC .. 이런식으로 구성되어있다면 0.2BTC와 0.4BTC 이렇게 2개의 input으로 구성될 것입니다. 이런 경우 모든 input에 대해서 위 과정을 거쳐 유효한지를 검사합니다.

간단히 요약하자면 output에는 publicKey가 들어있고
input에는 privateKey를 이용해 싸인한 signature가 들어있으므로
해당 transaction이 맞는지를 검증하기 위해서 output의 publicKey와 input의 signature를 비교해보는 것입니다.
(privateKey, publicKey 방식에서 publicKey를 이용해 유효한지 검증이 가능하므로)

 

output은 P2PKH(Pay-to-Public-Key-Hash) script로 locked되어집니다.

그리고 이 잠겨진 output은 나중에 그 output의 UTXO가 쓰여지게 될 때 transaction의 input이 되고 잠금이 풀어지게 될 것입니다.

글로는 이해가 잘 안될 수도 있습니다. 아래 링크의 그림을 보시면 이해에 도움이 될 것입니다.

medium.com/@ackhor/ch-10-something-on-transaction-unlocking-locking-script-83228754c3f9

아래 링크도 그림과 함께 잘 설명해놓은 글입니다.

learnmeabitcoin.com/beginners/output_locks

 

또한 P2PKH 이름에서 알 수 있듯 public key hash로 잠겨지기 때문에 저런 이름이 붙었는데 여기서 public key hash란 비트코인 주소랑 같습니다. 그러나 Base58 encoding이 되어있지 않습니다. 
Base58 인코딩에 대해서는 아래 링크를 참고해주세요.

비트코인에서의 Base58 인코딩: up-to-date-items.tistory.com/99

 

'Bitcoin' 카테고리의 다른 글

비트코인의 디지털 서명  (1) 2021.03.25
비트코인의 51% attack  (0) 2021.03.24
비트코인의 Mining pool  (0) 2021.03.22
비트코인의 채굴심화 (Extra Nonce)  (0) 2021.03.22
비트코인에서의 분기  (0) 2021.03.21