이동산 ([email protected]) 2016c0%cc%b5%bf%bb%ea.pdf · 해당 거래가 블록체인내에...

21
비트코인과 블록체인 2016.5 이동산 ([email protected])

Upload: others

Post on 06-Feb-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 이동산 (mountie@paygate.net) 2016C0%CC%B5%BF%BB%EA.pdf · 해당 거래가 블록체인내에 존재하고 그후 채굴된 블록이 여러개 있다는 점을 승인 출력값을

비트코인과 블록체인2016.5

이동산 ([email protected])

Page 2: 이동산 (mountie@paygate.net) 2016C0%CC%B5%BF%BB%EA.pdf · 해당 거래가 블록체인내에 존재하고 그후 채굴된 블록이 여러개 있다는 점을 승인 출력값을

비트코인이란 무엇인가?비트코인이란 무엇인가?

● 분산화된 P2P시스템 기반 디지털 가상화폐다● 비트코인은 전세계 어느 누구와도 빠르게 거래할

수 있는 가상 화폐다● 비트코인은 실험적인 가상화폐다● 비트코인은 플랫폼이다● 평균적으로 10분마다 블록증가● 총 비트코인 공급량 : 2100만 BTC (2040년 도달)

왜 비트코인인가?● 편의성

● 국경없는 거래가능● 국가통화정책에 대한 불신● 자생적 커뮤니티와 생태계가 제공하는 신뢰

비트코인의 역사● 1980~90년대 익명 e-cash● 1998년 Wei Dai의 B-money● 2005년 Hall Finney의 재사용 가능한 작업증명● 2008.10.31 : 사토시 비트코인 논문● 2008.11.9 : sourceforge.net에 비트코인 프로젝트

등록

● 2009.1.3 : 제네시스 블록 생성● 2010.5.21 : 피자 두판 1만 BTC로 구매● 2012.12.6 : 유럽에서 처음으로 비트코인 거래소가

은행업 허가 취득● 2013.8.19 : 독일 재무부가 비트코인을 합법화폐로

인정

Page 3: 이동산 (mountie@paygate.net) 2016C0%CC%B5%BF%BB%EA.pdf · 해당 거래가 블록체인내에 존재하고 그후 채굴된 블록이 여러개 있다는 점을 승인 출력값을

Bitcoin-Core Full Client

Page 4: 이동산 (mountie@paygate.net) 2016C0%CC%B5%BF%BB%EA.pdf · 해당 거래가 블록체인내에 존재하고 그후 채굴된 블록이 여러개 있다는 점을 승인 출력값을

비트코인 작동원리비트코인 거래

● 복식부기와 유사: 차변( 입력값, 이전거래의 출력값이 입력값이 됨), 대변(출력값, 총합은 입력값의 총합보다 약간 작야야함, 차액은 거래수수료)

● 일반적인 거래유형○ 1:1거래 : 잔액은 다시 Sender에게 돌아옴○ n:1거래 : 여러입력값을 하나의 출력값으로

합치는 거래○ 1:n거래 : 하나의 입력값을 여러개 출력값으

거래의 구성● 지갑 어플리케이션 : 거래진행에 적절한 입력값과

출력값을 선택하는 로직 구현● 올바른 입력값 얻기: 소비되지 않은 거래 출력값에

근거 여러개를 모아서 지불하거나 큰돈지불후 잔돈 받기

● 잔돈받기는 출력값을 자기자신으로 하는것● 출력값 생성하기

○ 스크립트 형태○ 스크립트 포함내용: 돈받는 사람의 공개키

에 대응하는 키(개인키)를 이용해 서명을 하는 누구에게나 지불가능하다

○ 거래수수료 스크립트: 따로 명시되지 않음. 잔액을 전액 받는것이 아니라 0.0001BTC만큼 공제한 잔액을 돌려받으면 됨

● 거래내역을 장부에 추가

Page 5: 이동산 (mountie@paygate.net) 2016C0%CC%B5%BF%BB%EA.pdf · 해당 거래가 블록체인내에 존재하고 그후 채굴된 블록이 여러개 있다는 점을 승인 출력값을

비트코인 작동원리(2)비트코인 채굴하기

● 채굴과정을 거쳐 블록에 포함됨● 입증하는데 엄청난 수학적 계산필요● 검증은 많은 계산 불필요● Proof-of-Work : CPU → GPU → ASIC

거래 소비하기● 단순지불검증(SPV)

○ Lightweight client○ 해당 거래가 블록체인내에 존재하고 그후

채굴된 블록이 여러개 있다는 점을 승인● 출력값을 참조해서 입력값을 정한 후 소비

블록에 담겨 있는 거래 채굴하기● 임시 풀에 거래들을 추가● 우선순위 : 오래된것 위주, 거래수수료가 일정 기

