SlideShare a Scribd company logo
1 of 47
Download to read offline
Mastering Bitcoin
Chap 8. 채굴과 합의
Song Je-Ho
qwerwon@gmail.com
채굴이란 무엇인가?
채굴( Mining )
 새로운 비트코인이 통화 공급량에 추가되는 과정
 채굴자들은 비트코인 네트워크에 처리 능력을 제공하여 블록을 생성해주고, 그 대가로 비트코인
(통화 발행량 + 거래 수수료)을 받는다.
 단순한 인센티브를 얻기위한 프로세스가 아니라, 분산화된 네트워크에서 거래를 검증하고 모든
참여자가 합의를 이룰 수 있도록 해주는 수단이다.
 이러한 검증 작업에 인센티브를 부과하여 참여자로 하여금 자율적으로 검증 작업에 참여하도록
유도한다.
채굴 보상
통화 발행
 비트코인에서는 약 10분마다 생성되는 블록에서 통화 발행이 일어난다(초기 50비트코인).
 210,000개의 블록(약 4년)마다 통화량은 절반으로 감소하고(현재 12.5비트코인 발행), 13,440,00
개의 블록이 생성되는 야 2140년경에는 2,100만 비트코인 전부가 발행되고 더 이상 새로운 비트
코인이 발행되지 않는다(채굴 작업은 계속 진행, 채굴자는 거래 수수료만 얻게 된다).
그림1] main.cpp의 블록 보상금을 return해주는 함수
매 210,000 블록마다 채굴 보상이
절반씩 줄어든다(binary shift)
분산 합의
합의 과정의 필요성
 기존의 중앙 기관을 보유하고 있는 신뢰 모델에서는 서비스를 제공하는 중앙 통제 기관의 판단
에 따라서 모든 프로세스가 처리되었다.
 그러나 모든 참여자(풀 노드)가 동등한 권한을 갖는 비트코인에서는 중앙 기관이 없기 때문에 어
떤 과정(트랜잭션)에 대하여 모든 네트워크가 동일한 결론에 도달할 수단인 ‘합의‘ 프로세스가
필요하다.
 “투표와 같이 명시적인 합의가 이루어지지 않기 때문에 ‘도출적(emergent)’이라는 단어를 사용
했으며, 이는 합의가 일어나는 정확한 시점이나 선출 과정이 없다는 것을 의미한다.”
분산 합의
합의 과정
 각 노드별로 트랜잭션을 독립적으로 검증
Tx 검증
Tx 검증
Tx 검증 Tx 검증
Tx 검증
Tx 검증
분산 합의
거래의 독립적 검증(체크 리스트)
 거래의 구문과 데이터 구조가 정확해야한다.
 입력값이나 출력값 목록이 비어 있지 않다.
 바이트 단위의 거래 크기가 MAX_BLOCK_SIZE보다 작다.
 출력값 금액과 노드의 총 금액이 허용된 가치 범위(0보다 크고 2,100만 비트코인보다 작음) 내에
있어야 한다.
 입력값 중 해시값은 0, N값은 -1이어서는 안된다.
 nLOCKTime 은 INT_MAX보다 작거나 동일해야 한다.
 바이트 단위의 거래 크기가 100보다 크거나 동일해야 한다.
 거래에 담겨있는 서명 작업 건수가 서명 작업 한도 내에 있어야 한다.
 해제 스크립트는 스택 상부에 숫자를 추가할 수만 있고 잠금 스크립트는 isStandard 형태와 일치
해야한다.
 풀이나 메인 브랜치에 있는 블록에 짝을 이루는 거래가 존재해야 한다.
 각각의 입력값에 대해, 참조 출력값이 풀 내의 어떠한 거래 내부에 존재한다면 해당 거래는 거부
되어야 한다.
분산 합의
거래의 독립적 검증(체크 리스트)
 거래의 구문과 데이터 구조가 정확해야한다.
 입력값이나 출력값 목록이 비어 있지 않다.
 바이트 단위의 거래 크기가 MAX_BLOCK_SIZE보다 작다.
 출력값 금액과 노드의 총 금액이 허용된 가치 범위(0보다 크고 2,100만 비트코인보다 작음) 내에
있어야 한다.
 입력값 중 해시값은 0, N값은 -1이어서는 안된다.
 nLOCKTime 은 INT_MAX보다 작거나 동일해야 한다.
 바이트 단위의 거래 크기가 100보다 크거나 동일해야 한다.
 거래에 담겨있는 서명 작업 건수가 서명 작업 한도 내에 있어야 한다.
 해제 스크립트는 스택 상부에 숫자를 추가할 수만 있고 잠금 스크립트는 isStandard 형태와 일치
해야한다.
 풀이나 메인 브랜치에 있는 블록에 짝을 이루는 거래가 존재해야 한다.
 각각의 입력값에 대해, 참조 출력값이 풀 내의 어떠한 거래 내부에 존재한다면 해당 거래는 거부
되어야 한다.
Output의 index
분산 합의
거래의 독립적 검증(체크 리스트)
 거래의 구문과 데이터 구조가 정확해야한다.
 입력값이나 출력값 목록이 비어 있지 않다.
 바이트 단위의 거래 크기가 MAX_BLOCK_SIZE보다 작다.
 출력값 금액과 노드의 총 금액이 허용된 가치 범위(0보다 크고 2,100만 비트코인보다 작음) 내에
있어야 한다.
 입력값 중 해시값은 0, N값은 -1이어서는 안된다.
 nLOCKTime 은 INT_MAX보다 작거나 동일해야 한다.
 바이트 단위의 거래 크기가 100보다 크거나 동일해야 한다.
 거래에 담겨있는 서명 작업 건수가 서명 작업 한도 내에 있어야 한다.
 해제 스크립트는 스택 상부에 숫자를 추가할 수만 있고 잠금 스크립트는 isStandard 형태와 일치
해야한다.
 풀이나 메인 브랜치에 있는 블록에 짝을 이루는 거래가 존재해야 한다.
 각각의 입력값에 대해, 참조 출력값이 풀 내의 어떠한 거래 내부에 존재한다면 해당 거래는 거부
