SlideShare a Scribd company logo
1 of 16
Download to read offline
Mastering Bitcoin 2nd Edition
Chap 6. Transactions
Song Je-Ho
qwerwon@gmail.com
트랜잭션이란?
 비트코인의 다른 모든 기능은 트랜잭션을 위해서 설계되었다고 표현해도 과언이 아닐 정도로 중
요한 요소로, 비트코인 화폐의 흐름을 나타내는 항목(entry)이다.
 위의 그림과 같이, explorer에는 트랜잭션의 해시, 보낸 이의 주소, 받는 이의 주소, 그리고 송금된
금액이 나타난다.
 그러나 실제 비트코인 네트워크에서 주고받는 트랜잭션의 실제 데이터는 위와 조금 다른 형태다.
그림1] Block explorer application에서 확인한 트랜잭션
트랜잭션이란?
 이전 페이지의 트랜잭션과 달리, 보낸 이의 주소, 받는 이의 주소, 그리고 보내는 화폐의 양이 따
로 존재하지 않는다.
 위에 빠진 내용은 모두 트랜잭션 입력/출력에 포함되어 있다.
그림2] 비트코인 클라이언트에서 명령어로 출력시킨 트랜잭션
트랜잭션 입력/출력
 비트코인은 지갑에 남아있는 ‘잔액’을 사용하는 개념이 아닌, 지금까지 다른 주소에게 받은 아직
사용하지 않은 출력인 ‘UTXO’를 소모하여 트랜잭션을 발생시킨다. UTXO는 비트코인에서 불가분
한 한 덩어리의 화폐이며, 모든 노드가 출력 가능한 입력인지 추적하기 위해 UTXO set을 유지한
다.
 지갑의 잔액이라는 개념은 지갑 어플리케이션에서 만든 개념으로, 모든 UTXO에서 해당 지갑이
사용할 수 있는 UTXO의 합을 데이터베이스로 저장한것이다.
 UTXO가 원하는 트랜잭션의 값보다 작을 경우에는 여러 UTXO를 소모하여 출력을 만들고, 반대로
UTXO가 원하는 트랜잭션의 값보다 클 경우에는 원하는 값만큼 소모하는 출력과 남은 금액(거스
름돈)을 다시 본인의 지갑으로 보내는 출력 2개를 만든다.
트랜잭션 출력
 트랜잭션의 출력은 두 개의 데이터로 이루어져 있다:
• value : Bitcoin의 양(Satoshi라는 Bitcoin에서 사용하는 가장 작은 화폐 단위로 표기)
• scriptPubKey : 스크립트(뒤 페이지에서 설명)
그림3] 그림 2의 출력 부분
그림4] 트랜잭션 출력 raw data의 구성
60e3160000000000197
6a914ab68025513c3db
d2f7b92a94e0581f5d50
f654e788acd0ef800000
0000001976a9147f9b1
a7fb68d60c536c2fd8ae
aa53a8f3cc025a888ac
Amount Size
Locking-script
트랜잭션 입력
 트랜잭션의 입력은 네 개의 데이터로 이루어져 있다:
• txid : 트랜잭션의 ID
• vout : output의 index
• scriptSig : 해당 UTXO를 사용하기 위한(scriptPubKey를 해제할) 서명
• sequence : 추후 설명
그림5] 그림2의 입력 부분
그림6] 트랜잭션 입력 raw data의 구성
186f9f998a5aa6f048e51dd8419a14d8
a0f1a8a2836dd734d2804fe65fa35779
000000008b483045022100884d142d
86652a3f47ba4746ec719bbfbd040a5
70b1deccbb6498c75c4ae24cb02204b
9f039ff08df09cbe9f6addac960298cad
530a863ea8f53982c09db8f6e381301
410484ecc0d46f1918b30928fa0e4ed9
9f16a0fb4fde0735e7ade8416ab9fe42
3cc5412336376789d172787ec3457ee
e41c04f4938de5cc17b4a10fa336a8d7
52adfffffffff
txid
vout
size
sequence
거래 수수료
거래 수수료
 거래 수수료는 비트 코인 네트워크를 안전하게 유지해주는 역할을 함.
