brunch

매거진 개발실습

You can make anything
by writing

C.S.Lewis

by SKKRYPTO Nov 14. 2020

파이썬으로 배우는
블록체인 구조와 이론

트랜잭션(transaction)

    안녕하세요 스크립토 6기 박세연입니다. 비트코인 네트워크의 목적은 트랜잭션입니다. 트랜잭션은 비트코인에서 거래를 하는 경우 송금을 하는 사람의 주소, 받는 사람의 주소, 수수료 등의 정보를 담은 것입니다. 트랜잭션을 완성하기 위해서는 서명을 검증해야하고 잔액(UTXO)도 확인해야하며 블록에 트랜잭션을 담고 해당 블록이 채굴되는 등의 여러 과정이 필요합니다. 이번 글에서는 트랜잭션의 구조와 트랜잭션을 검증하는 방법에 대해 공부한 내용을 정리했습니다.

    출처: 조성현, 이광성, 박혜리. 파이썬으로 배우는 블록체인 구조와 이론. 위키북스, 2019.


1. 트랜잭션의 구조

    트랜잭션에는 여러 정보가 포함된다트랜잭션의 입력부에는 자신의 UTXO 가리키는 포인터와 전자서명이 들어있고 출력부에는 수신자의 공개키 해시와 송금할 금액이 들어있다.


1) 이중 지급 문제

    이중 지급은 동일한 UTXO 여러 사람에게 송금하는 것을 말한다우리가 현재 사용하는 계좌와 돈으로 비유하면  계좌의 잔액이 1000원인데 1000원으로 1000원짜리 물건 2개를 동시에 결제하는 것이다.(물론 실제로 가능한 일을 아니지만실제로는 동시에 결제하는 것은 불가능하고하나에 대해 1000원을 결제한 순간  계좌에서 1000원이 빠져나가기 때문에 다른 물건을  경우엔 잔액이 부족하다는 알림이 오게된다하지만 비트코인에서는 어떨까?

    비트코인에서 누가 누구에게 돈을 보냈다는 정보는 트랜잭션에 담기게되는데 트랜잭션은 블록에 담겨서 해당 블록이 채굴되기 전까지는 유효한 트랜잭션이다앞의 예시를 블록체인으로 설명하면 물건을 사는 트랜잭션 모두 채굴되기 전까지는 유효한 상태인 것이다하지만  트랜잭션 중에서 하나가 채굴되면 나머지 하나는 이중지급 트랜잭션이 된다해당 트랜잭션은 거부되는 것이다.


2) 트랜잭션 데이터 구조

    

트랜잭션 데이터 구조

    트랜잭션의 구조는 크게 입력부와 출력부로 나뉘는데여기서 입력부의 Script Sig 다른 사람들이 전자 서명을 검증할  상용하는 공개키가 있고출력부의 Script PubKey 수신자의 공개키 해시 값이다트랜잭션 데이터가 블록체인의 특정 블록에 저장될 특정 트랜잭션을 찾기 위해서는 트랜잭션의 고유 ID 이용한다 고유 아이디는 트랜잭션에 담긴 위의 여러 데이터들의 해시값이다.



2. 전자서명 생성

    앞의 트랜잭션 데이터 구조의 Script Sig 부분에 대해  자세히 알아보자전자서명이라는 것은 A B에게 송금을 하면, A UTXO 소유자가 B 것으로 바뀌게 되는데   UTXO B 사용할 권한이 있다는 것을 증명하기 위한 것이다.

    보통의 거래와 다르게 생각해야할 점이실제 물리적인 돈이 아니라 가상화폐인 비트코인이므로 A B에게 송금을 한다는 것은 어떤 화폐를 '전달'하는 개념이 아니다. A 소유인 UTXO 소유권을 거래에 이용할 금액만큼을 B 소유로 변경하는 것이 비트코인에서의 거래라고 생각하면 이해하기 쉽다.

그림 1

위의 그림으로 대략적인 설명을 해보자면,

1. 처음 10BTC(UTXO) A 소유

2.  UTXO B에게 송금하는 트랜잭션이 생성되고 트랜잭션의 출력부의 Script PubKey에는 B 공개키 해시 값이 담긴다.

3. 이제 10BTC B 소유이다.

4. 이번에는 B 다시 자신의 10BTC(UTXO) C에게 송금하는 트랜잭션을 생성하려고 한다이때 트랜잭션의 입력부에 전자서명을 생성하는데두번째 트랜잭션의 Script Sig에는 B 자신의 개인키와 메시지를 이용해 생성한 전자 서명과 공개키를 기록한다.

    입력부의 Script Sig UTXO 소유자가 해당 UTXO 사용하겠다고 하고자물쇠를 푼다는 의미로 언로킹(unlocking) 스크립트라고 한다전자 서명에 포함되는 데이터들은  내용이 보호된다따라서 전자서명이 완료된 후에는  대상들의 내용을 바꿀  없다반대로 출력부의 Script PubKey 로킹(locking) 스크립트라고 한다쉽게 생각하면 로킹 스크립트(Script Pubkey) UTXO 소유자를 바꾼후, UTXO  소유자의 공개키 해시로 잠그고다시  UTXO 사용하는 트랜잭션이 생성되었을 언로킹 스크립트(Script sig) 아래 설명할 검증 스크립트를 이용해서 잠금을 해제한다고 생각하면 된다.



