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

잠금 스크립트

해시넷
ghdrn221 (토론 | 기여)님의 2019년 8월 28일 (수) 17:52 판
이동: 둘러보기, 검색

잠금 스크립트(scriptPubkey)는 출력값을 소비하기 위해 충족되어야 하는 요건을 스크립트로 작성한 것이다. 트랜잭션을 검증하기 올바른지 검증하라는 키(key)로 자물쇠의 역할이며, 스크립트퍼브키라고도 한다.

개요

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

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

특징

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

  • 비트코인 잠금 스크립트
p2p네트워크에서 해당트랜잭션을 받은 노드는 잠금 스크립트에 해제 스크립트를 대조해서 일치하는지 확인하고 true(참)라고 판명되면 올바른 트랜잭션이라고 간주하고 이웃노드로 전달하게 된다. input(입력)내부에 한쌍의 해제 스크립트와 잠금 스크립트가 존재하는데, 두가지를 통해 트랜잭션을 검증하면 되고, 잠금 스크립트 라는 자물쇠를 트랜잭션에 결과값에 같이 첨부를 하여 전달한다. 발생한 결과값을 사용하려면, 전달받은 주소 또한 자신의 해제 스크립트를 통해 해당 잠금 스크립트를 풀어야만 사용 가능하고, 두가지 검증이 false(실패)라면 어떤 노드에서도 유효한 트랜잭션이라 인정하지 않는다.[2]
  • 잠금 스트립트 트랜잭션검증하기
"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)와 함께 잠금 스크립트를 전송하고 밥의 지갑에 사토시가 잔액으로 표시되기 시작한다. 따라서 잠금 스크립트는 잠금 처럼 작동하게 된다. 밥이 이러한 사토시를 보내려면 엘리스가 잠금 스크립트에 배치 한 조건을 충족해야하는데, 사토시를 사용하기 위해 잠금 스크립트의 조건을 만족시키는 솔루션으로 해제스크립트를 작성한다. 해제 스크립트는 잠금 스크립트의 잠금 키 역할을한다.[3]

각주

  1. knocte, 〈ScriptPubKey {# payment-script}〉, 《깃허브》
  2. niipoong, 〈비트코인 스크립트와 디지털 서명, 검증 (scriptSig, scriptPubKey )〉, 《스팀》
  3. 아비셰크시나, 〈초보자를위한 간단하고 덜 기술적 인 설명〉, 《스택 익스체인지》

참고자료

같이 보기


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