준치 이상일때● 각 채굴자는 네트워크로부터 이전 블록을 박데 되

면 이전 경쟁 라우드에서 채굴에 실패했다는 사실을 알게 됨

● 채굴자는 자신의 블록에 특별한 거래하나를 포함○ 채굴자에 대한 보상.

● 한 블록에는 대략 400~500개 거래 포함

Page 6: 이동산 (mountie@paygate.net) 2016C0%CC%B5%BF%BB%EA.pdf · 해당 거래가 블록체인내에 존재하고 그후 채굴된 블록이 여러개 있다는 점을 승인 출력값을

비트코인 주소의미

● 개인키 및 공개키 쌍을 보유한 소유주를 나타낼 수 있고● Pay-to-Script-Hash(P2SH)등 여러 다른 대상을 나타낼 수도

있다

Bitcoin Address● Base58Check(RIPEMD160(SHA256(Public Key))) with

0x00 version prefix● Base58Check에는 용도 구분을 위한 Prefix를 사전 정의해두

고 있음.https://en.bitcoin.it/wiki/List_of_address_prefixes

꾸미기주소● 메시지를 포함하는 유효 비트코인 주소● 꾸미기주소 생성

○ 1IoveBPzz..adlfajldfs○ Love라는 단어가 포함되도록 주소 생성○ 수십억개의 후보를 생성하고 테스트○ 꾸미기 풀의 주소 채굴자들에게 요청, 대가로 비트코

인 지불