3. 전자서명 검증

    트랜잭션을 만드는 사람(송금하는 사람) 전자서명을 생성하고트랜잭션을 받은 사람(수신자) 전자서명을 검증한다전자 서명을 검증하는 경우그림 1에서의 Script PubKey Script Sig 이용한다. SCript Sig 검증할 트랜잭션의 입력부그림1에서는 B C에게 송금하는 트랜잭션에 기록되어 있고, Script PubKey UTXO 출력부에 기록되어있다.


검증 스크립트

* sig-r, sig-s 무엇인가?

   해당 트랜잭션 데이터 전체를 직렬화한 데이터가 서명할 메시지 m 해당하고 메시지에

   Double-SHA-256으로 해시값을 계산한다 다음 ECDSA 알고리즘의 절차대로 (그림 1 B)

   개인키로 메시지 해시값에 서명을 해서 구한 값이(s, r) = sig(hash(m))이다 값이 sig-r, sig-s

   되는 것이다.

검증 스크립트는 OP코드로 구성되는데 OP코드는 각각의 기능이 있다.

OP_DUP: 스택의 상위 아이템 복제

OP_HASH160: 스택의 상위 아이템에 Double SHA-256과 RIPEMD160 해시 수행

OP_EQUALVERIFY: 스택의 상위 두 개의 아이템을 비교OP_CHECKSIG: 비교해서 같으면 TRUE 다르면 FALSE

이제 이 검증 스크립트를 왼쪽에서 오른쪽으로 스택에 넣거나 빼면서 스크립트를 검증하는 것이다.

검증 스크립트 절차

1. 먼저 비어있는 스택에 sig-r, sig-s, Publick Key를 차례대로 담는다.

2. OP_DUP: 현재 스택의 상위 아이템(Public Key)를 복제한다.

3. OP_HASH160: 현재 스택의 상위 아이템(Public Key)의 해시값을 계산한다. 

4. 그 다음 아이템인 PubKey Hash를 스택에 넣는다.

5. OP_EQUALVERIFY: 스택의 상위 아이템 두개를 비교해서 같으면 다음으로 진행한다. 현재 스택의 top에는     PubKey Hash가 있고, 그 다음 요소와 동일하므로 다음으로 진행한다.

6. OP_CHECKSIG: 스택에서 Publick Key와 sig-r, sig-s를 꺼내서 ECDSA알고리즘으로 전자서명을 검증하      고, 그 결과가 참이면 스택에 TRUE만 남고 유효한 전자서명이라고 검증이 완료된다.



4. 적정 거래 수수료

    비트코인의 트랜잭션에서는 또 다른 개념인 수수료가 존재한다. 여기서 수수료란, 생성한 트랜잭션이 승인되기 위해서는 블록을 채굴하는 채굴자에게 지급해야하는 금액을 말한다. 평균 거래 수수료는 비트코인의 가격, 채굴자들의 해시파워 등의 영향으로 그 값이 특정한 값으로 정해지지 않고 변화한다.



5. Pay-to-Script Hash (P2SH)

    지금까지 설명한 트랜잭션에서는 출력부에 수신자의 공개키 해시(Pubkey Hash)를 기록했다. 이러한 형태를 Pay-to-Publick-Key-Hash(P2PKH) 방식이라고 한다. 수신자의 공개키 해시에 페이(pay)한다는 의미이다.

    Pay-to-Script Hash(P2SH)는 이름 그대로 공개키 해시가 아니라 스크립트 해시값을 기록하는 방식이다. 일반적으로 다중 서명 기능에 이용한다.

    이전에 설명했던 지갑은 개인키로 공개키를 생성하고, 그 공개키로 지갑주소를 만들지만, P2SH는 Redeem Script를 먼저 만들고 이 스크립트의 해시 값을 Base58Check로 인코딩해서 지갑주소를 만든다. 이 경우에 Script PubKey의 구조에 따라 Script Sig도 public key가 아니라 Redeem Script를 포함한다.



    이번 트랜잭션 부분에서는 실습 코드보다 트랜잭션이 생성되고 어떻게 검증이 되는지에 중점을 두고 공부해보았습니다. 다음 글에서는 채굴에 대해 공부한 내용을 가지고 오겠습니다.

매거진의 이전글 블록체인으로 구현하는 사이버 보안
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari