비트코인 트랜잭션 작동원리

chris0205.eth·2022년 5월 20일
0

비트코인

목록 보기
2/2
post-thumbnail

들어가며

비트코인 공부를 한 후에, 이더리움에 대해서 알아보기 위해 이더리움 백서를 읽다보면, UTXO란 것이 나온다. 이 UTXO는 비트코인의 트랜잭션 모델에 관한 것이다.

이러한 UTXO에 대한 간략한 설명이 나와있긴 하지만, 어떤 식으로 UTXO가 생성되고 사용되며, 비트코인의 트랜잭션이 어떤 식으로 이루어지는지 좀 더 자세히 알아보고 싶어 공부해보게 되었다.


UTXO

Unspent Transaction Output

비트코인 네트워크에선 UTXO를 소모해서 새로운 output을 만들어낸다.

input 스크립트에 의해 5btc가 소모되었고, cashier에게 지급하기 위한 1btc가 output 스크립트로 소모되었다. 그리고 transaction fee와 cashier에게 지급한 btc를 제외한 나머지 change는 나에게 다시 돌아와야 하는데, 이때, 새로운 output 스크립트를 만들어서 나의 계좌로 다시 들어온다.

중요한 것은 초기에 나의 5btc는 input 스크립트에 의해 소모되었으므로 새로운 output 스크립트로 나의 계좌에 돌아와야 한다는 것이다!

나의 입장에서 UTXO는 트랜잭션 이전에는 5btc에 해당하는 값이었고, 트랜잭션 이후에는 3.9btc에 해당하는 값이다.

그러나, 이러한 transaction 하나만으론 어떤 output이 unspent이고, 어떤 것이 spent인지 알수가 없다. 따라서, 다른 transaction도 함께 봐야 한다.

트랜잭션의 구조

비트코인의 트랜잭션은 input과 output 스크립트를 가지며, 한번 소비된 스크립트는 다시 소비될 수 없다. 또한, 위와 같이 한 트랜잭션의 input script가 다른 트랜잭션의 output script를 reference함으로써 partial order가 만들어진다.

이처럼 input과 output은 serialize(직렬화)되어서 stack machine으로 실행된다.

여기서 stack machine이 무엇일까?


가상머신(Virtual Machine)

컴퓨터 플랫폼과 실제 사용자 간의 환경을 조성해주는 소프트웨어이다.

개인 컴퓨터 안에 존재하는 또 다른 컴퓨터라고 이해하면 편하다.(물리적으로 간섭하진 않는다.)

사용목적에 따라 두 종류의 가상머신으로 나눌수 있는데, 하나는 process virtual machine이고, 또 하나는 system virtual machine이다.

Process Virtual Machine

보통 컴퓨터 프로그램은 해당 컴퓨터 머신의 프로세서(x86, x64, ARM)나 운영체제(Windows, MacOS, Linux)에 따라 다르게 컴파일을 해서 사용해야 한다.

하지만, process virtual machine을 사용해 머신에 가상머신을 환경에 맞게 설치하면 가상머신 위에서 실행시키는 프로그램을 머신의 환경과 독립시킬 수 있다.

즉, process VM의 목적은 컴퓨터 프로그램을 머신환경에 영향을 받지 않고 실행함에 있다.(다양한 하드웨어와 소프트웨어 환경에서 실행될 수 있다.)

예시로는 java virtual machine(JVM), .NET Framework(C#), V8(JavaScript) 등이 있다.

System Virtual Machine

실제 운영체제의 모든 기능을 제공해주는 가상머신이다.

MacOS에서 windows10을 사용하는 등의 예시가 있다.(아마도..?)

Script

스크립트 언어는 이미 실행되고 있는 프로그램의 상태나 동작을 변경하기 위한 언어이다.

단독으로 실행되는 프로그램이 아니므로 main 함수가 없어도 되기 때문에 프로그램을 간략하게 작성할 수 있다.

가상머신에 스크립트 언어를 입력하면 바이트코드(bytecode)로 해석(interpret)되어 실행된다.

메모리 관리를 가상머신이 함으로써, JIT(just-in-time) compilation과 같은 최적화 기법을 사용해서 성능이 크게 개선되었다.

예) JavaScript, Python, PHP, JSP

