❓ 스마트 컨트랙트의 시작
2015년 이더리움이 개발되면서부터 스마트 컨트랙트가 구현되었다고 알려져 있다. 하지만 엄밀하게 (제한적인 형태의) 스마트 컨트랙트가 이미 비트코인에서 낮은 수준으로 구현되어 있다고 볼 수 있다.
비트코인 거래 장부를 하나의 상태 변환 시스템(state transition system)으로 보면, 비트코인 시스템은 모든 비트코인의 소유권 현황으로 이루어진 하나의 상태(state)와 이 현재 상태 및 트랜잭션을 받아 그 결과로 새로운 상태를 출력해주는 상태 변환 함수(state transision function)로 구성되어있다고 볼 수 있다.
UTXO (Unspent Transaction Outputs)
미사용 트랜잭션 출력값, 미지출 거래 출력
쉽게 말해 쓰여지지 않은 비트코인 뭉치이다. 비트코인의 경우 누군가로부터 받은 금액을 UTXO로 저장한다. 트랜잭션이란 비트코인의 소유권을 이전하는 것이며 이 과정은 송신자의 비트코인 뭉치를 조합하여 이 새로운 비트코인 뭉치를 수신자의 것으로 전환시키는 것이다.
더욱 상세하게 말하자면 A가 B에게 비트코인을 전송하고자 할 때,
A의 공개키로 암호화 되어있는 UTXO를 A의 개인키로 소유권을 풀고 B의 공개키를 이용하여 다시 암호화하여 소유권을 넘겨주는 것이다. 넘겨진 UTXO는 B의 개인키로만 사용이 가능하다.
이러한 소유권 이정 과정은 트랜잭션의 입력값(Input)과 출력값(Output) 그리고 스크립트를 통해 이루어진다.
버전 (Version)
어떤 버전의 비트코인 소프트웨어를 사용하였는지, 트랜잭션 유형을 표기한 것이다. 모든 거래가 같은 버전에서 체결되지 않으므로 버전에 다양한 값이 들어갈 수 있다. 버전별로 구조와 규칙이 조금씩 다르다.
입력 카운터, 출력 카운터
입력값(Inputs)과 출력값(Outputs)의 갯수를 표시한다.
입력 (Inputs), 출력 (Outputs)
입력은 연결된 과거의 출력을 가리키는 포인터와 해제 키를 가지고 있으며 출력은 잠금과 값을 가지고 있다.
잠금 시간 (Lock Time)
블록체인에 거래가 담기기 전 일정 시간 잠궈두는 것으로, 트랜잭션을 언제 블록체인에 포함시킬지를 지정한다.
모든 트랜잭션은 UTXO를 소비하는 입력값과, UTXO를 생성하는 출력값으로 구성되어 있다.
입력값과 출력값은 비트코인 UTXO의 소유권을 이전하기 위한 준비물과 결과물이다. 각 거래는 하나 이상의 입력값과 출력값으로 구성된다. 출력값의 총합은 입력값의 총합보다 약간 작아야 하며, 이 갭은 거래 수수료가 되어 채굴자에게 보상으로 지급된다.
트랜잭션을 통해 입력값에서 출력값으로 가치가 이동한다. 입력값은 이전 거래의 출력값이다. 즉 트랜잭션은 이전 출력을 해제하고 새로운 출력을 만드는 과정이다. 이렇게 입력에 의해 생성된 후 다른 입력에 의해 해제되지 않은 트랜잭션 출력이 UTXO이다.
입력값에는 비트코인의 양과 해제해고자 하는 이전 출력을 가리키는 포인터, 그리고 잠겨 있는 이전 출력을 해제하기 위한 ScriptSig 키가 들어있다.
스택 기반 튜링 불완전 언어
비트코인 스크립트는 입력값의 해제 스크립트와 출력값의 잠금 스크립트로 작동된다.
UTXO를 소비하려고 할 때 먼저 소유권을 해제해야 하는데 이를 위해 입력값에 Unlocking-Script(해제 스크립트)가 들어간다. 반대로 UTXO를 받는 상대방의 소유로 잠그기 위해 출력값에는 LockingScript(잠금 스크립트)가 들어간다. 해제 스크립트 데이터 값이 복사되어 잠금 스크립트와 함께 연산되어 실행됐을 때 그 결과가 TRUE가 나오면 그 입력값은 유효한 것이며 UTXO를 소비할 수 있게 된다.
스크립트는 스택(stack) 데이터 구조를 사용하는 잠금-해제 매커니즘으로 동작한다. 트랜잭션의 유효성을 검사할 때 각 입력의 해제 스크립트는 해당 잠금 스크립트와 함께 실행되어 지출 조건을 충족시키는지 확인한다.
노드가 네트워크로부터 새로운 트랜잭션을 받으면, ScriptSig와 ScriptPubKey 필드를 추출, 연결하여 ScriptSig -> ScriptPubKey
순서로 스크립트를 나열한다. 노드는 이 스크립트와 빈 스택 하나를 이용해 스크립트를 실행한다.
스크립트 프로그램은 Opcode와 데이터, 두 종류의 객체를 가지고 있으며 스크립트는 Opcode와 데이터를 일렬로 늘어놓은 것이다. 포인터가 이 객체들을 순서대로 하나씩 가리키며 스크립트를 실행한다. 스크립트 실행 후 스택의 최상위 상단이 1인 경우(TRUE) 유효한 트랜잭션으로 간주하고 주변 노드들에게 전파한다.
Opcode
명령 또는 함수라고 하는 연산 작업 등의 모든 스크립트 단어의 목록이다. 비트코인 스크립트는 Opcode 명령으로 구성된 가능한 작은 범위의 작업만 허용하는 기본 언어이다.
UTXO의 ScriptPubKey는 수학적 퍼즐의 형태로, 올바른 ScriptSig를 추가하여 이 퍼즐을 풀 수 있다. UTXO는 유효한 해제 조건이 주어져야만 송금이 가능해지는 일종의 계약이다. 따라서 비트코인 스크립트를 스마트 컨트랙트로 볼 수 있는 것이다.
간단하고 직관적인 방법이다. 이 방법으로 전송받고자 한다면, 전송자에게 공개키를 제공해야 한다. 이 방법은 초창기 비트코인에서 많이 사용되었고, 공개키 노출로 인한 보안 문제로 현재는 P2PKH로 거의 대체되었다. 2009년 사토시 나카모토와 할 핀니 사이에서 이뤄진 최초의 트랜잭션이 P2PK 방식으로 진행되었다.
현재 가장 일반적으로 쓰이는 방법이다. 매커니즘 자체는 P2PK와 거의 동일하지만, P2PKH에서는 ScriptPubKey가 공개키 자체가 아닌 공개키의 해시값(주소)을 가지고 있다는 점이다. 따라서 UTXO 수신자는 공개키를 공개할 필요가 없는 우회적인 방식으로 보안성을 높일 수 있다.
P2PK에서는 비트코인을 받는 시점에 공개키가 드러나게 된다. 반면 P2PKH의 ScriptPubKey에는 공개키의 해시값만 있고, ScriptSig를 제시할 때 수신자가 공개키를 직접 제공해야 한다.
비트코인은 보안성이 뛰어나다. 블록체인 중 50% 공격에 대한 보안성이 가장 높다. 높은 보안성과 안정적인 네트워크가 비트코인의 가장 큰 장점이라고 할 수 있다. 하지만 근본적으로 범용성이 낮다는 단점이 있다.
비트코인 스크립트는 튜링 불완전 언어이며 확장성과 성능 문제로 스마트 컨트랙트를 수행하기에는 한계가 있다. 확장성 및 성능 문제를 해결하기 위해 다중 서명 및 시간 잠금 계약이 적용된 라이트닝 네트워크를 이용할 수 있다.
비트코인의 단점인 비싼 수수료를 보완하고, 스마트 컨트랙트 기능을 추가하기 위해 만들어진 사이드체인 암호화폐이다. 화폐 단위는 RSK이다. 비트코인은 튜링 불완전한 언어인 스크립트를 사용해 스마트 컨트랙트 기능이 부족했지만 루트스탁은 2way peg를 통해 이를 극복했고, 머지 마이닝(merge-mining)을 이용해 채굴자에게 보상하고 있다.
📌 Reference
https://brunch.co.kr/@skkrypto/13
https://steemit.com/kr/@feyee95/7-1
https://steemit.com/kr/@easyblockchain/5y38ab
https://academy.binance.com/ko/articles/an-introduction-to-bitcoin-script
https://learnmeabitcoin.com/technical/p2pkh