비트코인 part1

비트코인 part1

비트코인

블록체인 기술을 기반으로 만들어진 최초의 암호화폐

2008년 10월, 사토시나카모토라는 인물(?)이

“Bitcoin: A Peer-to-Peer Electronic Cash System”이라는

 

제목의 논문을 발표

블록체인이란 의미는 나오지 않았음

블록과 체인이 개별적 단어로 존재했음

2009년 1월, 비트코인 최초의 블록인 제네시스 블록이 만들어짐

2009년 2월, c++로 만들어진 Bitcoin Core v0.1 프로그램이 오픈소스로 공개

많은 사람들이 자신이 사토시 나카모토라 주장하지만,

증거제시자가 없음 (비밀키를 증명하면 됨)

비트코인 화폐단위

비트코인(BiTCoin)의 약자 BTC 사용

International Standards Organization (ISO)에서 명시하는 대로 XBT를 단위로 용

X: not associated with a particular country(국가존재하지않음), BT:BiTcoin / USD(국가 + 단위)

제작자의 이름을 딴 Satoshi라는 더 작은 단위가 존재 > 1BTC = 108 satoshi

1BTC가 대략 1억원이라 한다면 1 satoshi는 1원

(유용성 측면에서 최소단위가 중요함)

 

굉장히 작은 단위까지 있어 마이크로 페이먼트(micro payment)에도 적합

예전엔 사토시보다 작은 단위의 거래는 도지코인으로 거래하기도 했음 (지금은 다름)

비트코인에도 계좌(Account)라는 개념이 존재

은행같은 중앙기관이 없어도 계좌를 만들수 있음

(은행보다 만들기 쉬움) → 시빌공격(sybil attack)이 가능

 

계좌를 관리하는 지갑(Wallet) 어플을 통해 계좌 정보 조회 가능

지갑어플을 통해 만들어진 지갑이라해도 거래가 진행되지 않는다면

비트코인 코어에 기록 되지 않음

비트코인 계좌 = 개인키/공개키쌍으로 만들어짐

개인키

– 256bit길이의 숫자

– 보통 16진수 64자리로 표현됨

– ex. 1E99423A4ED27608A15A2616A2B0E9E52CED330AC530EDCC32C8FFC6A526AEDD

계좌에 비밀번호라고 봐도 됨

비트코인 계좌 = 개인키/공개키쌍으로 만들어짐

> 공개키

– 공개키는 개인키를 가지고 secp256k1

타원곡선 표준을 활용하여 만들어짐

 

– 공개키로 부터 개인키를 도출할수 없음

 

– 기본적으로 512bit (256bit, 256bit) 이지만 비트코인에서는

압축 공개키 방식 사용 256bit로 표현됨

 

– x를 통해 y를 알수 있고, y의 02(짝수), 03(홀수)까지 판단하여 입력 (접두어 사용)

ex. 03F028892BAD7ED57D2FB57BF33081D5CFCF6F9ED3D3D7F159C2E2FFF579DC341A

 

– 공개키를 통해 계좌번호 역할의 주소를 만들 수 있음

비트코인 계좌 – 주소

비밀키 공개키 쌍을 구해 공개키를 활용

공개키에 이중해시를 사용 → 이유: 풀릴 위험 존재

-> 보완성!

-> RIPEMD160 으로 고정길이 ↓

공개키 이중해시 된 값을 Base58check encode를 진행

Base58check encode with 0x00 version prefix를 통해

만들어진 값을 주소로 사용

Base58Check Encoding

> 공개키 해시값의 접두에 version을 붙히기

> version을 통해 메인넷인지 테스트넷인지 확인 가능

> version을 붙힌 공개키 해시값을 이중해시(SHA256)를 진행

> 앞부분 4byte를 체크섬(checksum, 주소의 유효성 검증)으로 사용

> Base 58 Encode 진행

> 0, O, o나 i, I, 1 같이 비슷해 보 이는 알파벳 및 숫자를 제거

