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

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

해시넷
이동: 둘러보기, 검색
34번째 줄: 34번째 줄:
  
 
: 2. 위의 템플릿에서 비어있는 해제 스크립트 부분에는 입력에 사용하기위한 UTXO의 이전출력 잠금 스크립트를 추가하고, 템플릿에 추가로 마지막에 sigHash Code가 01 00 00 00  붙어있는것에 유의 하여야 한다.
 
: 2. 위의 템플릿에서 비어있는 해제 스크립트 부분에는 입력에 사용하기위한 UTXO의 이전출력 잠금 스크립트를 추가하고, 템플릿에 추가로 마지막에 sigHash Code가 01 00 00 00  붙어있는것에 유의 하여야 한다.
 +
{{형광펜|#ffcccc|분홍색}} : 입력 세그먼트, {{형광펜|노란색}} : 출력 세그먼트
 
  Version : 01 00 00 00
 
  Version : 01 00 00 00
 
  Number of Inputs : 01
 
  Number of Inputs : 01
101번째 줄: 102번째 줄:
 
|align=center|Public Key(compressed with 03 prefix)
 
|align=center|Public Key(compressed with 03 prefix)
 
|align=center|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
 
|align=center|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
|align=center colspan=3|Header, Sig Length, Integer, R Length, R, Inedger, S Length, S  ->Signature(DERencoded)
 
 
|}
 
|}
 +
: {{글자색|Header, Sig Length, Integer, R Length, R, Inedger, S Length, S  ->Signature(DERencoded)}}
 +
 
: 6. 해제 스크립트 부분을 위에서 최종 생성한 서명으로 교체하면 최종 트랜잭션이 완성된다.
 
: 6. 해제 스크립트 부분을 위에서 최종 생성한 서명으로 교체하면 최종 트랜잭션이 완성된다.
 
+
{{형광펜|#ffcccc|분홍색}} : 입력 세그먼트, {{형광펜|노란색}} : 출력 세그먼트
 
+
Version : 01 00 00 00
 +
Number of Inputs : 01
 +
{{형광펜|#ffcccc|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|#ff0000}} 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|#ff0000}} 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|#ff0000}} {{글자색|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
  
 
== 명령어 ==
 
== 명령어 ==

2019년 9월 2일 (월) 16:53 판

해제 스크립트(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]

과정

  • 거래검증
해제 스크립트는 위와같이 임의로 블럭정보를 기반으로 생성을 할수없고, 생성후 코드기반으로 확인을 할수가 없어 개인키(Private key)를 사용하여 서명(signature)을 생성해야 하고, 동일한 개인키를 사용해서 서명을 생성해도 시간변화에 따라 매번 다른 서명이 생성이 되며, 특정 개인키를 하나 할당해서 그것을 사용하여 생성하는 과정은 다음과 같다.
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>
  • PUSHDATA <sig > : 서명을 Stack에 Push 하는 명령어
  • SIGHASH_ALL (01) : 거래에 대한 모든 것이 서명되어 있음을 나타낸다.
  • PUSHDATA <pubKey> : Public-Key를 Stack 에 Push 하라는 명령어

각주

참고자료

같이 보기


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