일반적으로 java, javaScript같은 언어는 가상머신으로 stack machine을 사용한다.

이는 비트코인 스크립트도 마찬가지이기 때문에 stack machine을 이용한 비트코인 스크립트 구현을 한 번 살펴보겠다.


비트코인 스크립트

P2PKH(Pay to Public Key Hash)

앞서 설명한 비트코인 트랜잭션을 직렬화시켜 다음과 같은 값들을 가져온다.

우선, input script는 unlocking script가 되고, output script는 locking script가 된다.

위의 그림에서 꺽쇠로 되어 있는 값은 변수(?)를 나타내고, 꺽쇠없이 대문자로 되어 있는 것은 명령어를 나타낸다.

위의 직렬화된 스크립트를 stack machine에 집어 넣어서 true가 나온다면, locking script, 즉 output script를 unlocking script(input script)가 소비(spent)할 수 있게 된다.

스택머신의 연산 과정은 다음과 같다.

마지막 명령어인 CHECKSIG의 값이 true가 나오면 해당 트랜잭션은 유효한 트랜잭션이라고 볼 수 있는 것이다.

💡 여기서 한가지 의문점.
굳이 왜 HASH160과 <PubKHash>를 사용해서 public key hash값을 비교하는가?
그냥 바로 public key 값만을 비교할 수도 있는데.

이유는 다음과 같다.

이전에 비트코인의 원리에 대해 알아볼때, public key로 전자서명을 복호화할 수 있단 것을 알아봤다. 이러한 전자서명은 트랜잭션에 대한 내용을 해시하여 나온 해시값을 private key로 암호화하여 나온 것이기 때문에, 만약 PubKHash를 사용하지 않고 public key를 사용하게 되면, output script의 거래 내역에 대해서 알기 쉬워진다. 이를 방지하기 위해, public key를 한 번 해시하여 사용하는 것이다.

또, 여기서 public key hash가 바로 비트코인 address이다. 물론 통상적으로 알고 있는 주소값이랑은 다른 형식으로 표현되지만.(base58check encoding을 하지 않았기 때문에.)

Other standard transaction script

위에서 설명한 P2PKH 스크립트 외에도 스택머신에서 마지막으로 남는 것이 booleans인 여러 스크립트를 직접 만들어서 사용할 수도 있다.

그럼에도 불구하고, 표준으로 정해진 다섯 가지 정도의 스크립트가 있다.

이렇게 표준 트랜잭션을 정해놓은 이유는 miner들이 다양한 트랜잭션을 실행하면서 야기될 해킹과 실패의 위험을 방지하기 위해서이다.


정리

비트코인의 트랜잭션은 스크립트 언어를 기반으로 스택머신에 의해 수행된다.

miner들은 블록에 이러한 표준 스크립트를 따르는 트랜잭션들을 수행해서 유효성을 검증한 다음에 블록에 트랜잭션을 추가한다.

UTXO는 input script, 즉 unlocking script에 의해서 소비되며 이렇게 소비된 output script(UTXO)는 재사용될 수 없기 때문에 만약, change가 있다면, 새로운 UTXO의 형태로 전달된다.

이러한 UTXO의 spent에 관한 합의 알고리즘이 Nakamoto’s consensus이다.

비트코인의 트랜잭션 모델에 한계가 존재하는데 크게 두 가지 정도로 볼 수 있다.

하나는 Turing-complete script가 아니라는 것이고, 또 다른 하나는 bootstrapping cost가 높다는 것이다. 이것에 대해선 비트코인의 한계점을 극복하기 위한 이더리움에 대해서 설명할 때 좀 더 자세히 살펴보겠다.


참고

블록체인의 원리 - 5. 비트코인 스크립트

Ethereum Whitepaper | ethereum.org

Tracking Bitcoin Market Cycles with UTXO

What is a Virtual Machine(VM) and How to Creat and Use

The Secret of Virtual Machines Is Inception. Seriously.

Mastering Bitcoin

profile
long life, long goal

0개의 댓글