검수요청.png검수요청.png

잠금 스크립트

해시넷
ghdrn221 (토론 | 기여)님의 2019년 8월 29일 (목) 10:56 판
이동: 둘러보기, 검색

잠금 스크립트(scriptPubkey)는 출력값을 소비하기 위해 충족되어야 하는 요건을 스크립트로 작성한 것이고, 블록체인상에서 기록되어 있는 모든 UTXO는 소비하기 위한 조건이 있는데 그 조건들을 스크립트로 구현한 것이다.[1] 트랜잭션을 검증하기 올바른지 검증하라는 키(key)로 자물쇠의 역할이며, 스크립트퍼브키라고도 한다.

개요

잠금 스크립트(scriptPubkey)는 비트코인 거래 작성을 유효화 시키는 핵심 키이다. 쉽게 설명하자면, 잠금 스크립트(scriptPubkey)는 비트코인 소비 조건이라고 할 수 있다. 잠금 스크립트(scriptPubkey)는 UTXO를 소비하기 위한 조건 및 공개키, 비트코인 주소를 포함한다. 왜냐하면 UTXO는 특정 지갑에서 소유하고 있는 비트코인 덩어리 이므로 소비 요건에 비트코인 주소와 공개키도 포함하는 것이다. 그러므로 해당 지갑 주소를 포함하는 이 잠금 스크립트를 풀 수 있는 조건을 달성하면 해당 지갑 주소에서 UTXO를 소비할 수 있게 되는 것이다. 잠금 스크립트는 비트코인 트랜잭션의 출력에 배치 된 잠금 스크립트로 수신자가 비트코인을 사용하기 위해 특정 조건을 충족해야한다. 잠금 스크립트는 비트코인 코드 외부의 PubKey 스크립트라고도 한다. 스크립트는 현재 프로그래밍 언어의 많은 기능이 부족하지만, 수행 할 수 있는 작업 수가 제한되어 있기 때문에 본질적으로 더 안전하다.

잠금 스크립트가 트랜잭션을 검증하기 올바른지 검증하는 키로 자물쇠의 역할 이라면, 트랜잭션을 발생시킨 주체의 서명 + 퍼브키, 열쇠의 역할을 하고, 잠금스크립트를 풀기위한 해제 스크립트가 있다. p2p네트워크에서 해당트랜잭션을 받은 노드는 잠금 스클비트에 해제스크립트를 대조해서 일치하는지 확인하고 true(참)라고 판명되면 올바른 트랜잭션이라고 간주하고 이웃노드로 전달하게 된다.

특징

트랜잭션 출력 스크립트(output script)를 위한 출력 이름(output name) 일방적으로 출력 스클립트에서는 공개키 또는 해쉬를 담고 있으며, 상응하는 개인키의 소유주만이 출력된 비트코인을 얻을수 있다. 내부적으로 비트코인 프로토콜은 잠금 스크립트를 통해 비트코인의 수신자를 식별한다. 잠금 스크립트는 비트 코인 주소와 관련이없는 것으로 보이지만 공개 키의 해시를 표시하는데, 비트 코인 주소는 주소를 사용할 네트워크와 공개 키의 해시를 식별하는 버전 바이트로 구성되며, 잠금 스크립트 및 네트워크 식별자에서 비트 코인 주소를 생성 할 수 있다.[2]

UTXO를 기본 단위로 거래하며 출력값에 잠금 스크립트, 입력값에 해제스크립가 들어가고, 출력값은 잠금 스크립트로 잠겨져 있으며 받는 사람은 자신의 서명이 들어간 해제 스크립트로 잠금장치를 풀어야 받은 돈을 사용할 수 있다.[3] UTXO를 소비하기 위한 요건을 명시하고 있고 그 뿐 아니라 공개키 또는 비트코인 주소를 포함한다. 특정 지갑에서 소유하고 있는 비트코인 덩어리로 소비 요건에 비트코인 주소와 공개키도 포함하며, 해당 지갑주소를 포함하는 잠금 스크립트를 풀수 있는 조건을 달성하면 해당 지갑주소에서 UTXO를 소비할 수 있다.[1]