• 거래 수수료는 모든 거래에 소액의 비용을 부과함으로써 채굴의 동기부여를 함.
• ‘스팸’ 거래나 어떠한 종류의 시스템 오용에 대해서 동기상실의 역할을 함.
트랜잭션 스크립트 언어
 트랜잭션의 입력과 출력에 사용되는 잠금/해제 스크립트는 모두 스크립트 언어로 작성됐고, 일
반적인 프로그래밍 언어와 다른 다음과 같은 특징을 갖는다.
 튜링 불완정성
• 반복문이나 복잡한 흐름의 조건문을 불가능하게 제한하여 DoS 공격을 방지한다.
 비상태(stateless) 검증
• 모든 노드에서 같은 결과를 만들기 위해서 스크립트의 실행 전후에 저장되는 상태가 없이, 오직 스크립트 안의 정보로만 수
행한다.
 스택 구조
• 비트코인 스크립트 언어는 스택이라는 데이터 구조를 사용하는 언어로 스택 기반 언어라고 불린다.
트랜잭션 스크립트 언어
 잠금 스크립트
• 스크립트는 잠금 스크립트와 해제 스크립트가 존재하는데, 잠금 스크립트는 수신자의 공개키로 암호화하기 때문에
scriptPubKey 라고 불리고, 그에 대응하는 개인키로 잠금을 해제해야 사용할 수 있다.
 해제 스크립트
• 해제 스크립트는 UTXO를 소비할 사람의 개인키를 이용한 서명(signature)이 포함되기 때문에 scriptSig 라고 불린다.
그림7] 해제 스크립트와 잠금 스크립트
트랜잭션 스크립트 예시
P2PKH (Pay-to-Public-Key-Hash)
디지털 서명(ECDSA)
 Elliptic Curve Digital Signature Algorithm(ECDSA)는 타원 곡선 개인/공개 키 쌍을 기반의 디지털 서
명 알고리즘이다. 비트코인에서 사용되는 ECDSA 기반 스크립트 함수들의 예로는:
• OP_CHECKSIG / OP_CHECKSIGVERIFY : 스택에 존재하는 공개 키와 서명이 서로 대응하는 개인/공개 키 쌍인지 확인하는 함수
• OP_CHECKMULTISIG / OP_CHECKMULTISIGVERIFY : N개의 공개키가 스크립트에 주어졌을 때, M개 이상의 서명이 제공됐는지
확인하는 함수
 이런 디지털 서명은 세 가지 용도로 사용된다.
• 개인 키 소유자가 지출을 승인했음을 증명한다.
• 본인이 서명했음을 부정하지 못하게 한다(부인 방지).
• 서명 된 후 누구도 수정할 수 없다.
디지털 서명(ECDSA)
서명의 생성
 트랜잭션 데이터의 일부와 개인 키를 사용하여 서명을 만든다.
그림8] 전자서명 생성 공식
디지털 서명(ECDSA)
서명의 생성
 트랜잭션 데이터의 일부와 개인 키를 사용하여 서명을 만든다.
그림8] 전자서명 생성 공식
임의의 숫자 k를 생성하고 k에 대응하는
공개 키P(P = k*G), 그리고 P의 x좌표에
해당하는 값 R을 이용해서 다음과 같은
S의 값을 생성한다.
𝑆 = 𝑘−1
ℎ𝑎𝑠ℎ 𝑚 + 𝑑𝐴 × 𝑅 𝑚𝑜𝑑 𝑝
디지털 서명(ECDSA)
서명의 생성
 트랜잭션 데이터의 일부와 개인 키를 사용하여 서명을 만든다.