되어야 한다.
트랜잭션이 블록에 포함될 수 없는 최소
시간(unix time or block height)
분산 합의
거래의 독립적 검증(체크 리스트)
 거래의 구문과 데이터 구조가 정확해야한다.
 입력값이나 출력값 목록이 비어 있지 않다.
 바이트 단위의 거래 크기가 MAX_BLOCK_SIZE보다 작다.
 출력값 금액과 노드의 총 금액이 허용된 가치 범위(0보다 크고 2,100만 비트코인보다 작음) 내에
있어야 한다.
 입력값 중 해시값은 0, N값은 -1이어서는 안된다.
 nLOCKTime 은 INT_MAX보다 작거나 동일해야 한다.
 바이트 단위의 거래 크기가 100보다 크거나 동일해야 한다.
 거래에 담겨있는 서명 작업 건수가 서명 작업 한도 내에 있어야 한다.
 해제 스크립트는 스택 상부에 숫자를 추가할 수만 있고 잠금 스크립트는 isStandard 형태와 일치
해야한다.
 풀이나 메인 브랜치에 있는 블록에 짝을 이루는 거래가 존재해야 한다.
 각각의 입력값에 대해, 참조 출력값이 풀 내의 어떠한 거래 내부에 존재한다면 해당 거래는 거부
되어야 한다.
분산 합의
거래의 독립적 검증(체크 리스트)
업 한도 내에 있어야 한다.
 해제 스크립트는 스택 상부에 숫자를 추가할 수만 있고 잠금 스크립트는 isStandard 형태와 일치
해야한다.
bitcoin/src/policy/policy.cpp
분산 합의
거래의 독립적 검증(체크 리스트)
 거래의 구문과 데이터 구조가 정확해야한다.
 입력값이나 출력값 목록이 비어 있지 않다.
 바이트 단위의 거래 크기가 MAX_BLOCK_SIZE보다 작다.
 출력값 금액과 노드의 총 금액이 허용된 가치 범위(0보다 크고 2,100만 비트코인보다 작음) 내에
있어야 한다.
 입력값 중 해시값은 0, N값은 -1이어서는 안된다.
 nLOCKTime 은 INT_MAX보다 작거나 동일해야 한다.
 바이트 단위의 거래 크기가 100보다 크거나 동일해야 한다.
 거래에 담겨있는 서명 작업 건수가 서명 작업 한도 내에 있어야 한다.
 해제 스크립트는 스택 상부에 숫자를 추가할 수만 있고 잠금 스크립트는 isStandard 형태와 일치
해야한다.
 풀이나 메인 브랜치에 있는 블록에 짝을 이루는 거래가 존재해야 한다.
 각각의 입력값에 대해, 참조 출력값이 풀 내의 어떠한 거래 내부에 존재한다면 해당 거래는 거부
되어야 한다.
트랜잭션의 input에 대응하는 output이
메모리 풀이나 기존 블록에 존재해야 한다
분산 합의
거래의 독립적 검증(체크 리스트)
 거래의 구문과 데이터 구조가 정확해야한다.
 입력값이나 출력값 목록이 비어 있지 않다.
 바이트 단위의 거래 크기가 MAX_BLOCK_SIZE보다 작다.
 출력값 금액과 노드의 총 금액이 허용된 가치 범위(0보다 크고 2,100만 비트코인보다 작음) 내에
있어야 한다.
 입력값 중 해시값은 0, N값은 -1이어서는 안된다.
 nLOCKTime 은 INT_MAX보다 작거나 동일해야 한다.
 바이트 단위의 거래 크기가 100보다 크거나 동일해야 한다.
 거래에 담겨있는 서명 작업 건수가 서명 작업 한도 내에 있어야 한다.
 해제 스크립트는 스택 상부에 숫자를 추가할 수만 있고 잠금 스크립트는 isStandard 형태와 일치
해야한다.
 풀이나 메인 브랜치에 있는 블록에 짝을 이루는 거래가 존재해야 한다.
 각각의 입력값에 대해, 참조 출력값이 풀 내의 어떠한 거래 내부에 존재한다면 해당 거래는 거부
되어야 한다.
이미 소모된 트랜잭션이면 거부한다
분산 합의
거래의 독립적 검증(체크 리스트)
 각각의 입력값에 대해, 참조 출력값이 거래 내에 있는지 검색하기 위해 메인 브랜치와 거래 풀을
살펴보자. 만약 출력 거래의 입력값에 대한 이전 출력값을 찾을 수 없을 때는 이 거래는 고아거래
가 될 것이다. 짝을 이루는 거래가 풀에 존재하지 않는 경우 고아거래 풀에 추가하라.
 각각의 입력값에 대해 참조 출력값이 코인베이스 출력이라면, 최소 COINBASE_MATURITY(100) 승
인을 받아야 한다.
 각각의 입력값에 대해 참조 출력값은 존재해야 하며, 이미 소비되었으면 안 된다.
 참조 출력 거래에서 입력값을 가져올 때 각 입력값 금액과 입력값 총액이 허용된 가치 범위(0보
다 크고 2,100만 비트코인보다 작음) 내에 있어야 한다.
 입력값 금액이 출력값 총액보다 작은 경우 해당 거래를 거절하라.
 거래 수수료가 비어 있는 블록에 들어가기에 너무 작을 때는 해당 거래를 거절하라.
 거래 수수료가 비어 있는 블록에 들어가기에 너무 작을 때는 해당 거래를 거절하라.
 각 입력값에 대한 해제 스크립트는 그에 해당하는 출력값 잠금 스크립트에 대해 검증해야 한다.
분산 합의
거래의 독립적 검증(체크 리스트)
 각각의 입력값에 대해, 참조 출력값이 거래 내에 있는지 검색하기 위해 메인 브랜치와 거래 풀을
살펴보자. 만약 출력 거래의 입력값에 대한 이전 출력값을 찾을 수 없을 때는 이 거래는 고아거래
가 될 것이다. 짝을 이루는 거래가 풀에 존재하지 않는 경우 고아거래 풀에 추가하라.
 각각의 입력값에 대해 참조 출력값이 코인베이스 출력이라면, 최소 COINBASE_MATURITY(100) 승
