MSTR Cat

블록체인/레벨 IV · 프로토콜 심화/4.1 Script/수업 1

스크립트: 스택 언어

실행을 제한된 범위로 유지하는 스택과 사토시가 비활성화한 옵코드

준비물종이 한 장과 펜비트코인 블록 탐색기 접근비트코인 위키의 ‘스크립트’ 페이지

호기심

  1. 루프가 없는 언어는 왜 모든 노드를 무한 반복 계산으로부터 보호할 수 있을까요?
  2. 2010년에 패치되기 전까지 누구나 다른 사람의 코인을 사용할 수 있었던 구체적인 버그는 무엇이었나요?
  3. 하나의 출력이 어떻게 데이터를 담으면서도 증명 가능하게 지출 불가능한 것으로 표시될 수 있을까요?

탐구

  1. 비트코인 스크립트는 Forth 스타일의 작은 스택 기반 언어입니다. 반복문과 재귀가 없어 의도적으로 튜링 완전하지 않게 설계되었습니다. 이러한 구조 덕분에 모든 스크립트의 실행 비용은 제한되고 예측 가능합니다. 어떤 스크립트도 무한히 실행되거나 무제한적인 리소스를 소비할 수 없어, 범용 코드에 내재된 서비스 거부 공격으로부터 네트워크를 보호합니다. 단순함 덕분에 모든 노드는 리소스 고갈의 위험 없이 결정론적 방식으로 트랜잭션을 검증할 수 있습니다.
  2. 모든 출력에는 지출 조건을 정의하는 잠금 스크립트(scriptPubKey)가 들어 있습니다. 지출자는 scriptSig를 통해, 또는 SegWit 이후로는 위트니스(witness) 데이터를 통해 잠금 해제 데이터를 제공합니다. 실행 과정에서는 데이터를 스택에 푸시하고 옵코드를 왼쪽에서 오른쪽으로 적용합니다. 실행이 오류 없이 끝나고 스택 맨 위에 참(true) 값이 남으면 해당 지출은 유효합니다. 이 이진적인 결과는 개인 키를 전혀 공개하지 않고도 비트코인을 보호하며, 신원 확인이 아니라 암호학적 검증에 의존합니다.
  3. 2010년, 사토시 나카모토는 버그가 발견되자 예방 조치로 OP_CAT과 OP_MUL을 포함한 여러 옵코드를 비활성화했습니다. 그중 하나(OP_LSHIFT의 버그)는 노드를 다운시킬 수 있었습니다. 더 심각한 결함은 scriptSig와 scriptPubKey를 이어 붙여 하나의 스크립트로 실행하는 방식에 있었습니다. OP_RETURN으로 끝나는 scriptSig는 잠금 스크립트가 실행되기도 전에 ‘true’로 실행을 끝낼 수 있었고, 이 때문에 누구나 아무의 코인이든 지출할 수 있었습니다. 첫 번째 수정에서는 OP_RETURN이 곧바로 실패하도록 바꿨고, 이후 릴리스에서는 한 걸음 더 나아가 scriptSig와 scriptPubKey를 별개의 스크립트로 실행하도록 했습니다. 이 변경으로 보안 모델이 강화되었고, 악용되거나 예측 불가능한 동작을 일으킬 수 있었던 위험한 연산이 제거되었습니다.
  4. OP_RETURN은 출력을 증명 가능하게 지출 불가능한 것으로 표시합니다. 이는 유효한 지출 경로를 만들지 않고 온체인에 소량의 데이터를 삽입하는 데 사용됩니다. 어떤 서명으로도 OP_RETURN을 충족할 수 없으므로 해당 코인은 영구적으로 잠기지만, 관련 데이터는 블록체인 기록의 일부로 남습니다. 이러한 출력은 결코 지출될 수 없으므로, 노드는 이를 지출 가능한 코인의 집합에서 제외합니다.
  5. 동작 원리를 이해하려면 종이 위에서 ‘2 3 OP_ADD 5 OP_EQUAL’을 단계별로 따라가 보세요. 빈 스택에서 시작합니다. 2를 푸시하고, 이어서 3을 푸시합니다. OP_ADD를 적용하면 두 값을 모두 꺼낸 뒤 그 합(5)을 푸시합니다. 다시 5를 푸시합니다. OP_EQUAL을 적용해 맨 위의 두 항목을 비교하면, 두 값이 같으므로 true(1)를 푸시합니다. 스택에는 하나의 true 값만 남아 유효성 요건을 충족합니다. 이 간단한 산술은 옵코드가 조건을 평가하기 위해 스택을 어떻게 조작하는지 보여줍니다.
  6. 블록 탐색기를 열고 아무 표준 트랜잭션이나 찾으세요. 출력 부분에서 scriptPubKey를 확인하세요. 레거시 P2PKH 출력이면 OP_DUP로, 네이티브 SegWit이면 OP_0으로, Taproot이면 OP_1로 시작합니다. 그런 다음 이러한 출력을 지출하는 트랜잭션을 열고, 이를 충족하는 서명과 키를 찾으세요. 레거시 출력이면 scriptSig에, SegWit과 Taproot이면 위트니스에 있으며, 이 서명과 키가 검증하는 모든 노드의 실행 스택에 참(true) 값을 남깁니다.

핵심 사실

  • 비트코인 스크립트는 튜링 완전하지 않으며, 루프나 재귀가 없습니다.
  • 버그가 발견된 후 사토시는 예방 조치로 2010년에 OP_CAT, OP_MUL 및 기타 옵코드를 비활성화했습니다.
  • 2010년부터 scriptSig와 scriptPubKey는 이어 붙여지지 않고 별도로 실행되어 왔습니다.
  • OP_RETURN은 데이터 삽입을 위해 출력을 증명 가능하게 지출 불가능한 것으로 표시합니다.
  • 유효한 지출은 실행 스택 맨 위에 참(true) 값을 남깁니다.
  • 임의적인 계산이 불가능하기 때문에 모든 스크립트의 비용은 제한됩니다.

연습 아홉, 여섯, 셋, 하나

9모으기비트코인 스크립트의 옵코드 9개를 나열하세요. 어떤 것이 비활성화되었는지, 어떤 것이 스택을 직접 수정하는지, 어떤 것이 암호학적 검증을 수행하는지 표시하세요.
6묶기9개를 기능에 따라 6개 그룹으로 묶으세요: 산술, 비교, 스택 조작, 암호 검증, 데이터 삽입, 사용 중단/제거.
3추리기6개를 스크립트가 의도적으로 제한된 상태로 유지된 3가지 이유로 줄이세요.
1결정화제한된 실행이 악성 스크립트로부터 네트워크를 어떻게 보호하는지 한 문장으로 쓰세요.

팩트 체크

날짜, 수치 및 주장은 아래에 명시된 출처들을 통해 확인되었습니다.

인터랙티브 아카데미에서 열기 →

EN PT ES ZH JA RU DE FR MS