활용

p2p네트워크에서 해당트랜잭션을 받은 노드는 잠금 스크립트에 해제 스크립트를 대조해서 일치하는지 확인하고 true(참)라고 판명되면 올바른 트랜잭션이라고 간주하고 이웃노드로 전달하게 된다. input(입력)내부에 한쌍의 해제 스크립트와 잠금 스크립트가 존재하는데, 두가지를 통해 트랜잭션을 검증하면 되고, 잠금 스크립트 라는 자물쇠를 트랜잭션에 결과값에 같이 첨부를 하여 전달한다. 발생한 결과값을 사용하려면, 전달받은 주소 또한 자신의 해제 스크립트를 통해 해당 잠금 스크립트를 풀어야만 사용 가능하고, 두가지 검증이 false(실패)라면 어떤 노드에서도 유효한 트랜잭션이라 인정하지 않는다.[4]
  • P2PKH 스크립트 유효성 검사
표준 P2PKH 잠금 스크립트
잠금 스크립트를 평가하려면, P2PKH 출력에서 잠금 스크립트는 다음과 같다.
OP_DUP OP_HASH160 <PubkeyHash> OP_EQUALVERIFY OP_CHECKSIG
지출자의 해제 스크립트가 평가되고, 스크립트 시작 부분에 접두사가 붙는다. P2PKH 트랜잭션에서 해제 스크립트에는 secp256k1 서명과 전체 공개 키(퍼브키)가 포함되어 다음과 같다.
<Sig> <PubKey> OP_DUP OP_HASH160 <PubkeyHash> OP_EQUALVERIFY OP_CHECKSIG
스크립트 언어는 튜링(Turing)이 아닌 무상태(stateless)인 의도적으로 설계된 스택 기반 앞의(Forth) 언어이다. 무상태는 트랜잭션이 블록 체인에 추가되면 영구적으로 추가 할 수 있다. 루프 나 힙이 없는 튜링의 불안정은 스크립트 언어의 유연성과 예측 가능성을 떨어 뜨려 보안 모델을 크게 단순화한다. 트랜잭션이 유효한지 테스트하기 위해 해제 스크립트와 잠금 스크립트 작업이 밥(Bob)의 해제 스크립트에서 시작하여 엘리스(Alice)의 잠금 스크립트가 끝날 때까지 한 번에 하나씩 실행한다.[5]
  1. 밥(해제 스크립트의 서명)이 빈 스택에 추가된다. 데이터이기 때문에 스택에 추가하는 것 외에는 아무 것도 수행되지 않으며, 공개 키는 서명의 최상부에 푸시된다.
  2. 엘리스의 잠금 스크립트에서 OP_DUP 작업이 실행되고, 스택 상단에있는 데이터의 복사본을 스택에 푸시한다. 밥이 제공 한 공개 키의 복사본을 만든다.
  3. 연산 OP_HASH160은 현재 스택 상단에있는 데이터의 해시를 스택에 푸시하고, 밥의 공개 키 해시를 만든다.
  4. 엘리스의 잠금 스크립트는 밥이 첫 번째 트랜잭션에 대해 준 잠금 해시를 푸시하며, 스택 맨 위에 밥의 잠금 해시 복사본이 두 개 있어야한다.
  5. 엘리스의 잠금 스크립트는 OP_EQUALVERIFY를 실행하고, OP_EQUAL을 실행 한 다음 OP_VERIFY를 실행하는 것과 같다. OP_EQUAL은 스택의 맨 위에있는 두 값을 확인하고, 제공된 전체 공개 키 밥에서 생성 된 잠금 해시가 트랜잭션 # 1을 생성 할 때 제공된 잠금 해시 엘리스와 동일한 지 확인하면, OP_EQUAL은 비교 한 두 개의 값을 스택 상단에서 제거 하고 비교 결과로 대체한다 : 0 or 1 (거짓 또는 참)이 라면, OP_VERIFY는 스택의 맨 위에있는 값을 확인하고, 값이 거짓이면 즉시 평가가 종료되고 트랜잭션 유효성 검사가 실패하며, 값이 참이면 스택에서 실제 값을 제거한다.
  6. 잠금 스크립트가 평가 된 후에 거짓이 스택 맨 위에 있지 않으면 트랜잭션이 다른 문제가 없을시 유효하다.
  • P2SH 스크립트(pay-to-script-hash)