인을 받아야 한다.
 각각의 입력값에 대해 참조 출력값은 존재해야 하며, 이미 소비되었으면 안 된다.
 참조 출력 거래에서 입력값을 가져올 때 각 입력값 금액과 입력값 총액이 허용된 가치 범위(0보
다 크고 2,100만 비트코인보다 작음) 내에 있어야 한다.
 입력값 금액이 출력값 총액보다 작은 경우 해당 거래를 거절하라.
 거래 수수료가 비어 있는 블록에 들어가기에 너무 작을 때는 해당 거래를 거절하라.
 거래 수수료가 비어 있는 블록에 들어가기에 너무 작을 때는 해당 거래를 거절하라.
 각 입력값에 대한 해제 스크립트는 그에 해당하는 출력값 잠금 스크립트에 대해 검증해야 한다.
코인베이스 출력이면, 100개의 블록 height 이후에사용할 수 있다.
분산 합의
Transaction 0
Transaction 1
Transaction 2
...
Transaction N
Block
#123528
합의 과정
 작업증명을 통해 블록 생성
채굴
채굴 노드
Block header
분산 합의
합의 과정
 각 노드의 새 블록 검증
블록 전파Transaction 0
Transaction 1
Transaction 2
...
Transaction N
Block
#123528
Block header
분산 합의
합의 과정
 각 노드의 새 블록 검증
블록 검증
블록 검증
Transaction 0
Transaction 1
Transaction 2
...
Transaction N
Block
#123528
Block header
분산 합의
...
...
...
...
...
Block
#???
합의 과정
 최고 누적 연산 체인(Longest Chain)을 독립적으로 선택
노드
...
...
...
...
...
Block
#???
...
...
...
...
...
Block
#???
...
...
...
...
...
Block
#???
...
...
...
...
...
Block
#???
체인 선택
후보 블록
Transaction 0
Transaction 1
Transaction 2
Transaction 3
Transaction 4
메모리 풀
우선순위
...
Transaction N-3
Transaction N-2
Transaction N-1
Transaction N
후보 블록 #6114
Transaction 0
Transaction 1
Transaction 8
Transaction 11
Transaction N-2
채굴 노드 A
???
후보 블록
Transaction 0
Transaction 1
Transaction 2
Transaction 3
Transaction 4
메모리 풀
우선순위
...
Transaction N-3
Transaction N-2
Transaction N-1
Transaction N
후보 블록 #6114
Transaction 0
Transaction 1
Transaction 8
Transaction 11
Transaction N-2
채굴 노드 A
50KB의 공간은
(Input 값의 총합 * Age) / Transacion size
값이 높은 트랜잭션을 할당하고,
???
후보 블록
Transaction 0
Transaction 1
Transaction 2
Transaction 3
Transaction 4
메모리 풀
우선순위
...
Transaction N-3
Transaction N-2
Transaction N-1
Transaction N
후보 블록 #6114
Transaction 0
Transaction 1
Transaction 8
Transaction 11
Transaction N-2
채굴 노드 A
나머지 공간은 킬로바이트 대비 최고
수수료를 가진 거래 순으로 블록에 담는다
후보 블록
Transaction 0
Transaction 1
Transaction 2
Transaction 3
Transaction 4
메모리 풀
우선순위
...
Transaction N-3
Transaction N-2
Transaction N-1
Transaction N
후보 블록 #6114
Transaction 0
Transaction 1
Transaction 8
Transaction 11
Transaction N-2
채굴 노드 A
블록 #6114
Transaction 0
Transaction 2
Transaction 8
Transaction 9
Transaction N-2
Block Header
후보 블록
Transaction 0
Transaction 1
Transaction 2
Transaction 3
Transaction 4
메모리 풀...
Transaction N-3
Transaction N-2
Transaction N-1
Transaction N
후보 블록 #6114
Transaction 0
Transaction 1
Transaction 8
Transaction 11
Transaction N-2
채굴 노드 A
 다른 노드가 먼저 블록을 채굴했으므로 전파된 블록의 검증작업 후에, 메모리 풀 내에 있는
트랜잭션 중에서 전파된 블록에 포함된 트랜잭션을 제거하고 새로운 후보 블록을 만든다.
전파된 블록에 포함된
트랜잭션 제거
블록 #6114
Transaction 0
Transaction 2
Transaction 8
Transaction 9
Transaction N-2
Block Header
코인베이스 거래
 채굴자가 블록을 성공적으로 채굴했을때 보상을 제공하는 트랜잭션으로, input이 코인베이스인
트랜잭션을 말한다.
 보상을 받은 뒤 100개의 block height가 지나고서 사용할 수 있다.
그림2] 실제 코인베이스 트랜잭션의 json 포맷 데이터
코인베이스 거래
입력값 구조
그림3] 그림 2 코인베이스 거래의 Raw data
코인베이스 거래
입력값 구조
그림3] 그림 2 코인베이스 거래의 Raw data
버전 정보
코인베이스 거래
입력값 구조
그림3] 그림 2 코인베이스 거래의 Raw data
Input 카운트
코인베이스 거래
입력값 구조
그림3] 그림 2 코인베이스 거래의 Raw data
Input 트랜잭션의 해시(코인베이스는
없으므로 모두 0)
코인베이스 거래
입력값 구조
그림3] 그림 2 코인베이스 거래의 Raw data
소모될 Input의 트랜잭션 내
index(마찬가지로 존재하지 않음)
코인베이스 거래
입력값 구조
그림3] 그림 2 코인베이스 거래의 Raw data
코인베이스 데이터의 길이
코인베이스 거래
입력값 구조
그림3] 그림 2 코인베이스 거래의 Raw data
코인베이스 데이터
코인베이스 거래
입력값 구조
그림3] 그림 2 코인베이스 거래의 Raw data
일련번호
코인베이스 거래
입력값 구조
그림3] 그림 2 코인베이스 거래의 Raw data
Output 카운트
코인베이스 거래
입력값 구조
그림3] 그림 2 코인베이스 거래의 Raw data
보상(Value)
코인베이스 거래
입력값 구조
그림3] 그림 2 코인베이스 거래의 Raw data
scriptPubkey
코인베이스 거래
입력값 구조
그림3] 그림 2 코인베이스 거래의 Raw data
locktime
블록 헤더
크기 필드 설명
4바이트 버전 소프트웨어/프로토콜 업그레이드 추적을 위한 버전 번호
32바이트 이전 블록 해시 체인 내 이전 블록의 해시에 대한 참조
32바이트 머클 루트 블록 거래의 머클 트리의 루트에 대한 해시
4바이트 타임스탬프 블록의 대략적인 생성시간(UNIX time)
4바이트 난이도 목표 블록의 작업증명 알고리즘에 대한 난이도 목표
4바이트 난스(Nonce) 작업증명 알고리즘에 사용되는 카운터
표 1] 블록 헤더의 구성
 블록 헤더 구조
