CS/3-2 블록체인

[블록체인] 07. Mechanics of Bitcoin - Limitations and Improvements

이지이즤 2022. 10. 23. 15:32

 

Limitations and Improvements

: 비트코인의 한계개선점


비트코인의 상당부분은 하드코딩 되어있음.
비트코인의 P2P 네트워크에 참여한다는 것도 비트코인 프로토콜이 구현된
프로그램(바꿀 수 없는 const)을 실행시키겠다는 거임.


<하드코딩 되어있는 것들>

  • 블록 채굴 평균 시간(10m)
  • block reward 구조 (50btc에서 시작하여 21만개 block마다 반감)
  • block size (transaction size를 upto 1MB로 함)
  • crypto algorithm (SHA256사용)
  • 비트코인의 총 양(2100만개) : 이 제한을 풀면 비트코인 교환가치에 큰 영향 미칠것임.
  • Low transaction throughput : 너~~무 느리다는 문제점..
    (송금,결제 시스템인데 판매자가 6confirm 기다리고 물건주는데까지의 시간이 너무 오래걸림)
    Bitcoin: 7 transactions / 1 sec
    - Visa: 10,000 transaction / 1 sec
    total transaction size = 1MB이고 avg transaction size = 250Byte이므로
    한 block당 대략 4000개의 transaction 포함되어있음.
    block은 10분에 1개꼴로 채굴되므로 4000/(10분*60초) = 7 transactions / 1sec

 

 

Changing Protocol


새로운 버전의 software
(업그레이드 된 비트코인 프로토콜)가 등장했다고 해보자.
노드들에게 새 버전 사용을 강제할 수 없음.
-> 새로운 버전 돌리는 노드 & 옛날 버전 돌리는 노드로 나눠짐(fork)

* 순간적인 branch(금방 없어짐) != fork(S/W 업그레이드에 의한 것)

 

Hard Fork

new features 등장 -> 새로운 버전의 S/W 탄생 -> 모든 노드가 new ver.을 돌리는 게 아님.
=> hard fork방식은 서로 다른 버전의 노드가 compatible 불가능함.
    서로 다른 버전의 노드가 만든 블록을 이해할 수 없음(accept하지 않음)
-> 블록체인이 완전히 분리되고 각 버전은 독자적으로 longest chain을 찾게 됨.
    두 체인이 절대로 다시 합쳐질 수 없음.(이혼!! 갈라서자! 남남 됨)

 

Soft Fork

new features 등장 -> validation rules가 더 엄격해짐! (backward computing)
=> new 버전 돌리는 노드가 만든 blockold버전 돌리는 노드가 인정함.(규칙이 엄격해졌을 뿐)
     그러나 old 버전 돌리는 노드가 만든 blocknew버전 돌리는 노드는 인정 안 함.
     (엄격하지 않은 기준에서 만들어진 bock 이므로)

old->new는 안되는데 new->old는 accept됨

old가 만들어서 뿌린 블록을 new가 인정 안해줌 -> 내 블록이 longest chain에 포함되지 않는 것을 종종 경험함.
새로운 ver을 채택한 노드가 과반이상(그럴듯한 upgrade이기때문)이라면 old ver노드들이 압박을 느낌.
열심히 채굴해봤자 다수의 new들이 내 block을 대세로 accept해주지 않으니까 나에게 손해임.
-> old ver노드가 new ver노드로 upgrade할 동기를 가지게 됨.

ex) new version은 coinbase parameter(아무거나 넣어도 됨)에 "Hello"를 넣어야한다는 규칙
     -> old ver노드는 coinbase parameter에 뭐가 들어갔든(old/new) 전부 받음.
         new ver노드는 "Hello" 들어간 것(new가 보낸 것)만 받음. (old가 보낸건 못받음)

 

 


Trilemma

 

① 탈중앙화 (Decentralization)

② 확장성 (Scalability) 

③보안 (Security) 

 


탈중앙화 (Decentralization) 문제

 

사토시나카모토는 은행같은 중앙집중 금융기관을 없애는 탈중앙화를 중요시했음.
1CPU 1VOTE!!! 모든 노드가 평등해야함!

근데 실제로는 이미 흔들리고있음(막강한 hash power가지는 채굴회사 존재)

채굴자들이 bitcoin 생태계 유지에 매우 중요한 역할(블록 검증, 채굴)을 하는데
(채굴자들이 담합해서 채굴안한다고 파업한다면 공격자들이 branch일으켜서 이중지불 할 것임.)
굉장히 중요한 일을 하고 있다는 것을 채굴자들도 앎.
본인들이 빠지면 비트코인이 흔들릴 걸 알기 때문에 채굴자들이 목소리를 냄.
더이상 탈중앙화가 아님. 채굴자들이 일반 노드보다 더 power를 가진 중앙의 역할을 하는 존재가 돼버림.
채굴 장비를 사고 파는 마켓도 생겨남(채굴 파워 키우기)