그림8] 전자서명 생성 공식
임의의 숫자 k를 생성하고 k에 대응하는
공개 키P(P = k*G), 그리고 P의 x좌표에
해당하는 값 R을 이용해서 다음과 같은
S의 값을 생성한다.
𝑆 = 𝑘−1
ℎ𝑎𝑠ℎ 𝑚 + 𝑑𝐴 × 𝑅 𝑚𝑜𝑑 𝑝
서명은 위 식의 역 함수인 밑의 식을
통해서 구해진 P와 R이 동일함을
보임으로써 증명할 수 있다(Qa는 개인 키).
𝑃 = 𝑆−1
× ℎ𝑎𝑠ℎ(𝑚) × 𝑆−1
× 𝑅 × 𝑄𝑎
디지털 서명(ECDSA)
서명의 생성
 트랜잭션 데이터의 일부와 개인 키를 사용하여 서명을 만든다.
그림8] 전자서명 생성 공식
임의의 숫자 k를 생성하고 k에 대응하는
공개 키P(P = k*G), 그리고 P의 x좌표에
해당하는 값 R을 이용해서 다음과 같은
S의 값을 생성한다.
𝑆 = 𝑘−1
ℎ𝑎𝑠ℎ 𝑚 + 𝑑𝐴 × 𝑅 𝑚𝑜𝑑 𝑝
서명은 위 식의 역 함수인 밑의 식을
통해서 구해진 P와 R이 동일함을
보임으로써 증명할 수 있다(Qa는 개인 키).
𝑃 = 𝑆−1
× ℎ𝑎𝑠ℎ(𝑚) × 𝑆−1
× 𝑅 × 𝑄𝑎
디지털 서명(ECDSA)
해제 스크립트
 만들어진 S, R 쌍으로 다음과 같은 해제 스크립트를 전송한다.
• 0x30 – 서명의 시작을 알림
• 0x45 – 서명의 총 길이를 나타냄(69 bytes)
• 0x02 – 다음 데이터 필드의 길이(0x21)
• 0x21 – R의 길이(33 bytes)
• R - 00884d142d86652a3f47ba4746ec719bbfbd040a570b1deccbb6498c75c4ae24cb
• 0x02 – 다음 데이터 필드의 길이(0x20)
• 0x20 – S의 길이(32 bytes)
• S - 4b9f039ff08df09cbe9f6addac960298cad530a863ea8f53982c09db8f6e3813
• 0x01 – 사용된 해시 함수의 종류(SIGHASH_ALL)
3045022100884d142d86652a3f47ba4746ec719bbfbd040a570b1deccbb6498c75c4ae24cb02204b9f039ff08df09cbe9f6addac960298cad530a863ea8f53982c09db8f6e381301

More Related Content

More from 제호 송

Multisig and segwit
Multisig and segwitMultisig and segwit
Multisig and segwit제호 송
 
Cryptokitties Code Review
Cryptokitties Code ReviewCryptokitties Code Review
Cryptokitties Code Review제호 송
 
Mastering ethereum(oracle)
Mastering ethereum(oracle)Mastering ethereum(oracle)
Mastering ethereum(oracle)제호 송
 
Mastering ethereum(smart contract)
Mastering ethereum(smart contract)Mastering ethereum(smart contract)
Mastering ethereum(smart contract)제호 송
 
Mastering bitcoin chap7
Mastering bitcoin chap7Mastering bitcoin chap7
Mastering bitcoin chap7제호 송
 
Mastering bitocin chap5
Mastering bitocin chap5Mastering bitocin chap5
Mastering bitocin chap5제호 송
 
Mastering bitcoin chap1
Mastering bitcoin chap1Mastering bitcoin chap1
Mastering bitcoin chap1제호 송
 
Mastering bitcoin chap8
Mastering bitcoin chap8Mastering bitcoin chap8
Mastering bitcoin chap8제호 송
 

More from 제호 송 (9)