Base58 & Base58Check● Base58 : Base64에서 혼란유발 문자(숫자0, 영문O,

숫자1, 영문I, + 부호, / 부호● Base58Check

○ 내장된 오류검사코드 포함 (4자리 체크섬값)○ 버전 byte 접두부 추가

■ 비트코인주소 : 0x00 (16진수) 1(Base58결과값)

■ Pay-to-Script-Hash 주소 : 0x05, 3■ 비트코인 테스트넷 주소 0x6F, m or n■ 개인키 WIF 0x80, 5|K|L■ BIF38암호화 개인키 0x0142, 6P■ BIP32 확장 공개키 0x0488B21E, xpub

○ checksum = SHA256(SHA256(prefix+data))■ checksum중 첫4글자만 사용

● https://en.bitcoin.it/wiki/Base58Check_encoding

Page 7: 이동산 (mountie@paygate.net) 2016C0%CC%B5%BF%BB%EA.pdf · 해당 거래가 블록체인내에 존재하고 그후 채굴된 블록이 여러개 있다는 점을 승인 출력값을

비트코인 주소(2)개인키 포맷 종류

● Hex : 접두부 없음, 64개의 16진법 수● WIF : 접두부 5, Base58Check encoding● WIF-압축형 : 접두부 K or L, 공개키가 양수/음수 여부로 구분,

인코딩전 접미부 0x01 추가암호화된 개인키(BIP0038)

● 목적

○ 개인키를 안전하게 백업 매체에 저장○ 지갑간 전송을 시행○ 노출될 수 있는 어떠한 조건에서도 비밀이 유지될 수

있도록 패스프레이즈를 이용해 개인키를 암호화○ Base58Check로 개인키를 인코딩하는데 필요한 공동

표준을 제안● AES를 암호 표준으로 이용● WIF형태 개인키를 입력값으로 이용 (Base58Check 접두부 5

로 시작) ● 암호화된 BIP0038 암호화 결과값의 Base58Check(접두부 :

6P)● cold storage에 이용됨● BIP0038 암호화 개인키가 담긴 종이지갑

공개키포맷● 압축공개키

○ 타원곡선암호에서 x좌표만 알면 Y값은 계산가능○ x좌표만 저장○ 접두부(02 : y값이 양수일때, 03 : y값이 음수일때)

● 비압축공개키

○ x,y좌표 모두 저장, 접두부 04Pay-to-Script hash(P2SH) 다중서명 주소

● 전통적인 비트코인 주소 : 숫자 1로 시작, 공개키로부터 생성, 공개키는 개인키에서 생성

● P2SH 주소 : 숫자 3으로 시작, 비트코인 거래의 수령인을 공개키 소유주가 아닌 스크립트의 해시로 지정

● BIP0016이후 널리 채택, 주소 자체에 기능 추가 기회 제공● 소유권 증명: 공개키 해시, 개인키 서명, 스크립트 실행● script hash = RIPEMD160(SHA256(script))

○ 접두부 5를 가진 Base58Check로 인코딩되며○ 결과적으로 3으로 시작하는 주소를 얻게 됨○ 가장 흔한 구현으로 다중서명 주소

Page 8: 이동산 (mountie@paygate.net) 2016C0%CC%B5%BF%BB%EA.pdf · 해당 거래가 블록체인내에 존재하고 그후 채굴된 블록이 여러개 있다는 점을 승인 출력값을

비트코인 지갑비결정적(무작위) 지갑

● 무작위로 개인키 모아놓는 장소● Type-O nondeterministic wallet● 개인키만 많은 지갑

결정적(종자) 지갑● common seed 이용 개인키 생성● common seed만 있으면 개인키 복원 가능한 구조

연상기호 코드 워드● 연상기호코드란 결정적 지갑을 얻기 위해 종자로 이용한 난수

를 표현하는 (인코딩하는) 영어 단어열● 단어열만 있으면 종자를 재현가능● 종자에서 지갑과 추출키 전부 재현 가능● BIP0039에서 정의

계층 결정적 지갑(HD지갑)● 트리 구조에서 생성된 키를 담고 있음● 장점 : 트리구조, 공개키에 대응하는 개인키 접근없이 공개키

열 생성가능● HD지갑은 근원종자(root seed)한개로부터 생성됨● 개인 자식키 유도하기

○ CKD: Child Key Delivation○ 일방 해시함수 기반 다음항목 포함 : 부모 개인키 혹

은 부모 공개키(ECDSA 비압축키), 체인코드라는 이름의 종자(256bit), 색인번호

● 절차

○ 부모 공개키 + 체인코드 + 색인번호로 HMAC-SHA512 알고리즘통해 512비트 해시 생성

○ 해시 출력값중 오른쪽 반의 256비트는 자식키 생성을 위한 체인키

○ 해시와 색인번호로 구성된 왼쪽 반의 256비트는 자식 개인키를 생성하기 위해 부모 개인키에 더해짐

● 색인번호 변경시 부모키 이용해서 다른 자식키 생성가능● 각 부모키는 20억개의 자식키 보유 가능● 트리구조로 확대하면 무한대 확장

Page 9: 이동산 (mountie@paygate.net) 2016C0%CC%B5%BF%BB%EA.pdf · 해당 거래가 블록체인내에 존재하고 그후 채굴된 블록이 여러개 있다는 점을 승인 출력값을

비트코인 지갑(HD지갑 - 계속)확장키

● 키 유도함수는 세가지 입력값을 기반으로 트리구조의 자식키 생성: 키, 체인코드, 목표 자식의 색인번호

● 키+체인코드 를 확장키라고 부름

공개 자식키 유도하기● 개인키 없이도 공개 부모키로부터 공개 자식키를 얻을 수 있음● 두가지 자식 공개키 얻는 방법

○ 개인키로부터 얻는 방법○ 부모 공개키로부터 직접 얻는 방법

● 매우 안전한 서버 어플리케이션○ 무한개의 공개키와 비트코인 주소 생성가능○ 생성된 비트코인 주소로 송금된 돈을 절대 소비불가능○ 그러나 안전한 서버에서는 확장 개인키 이용해서 거래서

명가능

단절된 자식키 유도하기● 위험성: 확장 공개키와 체인코드로 자식 개인키 유출 위험, 부모 체

인코드와 함께 자식 개인키 유출시 자식 개인키 전부 유출되는 위험성

● 대책: 단절 유도법 이용 (부모 공개키를 사용하지 않고 부모 개인키 사용해서 자식 체인코드 생성)

● 마스터키의 위험을 방지하기 위해서 마스터키의 1세대 자식들은 항상 단절 유도법 통해 생성

정규 유도와 단절 유도의 색인번호● 정규 유도법에서 사용 색인번호: 0 ~ 2의 31승 -1● 단절 유도법에서 사용 색인번호: 2의 31승 ~ 2의 32승 -1

HD 지갑키 식별자(경로)● HD지갑에 들어있는 키는 명명 규칙인 경로(path)를 이용해서 식별

● 트리구조의 각 단계는 슬래시(/)로 구분● 마스터 개인키에서 나온 개인키들은 소문자 m으로 시작● 마스터 공개키에서 나온 공개키들은 대문자 M으로 시작● 첫번째 자식 개인키는 "m/0", 첫번째 자식 공개키는 M/0, 손자키는

m/0/1

HD지갑 트리구조 탐색하기● HD지갑에서는 20억개의 정규 자식 및 20억개의 단절 자식 보유가

능 ⇒ 트리구조 탐색의 어려움● BIP0043 에서 구조 제안 : m / purpose' / coin_type' / account' /

change / address_index○ purpose는 항상 44로 고정○ coin_type : m/44'/0'(Bitcoin), m/44'/1' (Testnet), m/44'/2'

(Litecoin)○ account: 회계나 조직적인 용도 구분○ change: 0(수신공개키 주소), 1(잔액받기위한 용도)

Page 10: 이동산 (mountie@paygate.net) 2016C0%CC%B5%BF%BB%EA.pdf · 해당 거래가 블록체인내에 존재하고 그후 채굴된 블록이 여러개 있다는 점을 승인 출력값을

비트코인 거래거래의 수명주기

● 거래 생성○ 승인을 의미하는 서명을 한건 이상 받아야함○ 네트워크에 해당 거래 알림○ 네트워크 노드가 해당거래를 검증하고 계속 전파○ 채굴 노드에서 블록 검증후 블록체인에 기록○ 그다음에 생성되는 블록들에 의해 확인(승인)을 받고

나면

○ 해당 거래는 블록체인에 영구적으로 기록● 거래 생성하는것은 수표 발행과 유사.

○ 수표에 수취인 및 금액 기록 = 거래의사 데이터 생성○ 수표에 서명 = 거래서명○ 수표 전달 = 전파

● 비트코인 네트워크에 거래 전송하기○ 비트코인 거래는 본질적으로 300~400바이트 크기○ 개인정보가 없어서 공개적으로 전송가능

■ Bluetooth, NFC, 바코드, Radio 신호 ○ port# 8333○ 네트워크에 연결된 다른 노드에 의해 거래가 유효화

거래구조● 거래는 입력값이라고 불리는 자금원에서부터 출력값으로 불

리는 목적지까지 가치의 전송을 인코딩하는 데이터 구조● 필드

○ 버전 : 4byte, 해당 거래가 따르는 규칙을 명시○ 입력값 카운터 : 1~9바이트(Var Int), 포함된 입력값의

개수

○ 입력값 : 가변적, 하나 이상의 거래 입력값○ 출력값 카운터 : 포함된 출력값의 개수, 1~9바이트○ 출력값 : 하나 이상의 출력값○ 잠금시간: 유닉스 타임스템프나 블록 개수, 4바이트

■ 0 ~ 5억미만 : 블록의 높이로 해석됨, 블록 높이가 명시된 높이가 되기 전까지는 거래는 블록체인에 포함되지 않는다는것을 의미

■ 5억 이상인 경우 : 유닉스 기준일자 타임스탬프로 해석됨, 수표에 날짜를 늦춰 적는것과 같음

Page 11: 이동산 (mountie@paygate.net) 2016C0%CC%B5%BF%BB%EA.pdf · 해당 거래가 블록체인내에 존재하고 그후 채굴된 블록이 여러개 있다는 점을 승인 출력값을

비트코인 거래(2)거래 출력값과 입력값

● 소비되지 않은 거래 출력값○ UTXO, Unspent Transaction Output○ 블록체인상에 기록되어 있음○ 비트코인 네트워크는 수백만개에 달하는 UTXO중에

서 이용가능한 UTXO 전부를 추적한다○ 현실적으로 특정 소유주에 대해서 잠겨 있는 UTXO

가 여기저기 산재해있음● 20BTC에서 1BTC지불하는 예제

○ 입력값으로 20BTC전액을 소비하고○ 2개의 출력값 : 1BTC는 수신자에게, 19BTC는 자기

자신에게

○ coinbase 거래는 예외■ 각 블록내의 첫번째 거래, 채굴에 성공한 채

굴자에 의해 생성, 채굴에 대한 보상■ 입력값이 없고 출력값만 생성되기 때문

거래 출력값● 출력값은 블록체인에 기록● OP_RETURN을 제외하고 대부분 UTXO● UTXO 출력값 구성

○ 비트코인 금액: 사토시단위로 표현되는 비트코인 가치

○ 잠금 스크립트 크기○ 잠금 스크립트 : 특정 금액을 소비하기 위해 충족되어

야하는 조건 규정거래 입력값

● UTXO에 대한 지시자(pointer)역할을 한다● UTXO소비위한 소비조건 충족하는 해제 스크립트 포함(통상

서명)● 지불금액 결합을 위한 알고리즘은 지갑 프로그램에 따라서 다

● 구조

○ 거래해시: 소비될 UTXO를 담고 있는 거래에 대한 지시자

○ 출력값 인덱스: 소비될 UTXO의 색인번호(최초는 0)○ 해제 스크립트 크기○ 해제 스크립트○ 일련번호 : 현재 미사용. 대부분 0xFFFFFFFF로 설정

Page 12: 이동산 (mountie@paygate.net) 2016C0%CC%B5%BF%BB%EA.pdf · 해당 거래가 블록체인내에 존재하고 그후 채굴된 블록이 여러개 있다는 점을 승인 출력값을

비트코인 거래(3)거래수수료

● 비트코인 단위로 표현되는 거래가치보다는● 킬로바이트 단위의 거래크기를 근거로 계산됨● 처리 우선순위에 영향을 미침

○ 수수료가 높으면 우선 처리● 최소거래수수료

○ 0.0001BTC 혹은○ 1킬로바이트당 1mBTC의 10분의 1

■ 거래 대부분의 크기는 1KB 미만■ 여러개의 입력값과 출력값을 포함한 경우 데

이터가 커짐● 거래에 수수료 추가하기

○ 입력값 총합에서 출력값 총합을 제하고 남은 금액● 커피값이 0.015BTC, 수수료 0.001BTC라면

○ 입력값은 0.016BTC○ 출력값은 0.015BTC

거래사슬과 고아거래● 이전거래(부모거래) 출력값을 소비하여 다음거래(자식거래)를

위한 출력값을 생성● 자식거래가 부모거래보다 먼저 도착할수도 있음

○ 즉 출력값에 상응하는 UTXO가 아직 도달하지 앟았음

● 이경우 고아거래 풀(Orphan transaction pool)에 넣어둠○ 부모거래가 노드에 도착하면 자식거래를 재유효화함

● DoS공격방식○ 부모없는 자식거래를 대량 발생○ 프로그램속에 최대 보관 자식거래수 정하고 있음

Page 13: 이동산 (mountie@paygate.net) 2016C0%CC%B5%BF%BB%EA.pdf · 해당 거래가 블록체인내에 존재하고 그후 채굴된 블록이 여러개 있다는 점을 승인 출력값을

비트코인 거래 스크립트 언어● stackable language like Forth● 지불거래 스크립트 대부분은 Pay-to-Public-Key-Hash(공개키

에 매핑되는 개인키로만 서명가능)● 거래유효화를 위한 스크립트 언어 생성● 스크립트 구성(잠금+해제)

○ 잠금 스크립트 : 출력값에 위치, scriptPubKey라고 부르기도함

○ 해제 스크립트 : 잠금 스크립트가 출력값에 놓아둔 조건을 해결하거나 충족시켜서 출력값이 소비될 수 있도록 하는 스크립트, scriptSig

○ 모든 비트코인 클라이언트는 잠금 스크립트와 해제 스크립트를 함께 실행해서 거래를 유효화시킴

○ 최초: 잠금/해제를 서로 연결해서 실행, 보안상 이유로 변경

○ 현재: 해제 스크립트는 스택 실행엔진을 이용하여 실행됨

■ 오류가 없으면 잠금 스크립트 실행● 튜링 불완전성: 의도적으로 기능이 제한됨● 무상태형 검증

○ 스크립트 언어는 stateless○ 스크립트 실행전/후에 저장되는 상태가 없음

● reverse-polish notation을 따르는 스택 기반의 실행 언어● https://en.bitcoin.it/wiki/Script● 범위가 한정되도록 고안된 매우 단순한 언어 (다양한 하드웨

어)● 스택(stack) 데이터 구조 기반● 두가지 연산 : Push and Pop● 각 항목을 왼쪽에서 오른쪽으로 처리하면서 스크립트를 실행