블록 헤더
그림 4] 실제 비트코인 123,456번 블록의 헤더
 블록 헤더 예시
블록 헤더
그림 4] 실제 비트코인 123,456번 블록의 헤더
난이도(difficulty) : coefficient * 2**(8 * (exponent – 3))
 블록 헤더 예시
블록 헤더
그림 4] 실제 비트코인 123,456번 블록의 헤더
난이도(difficulty) : coefficient * 2**(8 * (exponent – 3)) 𝑡𝑎𝑟𝑔𝑒𝑡 𝑑𝑖𝑓𝑓𝑖𝑐𝑢𝑙𝑡𝑦 = 0𝑥6𝑎93𝑏3 × 28×(0𝑥1𝑎−0𝑥03)
= 𝟎𝒙𝟔𝒂𝟗𝟑𝒃𝟑 × 𝟐 𝟎𝒙𝒃𝟖
 블록 헤더 예시
블록 헤더
그림 4] 실제 비트코인 123,456번 블록의 헤더
0𝑥6𝑎93𝑏3 × 20𝑥𝑏8 채굴자는 sha256(encode_hex(“version” + “previousblock” + “merkleroot” + “time” + “bits” + “nonce”)) <
을 만족시키는 nonce를 가장 먼저 찾아서 블록을 네트워크에 전파하면, 채굴 보상을 받게 된다.
 블록 헤더 예시
블록 헤더
그림 4] 실제 비트코인 123,456번 블록의 헤더
sha256(encode_hex(“version” + “previousblock” + “merkleroot” + “time” + “bits” + “nonce”))
Block hash
 블록 헤더 예시
블록 헤더
그림 4] 실제 비트코인 123,456번 블록의 헤더
 블록 헤더 예시
 지난 2,016개의 블록 생성 시간을 기반으로 새 난이도(다음 블록의 난이도)를 설정한다.
 𝑁𝑒𝑤 𝐷𝑖𝑓𝑓𝑖𝑐𝑢𝑙𝑡𝑦 = 𝑂𝑙𝑑 𝐷𝑖𝑓𝑓𝑖𝑐𝑢𝑙𝑡𝑦 ×
𝐴𝑐𝑡𝑢𝑎𝑙 𝑇𝑖𝑚𝑒 𝑜𝑓 𝐿𝑎𝑠𝑡 2016 𝐵𝑙𝑜𝑐𝑘𝑠
20160 𝑚𝑖𝑛𝑢𝑡𝑒𝑠
블록 검증
 블록을 전파받은 노드들은 블록이 다음 기준들을 만족하는지 확인한다.
• 해당 블록의 데이터 구조는 문법적으로 유효하다.
• 해당 블록 헤더 해시는 목표 난이도보다 작다.
• 해당 블록의 타임스탬프는 향후 2시간 이내다.
• 해당 블록의 크기는 허용할 수 있는 한도 내에 있다.
• 제일 첫 거래는 코인베이스 생성거래다.
• 블록 내에 있는 거래 전부는 앞 페이지의 ‘거래의 독립적 검증’ 조건을 모두 만족한다.
블록 검증
 블록을 전파받은 노드들은 블록이 다음 기준들을 만족하는지 확인한다.
• 해당 블록의 데이터 구조는 문법적으로 유효하다.
• 해당 블록 헤더 해시는 목표 난이도보다 작다.
• 해당 블록의 타임스탬프는 향후 2시간 이내다.
• 해당 블록의 크기는 허용할 수 있는 한도 내에 있다.
• 제일 첫 거래는 코인베이스 생성거래다.
• 블록 내에 있는 거래 전부는 앞 페이지의 ‘거래의 독립적 검증’ 조건을 모두 만족한다.
블록 검증
 블록을 전파받은 노드들은 블록이 다음 기준들을 만족하는지 확인한다.
• 해당 블록의 데이터 구조는 문법적으로 유효하다.
• 해당 블록 헤더 해시는 목표 난이도보다 작다.
• 해당 블록의 타임스탬프는 향후 2시간 이내다.
• 해당 블록의 크기는 허용할 수 있는 한도 내에 있다.
• 제일 첫 거래는 코인베이스 생성거래다.
• 블록 내에 있는 거래 전부는 앞 페이지의 ‘거래의 독립적 검증’ 조건을 모두 만족한다.
블록체인 분기
 분산 네트워크 환경이기 때문에 모든 블록이 동일한 내용이 아니거나, propagation delay로 블록
들이 서로 다른 시간에 노드에 전파될 수 있다.
 이러한 이유로 각 노드는 다른 상태의 블록을 가질 수 있다(블록의 분기).
 블록의 분기가 일어났을 때, 노드들은 더 긴 체인을 메인 체인으로 채택한다(Longest chain).
그림5] 블록의 분기
#279067
#279068
#279068
New
arrival
#279069

More Related Content

More from 제호 송 (10)

Blockchain sharding
Blockchain shardingBlockchain sharding
Blockchain sharding
 
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 chap6
Mastering bitcoin chap6Mastering bitcoin chap6
Mastering bitcoin chap6
 
Mastering bitcoin chap1
Mastering bitcoin chap1Mastering bitcoin chap1
Mastering bitcoin chap1
 