Multisig and segwit
Multisig and segwitMultisig and segwit
Multisig and segwit
 
About dapp
About dappAbout dapp
About dapp
 
Cryptokitties Code Review
Cryptokitties Code ReviewCryptokitties Code Review
Cryptokitties Code Review
 
Mastering ethereum(oracle)
Mastering ethereum(oracle)Mastering ethereum(oracle)
Mastering ethereum(oracle)
 
Mastering ethereum(smart contract)
Mastering ethereum(smart contract)Mastering ethereum(smart contract)
Mastering ethereum(smart contract)
 
Mastering bitcoin chap7
Mastering bitcoin chap7Mastering bitcoin chap7
Mastering bitcoin chap7
 
Mastering bitocin chap5
Mastering bitocin chap5Mastering bitocin chap5
Mastering bitocin chap5
 
Mastering bitcoin chap1
Mastering bitcoin chap1Mastering bitcoin chap1
Mastering bitcoin chap1
 
Mastering bitcoin chap8
Mastering bitcoin chap8Mastering bitcoin chap8
Mastering bitcoin chap8
 

Mastering bitcoin chap6

  • 1. Mastering Bitcoin 2nd Edition Chap 6. Transactions Song Je-Ho qwerwon@gmail.com
  • 2. 트랜잭션이란?  비트코인의 다른 모든 기능은 트랜잭션을 위해서 설계되었다고 표현해도 과언이 아닐 정도로 중 요한 요소로, 비트코인 화폐의 흐름을 나타내는 항목(entry)이다.  위의 그림과 같이, explorer에는 트랜잭션의 해시, 보낸 이의 주소, 받는 이의 주소, 그리고 송금된 금액이 나타난다.  그러나 실제 비트코인 네트워크에서 주고받는 트랜잭션의 실제 데이터는 위와 조금 다른 형태다. 그림1] Block explorer application에서 확인한 트랜잭션
  • 3. 트랜잭션이란?  이전 페이지의 트랜잭션과 달리, 보낸 이의 주소, 받는 이의 주소, 그리고 보내는 화폐의 양이 따 로 존재하지 않는다.  위에 빠진 내용은 모두 트랜잭션 입력/출력에 포함되어 있다. 그림2] 비트코인 클라이언트에서 명령어로 출력시킨 트랜잭션
  • 4. 트랜잭션 입력/출력  비트코인은 지갑에 남아있는 ‘잔액’을 사용하는 개념이 아닌, 지금까지 다른 주소에게 받은 아직 사용하지 않은 출력인 ‘UTXO’를 소모하여 트랜잭션을 발생시킨다. UTXO는 비트코인에서 불가분 한 한 덩어리의 화폐이며, 모든 노드가 출력 가능한 입력인지 추적하기 위해 UTXO set을 유지한 다.  지갑의 잔액이라는 개념은 지갑 어플리케이션에서 만든 개념으로, 모든 UTXO에서 해당 지갑이 사용할 수 있는 UTXO의 합을 데이터베이스로 저장한것이다.  UTXO가 원하는 트랜잭션의 값보다 작을 경우에는 여러 UTXO를 소모하여 출력을 만들고, 반대로 UTXO가 원하는 트랜잭션의 값보다 클 경우에는 원하는 값만큼 소모하는 출력과 남은 금액(거스 름돈)을 다시 본인의 지갑으로 보내는 출력 2개를 만든다.
  • 5. 트랜잭션 출력  트랜잭션의 출력은 두 개의 데이터로 이루어져 있다: • value : Bitcoin의 양(Satoshi라는 Bitcoin에서 사용하는 가장 작은 화폐 단위로 표기) • scriptPubKey : 스크립트(뒤 페이지에서 설명) 그림3] 그림 2의 출력 부분 그림4] 트랜잭션 출력 raw data의 구성 60e3160000000000197 6a914ab68025513c3db d2f7b92a94e0581f5d50 f654e788acd0ef800000 0000001976a9147f9b1 a7fb68d60c536c2fd8ae aa53a8f3cc025a888ac Amount Size Locking-script
  • 6. 트랜잭션 입력  트랜잭션의 입력은 네 개의 데이터로 이루어져 있다: • txid : 트랜잭션의 ID • vout : output의 index • scriptSig : 해당 UTXO를 사용하기 위한(scriptPubKey를 해제할) 서명 • sequence : 추후 설명 그림5] 그림2의 입력 부분 그림6] 트랜잭션 입력 raw data의 구성 186f9f998a5aa6f048e51dd8419a14d8 a0f1a8a2836dd734d2804fe65fa35779 000000008b483045022100884d142d 86652a3f47ba4746ec719bbfbd040a5 70b1deccbb6498c75c4ae24cb02204b 9f039ff08df09cbe9f6addac960298cad 530a863ea8f53982c09db8f6e381301 410484ecc0d46f1918b30928fa0e4ed9 9f16a0fb4fde0735e7ade8416ab9fe42 3cc5412336376789d172787ec3457ee e41c04f4938de5cc17b4a10fa336a8d7 52adfffffffff txid vout size sequence
  • 7. 거래 수수료 거래 수수료  거래 수수료는 비트 코인 네트워크를 안전하게 유지해주는 역할을 함. • 거래 수수료는 모든 거래에 소액의 비용을 부과함으로써 채굴의 동기부여를 함. • ‘스팸’ 거래나 어떠한 종류의 시스템 오용에 대해서 동기상실의 역할을 함.
  • 8. 트랜잭션 스크립트 언어  트랜잭션의 입력과 출력에 사용되는 잠금/해제 스크립트는 모두 스크립트 언어로 작성됐고, 일 반적인 프로그래밍 언어와 다른 다음과 같은 특징을 갖는다.  튜링 불완정성 • 반복문이나 복잡한 흐름의 조건문을 불가능하게 제한하여 DoS 공격을 방지한다.  비상태(stateless) 검증 • 모든 노드에서 같은 결과를 만들기 위해서 스크립트의 실행 전후에 저장되는 상태가 없이, 오직 스크립트 안의 정보로만 수 행한다.  스택 구조 • 비트코인 스크립트 언어는 스택이라는 데이터 구조를 사용하는 언어로 스택 기반 언어라고 불린다.
  • 9. 트랜잭션 스크립트 언어  잠금 스크립트 • 스크립트는 잠금 스크립트와 해제 스크립트가 존재하는데, 잠금 스크립트는 수신자의 공개키로 암호화하기 때문에 scriptPubKey 라고 불리고, 그에 대응하는 개인키로 잠금을 해제해야 사용할 수 있다.  해제 스크립트 • 해제 스크립트는 UTXO를 소비할 사람의 개인키를 이용한 서명(signature)이 포함되기 때문에 scriptSig 라고 불린다. 그림7] 해제 스크립트와 잠금 스크립트
  • 10. 트랜잭션 스크립트 예시 P2PKH (Pay-to-Public-Key-Hash)
  • 11. 디지털 서명(ECDSA)  Elliptic Curve Digital Signature Algorithm(ECDSA)는 타원 곡선 개인/공개 키 쌍을 기반의 디지털 서 명 알고리즘이다. 비트코인에서 사용되는 ECDSA 기반 스크립트 함수들의 예로는: • OP_CHECKSIG / OP_CHECKSIGVERIFY : 스택에 존재하는 공개 키와 서명이 서로 대응하는 개인/공개 키 쌍인지 확인하는 함수 • OP_CHECKMULTISIG / OP_CHECKMULTISIGVERIFY : N개의 공개키가 스크립트에 주어졌을 때, M개 이상의 서명이 제공됐는지 확인하는 함수  이런 디지털 서명은 세 가지 용도로 사용된다. • 개인 키 소유자가 지출을 승인했음을 증명한다. • 본인이 서명했음을 부정하지 못하게 한다(부인 방지). • 서명 된 후 누구도 수정할 수 없다.
  • 12. 디지털 서명(ECDSA) 서명의 생성  트랜잭션 데이터의 일부와 개인 키를 사용하여 서명을 만든다. 그림8] 전자서명 생성 공식
  • 13. 디지털 서명(ECDSA) 서명의 생성  트랜잭션 데이터의 일부와 개인 키를 사용하여 서명을 만든다. 그림8] 전자서명 생성 공식 임의의 숫자 k를 생성하고 k에 대응하는 공개 키P(P = k*G), 그리고 P의 x좌표에 해당하는 값 R을 이용해서 다음과 같은 S의 값을 생성한다. 𝑆 = 𝑘−1 ℎ𝑎𝑠ℎ 𝑚 + 𝑑𝐴 × 𝑅 𝑚𝑜𝑑 𝑝
  • 14. 디지털 서명(ECDSA) 서명의 생성  트랜잭션 데이터의 일부와 개인 키를 사용하여 서명을 만든다. 그림8] 전자서명 생성 공식 임의의 숫자 k를 생성하고 k에 대응하는 공개 키P(P = k*G), 그리고 P의 x좌표에 해당하는 값 R을 이용해서 다음과 같은 S의 값을 생성한다. 𝑆 = 𝑘−1 ℎ𝑎𝑠ℎ 𝑚 + 𝑑𝐴 × 𝑅 𝑚𝑜𝑑 𝑝 서명은 위 식의 역 함수인 밑의 식을 통해서 구해진 P와 R이 동일함을 보임으로써 증명할 수 있다(Qa는 개인 키). 𝑃 = 𝑆−1 × ℎ𝑎𝑠ℎ(𝑚) × 𝑆−1 × 𝑅 × 𝑄𝑎
  • 15. 디지털 서명(ECDSA) 서명의 생성  트랜잭션 데이터의 일부와 개인 키를 사용하여 서명을 만든다. 그림8] 전자서명 생성 공식 임의의 숫자 k를 생성하고 k에 대응하는 공개 키P(P = k*G), 그리고 P의 x좌표에 해당하는 값 R을 이용해서 다음과 같은 S의 값을 생성한다. 𝑆 = 𝑘−1 ℎ𝑎𝑠ℎ 𝑚 + 𝑑𝐴 × 𝑅 𝑚𝑜𝑑 𝑝 서명은 위 식의 역 함수인 밑의 식을 통해서 구해진 P와 R이 동일함을 보임으로써 증명할 수 있다(Qa는 개인 키). 𝑃 = 𝑆−1 × ℎ𝑎𝑠ℎ(𝑚) × 𝑆−1 × 𝑅 × 𝑄𝑎
  • 16. 디지털 서명(ECDSA) 해제 스크립트  만들어진 S, R 쌍으로 다음과 같은 해제 스크립트를 전송한다. • 0x30 – 서명의 시작을 알림 • 0x45 – 서명의 총 길이를 나타냄(69 bytes) • 0x02 – 다음 데이터 필드의 길이(0x21) • 0x21 – R의 길이(33 bytes) • R - 00884d142d86652a3f47ba4746ec719bbfbd040a570b1deccbb6498c75c4ae24cb • 0x02 – 다음 데이터 필드의 길이(0x20) • 0x20 – S의 길이(32 bytes) • S - 4b9f039ff08df09cbe9f6addac960298cad530a863ea8f53982c09db8f6e3813 • 0x01 – 사용된 해시 함수의 종류(SIGHASH_ALL) 3045022100884d142d86652a3f47ba4746ec719bbfbd040a570b1deccbb6498c75c4ae24cb02204b9f039ff08df09cbe9f6addac960298cad530a863ea8f53982c09db8f6e381301