○ 숫자(데이터 상수)는 스택 상부에 기록○ OP_ADD : 스택에서 두 항목을 가지고 나와서 두 값

을 더하고 그 합계를 스택의 상부에 기록● 조건부 연산자들: 조건평가후 TRUE / FALSE 생성

○ OP_EQUAL: 동일하면 1(TRUE), 불일치 0(FALSE)○ 2 3 OP_ADD 5 OP_EQUAL : 2와 3을 더하고 그 결

과 값이 5와 동일한지 비교○ 잠금 스크립트 예 : 3 OP_ADD 5 OP_EQUAL○ 해제 스크립트 예 : 2○ 해제 스크립트 + 잠금 스크립트 결과값이 OP_TRUE

면 유효한 거래로 인정● 스택 상부의 결과값이 TRUE이거나 0이 아닌 숫자이거나 스

크립트 실행이후 스택이 비어있다면 거래는 유효

Page 14: 이동산 (mountie@paygate.net) 2016C0%CC%B5%BF%BB%EA.pdf · 해당 거래가 블록체인내에 존재하고 그후 채굴된 블록이 여러개 있다는 점을 승인 출력값을

5가지 표준 거래pay-to-public-key-hash

● P2PKH● 공개키 해시를 이용해 출력값에 대한 예상지출을 실행하는 잠

