잠금 스크립트 편집하기

이동: 둘러보기, 검색

경고: 로그인하지 않았습니다. 편집을 하면 IP 주소가 공개되게 됩니다. 로그인하거나 계정을 생성하면 편집자가 아이디(ID)으로 기록되고, 다른 장점도 있습니다.

편집을 되돌릴 수 있습니다. 이 편집을 되돌리려면 아래의 바뀐 내용을 확인한 후 저장해주세요.
최신판 당신의 편집
7번째 줄: 7번째 줄:
 
# 해제 스크립트 : 잠금 스크립트가 출력값에 걸어둔 조건을 해결해 출력값이 소비될 수 있도록 하는 스크립트
 
# 해제 스크립트 : 잠금 스크립트가 출력값에 걸어둔 조건을 해결해 출력값이 소비될 수 있도록 하는 스크립트
  
[[블록체인]]상에서 기록되어 있는 모든 [[UTXO]]들은 그것을 소비하기 위한 조건이 있는데, 그 조건들을 스크립트로 구현한 것이 잠금 스크립트이다. 스크립트퍼브키라고도 불리는 잠금 스크립트는 UTXO를 소비하기 위한 요건을 명시하고 있으며, 공개키 또는 비트코인 주소를 포함한다. 그 이유는 UTXO가 특정 지갑에서 소유하고 있는 비트코인 덩어리기 때문에 이 소비 요건에 비트코인 주소와 공개키도 포함하기 때문이다. 따라서 해당 지갑주소를 포함하는 이 잠금 스크립트를 풀 수 있는 조건을 달성하면 해당 지갑주소에서 UTXO를 소비할 수 있게 된다.<ref name="끙">jsralph, 〈[https://steemit.com/kr/@jsralph/67ifzs-1 쉽게 설명하는 블록체인, 스크립트란 뭔가요? (비트코인의 언어)]〉, 《스팀잇》</ref>
+
[[블록체인]]상에서 기록되어 있는 모든 [[UTXO]]들은 그것을 소비하기 위한 조건이 있는데, 그 조건들을 스크립트로 구현한 것이 잠금 스크립트이다. 스크립트퍼브키라고도 불리는 잠금 스크립트는 UTXO를 소비하기 위한 요건을 명시하고 있으며, 공개키 또는 비트코인 주소를 포함한다. 그 이유는 UTXO가 특정 지갑에서 소유하고 있는 비트코인 덩어리기 때문에 이 소비 요건에 비트코인 주소와 공개키도 포함하기 때문이다. 따라서 해당 지갑주소를 포함하는 이 잠금 스크립트를 풀 수 있는 조건을 달성하면 해당 지갑주소에서 UTXO를 소비할 수 있게 된다.<ref name="끙"></ref>
  
 
잠금 스크립트와 [[해제 스크립트]](scriptSig)는 언뜻 비슷해보이지만 이 둘은 열쇠와 자물쇠의 관계이다. 잠금 스크립트는 자물쇠의 역할을 하며, [[트랜잭션]]을 검증하기 올바른지 검증하라는 키이다. 반면 해제 스크립트는 열쇠의 역할을 하며, 트랜잭션을 발생시킨 주체의 서명과 공개키를 합쳐 잠금 스크립트를 풀기 위해 작동한다. [[피투피]] [[네트워크]]에서 해당 트랜잭션을 받은 [[노드]]는 이 잠금 스크립트에 해제 스크립트를 대조해서 일치하는지 확인하고 true라고 판명되면 올바른 트랜잭션이라 간주해 이웃노드로 전달한다.<ref name="황">niipoong, 〈[https://steemit.com/kr/@niipoong/scriptsig-scriptpubkey 비트코인 스크립트와 디지털 서명, 검증 (scriptSig, scriptPubKey )]〉, 《스팀잇》</ref>
 
잠금 스크립트와 [[해제 스크립트]](scriptSig)는 언뜻 비슷해보이지만 이 둘은 열쇠와 자물쇠의 관계이다. 잠금 스크립트는 자물쇠의 역할을 하며, [[트랜잭션]]을 검증하기 올바른지 검증하라는 키이다. 반면 해제 스크립트는 열쇠의 역할을 하며, 트랜잭션을 발생시킨 주체의 서명과 공개키를 합쳐 잠금 스크립트를 풀기 위해 작동한다. [[피투피]] [[네트워크]]에서 해당 트랜잭션을 받은 [[노드]]는 이 잠금 스크립트에 해제 스크립트를 대조해서 일치하는지 확인하고 true라고 판명되면 올바른 트랜잭션이라 간주해 이웃노드로 전달한다.<ref name="황">niipoong, 〈[https://steemit.com/kr/@niipoong/scriptsig-scriptpubkey 비트코인 스크립트와 디지털 서명, 검증 (scriptSig, scriptPubKey )]〉, 《스팀잇》</ref>
14번째 줄: 14번째 줄:
 
트랜잭션 출력 스크립트에서는 공개키 또는 [[해시]]를 담고 있으며, 상응하는 개인 키의 소유주만이 출력된 비트코인을 얻을 수 있다. 내부적으로 비트코인 프로토콜은 잠금 스크립트를 통해 비트코인의 수신자를 식별한다. 잠금 스크립트는 비트코인 주소와 관련이 없는 것으로 보이지만 공개 키의 해시를 표시하는데, 비트코인 주소는 주소를 사용할 네트워크와 공개 키의 해시를 식별하는 버전 [[바이트]](byte)로 구성되며, 잠금 스크립트 및 네트워크 식별자에서 비트코인 주소를 생성할 수 있다.<ref>knocte, 〈[https://programmingblockchain.gitbook.io/programmingblockchain/bitcoin_transfer/payment_script ScriptPubKey {# payment-script}]〉, 《깃허브》 </ref>
 
트랜잭션 출력 스크립트에서는 공개키 또는 [[해시]]를 담고 있으며, 상응하는 개인 키의 소유주만이 출력된 비트코인을 얻을 수 있다. 내부적으로 비트코인 프로토콜은 잠금 스크립트를 통해 비트코인의 수신자를 식별한다. 잠금 스크립트는 비트코인 주소와 관련이 없는 것으로 보이지만 공개 키의 해시를 표시하는데, 비트코인 주소는 주소를 사용할 네트워크와 공개 키의 해시를 식별하는 버전 [[바이트]](byte)로 구성되며, 잠금 스크립트 및 네트워크 식별자에서 비트코인 주소를 생성할 수 있다.<ref>knocte, 〈[https://programmingblockchain.gitbook.io/programmingblockchain/bitcoin_transfer/payment_script ScriptPubKey {# payment-script}]〉, 《깃허브》 </ref>
  
UTXO를 기본 단위로 거래하며 출력값에 잠금 스크립트, 입력값에 해제 스크립트가 들어가고, 출력값은 잠금 스크립트로 잠겨져 있으며 받는 사람은 자신의 [[서명]]이 들어간 해제 스크립트로 잠금장치를 풀어야 받은 돈을 사용할 수 있다.<ref>feyee95, 〈[https://steemit.com/kr/@feyee95/7-2 비트코인 스크립트 언어의 장점과 한계]〉, 《스팀잇》</ref> 잠금 스크립트는 UTXO를 소비하기 위한 요건을 명시하고 있고 그뿐 아니라 공개키 또는 비트코인 주소를 포함한다. 특정 지갑에서 소유하고 있는 비트코인 덩어리로 소비 요건에 비트코인 주소와 공개키도 포함하며, 해당 지갑 주소를 포함하는 잠금 스크립트를 풀 수 있는 조건을 달성하면 해당 지갑 주소에서 UTXO를 소비할 수 있다.<ref name="끙"></ref>
+
UTXO를 기본 단위로 거래하며 출력값에 잠금 스크립트, 입력값에 해제 스크립트가 들어가고, 출력값은 잠금 스크립트로 잠겨져 있으며 받는 사람은 자신의 [[서명]]이 들어간 해제 스크립트로 잠금장치를 풀어야 받은 돈을 사용할 수 있다.<ref>feyee95, 〈[https://steemit.com/kr/@feyee95/7-2 비트코인 스크립트 언어의 장점과 한계]〉, 《스팀》</ref> 잠금 스크립트는 UTXO를 소비하기 위한 요건을 명시하고 있고 그뿐 아니라 공개키 또는 비트코인 주소를 포함한다. 특정 지갑에서 소유하고 있는 비트코인 덩어리로 소비 요건에 비트코인 주소와 공개키도 포함하며, 해당 지갑 주소를 포함하는 잠금 스크립트를 풀 수 있는 조건을 달성하면 해당 지갑 주소에서 UTXO를 소비할 수 있다.<ref name="끙"></ref>
  
 
== 활용 ==
 
== 활용 ==
35번째 줄: 35번째 줄:
 
# 밥(해제 스크립트의 서명)이 빈 [[스택]]에 추가된다. [[데이터]]이기 때문에 스택에 추가하는 것 외에는 아무것도 수행되지 않으며, 공개키는 서명의 최상부에 추가된다.
 
# 밥(해제 스크립트의 서명)이 빈 [[스택]]에 추가된다. [[데이터]]이기 때문에 스택에 추가하는 것 외에는 아무것도 수행되지 않으며, 공개키는 서명의 최상부에 추가된다.
 
# 엘리스의 잠금 스크립트에서 OP_DUP 작업이 실행된다. OP_DUP은 현재 스택 상단에 있는 데이터의 복사본을 스택에 추가한다. 이 경우 밥이 제공한 공개 키의 복사본을 만든다.
 
# 엘리스의 잠금 스크립트에서 OP_DUP 작업이 실행된다. OP_DUP은 현재 스택 상단에 있는 데이터의 복사본을 스택에 추가한다. 이 경우 밥이 제공한 공개 키의 복사본을 만든다.
# 다음에 실행되는 연산 OP_HASH 160은 현재 스택 상단에 있는 데이터의 해시(이 경우 밥의 공개 키)를 스택에 추가한다. 이는 밥의 공개 키 해시를 만든다.<ref>KIM JUN YONG
+
# 다음에 실행되는 연산 OP_HASH 160은 현재 스택 상단에 있는 데이터의 해시(이 경우 밥의 공개 키)를 스택에 추가한다. 이는 밥의 공개 키 해시를 만든다.
, 〈[https://medium.com/landingblock-korea/%EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8%EC%9D%84-%EC%95%8C%EA%B8%B0-%EC%A0%84%EC%97%90-%EC%95%8C%EC%95%84%EC%95%BC-%ED%95%A0-%EC%95%94%ED%98%B8%ED%95%99-87fd8cecd455 블록체인을 알기 전에 알아야 할 "암호학"]〉, 《미디엄》, 2018-11-14</ref>
 
 
# 엘리스의 잠금 스크립트는 밥이 첫 번째 트랜잭션에 대해 준 잠금 퍼브키 해시를 추가한다. 이 시점에서 스택 맨 위에 밥의 퍼브키 해시 복사본이 두 개 있어야 한다.
 
# 엘리스의 잠금 스크립트는 밥이 첫 번째 트랜잭션에 대해 준 잠금 퍼브키 해시를 추가한다. 이 시점에서 스택 맨 위에 밥의 퍼브키 해시 복사본이 두 개 있어야 한다.
 
# 엘리스의 잠금 스크립트는 OP_EQUALVERIFY를 실행한다. OP_EQUALVERIFY는 OP_EQUAL을 실행 한 다음 OP_VERIFY를 실행하는 것과 같다. OP_EQUAL은 스택의 맨 위에 있는 두 값을 확인한다. 이 경우, 제공된 전체 공개 키 밥에서 생성된 퍼브키 해시가 트랜잭션 # 1을 생성할 때 제공된 퍼브키 해시 엘리스와 동일한지 확인한다. OP_EQUAL은 비교한 두 개의 값을 스택 상단에서 제거하고 비교 결과로 대체한다. OP_VERIFY는 스택의 맨 위에 있는 값을 확인한다. 값이 0 (거짓)이라면 즉시 평가가 종료되고 트랜잭션 유효성 검사가 실패한다. 그렇지 않으면 스택에서 실제 값을 팝한다.
 
# 엘리스의 잠금 스크립트는 OP_EQUALVERIFY를 실행한다. OP_EQUALVERIFY는 OP_EQUAL을 실행 한 다음 OP_VERIFY를 실행하는 것과 같다. OP_EQUAL은 스택의 맨 위에 있는 두 값을 확인한다. 이 경우, 제공된 전체 공개 키 밥에서 생성된 퍼브키 해시가 트랜잭션 # 1을 생성할 때 제공된 퍼브키 해시 엘리스와 동일한지 확인한다. OP_EQUAL은 비교한 두 개의 값을 스택 상단에서 제거하고 비교 결과로 대체한다. OP_VERIFY는 스택의 맨 위에 있는 값을 확인한다. 값이 0 (거짓)이라면 즉시 평가가 종료되고 트랜잭션 유효성 검사가 실패한다. 그렇지 않으면 스택에서 실제 값을 팝한다.
43번째 줄: 42번째 줄:
  
 
* '''P2SH 스크립트'''(pay-to-script-hash)
 
* '''P2SH 스크립트'''(pay-to-script-hash)
: 수신자는 스크립트 조건에 주의를 기울이고 원하는 경우 지출자에게 잠금 스크립트 사용을 요청할 수 있고, 짧은 비트코인 주소보다 덜 편리하며 [[BIP70]] 지불 [[프로토콜]]을 광범위하게 구현하기 전에 프로그램 간에 이를 통신하는 표준 방법이 없어 P2SH 트랜잭션을 작성하여 스크립트 해시가 포함된 잠금 스크립트인 [[리딤]](redeem) 스크립트를 만들었다. [[P2SH]] 워크 플로는 P2PKH 워크 플로와 거의 동일하고, 밥은 원하는 스크립트로 리딤 스크립트를 생성하고 사용 스크립트를 해시하며 엘리스에 사용 스크립트 해시를 제공하며, 엘리스는 밥의 상환 스크립트 해시가 포함된 P2SH 스타일 출력을 만든다.<ref>안성주지몬, 〈[https://potensj.tistory.com/59 (Mastering Bitcoin) 마스터링 비트코인 내 맘대로 정리 - Ch07]〉, 《티스토리》, 2019-01-28</ref>
+
: 수신자는 스크립트 조건에 주의를 기울이고 원하는 경우 지출자에게 잠금 스크립트 사용을 요청할 수 있고, 짧은 비트코인 주소보다 덜 편리하며 [[BIP70]] 지불 [[프로토콜]]을 광범위하게 구현하기 전에 프로그램 간에 이를 통신하는 표준 방법이 없어 P2SH 트랜잭션을 작성하여 스크립트 해시가 포함된 잠금 스크립트인 [[리딤]](redeem) 스크립트를 만들었다. [[P2SH]] 워크 플로는 P2PKH 워크 플로와 거의 동일하고, 밥은 원하는 스크립트로 리딤 스크립트를 생성하고 사용 스크립트를 해시하며 엘리스에 사용 스크립트 해시를 제공하며, 엘리스는 밥의 상환 스크립트 해시가 포함된 P2SH 스타일 출력을 만든다.
  
 
: [[파일:P2sh1.PNG]]
 
: [[파일:P2sh1.PNG]]
140번째 줄: 139번째 줄:
 
: 해시값을 [[개인 키]](private-key)로 서명하여 [[DER]] 형식으로 된 서명 값을 생성하고, 개인 키로부터 [[공개키]](public-key) 값을 생성하고, 관련 정보를 추가하여  해제 스크립트값을 완성한다. "unsigned raw Transaction data" 에 있던 첫 번째 잠금 스트립트 값을 해제 스트립트 값으로 바꾸고(replace), 스크립트 길이(script length) 값도 바꾼다. 그리고 마지막에 있던 4바이트-해시 유형인 01000000을 제거하면, 서명 값이 들어간 거래, 트랜잭션 데이터가 완성된다.
 
: 해시값을 [[개인 키]](private-key)로 서명하여 [[DER]] 형식으로 된 서명 값을 생성하고, 개인 키로부터 [[공개키]](public-key) 값을 생성하고, 관련 정보를 추가하여  해제 스크립트값을 완성한다. "unsigned raw Transaction data" 에 있던 첫 번째 잠금 스트립트 값을 해제 스트립트 값으로 바꾸고(replace), 스크립트 길이(script length) 값도 바꾼다. 그리고 마지막에 있던 4바이트-해시 유형인 01000000을 제거하면, 서명 값이 들어간 거래, 트랜잭션 데이터가 완성된다.
  
: ECC 암호 알고리즘에서는 공개키를 2개(X값, Y값) 사용하며, 서명 값도 2개(X값, Y값 ==> R 값, S값) 만들어지는데 특징으로 인해, 개인 키는 256-비트이지만, 서명 값과 공개키는 각각 512-비트라고 한다. 서명 값과 공개키 값은 해제 스크립트 안에 들어 있고, 공개키는 비압축(Uncompressed) 형식과 압축(Compressed) 형식 2가지로 표현할 수 있다. <ref>AEP코리아네트, 〈[http://a.to/193EW0M 비트코인 시스템에서 사용하는 암호 기술(II) - 거래 검증]〉, 《네이버 블로그》, 2017-12-21 </ref>
+
: ECC 암호 알고리즘에서는 공개키를 2개(X값, Y값) 사용하며, 서명 값도 2개(X값, Y값 ==> R 값, S값) 만들어지는데 특징으로 인해, 개인 키는 256-비트이지만, 서명 값과 공개키는 각각 512-비트라고 한다. 서명 값과 공개키 값은 해제 스크립트 안에 들어 있고, 공개키는 비압축(Uncompressed) 형식과 압축(Compressed) 형식 2가지로 표현할 수 있다. <ref>AEP코리아네트, 〈[http://a.to/193EW0M 비트코인 시스템에서 사용하는 암호 기술(II) - 거래 검증]〉, 《네이버》, 2017-12-21 </ref>
 
  Uncompressed Form :  04 <X> <Y>
 
  Uncompressed Form :  04 <X> <Y>
 
  Compressed Form    :  02 <X>  When <Y> is even
 
  Compressed Form    :  02 <X>  When <Y> is even
157번째 줄: 156번째 줄:
 
== 참고자료 ==
 
== 참고자료 ==
 
* 비트코인 개발자가이드 공식 홈페이지 - https://wikidocs.net/14505
 
* 비트코인 개발자가이드 공식 홈페이지 - https://wikidocs.net/14505
* easyblockchain, 〈[http://a.to/19SX4y9 쉽게 설명하는 블록체인:비트코인의 언너 '스크립트 Script)']〉, 《뱅크샐러드》, 2018-07-02
+
* easyblockchain, 〈[http://a.to/19SX4y9 쉽게 설명하는 블록체인:비트코인의 언너 '스크립트 Script)']〉, 《banksalad》, 2018-07-02
 
* 〈[https://www.mycryptopedia.com/scriptpubkey-scriptsig/ scriptPubKey 및 scriptSig 설명]〉, 《MYCRYPTOPEDIA》, 2018-10-30
 
* 〈[https://www.mycryptopedia.com/scriptpubkey-scriptsig/ scriptPubKey 및 scriptSig 설명]〉, 《MYCRYPTOPEDIA》, 2018-10-30
* niipoong, 〈[https://steemit.com/kr/@niipoong/scriptsig-scriptpubkey 비트코인 스크립트와 디지털 서명, 검증 (scriptSig, scriptPubKey )]〉, 《스팀잇》
+
* niipoong, 〈[https://steemit.com/kr/@niipoong/scriptsig-scriptpubkey 비트코인 스크립트와 디지털 서명, 검증 (scriptSig, scriptPubKey )]〉, 《스팀》
 
* 니르바나, 〈[https://ihpark92.tistory.com/59 트랜잭션 검증을 위한 scriptPubKey와 scriptSig 생성하기]〉, 《티스토리》
 
* 니르바나, 〈[https://ihpark92.tistory.com/59 트랜잭션 검증을 위한 scriptPubKey와 scriptSig 생성하기]〉, 《티스토리》
 
* knocte, 〈[https://programmingblockchain.gitbook.io/programmingblockchain/bitcoin_transfer/payment_script ScriptPubKey {# payment-script}]〉, 《깃허브》
 
* knocte, 〈[https://programmingblockchain.gitbook.io/programmingblockchain/bitcoin_transfer/payment_script ScriptPubKey {# payment-script}]〉, 《깃허브》
* 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
+
* AEP코리아네트, 〈[http://a.to/193EW0M 비트코인 시스템에서 사용하는 암호 기술(II) - 거래 검증]〉, 《네이버》, 2017-12-21
  
 
== 같이 보기 ==
 
== 같이 보기 ==

해시넷에서의 모든 기여는 다른 기여자가 편집, 수정, 삭제할 수 있다는 점을 유의해 주세요. 만약 여기에 동의하지 않는다면, 문서를 저장하지 말아 주세요.
또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다 (자세한 사항은 해시넷:저작권 문서를 보세요). 저작권이 있는 내용을 허가 없이 저장하지 마세요!

취소 | 편집 도움말 (새 창에서 열림)