UTXO를 이용해 화폐를 주고 받기 위해서 컴퓨터가 이해하기 처리할 수 있도록 해야하는데, 비트코인에서는 이를 스크립트 언어를 사용하여 구현한다.

비트코인 스크립트는 일반적인 프로그래밍 언어와는 다르게 어떤 공식적인 문법이나 구문이 있는 것이 아니라 간단한 연산 목록으로 구성되어 있으며, 스크립트에서 사용하는 연산들은 Opcode에 해당한다.

블록체인에 올라간 트랜잭션은 데이터 위변조가 매우 어렵기 때문에 모든 노드는 동일한 스크립트를 실행하고, 정확히 동일한 결과를 얻게되낟. 악의적인 노드가 변조한 트랜잭션을 퍼뜨리면, 변조된 트랜잭션의 스크립트 실행결과와 다른 트랜잭션의 스크립트 실행 결과가 달라질 것이다.

스크린샷 2022-11-28 오전 11.23.57.png

노드는 피어로부터 트랜잭션을 받으면 먼저 해당 트랜잭션 안에 들어있는 입력과 출력 목록에서 각 입력과 출력에 해당하는 ScriptSig와 ScriptPubKeys를 추출한다. 그리고 기존 블록들을 찾아보며 입력과 연결된 이전 출력을 찾고, 각 입력과 출력에 들어있는 ScriptSig와 ScriptPubKey를 연결한다.

ScriptSig와 ScriptPubKey는 각각의 연속적인 정보를 담고 있다. 노드가 ScriptSig와 ScriptPubKey를 연결하고, 그 연결한 전체 시퀀스를 파싱하면 온전한 스크립트 코드가 나타난다. 노드는 이 코드를 단계별로 실행한다.

스크린샷 2022-11-28 오전 11.28.00.png

스크립트는 이 Opcode와 DATA를 일렬로 늘어놓은 것이다. 포인터는 일렬로 늘어진 Opcode와 데이터를 순서대로 하나씩 가리키고, 포인터가 데이터를 가리키면 데이터를 스택에 넣고, Opcode를 가리키면 스택에서 데이터를 꺼내온다.

스크립트 실행이 성공적이면 스택의 가장 상단에 있는 요소는 1이 된다. 1이 아닐경우 실패한 것으로 간주한다.

노드가 네트워크로부터 새로운 트랜잭션을 받으면, ScriptSig와 ScriptPubKey 필드를 추출 후 연결하여 최종적으로 <ScriptSig><ScriptPubKey> 형태의 스크립트를 얻게 된다. 노드는 이 스크립트와 빈 스택 하나를 사용해 스크립트를 실행하고 실행이 완료되면 최상위 스택 요소가 1인지 확인한다. 1일 경우에 노드는 트랜잭션을 주변 노드들에게 전파한다.

[P2PK]