수신자는 스크립트 조건에주의를 기울이고 원하는 경우 지출 자에게 잠금 스크립트 사용을 요청할 수 있고, 짧은 비트코인 주소보다 덜 편리하며 BIP70 지불 프로토콜을 광범위하게 구현하기 전에 프로그램간에 이를 통신하는 표준 방법이 없어 P2SH 트랜잭션을 작성하여 스크립트 해시가 포함 된 잠금 스크립트인 리딤(redeem) 스크립트를 만들었다. P2SH 워크 플로는 P2PKH 워크 플로와 거의 동일하고, 밥은 원하는 스크립트로 리딤 스크립트를 생성하고 사용 스크립트를 해시하며 엘리스에 사용 스크립트 해시를 제공하며, 엘리스는 밥의 상환 스크립트 해시가 포함 된 P2SH 스타일 출력을 만든다.
P2sh1.PNG
밥은 출력을 보내려고 할 때 서명 스크립트의 전체 직렬화된 사용 스크립트와 함께 자신의 서명을 제공합니다. 피어 - 투 - 피어 네트워크는 엘리스가 출력에 넣은 스크립트 해시와 동일한 값으로 전체 회수 스크립트 해시를 보장하며, 기본 잠금 스크립트인 것처럼 보충 스크립트를 정확하게 처리하여 검색 스크립트가 거짓를 반환하지 않으면 밥에게 출력을 보낸다.
P2sh2.PNG
사용 스크립트의 해시는 잠금 해시와 동일한 속성을 갖기 때문에 표준 주소와 구분하기 위해 하나의 작은 변경만으로 표준 비트코인 주소 형식으로 변환 할 수 있어 P2PH 스타일 주소를 수집하는 것처럼 간단하게 P2SH 스타일 주소를 수집 할 수 있다. 해시는 사용 스크립트의 공개 키를 난독 화하여, P2SH 스크립트는 P2PKH 잠금 해시만큼 안전하다.


  • 잠금 스트립트 트랜잭션검증하기
"hadh":"503e4e9824284eb06f1a328484e2b367b5f4f93a405d6e7b97261bafabfb53d5", 
"vout_sz":2, 
"relayed_by":"0.0.0.0", 
"out":[ 
 { 
"spent":true, 
"tx_index":311962649, 
"type":0, 
"addr":"3FfQGY7jqsADC7uTVqF3vKQzeNPiBPTqt4", 
"value":34676070, 
"n":0 〈
"script":"a914994394dbd20b7752e272458c738ae9b7666271b787" 〈
 }, 
 { 
"sepent":true, 
"tx_index":311962649, 
"type":0, 
"addr":"1NdvAyRJLdK5EXs7DV3ebYb5wffdCZk1pD", 
"value":31129454 
"n":1, 
"script":"76a914ed5600751fea259a0f8c8bec09a626e7e4450e7a88ac" 
 } 
] 
잠금 스크립트를 생성하기 위한 다섯가지 절차는 다음과 같다.
1. DUP + HASH160 + <pubKeyHash> + EQUALVERIFY + CHECKSIG
2. 비트코인 OPCODE 값을 확인하여 위의 OPCODE에 해당하는 Hex값으로 변환한다.
 : 76 + a9 + length + pubKeyHash + 88 + ac