Mastering bitcoin chap8

  • 1. Mastering Bitcoin Chap 8. 채굴과 합의 Song Je-Ho qwerwon@gmail.com
  • 2. 채굴이란 무엇인가? 채굴( Mining )  새로운 비트코인이 통화 공급량에 추가되는 과정  채굴자들은 비트코인 네트워크에 처리 능력을 제공하여 블록을 생성해주고, 그 대가로 비트코인 (통화 발행량 + 거래 수수료)을 받는다.  단순한 인센티브를 얻기위한 프로세스가 아니라, 분산화된 네트워크에서 거래를 검증하고 모든 참여자가 합의를 이룰 수 있도록 해주는 수단이다.  이러한 검증 작업에 인센티브를 부과하여 참여자로 하여금 자율적으로 검증 작업에 참여하도록 유도한다.
  • 3. 채굴 보상 통화 발행  비트코인에서는 약 10분마다 생성되는 블록에서 통화 발행이 일어난다(초기 50비트코인).  210,000개의 블록(약 4년)마다 통화량은 절반으로 감소하고(현재 12.5비트코인 발행), 13,440,00 개의 블록이 생성되는 야 2140년경에는 2,100만 비트코인 전부가 발행되고 더 이상 새로운 비트 코인이 발행되지 않는다(채굴 작업은 계속 진행, 채굴자는 거래 수수료만 얻게 된다). 그림1] main.cpp의 블록 보상금을 return해주는 함수 매 210,000 블록마다 채굴 보상이 절반씩 줄어든다(binary shift)
  • 4. 분산 합의 합의 과정의 필요성  기존의 중앙 기관을 보유하고 있는 신뢰 모델에서는 서비스를 제공하는 중앙 통제 기관의 판단 에 따라서 모든 프로세스가 처리되었다.  그러나 모든 참여자(풀 노드)가 동등한 권한을 갖는 비트코인에서는 중앙 기관이 없기 때문에 어 떤 과정(트랜잭션)에 대하여 모든 네트워크가 동일한 결론에 도달할 수단인 ‘합의‘ 프로세스가 필요하다.  “투표와 같이 명시적인 합의가 이루어지지 않기 때문에 ‘도출적(emergent)’이라는 단어를 사용 했으며, 이는 합의가 일어나는 정확한 시점이나 선출 과정이 없다는 것을 의미한다.”
  • 5. 분산 합의 합의 과정  각 노드별로 트랜잭션을 독립적으로 검증 Tx 검증 Tx 검증 Tx 검증 Tx 검증 Tx 검증 Tx 검증
  • 6. 분산 합의 거래의 독립적 검증(체크 리스트)  거래의 구문과 데이터 구조가 정확해야한다.  입력값이나 출력값 목록이 비어 있지 않다.  바이트 단위의 거래 크기가 MAX_BLOCK_SIZE보다 작다.  출력값 금액과 노드의 총 금액이 허용된 가치 범위(0보다 크고 2,100만 비트코인보다 작음) 내에 있어야 한다.  입력값 중 해시값은 0, N값은 -1이어서는 안된다.  nLOCKTime 은 INT_MAX보다 작거나 동일해야 한다.  바이트 단위의 거래 크기가 100보다 크거나 동일해야 한다.  거래에 담겨있는 서명 작업 건수가 서명 작업 한도 내에 있어야 한다.  해제 스크립트는 스택 상부에 숫자를 추가할 수만 있고 잠금 스크립트는 isStandard 형태와 일치 해야한다.  풀이나 메인 브랜치에 있는 블록에 짝을 이루는 거래가 존재해야 한다.  각각의 입력값에 대해, 참조 출력값이 풀 내의 어떠한 거래 내부에 존재한다면 해당 거래는 거부 되어야 한다.
  • 7. 분산 합의 거래의 독립적 검증(체크 리스트)  거래의 구문과 데이터 구조가 정확해야한다.  입력값이나 출력값 목록이 비어 있지 않다.  바이트 단위의 거래 크기가 MAX_BLOCK_SIZE보다 작다.  출력값 금액과 노드의 총 금액이 허용된 가치 범위(0보다 크고 2,100만 비트코인보다 작음) 내에 있어야 한다.  입력값 중 해시값은 0, N값은 -1이어서는 안된다.  nLOCKTime 은 INT_MAX보다 작거나 동일해야 한다.  바이트 단위의 거래 크기가 100보다 크거나 동일해야 한다.  거래에 담겨있는 서명 작업 건수가 서명 작업 한도 내에 있어야 한다.  해제 스크립트는 스택 상부에 숫자를 추가할 수만 있고 잠금 스크립트는 isStandard 형태와 일치 해야한다.  풀이나 메인 브랜치에 있는 블록에 짝을 이루는 거래가 존재해야 한다.  각각의 입력값에 대해, 참조 출력값이 풀 내의 어떠한 거래 내부에 존재한다면 해당 거래는 거부 되어야 한다. Output의 index
  • 8. 분산 합의 거래의 독립적 검증(체크 리스트)  거래의 구문과 데이터 구조가 정확해야한다.  입력값이나 출력값 목록이 비어 있지 않다.  바이트 단위의 거래 크기가 MAX_BLOCK_SIZE보다 작다.  출력값 금액과 노드의 총 금액이 허용된 가치 범위(0보다 크고 2,100만 비트코인보다 작음) 내에 있어야 한다.  입력값 중 해시값은 0, N값은 -1이어서는 안된다.  nLOCKTime 은 INT_MAX보다 작거나 동일해야 한다.  바이트 단위의 거래 크기가 100보다 크거나 동일해야 한다.  거래에 담겨있는 서명 작업 건수가 서명 작업 한도 내에 있어야 한다.  해제 스크립트는 스택 상부에 숫자를 추가할 수만 있고 잠금 스크립트는 isStandard 형태와 일치 해야한다.  풀이나 메인 브랜치에 있는 블록에 짝을 이루는 거래가 존재해야 한다.  각각의 입력값에 대해, 참조 출력값이 풀 내의 어떠한 거래 내부에 존재한다면 해당 거래는 거부 되어야 한다. 트랜잭션이 블록에 포함될 수 없는 최소 시간(unix time or block height)
  • 9. 분산 합의 거래의 독립적 검증(체크 리스트)  거래의 구문과 데이터 구조가 정확해야한다.  입력값이나 출력값 목록이 비어 있지 않다.  바이트 단위의 거래 크기가 MAX_BLOCK_SIZE보다 작다.  출력값 금액과 노드의 총 금액이 허용된 가치 범위(0보다 크고 2,100만 비트코인보다 작음) 내에 있어야 한다.  입력값 중 해시값은 0, N값은 -1이어서는 안된다.  nLOCKTime 은 INT_MAX보다 작거나 동일해야 한다.  바이트 단위의 거래 크기가 100보다 크거나 동일해야 한다.  거래에 담겨있는 서명 작업 건수가 서명 작업 한도 내에 있어야 한다.  해제 스크립트는 스택 상부에 숫자를 추가할 수만 있고 잠금 스크립트는 isStandard 형태와 일치 해야한다.  풀이나 메인 브랜치에 있는 블록에 짝을 이루는 거래가 존재해야 한다.  각각의 입력값에 대해, 참조 출력값이 풀 내의 어떠한 거래 내부에 존재한다면 해당 거래는 거부 되어야 한다.
  • 10. 분산 합의 거래의 독립적 검증(체크 리스트) 업 한도 내에 있어야 한다.  해제 스크립트는 스택 상부에 숫자를 추가할 수만 있고 잠금 스크립트는 isStandard 형태와 일치 해야한다. bitcoin/src/policy/policy.cpp
  • 11. 분산 합의 거래의 독립적 검증(체크 리스트)  거래의 구문과 데이터 구조가 정확해야한다.  입력값이나 출력값 목록이 비어 있지 않다.  바이트 단위의 거래 크기가 MAX_BLOCK_SIZE보다 작다.  출력값 금액과 노드의 총 금액이 허용된 가치 범위(0보다 크고 2,100만 비트코인보다 작음) 내에 있어야 한다.  입력값 중 해시값은 0, N값은 -1이어서는 안된다.  nLOCKTime 은 INT_MAX보다 작거나 동일해야 한다.  바이트 단위의 거래 크기가 100보다 크거나 동일해야 한다.  거래에 담겨있는 서명 작업 건수가 서명 작업 한도 내에 있어야 한다.  해제 스크립트는 스택 상부에 숫자를 추가할 수만 있고 잠금 스크립트는 isStandard 형태와 일치 해야한다.  풀이나 메인 브랜치에 있는 블록에 짝을 이루는 거래가 존재해야 한다.  각각의 입력값에 대해, 참조 출력값이 풀 내의 어떠한 거래 내부에 존재한다면 해당 거래는 거부 되어야 한다. 트랜잭션의 input에 대응하는 output이 메모리 풀이나 기존 블록에 존재해야 한다
  • 12. 분산 합의 거래의 독립적 검증(체크 리스트)  거래의 구문과 데이터 구조가 정확해야한다.  입력값이나 출력값 목록이 비어 있지 않다.  바이트 단위의 거래 크기가 MAX_BLOCK_SIZE보다 작다.  출력값 금액과 노드의 총 금액이 허용된 가치 범위(0보다 크고 2,100만 비트코인보다 작음) 내에 있어야 한다.  입력값 중 해시값은 0, N값은 -1이어서는 안된다.  nLOCKTime 은 INT_MAX보다 작거나 동일해야 한다.  바이트 단위의 거래 크기가 100보다 크거나 동일해야 한다.  거래에 담겨있는 서명 작업 건수가 서명 작업 한도 내에 있어야 한다.  해제 스크립트는 스택 상부에 숫자를 추가할 수만 있고 잠금 스크립트는 isStandard 형태와 일치 해야한다.  풀이나 메인 브랜치에 있는 블록에 짝을 이루는 거래가 존재해야 한다.  각각의 입력값에 대해, 참조 출력값이 풀 내의 어떠한 거래 내부에 존재한다면 해당 거래는 거부 되어야 한다. 이미 소모된 트랜잭션이면 거부한다
  • 13. 분산 합의 거래의 독립적 검증(체크 리스트)  각각의 입력값에 대해, 참조 출력값이 거래 내에 있는지 검색하기 위해 메인 브랜치와 거래 풀을 살펴보자. 만약 출력 거래의 입력값에 대한 이전 출력값을 찾을 수 없을 때는 이 거래는 고아거래 가 될 것이다. 짝을 이루는 거래가 풀에 존재하지 않는 경우 고아거래 풀에 추가하라.  각각의 입력값에 대해 참조 출력값이 코인베이스 출력이라면, 최소 COINBASE_MATURITY(100) 승 인을 받아야 한다.  각각의 입력값에 대해 참조 출력값은 존재해야 하며, 이미 소비되었으면 안 된다.  참조 출력 거래에서 입력값을 가져올 때 각 입력값 금액과 입력값 총액이 허용된 가치 범위(0보 다 크고 2,100만 비트코인보다 작음) 내에 있어야 한다.  입력값 금액이 출력값 총액보다 작은 경우 해당 거래를 거절하라.  거래 수수료가 비어 있는 블록에 들어가기에 너무 작을 때는 해당 거래를 거절하라.  거래 수수료가 비어 있는 블록에 들어가기에 너무 작을 때는 해당 거래를 거절하라.  각 입력값에 대한 해제 스크립트는 그에 해당하는 출력값 잠금 스크립트에 대해 검증해야 한다.
  • 14. 분산 합의 거래의 독립적 검증(체크 리스트)  각각의 입력값에 대해, 참조 출력값이 거래 내에 있는지 검색하기 위해 메인 브랜치와 거래 풀을 살펴보자. 만약 출력 거래의 입력값에 대한 이전 출력값을 찾을 수 없을 때는 이 거래는 고아거래 가 될 것이다. 짝을 이루는 거래가 풀에 존재하지 않는 경우 고아거래 풀에 추가하라.  각각의 입력값에 대해 참조 출력값이 코인베이스 출력이라면, 최소 COINBASE_MATURITY(100) 승 인을 받아야 한다.  각각의 입력값에 대해 참조 출력값은 존재해야 하며, 이미 소비되었으면 안 된다.  참조 출력 거래에서 입력값을 가져올 때 각 입력값 금액과 입력값 총액이 허용된 가치 범위(0보 다 크고 2,100만 비트코인보다 작음) 내에 있어야 한다.  입력값 금액이 출력값 총액보다 작은 경우 해당 거래를 거절하라.  거래 수수료가 비어 있는 블록에 들어가기에 너무 작을 때는 해당 거래를 거절하라.  거래 수수료가 비어 있는 블록에 들어가기에 너무 작을 때는 해당 거래를 거절하라.  각 입력값에 대한 해제 스크립트는 그에 해당하는 출력값 잠금 스크립트에 대해 검증해야 한다. 코인베이스 출력이면, 100개의 블록 height 이후에사용할 수 있다.
  • 15. 분산 합의 Transaction 0 Transaction 1 Transaction 2 ... Transaction N Block #123528 합의 과정  작업증명을 통해 블록 생성 채굴 채굴 노드 Block header
  • 16. 분산 합의 합의 과정  각 노드의 새 블록 검증 블록 전파Transaction 0 Transaction 1 Transaction 2 ... Transaction N Block #123528 Block header
  • 17. 분산 합의 합의 과정  각 노드의 새 블록 검증 블록 검증 블록 검증 Transaction 0 Transaction 1 Transaction 2 ... Transaction N Block #123528 Block header
  • 18. 분산 합의 ... ... ... ... ... Block #??? 합의 과정  최고 누적 연산 체인(Longest Chain)을 독립적으로 선택 노드 ... ... ... ... ... Block #??? ... ... ... ... ... Block #??? ... ... ... ... ... Block #??? ... ... ... ... ... Block #??? 체인 선택
  • 19. 후보 블록 Transaction 0 Transaction 1 Transaction 2 Transaction 3 Transaction 4 메모리 풀 우선순위 ... Transaction N-3 Transaction N-2 Transaction N-1 Transaction N 후보 블록 #6114 Transaction 0 Transaction 1 Transaction 8 Transaction 11 Transaction N-2 채굴 노드 A ???
  • 20. 후보 블록 Transaction 0 Transaction 1 Transaction 2 Transaction 3 Transaction 4 메모리 풀 우선순위 ... Transaction N-3 Transaction N-2 Transaction N-1 Transaction N 후보 블록 #6114 Transaction 0 Transaction 1 Transaction 8 Transaction 11 Transaction N-2 채굴 노드 A 50KB의 공간은 (Input 값의 총합 * Age) / Transacion size 값이 높은 트랜잭션을 할당하고, ???
  • 21. 후보 블록 Transaction 0 Transaction 1 Transaction 2 Transaction 3 Transaction 4 메모리 풀 우선순위 ... Transaction N-3 Transaction N-2 Transaction N-1 Transaction N 후보 블록 #6114 Transaction 0 Transaction 1 Transaction 8 Transaction 11 Transaction N-2 채굴 노드 A 나머지 공간은 킬로바이트 대비 최고 수수료를 가진 거래 순으로 블록에 담는다
  • 22. 후보 블록 Transaction 0 Transaction 1 Transaction 2 Transaction 3 Transaction 4 메모리 풀 우선순위 ... Transaction N-3 Transaction N-2 Transaction N-1 Transaction N 후보 블록 #6114 Transaction 0 Transaction 1 Transaction 8 Transaction 11 Transaction N-2 채굴 노드 A 블록 #6114 Transaction 0 Transaction 2 Transaction 8 Transaction 9 Transaction N-2 Block Header
  • 23. 후보 블록 Transaction 0 Transaction 1 Transaction 2 Transaction 3 Transaction 4 메모리 풀... Transaction N-3 Transaction N-2 Transaction N-1 Transaction N 후보 블록 #6114 Transaction 0 Transaction 1 Transaction 8 Transaction 11 Transaction N-2 채굴 노드 A  다른 노드가 먼저 블록을 채굴했으므로 전파된 블록의 검증작업 후에, 메모리 풀 내에 있는 트랜잭션 중에서 전파된 블록에 포함된 트랜잭션을 제거하고 새로운 후보 블록을 만든다. 전파된 블록에 포함된 트랜잭션 제거 블록 #6114 Transaction 0 Transaction 2 Transaction 8 Transaction 9 Transaction N-2 Block Header
  • 24. 코인베이스 거래  채굴자가 블록을 성공적으로 채굴했을때 보상을 제공하는 트랜잭션으로, input이 코인베이스인 트랜잭션을 말한다.  보상을 받은 뒤 100개의 block height가 지나고서 사용할 수 있다. 그림2] 실제 코인베이스 트랜잭션의 json 포맷 데이터
  • 25. 코인베이스 거래 입력값 구조 그림3] 그림 2 코인베이스 거래의 Raw data
  • 26. 코인베이스 거래 입력값 구조 그림3] 그림 2 코인베이스 거래의 Raw data 버전 정보
  • 27. 코인베이스 거래 입력값 구조 그림3] 그림 2 코인베이스 거래의 Raw data Input 카운트
  • 28. 코인베이스 거래 입력값 구조 그림3] 그림 2 코인베이스 거래의 Raw data Input 트랜잭션의 해시(코인베이스는 없으므로 모두 0)
  • 29. 코인베이스 거래 입력값 구조 그림3] 그림 2 코인베이스 거래의 Raw data 소모될 Input의 트랜잭션 내 index(마찬가지로 존재하지 않음)
  • 30. 코인베이스 거래 입력값 구조 그림3] 그림 2 코인베이스 거래의 Raw data 코인베이스 데이터의 길이
  • 31. 코인베이스 거래 입력값 구조 그림3] 그림 2 코인베이스 거래의 Raw data 코인베이스 데이터
  • 32. 코인베이스 거래 입력값 구조 그림3] 그림 2 코인베이스 거래의 Raw data 일련번호
  • 33. 코인베이스 거래 입력값 구조 그림3] 그림 2 코인베이스 거래의 Raw data Output 카운트
  • 34. 코인베이스 거래 입력값 구조 그림3] 그림 2 코인베이스 거래의 Raw data 보상(Value)
  • 35. 코인베이스 거래 입력값 구조 그림3] 그림 2 코인베이스 거래의 Raw data scriptPubkey
  • 36. 코인베이스 거래 입력값 구조 그림3] 그림 2 코인베이스 거래의 Raw data locktime
  • 37. 블록 헤더 크기 필드 설명 4바이트 버전 소프트웨어/프로토콜 업그레이드 추적을 위한 버전 번호 32바이트 이전 블록 해시 체인 내 이전 블록의 해시에 대한 참조 32바이트 머클 루트 블록 거래의 머클 트리의 루트에 대한 해시 4바이트 타임스탬프 블록의 대략적인 생성시간(UNIX time) 4바이트 난이도 목표 블록의 작업증명 알고리즘에 대한 난이도 목표 4바이트 난스(Nonce) 작업증명 알고리즘에 사용되는 카운터 표 1] 블록 헤더의 구성  블록 헤더 구조
  • 38. 블록 헤더 그림 4] 실제 비트코인 123,456번 블록의 헤더  블록 헤더 예시
  • 39. 블록 헤더 그림 4] 실제 비트코인 123,456번 블록의 헤더 난이도(difficulty) : coefficient * 2**(8 * (exponent – 3))  블록 헤더 예시
  • 40. 블록 헤더 그림 4] 실제 비트코인 123,456번 블록의 헤더 난이도(difficulty) : coefficient * 2**(8 * (exponent – 3)) 𝑡𝑎𝑟𝑔𝑒𝑡 𝑑𝑖𝑓𝑓𝑖𝑐𝑢𝑙𝑡𝑦 = 0𝑥6𝑎93𝑏3 × 28×(0𝑥1𝑎−0𝑥03) = 𝟎𝒙𝟔𝒂𝟗𝟑𝒃𝟑 × 𝟐 𝟎𝒙𝒃𝟖  블록 헤더 예시
  • 41. 블록 헤더 그림 4] 실제 비트코인 123,456번 블록의 헤더 0𝑥6𝑎93𝑏3 × 20𝑥𝑏8 채굴자는 sha256(encode_hex(“version” + “previousblock” + “merkleroot” + “time” + “bits” + “nonce”)) < 을 만족시키는 nonce를 가장 먼저 찾아서 블록을 네트워크에 전파하면, 채굴 보상을 받게 된다.  블록 헤더 예시
  • 42. 블록 헤더 그림 4] 실제 비트코인 123,456번 블록의 헤더 sha256(encode_hex(“version” + “previousblock” + “merkleroot” + “time” + “bits” + “nonce”)) Block hash  블록 헤더 예시
  • 43. 블록 헤더 그림 4] 실제 비트코인 123,456번 블록의 헤더  블록 헤더 예시  지난 2,016개의 블록 생성 시간을 기반으로 새 난이도(다음 블록의 난이도)를 설정한다.  𝑁𝑒𝑤 𝐷𝑖𝑓𝑓𝑖𝑐𝑢𝑙𝑡𝑦 = 𝑂𝑙𝑑 𝐷𝑖𝑓𝑓𝑖𝑐𝑢𝑙𝑡𝑦 × 𝐴𝑐𝑡𝑢𝑎𝑙 𝑇𝑖𝑚𝑒 𝑜𝑓 𝐿𝑎𝑠𝑡 2016 𝐵𝑙𝑜𝑐𝑘𝑠 20160 𝑚𝑖𝑛𝑢𝑡𝑒𝑠
  • 44. 블록 검증  블록을 전파받은 노드들은 블록이 다음 기준들을 만족하는지 확인한다. • 해당 블록의 데이터 구조는 문법적으로 유효하다. • 해당 블록 헤더 해시는 목표 난이도보다 작다. • 해당 블록의 타임스탬프는 향후 2시간 이내다. • 해당 블록의 크기는 허용할 수 있는 한도 내에 있다. • 제일 첫 거래는 코인베이스 생성거래다. • 블록 내에 있는 거래 전부는 앞 페이지의 ‘거래의 독립적 검증’ 조건을 모두 만족한다.
  • 45. 블록 검증  블록을 전파받은 노드들은 블록이 다음 기준들을 만족하는지 확인한다. • 해당 블록의 데이터 구조는 문법적으로 유효하다. • 해당 블록 헤더 해시는 목표 난이도보다 작다. • 해당 블록의 타임스탬프는 향후 2시간 이내다. • 해당 블록의 크기는 허용할 수 있는 한도 내에 있다. • 제일 첫 거래는 코인베이스 생성거래다. • 블록 내에 있는 거래 전부는 앞 페이지의 ‘거래의 독립적 검증’ 조건을 모두 만족한다.
  • 46. 블록 검증  블록을 전파받은 노드들은 블록이 다음 기준들을 만족하는지 확인한다. • 해당 블록의 데이터 구조는 문법적으로 유효하다. • 해당 블록 헤더 해시는 목표 난이도보다 작다. • 해당 블록의 타임스탬프는 향후 2시간 이내다. • 해당 블록의 크기는 허용할 수 있는 한도 내에 있다. • 제일 첫 거래는 코인베이스 생성거래다. • 블록 내에 있는 거래 전부는 앞 페이지의 ‘거래의 독립적 검증’ 조건을 모두 만족한다.
  • 47. 블록체인 분기  분산 네트워크 환경이기 때문에 모든 블록이 동일한 내용이 아니거나, propagation delay로 블록 들이 서로 다른 시간에 노드에 전파될 수 있다.  이러한 이유로 각 노드는 다른 상태의 블록을 가질 수 있다(블록의 분기).  블록의 분기가 일어났을 때, 노드들은 더 긴 체인을 메인 체인으로 채택한다(Longest chain). 그림5] 블록의 분기 #279067 #279068 #279068 New arrival #279069