Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Bitcoin transaction
1. Transaction
• 철수가 영희에게 1.25 bitcoin를 전달한다고 가정할 때 Transaction 생성 및 검증
과정을 설명
기본 전제
• 원리에 집중하여 설명하기위해 transaction의 일부 field는 생략하였음(locktime 등)
• 기본적으로 잠금, 해제 스크립트는 P2PK 를 전제로 함
• 서명 해시는 SIGHASH_ALL 을 전제로 함
2. Transaction 생성
1. 철수의 UTXO 파악
From
회윤
To
철수
입력 카운터: 1 출력 카운터: 1
이전 거래의 해시값(txid)
이전 거래의 인덱스
전자서명
Sequence number
0.25 bit
철수의 주소(잠금 스크립트)
TX Hash: tx02
From
회윤
To
철수
입력 카운터: 1 출력 카운터: 1
이전 거래의 해시값(txid)
이전 거래의 인덱스
전자서명
Sequence number
1 bit
철수의 주소(잠금 스크립트)
TX Hash: tx01
3. From
회윤
To
철수
Transaction (철수 -> 영희)
Transaction 생성
From
회윤
To
철수
입력 카운터: 1 출력 카운터: 1
이전 거래의 해시값(txid)
이전 거래의 인덱스
전자서명
Sequence number
0.25 bit
철수의 주소(잠금 스크립트)
TX Hash: tx02
From
회윤
To
철수
입력 카운터: 1 출력 카운터: 1
이전 거래의 해시값(txid)
이전 거래의 인덱스
전자서명
Sequence number
1 bit
철수의 주소(잠금 스크립트)
TX Hash: tx01
2. input setting
4. From
회윤
To
철수
입력 카운터: 2
이전 거래의 해시값(txid)
이전 거래의 인덱스
해제 스크립트
Sequence number
이전 거래의 해시값(txid)
이전 거래의 인덱스
해제 스크립트
Sequence number
Transaction (철수 -> 영희)
Transaction 생성
From
회윤
To
철수
입력 카운터: 1 출력 카운터: 1
이전 거래의 해시값(txid)
이전 거래의 인덱스
전자서명
Sequence number
0.25 bit
철수의 주소(잠금 스크립트)
TX Hash: tx02
From
회윤
To
철수
입력 카운터: 1 출력 카운터: 1
이전 거래의 해시값(txid)
이전 거래의 인덱스
전자서명
Sequence number
1 bit
철수의 주소(잠금 스크립트)
TX Hash: tx01
2. input setting
5. From
회윤
To
철수
입력 카운터: 2
tx01
0
해제 스크립트
ffffffff
tx02
0
해제 스크립트
ffffffff
Transaction (철수 -> 영희)
Transaction 생성
From
회윤
To
철수
입력 카운터: 1 출력 카운터: 1
이전 거래의 해시값(txid)
이전 거래의 인덱스
전자서명
Sequence number
0.25 bit
철수의 주소(잠금 스크립트)
TX Hash: tx02
From
회윤
To
철수
입력 카운터: 1 출력 카운터: 1
이전 거래의 해시값(txid)
이전 거래의 인덱스
전자서명
Sequence number
1 bit
철수의 주소(잠금 스크립트)
TX Hash: tx01
2. input setting
6. From
회윤
To
철수
입력 카운터: 2
tx01
0
해제 스크립트
ffffffff
tx02
0
해제 스크립트
ffffffff
Transaction (철수 -> 영희)
Transaction 생성
From
회윤
To
철수
입력 카운터: 1 출력 카운터: 1
이전 거래의 해시값(txid)
이전 거래의 인덱스
전자서명
Sequence number
0.25 bit
철수의 주소(잠금 스크립트)
TX Hash: tx02
From
회윤
To
철수
입력 카운터: 1 출력 카운터: 1
이전 거래의 해시값(txid)
이전 거래의 인덱스
전자서명
Sequence number
1 bit
철수의 주소(잠금 스크립트)
TX Hash: tx01
3. output setting
출력 카운터: 1
1.25bit
영희의 주소(잠금 스크립트)
7. Z Private keySig = F ( , )sig
전자서명
4. signature setting
Transaction 생성
Signature를 생성하려면, 트랜잭션의 해시 (i.e. Z) 가 필요하다.
하지만 트랜잭션 직렬화 시에 signature를 포함한다고 하면 트랜잭션의 해시를 만들기 위해서
Signature가 필요하여 무한 재귀에 빠지게 된다.
이 문제를 해결하기 위해서 signature를 포함하지 않고 Z 값을 생성한다.
8. From
회윤
To
철수
입력 카운터: 2
tx01
0
해제 스크립트
ffffffff
tx02
0
0
ffffffff
Transaction (철수 -> 영희)
Transaction 생성
From
회윤
To
철수
입력 카운터: 1 출력 카운터: 1
이전 거래의 해시값(txid)
이전 거래의 인덱스
전자서명
Sequence number
0.25 bit
철수의 주소(잠금 스크립트)
TX Hash: tx02
From
회윤
To
철수
입력 카운터: 1 출력 카운터: 1
이전 거래의 해시값(txid)
이전 거래의 인덱스
전자서명
Sequence number
1 bit
철수의 주소(잠금 스크립트)
TX Hash: tx01
4. signature setting
출력 카운터: 1
1.25bit
영희의 주소(잠금 스크립트)
9. From
회윤
To
철수
입력 카운터: 2
tx01
0
해제 스크립트
ffffffff
tx02
0
0
ffffffff
Transaction (철수 -> 영희)
Transaction 생성
From
회윤
To
철수
입력 카운터: 1 출력 카운터: 1
이전 거래의 해시값(txid)
이전 거래의 인덱스
전자서명
Sequence number
0.25 bit
철수의 주소(잠금 스크립트)
TX Hash: tx02
From
회윤
To
철수
입력 카운터: 1 출력 카운터: 1
이전 거래의 해시값(txid)
이전 거래의 인덱스
전자서명
Sequence number
1 bit
철수의 주소(잠금 스크립트)
TX Hash: tx01
출력 카운터: 1
1.25bit
영희의 주소(잠금 스크립트)
4. signature setting
10. Transaction 생성
From
회윤
To
철수
입력 카운터: 1 출력 카운터: 1
이전 거래의 해시값(txid)
이전 거래의 인덱스
전자서명
Sequence number
0.25 bit
철수의 주소(잠금 스크립트)
TX Hash: tx02
From
회윤
To
철수
입력 카운터: 1 출력 카운터: 1
이전 거래의 해시값(txid)
이전 거래의 인덱스
전자서명
Sequence number
1 bit
TX Hash: tx01
From
회윤
To
철수
입력 카운터: 2
tx01
0
해제 스크립트
ffffffff
tx02
0
0
ffffffff
Transaction (철수 -> 영희)
철수의 주소(잠금 스크립트)
출력 카운터: 1
1.25bit
영희의 주소(잠금 스크립트)
4. signature setting
11. Transaction 생성
From
회윤
To
철수
입력 카운터: 1 출력 카운터: 1
이전 거래의 해시값(txid)
이전 거래의 인덱스
전자서명
Sequence number
0.25 bit
철수의 주소(잠금 스크립트)
TX Hash: tx02
From
회윤
To
철수
입력 카운터: 1 출력 카운터: 1
이전 거래의 해시값(txid)
이전 거래의 인덱스
전자서명
Sequence number
1 bit
TX Hash: tx01
4. signature setting
From
회윤
To
철수
입력 카운터: 2
tx01
0
해제 스크립트
ffffffff
tx02
0
0
ffffffff
Transaction (철수 -> 영희)
철수의 주소(잠금 스크립트)
출력 카운터: 1
1.25bit
영희의 주소(잠금 스크립트)
SIGHASH_ALL
12. Transaction 생성
4. signature setting
Hash
fuction
Transaction hash (i.e. Z)
From
회윤
To
철수
입력 카운터: 2
tx01
0
해제 스크립트
ffffffff
tx02
0
0
ffffffff
Transaction (철수 -> 영희)
철수의 주소(잠금 스크립트)
출력 카운터: 1
1.25bit
영희의 주소(잠금 스크립트)
SIGHASH_ALL
13. Transaction 생성
Hash
fuction
Transaction hash (i.e. Z)
Z Private keySig = F ( , )sig
전자서명
4. signature setting
From
회윤
To
철수
입력 카운터: 2
tx01
0
해제 스크립트
ffffffff
tx02
0
0
ffffffff
Transaction (철수 -> 영희)
철수의 주소(잠금 스크립트)
출력 카운터: 1
1.25bit
영희의 주소(잠금 스크립트)
SIGHASH_ALL
14. From
회윤
To
철수
입력 카운터: 2
tx01
0
해제 스크립트
ffffffff
tx02
0
해제 스크립트
ffffffff
Transaction (철수 -> 영희)
Transaction 생성
From
회윤
To
철수
입력 카운터: 1 출력 카운터: 1
이전 거래의 해시값(txid)
이전 거래의 인덱스
전자서명
Sequence number
0.25 bit
철수의 주소(잠금 스크립트)
TX Hash: tx02
From
회윤
To
철수
입력 카운터: 1 출력 카운터: 1
이전 거래의 해시값(txid)
이전 거래의 인덱스
전자서명
Sequence number
1 bit
철수의 주소(잠금 스크립트)
TX Hash: tx01
출력 카운터: 1
1.25bit
영희의 주소(잠금 스크립트)
전자서명
4. signature setting
15. From
회윤
To
철수
입력 카운터: 2
tx01
0
해제 스크립트
ffffffff
tx02
0
해제 스크립트
ffffffff
Transaction (철수 -> 영희)
Transaction 생성
From
회윤
To
철수
입력 카운터: 1 출력 카운터: 1
이전 거래의 해시값(txid)
이전 거래의 인덱스
전자서명
Sequence number
0.25 bit
철수의 주소(잠금 스크립트)
TX Hash: tx02
From
회윤
To
철수
입력 카운터: 1 출력 카운터: 1
이전 거래의 해시값(txid)
이전 거래의 인덱스
전자서명
Sequence number
1 bit
철수의 주소(잠금 스크립트)
TX Hash: tx01
출력 카운터: 1
1.25bit
영희의 주소(잠금 스크립트)
전자서명
SIGHASH_ALL
4. signature setting
16. Transaction 생성
From
회윤
To
철수
입력 카운터: 1 출력 카운터: 1
이전 거래의 해시값(txid)
이전 거래의 인덱스
전자서명
Sequence number
0.25 bit
철수의 주소(잠금 스크립트)
TX Hash: tx02
From
회윤
To
철수
입력 카운터: 1 출력 카운터: 1
이전 거래의 해시값(txid)
이전 거래의 인덱스
전자서명
Sequence number
1 bit
철수의 주소(잠금 스크립트)
TX Hash: tx01
From
회윤
To
철수
입력 카운터: 2
tx01
0
해제 스크립트
ffffffff
tx02
0
해제 스크립트
ffffffff
Transaction (철수 -> 영희)
출력 카운터: 1
1.25bit
영희의 주소(잠금 스크립트)
전자서명
SIGHASH_ALL
전자서명
SIGHASH_ALL
4. signature setting
17. Transaction 검증
1. 기본 검증
• 각 input이 가리키는 output은 UTXO가 맞는가?
• Sum of Input >= Sum of output
• ETC..
From
회윤
To
철수
입력 카운터: 2
tx01
0
해제 스크립트
ffffffff
tx02
0
해제 스크립트
ffffffff
Transaction (철수 -> 영희)
출력 카운터: 1
1.25bit
영희의 주소(잠금 스크립트)
전자서명
SIGHASH_ALL
전자서명
SIGHASH_ALL
18. Transaction 검증
2. Script 검증
• 각 input에 대한 script 검증
Verify( sig(r, s), z, public key )
전자서명
True or False
각 Node는 Z를 직접 생성하여 검증
19. Transaction 검증
From
회윤
To
철수
입력 카운터: 2
tx01
0
해제 스크립트
ffffffff
tx02
0
해제 스크립트
ffffffff
Transaction (철수 -> 영희)
출력 카운터: 1
1.25bit
영희의 주소(잠금 스크립트)
전자서명
SIGHASH_ALL
전자서명
SIGHASH_ALL
2.1 SIGHASH 확인
각각 검증
20. Transaction 검증
From
회윤
To
철수
입력 카운터: 2
tx01
0
해제 스크립트
ffffffff
tx02
0
해제 스크립트
ffffffff
Transaction (철수 -> 영희)
출력 카운터: 1
1.25bit
영희의 주소(잠금 스크립트)
전자서명
SIGHASH_ALL
전자서명
SIGHASH_ALL
2.1 SIGHASH 확인
21. Transaction 검증
2.1 SIGHASH 확인
From
회윤
To
철수
입력 카운터: 2
tx01
0
해제 스크립트
ffffffff
tx02
0
해제 스크립트
ffffffff
Transaction (철수 -> 영희)
출력 카운터: 1
1.25bit
영희의 주소(잠금 스크립트)
전자서명
SIGHASH_ALL
전자서명
SIGHASH_ALL
22. Transaction 검증
2.2 Z 생성
From
회윤
To
철수
입력 카운터: 2
tx01
0
해제 스크립트
ffffffff
tx02
0
해제 스크립트
ffffffff
Transaction (철수 -> 영희)
출력 카운터: 1
1.25bit
영희의 주소(잠금 스크립트)
전자서명
SIGHASH_ALL
전자서명
SIGHASH_ALL
전체를 직렬화!
23. Transaction 검증
From
회윤
To
철수
입력 카운터: 2
tx01
0
해제 스크립트
ffffffff
tx02
0
ffffffff
Transaction (철수 -> 영희)
출력 카운터: 1
1.25bit
영희의 주소(잠금 스크립트)
전자서명
SIGHASH_ALL
0
2.2 Z 생성
24. Transaction 검증
From
회윤
To
철수
입력 카운터: 2
tx01
0
ffffffff
tx02
0
ffffffff
Transaction (철수 -> 영희)
출력 카운터: 1
1.25bit
영희의 주소(잠금 스크립트)
0
철수의 주소(잠금 스크립트)
2.2 Z 생성
25. Transaction 검증
2.2 Z 생성
From
회윤
To
철수
입력 카운터: 2
tx01
0
ffffffff
tx02
0
ffffffff
Transaction (철수 -> 영희)
출력 카운터: 1
1.25bit
영희의 주소(잠금 스크립트)
0
철수의 주소(잠금 스크립트)
SIGHASH_ALL
26. Transaction 검증
2.3 script 실행 및 검증
Hash
fuction
Transaction hash (i.e. Z)
Verify( sig(r, s), z, public key )
전자서명
From
회윤
To
철수
입력 카운터: 2
tx01
0
ffffffff
tx02
0
ffffffff
Transaction (철수 -> 영희)
출력 카운터: 1
1.25bit
영희의 주소(잠금 스크립트)
0
철수의 주소(잠금 스크립트)
SIGHASH_ALL
27. Transaction 검증
Hash
fuction
Transaction hash (i.e. Z)
True
Verify( sig(r, s), z, public key )
전자서명
2.3 script 실행 및 검증
From
회윤
To
철수
입력 카운터: 2
tx01
0
ffffffff
tx02
0
ffffffff
Transaction (철수 -> 영희)
출력 카운터: 1
1.25bit
영희의 주소(잠금 스크립트)
0
철수의 주소(잠금 스크립트)
SIGHASH_ALL
28. Transaction 검증
Hash
fuction
Transaction hash (i.e. Z)
True
Verify( sig(r, s), z, public key )
전자서명
2.3 script 실행 및 검증
From
회윤
To
철수
입력 카운터: 2
tx01
0
ffffffff
tx02
0
ffffffff
Transaction (철수 -> 영희)
출력 카운터: 1
1.25bit
영희의 주소(잠금 스크립트)
0
철수의 주소(잠금 스크립트)
SIGHASH_ALL
Verified!