금 스크립트 포함● 디지털 서명 사용해서 해제 가능● OP_DUP OP_HASH160 <Public Key Hash> OP_EQUAL

OP_CHECKSIGPay-to-Public-Key

● 잠금 스크립트내에 공개키가 저장되어 길이가 짧아짐● coinbase 거래에 자주 나타남(채굴자들이 생성하는 거래)● 잠금스크립트 : <Public key A> OP_CHECKSIG● 해제스크립트 : <Signature from Private KeyA>● 복합 스크립트 : <Signature from Private KeyA> <Public Key

A> OP_CHECKSIG다중서명 (OP_CHECKMULTISIG)

● OP_0 <SignatureB> <SignatureC> 2 <PublicKeyA> <PublicKeyB> <PublicKeyC> 3 OP_CHECKMULTISIG

○ 예상지출로 설정된 3개의 공개키중에서 2개의 공개키에 대응하는 2개의 개인키로부터 나온 유효서명을 해제 스크립트가 보유하고 있는지 여부

pay-to-script-hash● OP_CHECKMULTISIG의 번거로운 단점 해소● P2SH : 해당 출력값이 소비된 후에 제공되며 해시와 일치하

는 스크립트로 지불● P2SH가 있는 스크립트

○ 리딤 스크립트 : 2 PubKey1 PubKey2 PubKey3 PubKey4 PubKey5 5 OP_CHECKMULTISIG