결국!

비밀키 k -> 공개키 K -> 주소

비트코인에서 사용되는 해시함수는

SHA2계열을 사용하고 있음

 

사용되고 있는 부분

> 공개키의 해시값으로 주소 생성

> 작업증명

> 트랜잭션 아이디

> 머클트리

블록 파라미터란 블록이 설정된 상태

> 블록 크기 : 1MB

> 블록 생성 주기 : 10분

> 블록 당 트랜잭션 수 : 수천개(~3000개)

> 블록 당 채굴 보상 : 약 6.4BTC (수수료포함)

> 광물을 캐는 행위를 채굴이라 한다

> 비트코인을 캐는 행위를 채굴이라 한다

> 캐는 행위란 컴퓨터 연산을 사용하여 해시퍼즐을 푸는 행위

> 해시퍼즐은 난이도를 통해서 구해지는 퍼즐

PoW (Proof of Work) – 작업증명 – 해시퍼즐풀기

PoW (Proof of Work) – 작업증명 – 난스를 증가시켜 정답을 찾아 정답을 찾아간다

해시함수의 특성상 1이 증가한다고 해서

바로 목표값에 도달하는 것이 아니라

 

랜덤하게 값이 생성 되기 때문에 얼마나 증가 시켜야

목표값보다 낮은 수를 랜덤하므로 바로 얻기는 어렵다

채굴 난이도

> 목표난이도는 2주간 2016개 블록을 확인해서 블록 생성 시간에 맞게 변경

> 평균 10분 보다 크면 난이도를 낮추고, 평균 10분 보다 낮으면 난이도를 높임

> 난이도가 높아지면 목표값이 더 낮아지고, 난이도가 낮아지면 목표값이 올라감

> 목표값에 따라 해시퍼즐 구하는 시간이 달라짐

채굴 보상 = 블록 보상 + 트랜잭션 수수료

블록보상

– 채굴에 성공(해시퍼즐해결)할 시 주어지는 보상 ( 코인베이스 트랜잭션 )

– 처음엔 50BTC 였으나, 반감기가 존재 ( 평균 4년 )

– 총 발행량 2100만개 > 트랜잭션 수수료

 

블록에 담긴 모든 트랜잭션에 있는 수수료를 채굴자가 채굴 보상으로 가져감

비트코인의 트랜잭션은 3가지 특성

> Unspent Transaction Output (UTXO)

> 스크립트 언어(script language)

> 세그윗 (Segregated Witness, SegWit)

비트코인 트랜잭션 – UTXO

소비되지 않은 트랜잭션 출력

> 비트코인은 계좌에 얼마가 있다라는 형식으로 저장되지 않음

(Not Account/Balance Model)

> 특정 계좌의 잔액(Balance)을 알고싶다면 그 계좌 소유의 UTXO를 더해야 함

> input value = output value + fee

비트코인 트랜잭션 – 스크립트 언어

> 비트코인의 트랜잭션에서 사용되는 간단한 언어

> Stack based, from left to right, no loops, and not Turing complete

> UTXO를 사용하기 위한 unlocking script와 UTXO를 잠그기 위한 locking script를 구현할 때 사용

트랜잭션에 사용된 script에 따른 5 종류의 표준 트랜잭션 (Standard Transaction)이 존재

> P2PK (Pay to PubKey)

> P2PKH (Pay to PubKey Hash)

> P2SH (Pay to Script Hash)

> Multi Sig (Multi Signature)

> Null Data

P2PK (Pay to PubKey)

– Locking Script = ScriptPubKey : <pubkey> OP_CHECKSIG

 

– Unlocking Script = ScriptSig : <sig>

 

– 가장 간단한 형식의 script

 

– UTXO가 생성되는 순간 script에 명시되어 있으니

소유자의 public key가 노출되는 단점이 있음

 

– 단점 해결을 위해 P2PKH가 등장

Leave a Comment

%d 블로거가 이것을 좋아합니다: