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

"해제 스크립트"의 두 판 사이의 차이

해시넷
이동: 둘러보기, 검색
150번째 줄: 150번째 줄:
 
* 니르바나, 〈[https://ihpark92.tistory.com/59 트랜잭션 검증을 위한 scriptPubKey와 scriptSig 생성하기]〉, 《티스토리》
 
* 니르바나, 〈[https://ihpark92.tistory.com/59 트랜잭션 검증을 위한 scriptPubKey와 scriptSig 생성하기]〉, 《티스토리》
 
* jsralph, 〈[https://steemit.com/kr/@jsralph/67ifzs-1 쉽게 설명하는 블록체인, 스크립트란 뭔가요?]〉, 《스팀잇》
 
* jsralph, 〈[https://steemit.com/kr/@jsralph/67ifzs-1 쉽게 설명하는 블록체인, 스크립트란 뭔가요?]〉, 《스팀잇》
 +
* AEP코리아네트, 〈[http://a.to/193EW0M 비트코인 시스템에서 사용하는 암호 기술(II) - 거래 검증]〉, 《네이버 블로그》, 2017-12-21
  
 
== 같이 보기 ==
 
== 같이 보기 ==

2019년 9월 2일 (월) 17:28 판

해제 스크립트(scriptSig)는 그조건만 충족시키는 유일한 서명(signature), 잠금 해제 스크립트로 잠금 스크립트가 출력값에 걸어둔 조건을 해결해 출력값이 소비뒬수 있도록 하는 스크립트이며, 열쇠의 역할로 잠금스크립트를 풀기위한스크립트 시그서명 스크립트라고도 한다.

개요

거래의 입력값에 포함되어 있으며, 얼마를 보낼지 보낼금액란에 입력하는 명령어 안에 잠금 스크립트의 조건을 충족할 해제스크립트가 포함되어 있기 때문에 해당 비트코인 주소의 UTXO에 대한 소유권을 입증하고 그 UTXO를 소비할수 있다.비트코인 생태계에도 스크립트라고 부르는 프로그래밍 언어가 존재한다. 스크립트는 비트코인의 모든 거래를 유효화시키는 언어로, 단순하면서도 비트코인이 비트코인으로서 역할을 하게 하는 적합한 언어이다. 비트코인은 고정적인 패턴화된 형태의 시스템이 아니라 스크립트 언어를 통해 실행되기 때문에 무한대에 가까운 표현 가능한 조건들이 만들어질 수 있는데, 이것이 바로 비트코인이 화폐로서 역할을 하게 하는 힘이다. 비트코인 거래를 작동하기 위해서 두 가지 잠금 스크립트와 해제 스크립트, 두 가지 엔진이 작동한다.

  1. 잠금 스크립트 : 출력값을 소비하기 위해 충족되어야 하는 요건을 스크립트로 작성한 것
  2. 해제 스크립트 : 잠금 스크립트가 출력값에 걸어둔 조건을 해결해 출력값이 소비될 수 있도록 하는 스크립트

블록체인 상에서 기록된 비트코인의 잔액을 표현한 모든 UTXO들은 그것들을 소비하기 위한 조건이 있는데 그조건을 잠금 스크립트라 하고 그조건을 풀수 있는 입력값을 해제스크립트 이며, 데이터 값이 복사되어 잠금 스크립트와 함께 연산 되어 실행됐을 때결과가 TRUE값이 나오면 그 입력값은 유효하다는 것이고, UTXO를 소비할수 있게 된다.[1]

해제 스크립트는 거래의 입력값에 포함되어 있으며, 얼마를 보낼지 보낼금액란에 입력하는 명령어 안에 잠금 스크립트의 조건을 충족할 해제스크립트가 포함되어 있기 때문에 해당 비트코인 주소의 UTXO에 대한 소유권을 입증하고 그 UTXO를 소비할수 있다. 해제 스크립트와 잠금 스크립트(scriptPubkey) 는 언뜻 비슷해보이지만 이 둘은 자물쇠와 열쇠의 관계이다. 해제 스크립트는 열쇠의 역할을 하며, 트랜잭션을 발생시킨 주체의 서명과 공개키를 합쳐 잠금 스크립트를 풀기 위해 작동한다. 반면 잠금 스크립트는 자물쇠의 역할을 하며, 트랜잭션을 검증하기 올바른지 검증하라는 키이다. 피투피 네트워크에서 해당 트랜잭션을 받은 노드는 이 잠금 스크립트에 해제 스크립트를 대조해서 일치하는지 확인하고 true라고 판명되면 올바른 트랜잭션이라 간주해 이웃노드로 전달한다.[2]

특징

해제 스클비트에는 시그(sig) 및 퍼브키(PubK) 또는 디지털 서명 및 공개 키가 포함되어 있으며 잠금 스크립트를 충족시키기 위해 제공되며, 해제 스크립트 및 잠금 스크립트(scriptPubKey)가 순서대로 결합 및 실행되고 해제 스크립트가 먼저 실행되도록 작동한다. 예를 들어, 밥(Bob)이 엘리스(Alice)로부터받은 1비트 코인을 사용하기로 결정한 경우 먼저 출력을 잠금 해제 해야 하고 수신자가 1비트 코인을 수신하면 잠금 이 해제 된다.[3] 해제 스크립트는 트랜잭션을 발생시킨 주체의 서명 + publicKey , 열쇠의 역할을 하고, 잠금스크립트를 풀기위한 해제 스크립트라고도 불리며, 인위적으로 만들어 낼 수 없다. 트랜잭션 발생자의 개인키가 필요한 서명이 존재하기 때문이며, 잠금 스크립트를 통해 트랜잭션을 검증하고 서명을 확인한다.[4]

해제 스크립트는 거래의 입력값에 포함 되어 있어 얼마를 보낼지 보낼 금액란에 적어 넣는다면 그 명령어에는 잠금 스크립트의 조건을 충족할 해제 스크립트가 있어 해당 비트코인 주소의 UTXO에 대한 소유권을 입증하고 그 UTXO를 소비하도록 한다. 블록체인상에서 기록되어 있는 모든 UTXO들은 그것들을 소비하기 위한 조건이 있는데 그 조건들을 스크립트로 구현한 것이 잠금 스크립트인 것이고 그 조건을 풀 수 있는 특정 입력값이 해제 스크립트인데 이 데이터가 복사되어 잠금 스크립트와 함께 연산이 실행됐을때 결과가 TRUE 값이 나오면 그 입력값은 유효해지고 UTXO를 소비할 수 있다.[5]

활용

비트코인(bitcoin)
  • 비트코인
비트코인(Bitcoin)은 스크립트라고 하는 프로그래밍 언어가 있는데, 단순하면서도 어떻게 보면 비트코인이 비트코인으로서 역할을 하게 하는 적합한 언어라고 할 수 있고, 비트코인의 모든 거래를 유효화 시키는 것이 스크립트이며, 또한 비트코인은 고정적인 패턴화된 형태의 시스템이 아니라 스크립트 언어를 통해 실행되기 때문에 무한대에 가까운 표현 가능한 조건들이 만들어질 수 있는데 이것이 비트코인이 화폐로서 역할을 하게하는 힘이다. 해제 스크립트에는 비트코인 지갑의 소유권을 인증하는 서명이 포함되어 있는데 이 서명 값과 출력값(UTXO)의 잠금 스크립트 값이 위 그림처럼 푸시연산과 팝연산을 거쳐 TRUE값이 도출되면 비트코인을 소비할 수 있어 스크립트가 비트코인 거래를 작동시키는 방법이다. 스크립트는 스택(Stack)이라 불리는 데이터 구조를 사용하는데 다음과 같다.[5]
스택1.PNG
스택의 데이터 구조이고 이 스택은 푸시(push)와 팝(pop)연산을 가능하게 하며, 푸시는 데이터 최상단에 데이터를 추가하는 연산이고 팝은 데이터 최상단에서 데이터를 제거하는 연산이다.
스택2.PNG
8을 푸시연산 하게되면 8이 들어가고 거기에 또 3과 -1을 각각 푸시하면 쌓인 데이터의 가장 위에 데이터가 쌓여 들어가는 것이고, 그와 반대로 팝 연산을 하게되면 최상단에 있는 데이터를 제거해주는 시스템이 스택 데이터 구조이며, 팝 연산에서는 더하기, 빼기, 곱하기, 나누기 등의 명령어를 넣으면 위의 그림처럼 그냥 가장 위의 데이터가 제거되는 것이 아닌 명령했던 더하기, 빼기, 곱하기, 나누기가 연산 과정을 거친 후 제거된다.
스택3.PNG
2+3을 했을때 5가 나오는지 확인을 하는 과정을 스크립팅 언어로 나타낸 것인데, 만일 +3 = 5가 잠금 스크립트 라면 2는 해제 스크립트인 것인데, 이 말은 +3을 했을때 5가 나오는 입력값인 2를 찾는 것이 잠금 스크립트의 조건을 만족하는 해제 스크립트를 찾는다.가기.png 비트코인에 대해 자세히 보기

과정

  • 거래검증
해제 스크립트는 위와같이 임의로 블럭정보를 기반으로 생성을 할수없고, 생성후 코드기반으로 확인을 할수가 없어 개인키(Private key)를 사용하여 서명(signature)을 생성해야 하고, 동일한 개인키를 사용해서 서명을 생성해도 시간변화에 따라 매번 다른 서명이 생성이 되며, 특정 개인키를 하나 할당해서 그것을 사용하여 생성하는 과정은 다음과 같다.[6]
1. 먼저 해제 스크립트를 제외한 트랜잭션 템플릿을 작성한다.
분홍색 : 입력 세그먼트, 노란색 : 출력 세그먼트
Version : 01 00 00 00
Number of Inputs : 01
Previous Tx Hash(reversed) : 41 6e 9b 45 55 18 0a aa 0c 41 70 67 a4 66 07 bc 58 c9 6f 01 31 v2 f4 1f 7d 0f b6 65 ea b0 3a 7e
Previous Output Index : 00 00 00 00
ScriptLength
ScriptSig(Unlocking script)
Sequence : ff ff ff ff
Number of Outputs 01
Value : 20 4e 00 00 00 00 00 00
Script Length : 19
ScriptPubKey(Locking Script) : 76 a9 14 e8 1d 74 2e 2c 3c 7a cd 4c 29 de 09 0f c2 c4 d4 12 0b 2b f8 88 ac
Locktime : 00 00 00 00
2. 위의 템플릿에서 비어있는 해제 스크립트 부분에는 입력에 사용하기위한 UTXO의 이전출력 잠금 스크립트를 추가하고, 템플릿에 추가로 마지막에 sigHash Code가 01 00 00 00 붙어있는것에 유의 하여야 한다.
분홍색 : 입력 세그먼트, 노란색 : 출력 세그먼트
Version : 01 00 00 00
Number of Inputs : 01
Previous Tx Hash(reversed) : 41 6e 9b 45 55 18 0a aa 0c 41 70 67 a4 66 07 bc 58 c9 6f 01 31 v2 f4 1f 7d 0f b6 65 ea b0 3a 7e
Previous Output Index : 00 00 00 00
ScriptLength : 19
ScriptPubKey of Previous Output(Pkaceholder for final scriptSig) : 76 a9 14 99 b1 eb cf c1 1a 13 df 51 61 ab a8 16 04 60 fe 16 01 d5 41 88 ac
Sequence : ff ff ff ff
Number of Outputs 01
Value : 20 4e 00 00 00 00 00 00
Script Length : 19
ScriptPubKey(Loking Script) : 76 a9 14 99 b1 eb cf c1 1a 13 df 51 61 ab a8 16 04 60 fe 16 01 d5 41 88 ac
Lokingtime : 00 00 00 00
SigHash Code : 01 00 00 00
3. 위의 16진수 트랜잭션 메시지와 개인키를 사용하여 ECC 알고리즘을 통해 서명을 생성한다.
import hash1ib, ecdsa, binascii
from ecdsa import Signingky, SECP256k1

mhex = '0100000001416e9b4555180aaa0c417067a46607bc58c96f0131b2f41f7d0fb665eab03a7e000000001976a9145

txHash = hadh1ib.sha256(hadh1ib.sha256(mhex.decode('hex')).degest()).hexdigest()
privkey = '3cd0560f5b27591916c643a0b7aa69d3839380a728d2e912990dc573715ㅇ2c'

signingkey = ecdsa.Signingkey.from_string(privey.decide('hex'), curve=ecdsa.SECP256k1)
SIG = signingkey.sign_digest(txhash, sigencode=ecdsa.util.sige.util.sige,code_ca,ize)

binascii.hexlify(SIG)
4. 이 과정을 통해 생성된 서명은 다음과 같다.
 : 304402201c3be71e1794621cbe3a7adec1af25f818f238f5796d47152137eba710f2174a02204f8fe667b696e30012ef4e56ac96
5. 생성된 서명과 개인키를 사용하여 DER포맷으로 해제 스크립트를 구성하며, R, S 데이터는 32, 33바이트가 될수있기 때문에 PUSHDATA Opcode 값은 47, 48, 49가 된다.
PUSHDATA Opcode 47
Header 30
Sig Length 44
Integer 02
R Length 20
R 1c 3b e7 1e 17 94 62 1c de 3a 7a de 3a 7a de c1 af 25 f8 18 f2 38 f5 79 6d 47 15 21 37 eb a7 10 f2 17 4a
Inedger 02
S Length 20
S 4f 8f e6 67 b6 96 e3 00 12 ef 4e 56 ac 96 af b8 30 db df fe e3 b1 5d 2e 47 40 66 ab 34 a3 9b ad
SigHash Code 01
PUSHDATA Opcode 21
Public Key(compressed with 03 prefix) 03 bf 35 0d 28 21 37 51 58 a6 08 b5 1e 3e 89 8e 50 7f e4 7f 2d 2e 8c 77 4d e4 a9 a7 ed ec f7 4e da
Header, Sig Length, Integer, R Length, R, Inedger, S Length, S ->Signature(DERencoded)
6. 해제 스크립트 부분을 위에서 최종 생성한 서명으로 교체하면 최종 트랜잭션이 완성된다.
분홍색 : 입력 세그먼트, 노란색 : 출력 세그먼트
Version : 01 00 00 00
Number of Inputs : 01
Previous Tx Hash(reversed) : 41 6e 9b 45 55 18 0a aa 0c 41 70 67 a4 66 07 bc 58 c9 6f 01 31 v2 f4 1f 7d 0f b6 65 ea b0 3a 7e
Previous Output Index : 00 00 00 00
ScriptLength : 6a
ScriptSig(Unlocking script) : 47 30 44 02 20 1c 3d e7 1e 17 94 62 1c de 3a 7a de c1 af 25 f8 18 f2 38 f5 79 6d 47 15 21 37 eb a7 10 fe 17 4a 02 20 4f 8f e6 67 b6 96 e3 00 12 ef 4e 56 ac 96 af b8 30 bd df fe e3 b1 5d 2e 47 40 66 ab 3a a3 9b ad 01 21 03 bf 35 0d 28 21 37 51 58 a6 08 b5 1e 3e 89 8e 50 7f e4 7f 2d 2e 8c 77 4d e4 a9 a7 ed ec f7 4e da
Sequence : ff ff ff ff
Number of Outputs 01
Value : 20 4e 00 00 00 00 00 00
Script Length : 19
ScriptPubKey(Loking Script) : 76 a9 14 99 b1 eb cf c1 1a 13 df 51 61 ab a8 16 04 60 fe 16 01 d5 41 88 ac
Lokingtime : 00 00 00 00

명령어

  • 스크립트 코드: PUSHDATA <sig> SIGHASH_ALL PUSHDATA <pubKey>
  1. PUSHDATA <sig > : 서명(signature)을 스택(stack)에 푸시(push) 하라는 명령어
  2. SIGHASH_ALL : 거래에 대한 모든 것이 서명되어 있음을 나타낸다.
  3. PUSHDATA <pubKey> : 공개키(public-key)를 스택에 푸시하라는 명령어

각주

참고자료

같이 보기


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