○ 잠금 스크립트 : OP_HASH160 <20 bytes hash of redeem script> OP_EQUAL

○ 해제 스크립트 : Sig1 Sig2 <redeem script>● Pay-to-script-hash 주소: BIP0013에서 규정, 접두부 3● 장점

○ 거래크기 줄임○ P2SH는 스크립트를 만드는 부담을 송신자가 아니라 수취

인에게 부담시킴○ 긴 스크립트 수수료 비용 부담을 수취인으로 옮긴다

■ 수취인은 거래의 출력값을 소비하기 위해서는 길이가 긴 리딤 스크립트를 거래의 입력값에 포함시켜야한다

Page 15: 이동산 (mountie@paygate.net) 2016C0%CC%B5%BF%BB%EA.pdf · 해당 거래가 블록체인내에 존재하고 그후 채굴된 블록이 여러개 있다는 점을 승인 출력값을

5가지 표준 거래 (OP_RETURN)● 목적지 주소 20바이트 공간을 자유목적으로 사용해서 소비될 수 없는 UTXO를 생성● 목적지 주소는 데이터용으로 사용됨 ⇒ 문제발생● 그래서 OP_RETURN 도입 합의● 40바이트 크기

○ 실제로는 80바이트○ https://en.bitcoin.it/wiki/OP_RETURN

● UTXO 세트에 저장될 필요 없음○ UTXO 메모리 풀 절감

● OP_RETURN 응용○ SHA256 32byte○ 8바이트 접두부

● Proof-of-Existence○ DOCPROOF 접두부 사용

● 해제 스크립트가 없음○ but input 스크립트는 서명값 포함?

● only single OP_RETURN○ but 다른 지불 스크립트와 함께 사용 가능

Page 16: 이동산 (mountie@paygate.net) 2016C0%CC%B5%BF%BB%EA.pdf · 해당 거래가 블록체인내에 존재하고 그후 채굴된 블록이 여러개 있다는 점을 승인 출력값을

비트코인 네트워크● P2P 네트워크 아키텍처● 노드의 유형 및 역할

○ 4가지 기능: 라우팅, 블록체인 데이터베이스, 채굴, 지갑서비스

○ 라우팅: 모든 노드가 보유, 거래와 블록을 검증하고 전파, 이웃노드와의 연결을 유지

○ 단순지불검증(SPV): 라이트웨이트 노드○ 채굴 노드

● 네트워크 검색○ 포트 8333○ 연결후

■ 버전메세지 전송■ 핸드세이크 시작(Protocol_version,

nLocalServices, nTime, addrYou, addrMe, subver, Best Height)

■ 연결승인 : verack○ 이웃노드 없으면 seed node에 접속

● 최초 블록은 클라이언트 소프트웨어에 내장

● 단순지불검증(SPV) 노드○ 비트코인 지갑의 가장 흔한 형태○ 이웃노드 의존○ 거래유효성 검증가능 but 소비여부를 검증할 수 없음○ 머클경로 이용 존재하는 거래의 유효성 검증가능○ 누가 어떤 주소 검색하는지 알기 때문에 프라이버시

문제 있음 ⇒ 블룸필터(Bloom filter) 기능으로 해결시도

● 블룸필터: 확율적 검색 필터, 프라이버시 보호하면서 검색패턴을 표현하기 위한 효율적인 방법 제공

○ 지갑내 주소에만 반응하는 필터 생성후 관련 데이터만 수신

● 거래 풀○ 메모리풀이라고도 함○ 미승인 거래로 이루어진 임시 목록 보관○ UTXO중에서는 2009년도 날짜것도 있음

● 비상 메시지○ 거래 사용안되지만 대부분 노드에서 실행○ 비상경보 방송 시스템○ 멀티블록 분기를 발생시킨 심각한 데이터베이스 버그

가 나타난 2013년 초에 사용됨

Page 17: 이동산 (mountie@paygate.net) 2016C0%CC%B5%BF%BB%EA.pdf · 해당 거래가 블록체인내에 존재하고 그후 채굴된 블록이 여러개 있다는 점을 승인 출력값을

블록체인

● 블록체인내의 블록 각각은 SHA256 Hash를 통해서 생성됨● 여러개의 자식블록이 블록체인 분기가 발생하는 동안 생성

○ 다른 채굴자들에 의해 거의동시로 다른 블록들이 발견되는 경우. 일시적 상황

● 블록구조

○ 블록크기: 4바이트○ 블록헤더: 80바이트

■ 이전블록 해시값, 난이도, 타임스탬프, nonce○ 거래카우터: 1~9바이트○ 거래: 가변적

● 블록 식별자: 블록 헤더 해시와 블록 높이○ 블록 암호화 해시: SHA256 블록헤더를 2회 해싱후

확보

■ 실제로 블록의 데이터 구조에 포함되어 있지 않음

■ 네트웍전송시에도 미포함, 각 노드에 의해 계산됨

○ 블록체인내에서의 위치 파악: 블록높이 확인. 데이터구조의 일부가 아니라서 저장안됨

● 최초 블록○ 2009년 생성○ 클라이언트 소프트웨어 내에 고정적으로 인코딩

● 새로 생성된 블록들을 전송받고나면 유효성 검사후 기존 블록체인에 연결. 새로 생성된 블록헤더 검사후 이전블록 해시 찾음

● 머클트리

○ 이진 해시 트리 (암호 해시를 담고 있음)○ 규모가 큰 데이터집합의 완전성을 효율적으로 요약하

고 검증하는데 사용되는 데이터 구조○ 거래데이터를 해싱해서 나온 결과값 두개를 연결한

해시 두개를 연결한 해시 …. 계속 두개의 해시를 연결한 값을 해시해서 루트를 찾아감

○ 홀수개라면 마지막거래 해시를 복사해서 짝수로 만듬○ 블록내에 수백건에서 수천건의 거래에 대한 단일 머

클 루트 생성후 특정 거래가 블록내에 포함됨을 임증○ 노드가 Log2(N)개의 32바이트 해시 생성해서 루트

연결

● 머클트리와 단순지불검증(SPV)○ 머클트리는 SPV노드에서 널리 사용됨○ SPV Node는 블록 헤더만을 다운로드함○ 거래가 블록내에 포함되어 있는지 여부 검증위해 머

클 경로 사용○ 풀블록(약 1MB)의 1000분의 1수준

Page 18: 이동산 (mountie@paygate.net) 2016C0%CC%B5%BF%BB%EA.pdf · 해당 거래가 블록체인내에 존재하고 그후 채굴된 블록이 여러개 있다는 점을 승인 출력값을

비트코인 채굴● 채굴자들의 보상

○ 새 블록에서 새로운 코인 생성■ 4년마다(210,000블록마다) 줄어듬■ 최초 50BTC, 2012.11 25BTC, 2016 12.5

BTC, 2040년 종료○ 거래수수료: 입력값과 출력값 차이만큼○ 통화공급은 채굴을 통해서이루어짐

● 채굴의 목적: 블록을 만들어주는 역할, 거래검증 및 승인● 분산화된 합의

○ 각 풀 노드마다 독립된 검증 실시○ 검증된 거래들을 새로운 블록에 독립적으로 추가○ 모든 노드들이 새 블록을 독립적으로 검증한 후 체인

에 블록을 연결● 각 노드는 모든 거래를 독립적으로 검증● 채굴 노드는 새로운 블록 구성 노력

○ 새로운 블록을 수신했다는것은 경쟁패배 의미○ 10분마다 새 블록 생성.

● 검증된 거래는 노드의 메모리풀 또는 거래 풀에 추가● 거래의 나이, 수수료등 고려 우선순위에 따른 후보거래 구성● 생성거래 (혹은 coinbase 거래)

○ 입력값으로 UTXO를 쓰지 않음○ 구조: 거래해시, 출력값 인덱스, 코인베이스 데이터

크기, 코인베이스 데이터, 일련번호○ 코인베이스 데이터의 나머지 부분은 채굴자들이 원하

는 방식으로 사용될 수 있음. 마지막 부분은 BIP0016 지지의사 표명의 표시로 P2SH추가

● 블록헤더 구성하기○ 6개의 헤더: 버전, 이전 블록해시, 머클루트, 타임스탬

프, 난이도 목표, 난스● 코인베이스에 대한 보상금과 수수료

○ 거래수수료 총액 계산: 블록에 추가된 거래의 입력값과 출력값 총액의 차액으로 계산

○ coinbase reward■ 블록 높이에 근거 매 210,000블록마다 절반

으로 줄어듬. ■ 반감기는 최대 64회 허용