Top 3~4정도의 miner들이 굉장한 hash power를 가지고 있음. 결코 탈중앙화가 아님.
==> 51% 공격이 가능해짐!!! (막강한 hash power가지는 채굴집단 몇몇이 담합)

 

해결책: ASIC-Resistant Mining Puzzles

비트코인 채굴 ASICSHA256 전용 계산을 하는데 특화된 H/W 머신인데,
ASIC에 저항성을 가지는 mining puzzle을 제시하자는 방법임. (비트코인 이후의 프로젝트임)

즉, ASIC을 도입할 능력이 안되는 다수의 일반 채굴자들은 불리하니까
ASIC을 이용한 채굴에 불이익을 주자는 방법임.

ASIC-resistant puzzle은 일반 컴퓨터와 특수 컴퓨터의 gap을 줄임.
전문장비 없더라도 채굴 경쟁력이 어느정도 보장되도록 함.

ex) Memory-Hard Puzzles (Litecoin에서 채택중)
퍼즐 풀기 위해서 굉장히 다량의 메모리 필요!
(SHA256 계산 특화에 방대한 메모리가 필요하지 않음. 일반 컴퓨터와 메모리 성능 차이는 크지않음.
-> 메모리 사용을 강제하는 퍼즐을 만들자)

메모리를 써야만 채굴 경쟁에서 뒤처지지 않음. 채굴자가 메모리를 안 쓸 수 없게 함.
검증하려면 좀 오래걸린다는 단점.(채굴자의 N과 seed값을 가져다가 저거 계산을 해봐야함)

 

cf) Selfish Mining Attack

블록체인은 모든 노드가 본인의 이익을 극대화하는 방향으로 행동한다고 가정함.(게임이론)
그러나 인간이 극도의 탐욕이나 불안한 상태에서는 비이성적으로 행동하는 경우가 존재함.
hash power가 51%가 아니라 25~30%만 되어도 나머지 70%가 비합리적인 생각을 해서
과반수가 아닌 power로도 공격을 성공할 수도 있음.(bitcoiin에서는 아직까지는 발생한 적 없음)

 

 


확장성 (Scalability) 문제

 

비트코인은 consensus 과도하게 신경을 쓰고있는 프로토콜임.
(consensus가 깨지면, 비트코인 신뢰성과 교환가치가 떨어지고 망할 수도 있기때문)

=> 확장성이 희생될 수 밖에 없음.(transaction throughput 굉장히 낮음)

 

 

해결책: 허가형 (Permissioned) 블록체인

 


해결책: Increasing Block Size (2017)

Bitcoin Cash Chain의 해결책


- 2017년 이전
 : 비트코인 자체를 아는 사람이 별로 없었고, 알더라도 pay하려는 트랜잭션이 적었음.
   채굴은 10분에 1개꼴로 정해져있는데 채굴을 위한 트랜잭션들이 많지 않다보니까
   블록의 상당 부분이 비어있는 채로 채굴되었음.

- 2017년 이후
 : 점점 트랜잭션이 많아지게되면서, 블록에 트랜잭션들이 꽉 찬 상태로 채굴됨.
   -> transaction fee 높아짐, 채굴될 블록에 포함되기 위해 대기해야함.

=> Bitcoin CoreBitcoin CashHard fork !!!
     Bitcoin Cashblock size 8MB로 올려서 확장성 키움. 
     블록 널널해져서 경쟁이 치열하지 않아 transaction fee가 낮아진다는 장점도 있음.

그럼 Bitcoin Core는 그동안 뭐했니?
SegWit으로 확장성 문제 해결 시도했음.

 

해결책: SegWit (Segregated Witness)

Bitcoin Core의 해결책; 분리된 signature

한 block에 transaction 1MB만 넣을 수 있음.
transaction의 signature(witness) 부분을 바깥으로 빼서(input, output만 넣기) transaction당 size를 줄이자. 
signature를 빼고 확보된 space에 transaction을 더 넣자!
(1MB -> 최대 4MB로 block size 커짐. 즉, 초당 처리할 수 있는 transaction 수 늘어남)

=> 근데 이걸 soft fork로 했음 ㄷㄷ

soft fork : old ver노드가 new ver블록 인정, new ver노드는 old ver블록 인정X.

old ver.돌리는 노드에게 SegWit block 보낼때는 Witness Data 빼고  Base Block만 보냄.
(size가 1MB여야 access해줌)

