용어집 / 개발자 참고 자료
Bitcoin Script
별칭은 Script입니다.
- Bitcoin Script란 무엇입니까?
- Bitcoin Script는 모든 비트코인 출력이 담고 있는 작은 스택 기반 언어로, 해당 코인을 다시 사용할 수 있기 전에 누군가가 충족해야 하는 조건을 정합니다.
코인은 사람에게 전송되지 않습니다. 코인은 짧은 프로그램 뒤에 잠기며, 코인을 쓰는 일은 그 프로그램이 스택 맨 위에 참값을 남기고 끝나도록 만드는 데이터를 제공하는 것을 뜻합니다. 이 언어에는 반복문도 재귀도 없으며, 레거시 스크립트는 10,000바이트와 201개의 연산에서 멈추므로 검증자는 작업이 끝날 것임을 언제나 압니다. 그래서 비트코인에는 폭주하는 계약이 생긴 적이 없습니다.
작동 방식
비트코인 스크립트는 왼쪽에서 오른쪽으로 읽으며 그 밖의 일은 하지 않는 스택 머신입니다.
데이터 푸시는 스택에 올라가고, 연산은 스택에서 인수를 꺼내고 결과를 다시 올립니다. 변수도, 뒤로 가는 점프도, 검증 중인 트랜잭션 밖의 무엇이라도 읽는 방법도 없습니다. 스크립트는 실행이 오류 없이 끝나고 맨 위에 참값을 남길 때 성공합니다.
지출 시점에 두 조각이 만납니다. 지출되는 출력은 잠금을 담고 있으며 이것을 공개 키 스크립트(pubkey script)라고 부릅니다. 그것을 지출하는 입력은 증명을 담고 있으며, 오래된 출력에서는 서명 스크립트, segwit 출력에서는 위트니스(witness)라고 부릅니다. 두 조각은 스택을 서로 넘겨받으며 차례로 실행되고, 하나의 프로그램으로 이어 붙여지지는 않습니다. 이 분리는 잠금 쪽에 연산자를 주입할 수 있는 지출자가 조건을 다시 쓸 수 있다는 것이 분명해진 뒤 이른 시기에 도입되었습니다.
비트코인 역사에서 가장 흔한 스크립트는 전문을 읽어 볼 가치가 있습니다. pay-to-public-key-hash 출력은 OP_DUP, OP_HASH160, 20바이트 해시, OP_EQUALVERIFY, OP_CHECKSIG를 담습니다. 지출자는 서명과 공개 키를 제공합니다. 실행은 둘을 스택에 올리고, 공개 키를 복제하고, 복제본을 해시하여 20바이트로 만들고, 기대하는 해시를 올리고, 둘을 비교하여 다르면 중단하고, 그다음 트랜잭션 자체의 직렬화에 대하여 서명을 검사합니다. 단계는 여섯 개이며, 레거시 주소의 보안 전체가 이 단계들에 달려 있습니다.
한도는 의도적이고 정밀합니다. 레거시 스크립트와 P2SH 스크립트는 10,000바이트나 201개의 푸시가 아닌 연산을 넘을 수 없습니다. 스택의 항목 하나는 520바이트를 넘을 수 없습니다. 스택은 1,000개를 넘는 항목을 담을 수 없습니다. OP_CHECKMULTISIG 하나는 20개를 넘는 공개 키를 지목할 수 없습니다. 모든 상한은 누가 무엇을 작성하든 블록 검증 비용이 한정되게 유지되도록 존재합니다.
이 언어는 예약된 무동작 코드에 실제 의미를 부여함으로써 두 번 성장했습니다. BIP65는 2015년 12월에 OP_CHECKLOCKTIMEVERIFY를 정의하여, 출력이 지정된 시각이나 높이 전에는 움직이기를 거부할 수 있게 했습니다. BIP112는 OP_CHECKSEQUENCEVERIFY에 같은 일을 했으며, 2016년 7월의 블록 419,328부터 활성화되어 코인이 확인된 시점부터 측정하는 상대적 타임록을 추가했습니다. 이 두 오피코드가 있기에 라이트닝 채널, 기한이 있는 에스크로, 타임록 기반 상속 설계가 존재할 수 있습니다.
비트코인을 구매할 때 이것이 중요한 이유
출금하는 주소는 스크립트 유형이며, 그 선택은 다음 수수료에 나타납니다.
레거시 pay-to-public-key-hash 입력을 쓰는 데는 대략 148 가상 바이트가 듭니다. 네이티브 segwit 입력을 쓰는 데는 대략 68이 드는데, BIP141이 도입한 위트니스 할인이 위트니스 데이터를 4분의 1 요율로 청구하기 때문이며, taproot 키 경로 지출은 그보다 더 작습니다. 20sat/vB의 수수료율에서 이 차이는 작은 출금 비용의 대부분이며, 코인을 옮길 때마다 되풀이됩니다. 거래소가 출금할 주소 형식을 선택하게 하는 곳에서는 최신 형식을 고르는 것이 영구적인 할인입니다.
멀티시그 금고도 실제로는 스크립트입니다. 2-of-3 구성은 공개 키 셋을 지목하고 서명 둘을 요구하는 스크립트이며, 어떤 기기가 그런 스크립트를 정직하게 표시하고 서명할 수 있는지는 이 사이트의 하드웨어 지갑 리뷰가 직접 다루는 문제입니다. 타임록에 기반한 상속 계획도 마찬가지입니다. 코인은 누군가가 여전히 스크립트를 가지고 있어야만 되찾을 수 있으며, 그래서 스크립트를 다시 만드는 평문 레시피인 출력 디스크립터가 시드 문구와 함께 백업에 들어가야 합니다.
실용적인 경고 하나입니다. 어떤 플랫폼이 붙여 넣은 주소로 보내기를 거부할 때, 그 원인은 거의 언제나 주소가 틀린 것이 아니라 그 플랫폼의 출금 코드가 그 스크립트 유형을 만들 수 없다는 데 있습니다. 익숙하지 않은 주소 형식은 소중한 잔액을 옮기기 전에 작은 금액으로 시험해 보십시오.
1,840억 비트코인 버그와 사토시가 꺼 버린 오피코드
2010년 8월 15일에 블록 74,638은 184,467,440,737.09551616비트코인을 만들어 낸 트랜잭션을 담았고, 그 코인은 각각 대략 922억인 두 출력으로 나뉘었습니다.
트랜잭션의 출력이 입력을 넘지 않았는지 확인하는 검사는 고정 폭 부호 있는 산술을 사용했고, 그 산술을 넘치게 할 만큼 큰 출력은 음수로 합산되었으므로 검사를 통과했습니다. 패치된 클라이언트는 약 5시간 안에 나타났고, 정직한 체인은 높이 74,691에서 나쁜 체인을 앞질렀습니다. 그 코인은 누구나 사용하는 체인 위에 존재한 적이 없습니다.
그 사건은 문자열 및 산술 연산의 관련 버그 무리와 함께, 열다섯 개의 오피코드가 영구히 비활성화된 이유입니다. OP_CAT, OP_SUBSTR, OP_LEFT, OP_RIGHT, OP_INVERT, OP_AND, OP_OR, OP_XOR, OP_2MUL, OP_2DIV, OP_MUL, OP_DIV, OP_MOD, OP_LSHIFT, OP_RSHIFT입니다. 스크립트가 그중 하나를 담기만 해도 그 트랜잭션은 실행 여부와 관계없이 무효입니다. 비활성화는 시간 압박 속에 적용된 둔한 수단이었고, 그 일부를 되돌리는 것은 현재 진행 중인 작업입니다. BIP347은 tapscript 안에서 OP_CAT를 복원할 것을 제안하며, 그곳에서는 더 새로운 한도 덕분에 남용이 훨씬 어렵습니다.
비트코인 스크립트 vs tapscript
Tapscript는 규칙집을 다시 그린 비트코인 스크립트이며, taproot 스크립트 경로 지출 안에서만 적용됩니다. BIP342는 10,000바이트 스크립트 크기 상한과 201개 연산 상한을 모두 없애고, OP_CHECKMULTISIG와 OP_CHECKMULTISIGVERIFY를 비활성화하고, 멀티시그 정책을 일괄 검증할 수 있도록 그 자리에 OP_CHECKSIGADD를 추가했습니다. 서명 검사는 세는 대신 계량됩니다. 각 입력은 50에 자신의 위트니스 직렬화 크기를 더한 예산을 받고, 실행되는 서명 검사마다 그중 50을 씁니다. 같은 스택 머신, 다른 회계입니다.
비트코인 스크립트 vs 공개 키 스크립트
비트코인 스크립트는 언어이고, 공개 키 스크립트는 그 언어로 작성된 하나의 프로그램입니다. 출력은 공개 키 스크립트를 담고 있으며, 그것이 잠금입니다. 그것을 지출하는 입력은 서명 스크립트나 위트니스를 담고 있으며, 그것이 열쇠입니다. 둘 다 비트코인 스크립트이며, 둘 중 어느 하나를 그냥 “스크립트”라고 부르는 것이 원시 트랜잭션을 읽을 때 혼란의 가장 흔한 원인입니다. 두 조각은 따로 평가되고, 코인을 받을 때 커밋된 것은 그중 하나뿐이기 때문입니다.