3. 비트코인 주소를 기반으로 퍼브키 해시값을 계산한다.
 : pubKeyHash = Base58Decode((1NdvAyRJLdK5EXs7DV3ebYb5wffdCZk1pD))
 : 00ED5600751FEA259A0F8C8BEC09A626E7E4450E7A2F6DA14A
 : 디코딩된 hex값에서 1바이트 버전 prefix와 4바이트 checksum을 제외한 순수 퍼브키 해시값을 가져온다.
4. 퍼브키 해시값을 사용하여 재구성한다.
 : 76 + a9 + 14 + ED5600751FEA259A0F8C8BEC09A626E7E4450E7A + 88 + ac
5. 최종 잠금스크립트 해시값 생성한다.
 : 76a914ED5600751FEA259A0F8C8BEC09A626E7E4450E7A88ac 생성한 잠금 스크립트는 위의 블록정보에서 확인한 스크립트값과 동일하다.

예시

  • 예시1 : 시나리오 - A가 1 BTC를 B로 보내고 있다.

scriptPubKey = OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG </noinclude>

퍼브키해시 = 수신자 공개 키의 해시(B) 발신자(A)는 수신자(B)의 비트코인 주소만 가지고 있으므로 비트코인 주소에서 퍼브시해시를 얻는방법.
  1. 입력 스크립트는 보낸 사람의 이전 트랜잭션에 대한 정보를 전달하고 색인을 사용하여 이전 트랜잭션의 적절한 출력 부분을 가리킨다. 이전 트랜잭션의 출력은 비트코인을 수신자(B)에게 전송한다고 주장 할 수있는 발신자(A)의 총 가용잔액 이다.
  2. 이 입력 스크립트는 또한 발신자(A)가 이전 트랜잭션의 참조 된 출력에 보유 된 비트 코인의 실제 소유자인지 확인하는 데 사용된다.
  3. 출력 스크립트는 발신자가 수신자에게 전송하고자하는 비트 코인 수와 수신자의 비트 코인 주소를 알려준다.
엘리스(Alice)는 발신자가되고 밥(Bob)은 수신자가 된다. 엘리스는 밥지갑의 개인 키에 해당하는 잠금 스크립트를 만든다. 비트 코인 네트워크에서 사토시(satoshis)와 함께 잠금 스크립트를 전송하고 밥의 지갑에 사토시가 잔액으로 표시되기 시작한다. 따라서 잠금 스크립트는 잠금 처럼 작동하게 된다. 밥이 이러한 사토시를 보내려면 엘리스가 잠금 스크립트에 배치 한 조건을 충족해야하는데, 사토시를 사용하기 위해 잠금 스크립트의 조건을 만족시키는 솔루션으로 해제스크립트를 작성한다. 해제 스크립트는 잠금 스크립트의 잠금 키 역할을한다.[6]

각주

  1. 1.0 1.1 jsralph, 〈쉽게 설명하는 블록체인, 스크립트란 뭔가요?〉, 《스팀》
  2. knocte, 〈ScriptPubKey {# payment-script}〉, 《깃허브》
  3. feyee95, 〈비트코인 스크립트 언어의 장점과 한계〉, 《스팀》
  4. niipoong, 〈비트코인 스크립트와 디지털 서명, 검증 (scriptSig, scriptPubKey )〉, 《스팀》
  5. 비트코인 개발자가이드 공식 홈페이지 - https://wikidocs.net/14505
  6. 아비셰크시나, 〈초보자를위한 간단하고 덜 기술적 인 설명〉, 《스택 익스체인지》

참고자료

같이 보기


  검수요청.png검수요청.png 이 잠금 스크립트 문서는 블록체인 기술에 관한 글로서 검토가 필요합니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 문서 내용을 검토·수정해 주세요.