validity 검증은 어떻게 통과함?
Pay-to-Witness-Public-Key-Hash

진정한 validity검증은 아니지만(sig부분이 빠져있어서 redeem 권한체크는 못함-> segwit노드가 대세라서
redeem 권한체크 못한 블록은 인정 안할 것이기 때문에 이게 문제되진 않음)

아무튼 old ver노드가 segwit의 validity가 true라고 하고 수용함.

 

multisignature 문제

어떤 회사(여러 명) 계좌에 입금된 돈개인의 계좌로 송금하려면 최소 2명 이상의 동의가 필요함.

매 transaction output마다 여러 public key hash(서명 검증을 위해)가 들어가서 길어짐.
Bitcoin Address는 public key를 hash한 것인데(4장 참고)
public key hash(=목적지 address)로 payment 해야하므로.

 

해결책: Pay-to-Script-Hash (P2SH)

구매자는 script hash 지불 가능! (address가 아니라 script로 보냄!)
code 짧아짐(transaction size 줄임) -> block당 포함하는 transaction 개수 증가

구매자는 script hash에 지불
회사 계좌의 돈을 사용할때만 redeem script 사용

 

Pay-to-Witness-Script-Hash
: pay-to-script-hash에 SegWit 적용

 

 


PoW로 인한 에너지 낭비 문제

작업을 했다는 증명을 제시해야만 채굴했다고 인정받고 보상을 받음.
확장성을 위해 초당 처리하는 transaction 수 늘리기 위해서는
block에 더 많은 트랜잭션을 포함시키거나 block의 채굴 주기를 줄여야함.
근데 그게 PoW에 의해 막혀있음.

그리고 비트코인 채굴로 인한 에너지 소비가 과다함.(hardware,전기 cost < reward)

 

해결책: Proof of Stake (PoS) 

지분증명 (이더리움에서 채택중)
-> 전기 사용량 99.5% 감소함(과도한 전기소비 문제를 해결)

누가 채굴할 지 결정하는 투표 시스템을 만듦.
해당 currency(지분)를 가지고 있는 만큼 voting power를 줌.

지분 많음(currency 많이 가지고있음) -> 이 currency의 교환가치가 떨어지는 것을 가장 두려워하는 사람임
-> 우리의 블록체인 프로젝트 공동의 이익을 위해 정직하게 최선을 다해 검증할 것임
    (먹튀해서 화폐가치 떨어뜨릴 가능성 가장 적음)

가장 많이 투자한 경우에 자동적으로 voting power가 커지기때문에 
그 이후에는 에너지나 장비를 덜 소비할 것임.

에너지 소비도 줄이고 확장성 문제도 해결함!

 

 


보안 (Security) 문제

 

개인정보보호 문제

비트코인 transaction에 원하는 임의의 data를 집어넣을 수 있다는 것을 악용.
대략 251million개의 트랜잭션에 송금과 무관한 내용(음란물, 광고, 악성코드 등)이 들어있음.
-> 지울 수 없음.

거리소 해킹 및 투명성

거래소(≒증권회사)가 해킹당해서 파산한 적도 있음.

 

해결책: Cold (H/W) Wallet

비트코인을 가지고 있는 2가지 방법
1. 특정 거래소와 거래하면서 계좌를 개설하고 그 거래소 계좌를 통해서 비트코인 구매
   (거래소가 내 계좌의 비트코인에 접근 가능)

-> 거래소 못믿겠다!

2. 내가 비트코인 주소를 만들고 그 주소에 비트코인 집어넣기
   (그 주소에 도달한 비트코인을 꺼내갈 수 있는 SK는 wallet에 가지고 있음)
   wallet을 cold wallet으로 유지하는 게 가장 안전함!!

cold wallet은 network와 분리되어있음.
공격자는 physical하게 훔쳐가는 방법밖에 없음. 훔치기 어려움.

 

해결책: Paper Wallet

 

해결책: DEX

거래소 자체를 자동화 시키기.(smart contract 기능 이용)
거래소가 하는 기능/역할들을 프로그램해서 블록체인에 포함시키기.

탈중앙화(자동화)된 거래소를 통해서 코인 거래하려면 거래소 프로그램을 호출하기만 하면 됨.
기존 거래소의 취약성 문제 해결함!

--------------여기까지 중간고사--------------

 


Anonymity in Bitcoin

비트코인은 (엄밀하게 따지면) 익명성이 보장되지 않음.
pseudonymity(수도 레벨의 익명성)는 보장함. ex) real name이 아니라 ID나 닉네임 사용
-> 비트코인에서는 public key hash(address)를 identity(고유값, ID역할)로 사용함.