Page 19: 이동산 (mountie@paygate.net) 2016C0%CC%B5%BF%BB%EA.pdf · 해당 거래가 블록체인내에 존재하고 그후 채굴된 블록이 여러개 있다는 점을 승인 출력값을

비트코인 채굴(2)● 블록 채굴은 블록 헤더를 반복적으로 해싱해서 해시 결과값이

특정 목표치와 일치할때까지 하나의 매개변수를 변화시키는 과정

● 작업증명 알고리즘○ 해쉬값을 찾아내는 과정○ 원하는 난이도 설정: 얼마나 많은 리딩 비트가 0이어

야하는지를 나타낸 수치● 난이도 표기법

○ 난이도 목표값을 계수/지수 포맷으로 표현○ 첫두자리의 16진수는 지수를 나타내고 다음 여섯자

리 16진수는 계수를 나타냄● 난이도 목표 및 목표 재설정

○ 평균 블록 생성시간 10분을 기준으로 함.○ 난이도가 높은 것으로 작업했다는 증명○ 전기료 및 전기료를 내기 위해 사용되는 통화에 대한

비트코인 환율과 밀접하게 관련있음● 블록채굴 성공확율 높이기 위해 ASIC 이용추세● 각 노드에서 새 블록을 검증 : 난이도 등

○ 부정직하게 생성된 블록은 다른 노드에서 거부

● 블록체인을 수집해서 선택하기○ 블록을 체인 안에 모아서 가장 많은 작업증명을 보유

하고 있는 체인을 선택○ 누적 난이도가 가장 큰 값을 가진 블록들로 구성된 체

인이면 어떠한 것이라도 메인체인이 됨○ 가장 많은 블록을 담고 있으면 메인 체인이 된다○ 고아블록은 부모 블록이 도착할때까지 풀에 저장

● 블록체인 분기○ 블록들이 다른시간에 다른 노드에 도착할 수 있기 때

문에 분기 발생○ 분기 방지를 위해서

■ 각 노드는 항상 작업증명을 가장 많이 시행한 블록체인을 선택해서 연장하려고 함

■ 분기를 잘못선택하면 잘못된 노드가 되버림■ 대부분 한 블록이내에서 해결됨

● 채굴과 해싱 레이스○ 해싱 파워 증대로 추가 난스 솔루션 필요

■ 난스값 40억개 모두 투입해서 블록을 못찾게 됨

■ 코인베이스 거래에 추가 난스 추가해서 해결● 협력을 위한 채굴 풀 이용하기도함. (풀 관리자가 존재) ⇒

P2Pool

Page 20: 이동산 (mountie@paygate.net) 2016C0%CC%B5%BF%BB%EA.pdf · 해당 거래가 블록체인내에 존재하고 그후 채굴된 블록이 여러개 있다는 점을 승인 출력값을

Thinking● 1:n 거래시 수수료는? n:1의 경우 one transaction● coinbase 거래를 채굴업자가 임의로 높이면 무슨일이 발생?

노드에서 거부● SHA256 upgrade? 합의에 의해● how many blockchain nodes? ● HD지갑의 트리구조 대신 SNS 구조 채택 가능성?● 한 블록에 들어가는 거래는 몇개? https://blockchain.

info/charts/n-transactions-per-block, 최소 400개에서 2천개정도까지

● reward는 수학적으로 어떻게 부여되나? 거래수수료로는 부족해보임

● Bitcoin HSM?● one private key and multiple public key? private - public key

pair, 하나의 개인키에서 2개이상 공개키 생성가능(압축공개키, 비압축공개키)

● 타원곡선암호 지원? ECDSA● Base58Check version prefix의 약속된 코드 목록이 있는가?

https://en.bitcoin.it/wiki/List_of_address_prefixes

● OP_RETURN 40bytes max? prefix + 32byte hash, Base58Check format? 실제 80바이트

● OP_RETURN fee는 어떻게 지불?● 데이터 암호화 키관리 솔루션에 HD 지갑의 키 관리 방식 응용● BIP0038 암호화 개인키는 어떤 알고리즘 사용?● bitcoin script : https://en.bitcoin.it/wiki/Script

https://www.cs.princeton.edu/~tongbinw/bitcoinIDE/build/editor.html

● bitcoin address로 도메인 생성, 인증서 발급, bitcoin address에 대한 공식적인 KYC 제공. bitaddress.org

● BIP에 formatting small numbers 제안 https://github.com/bitcoin/bips/blob/master/README.mediawiki

● P2SH와 OP_RETURN 함께 사용 ⇒ OP_PUSH <data> OP_DROP 으로 사용.

Page 21: 이동산 (mountie@paygate.net) 2016C0%CC%B5%BF%BB%EA.pdf · 해당 거래가 블록체인내에 존재하고 그후 채굴된 블록이 여러개 있다는 점을 승인 출력값을

감사합니다.