pseudonymity만으로는 충분한 익명성이 보장되지 않음. privacy 문제!
누군가가 나의 Bitcoin address를 나의 real-world identity와 연결(link)지을 수 있다면
나와 관련된 모든 transaction들이 알려짐. ex) 식당에서 bitcoin으로 지불 시 쉽게 연결 가능

random해 보이는 sequence(address)가 특정인과 연결되어있음.
이 주소로부터 특정인을 연결시키는 것(쉽진 않지만 불가능은 아님)은 추가의 작업이 필요하긴 함.

즉, bitcoin의 Anonimity
pseudonymity(실제 이름X) + unlinkability(누구랑 연결되어있는지 쉽게 알 수 X)가 동시에 보장되는 것

 

Unlinkability

: 두 item을 연관시키는 것이 불가능한 것.
 ex) 두 주소가 같은 소유자의 주소인지 연결 불가능, 주소 다른 두 트랜잭션이 동일인이 유발시킨 것인지 연결 불가능.
 근데 unlinkability 쉽지 않음. 두 군데의 주소에서 redeem 해와서 사용하는 트랜잭션을 보고
 제 3자는 그 두개의 주소가 아마도 같은 사람이 관리하고 있겠다고 유추 가능.

pseudonumity는 보장되지만 unlinkability는 보장되지 않는다면 완벽한 anonimity가 보장되지 않음.
* side channels 
 : 우회경로로 정보 알아내기. 여러 정보 조합해서 끼워맞췄더니 특정한 목적지를 가리킴.
   ex) Alice가 Bob에게 오늘 5btc를 보낸다는 사실과 Bob의 bitcoin address를 알고 있다면
        Bob의 거래내역을 보고 Alice의 bitcoin address도 찾을 수 있음.

 

익명성이 필요한 이유?

검열 저항성! (bitcoin의 목표)
: 익명성이 보장되지 않으면 검열하는 거랑 다를 게 없음.

근데 블록체인은 모든 트랜잭션이 기록됨. 원하면 누구든 열람 가능하고 관련된 주소 역추적 가능.
현재 은행 시스템(해킹해야 남의 거래 볼 수 있음)보다도 privacy가 떨어짐.
만약 나의 real-world identity랑 bitcoin address가 link 된다면, 나의 주소와 관련된 모든 트랜잭션의 privacy를 잃음.

그러나 익명성이 완벽히 보장되지 않는 것이 도움이 되는 경우가 있음.
ex) 돈세탁
    : pseudonymous는 제공하므로 해커가 부정한 방법으로 지불받은 btc를 역추적하는 것이 쉽지는 않은데
      해커가 최종적으로 원하는 것은 btc를 법정화폐로 바꾸는 것이므로 돈세탁하다가 법정화폐로 바꾸는 순간
      입금하려는 계좌가 들통나므로 결국 identity가 드러남. 익명 완전 보장X.

현재 40%의 bitcoin users가 identified 가능함. (특정 비트코인 주소의 소유자를 알 수 있음)
해당 주소에 다량의 트랜잭션이 있었다면 추적이 더 쉬움. 

 

비트코인이 unlinkable 하기 위해서..

1. 한 사람이 소유하고있는 서로 다른 두 주소가 link되기 어려워야 함.
2. 한 사람에 의해 만들어진 서로 다른 두 transaction이 link되기 어려워야 함.
3. 송신자의 payment와 수신자의 recipient를 link하기 어려워야 함. (-> 달성 불가능. 트랜잭션에 분명하게 드러남)
    bitcoin은 payment를 위한 platform인데 송신자와 수신자 정보를 빼놓고는 transaction을 만들 수 없음.

-> 송신자최종 수신자 사이의 연결이 불가능하게(어렵게) 하자!
A가 Z에게 보내는 것이 목표라면 A->B, B->C, ... , Y->Z 여러 경유지를 거쳐 보내서 최종 목적지 찾아내기 어렵도록 함.

 

암호화폐 세탁 서비스(Tumbler)

 

Coinjoin

: transaction의 익명성을 위한 protocol

A가B에게 10btc 보내고 싶음. -> 누군가에게 10btc를 보내고 싶어하는 사람들을 찾음.
-> sender와 receiver를 뒤섞어서 보냄. (모인 사람들 transaction의 input/output을 뒤섞어서 보냄)

즉, A->B가 아니라 A->D, ?->B, ...
A는 다른사람에게 10btc보내고 A대신 누군가가 B에게 10btc 보내줌. 

?->B 트랜잭션 만들었다는 것을 확인한 후, A->D에 서명하고 트랜잭션을 broadcast함.