블록체인 3 - Bitcoin - Challenges and Responses
비트코인
- 비트코인은 프로토콜의 집합이다.
- 비트코인 소프트웨어는 이 프로토콜을 작동시킨다.
- 소프트웨어가 실행되면, 코인이 생성되고 계정간 전송이 가능해진다.
- 이런 행위는 트랜잭션 데이터로 기록되고, 이 데이터들이 묶여 블록이 되고, 연결되고 비트코인 블록체인을 형성한다.
비트코인은 어떻게 동작하나?
목표 : 금융 기관을 거치지 않고 한 당사자가 다른 당사자로 직접 지불할 수 있는, 검열 불가능한 전자 지불 시스템 만들기
비트코인이 해결하는 문제점과 그 방법
- 문제점 1 : 단일 중앙 정부 관리자의 존재. - 검열 저항성이 없다.
- 해결책 : Replicate th books. - 장부를 복제하라
- 누구나 허가 없이 장부 관리자가 될 수 있고, 모두 동등한 peers 이며, 누군가 조작하려하면 무시할 수 있고, 누군가 합류하거나 떠나도 네트워크는 계속 유지된다.
- 해결책 : Replicate th books. - 장부를 복제하라
- 문제점 2 : 계정 생성에 허가가 필요함
- 해결책 : 공개키를 계좌번호로 사용한다.
- 공개키에서 파생된 값을 계좌번호(주소)로 사용하고, 비밀번호 대신 디지털 서명을 사용한다.
- 사용자는 지갑 소프트웨어를 통해 원하는 만큼 주소를 생성할 수 있고, 이 주소의 개인키를 가진 사람만이 자금을 사용할 수 있다.
- 해결책 : 공개키를 계좌번호로 사용한다.
- 문제점 3 : 트랜잭션 순서의 문제
- 다수의 장부 관리자가 어떻게 서로 동기화 상태를 유지하나?
- 수많은 거래와 네트워크 전파 속도 때문에, 관리자마다 '거래순서' 에 대한 서로다른 버전을 가질 수 있다.
- 해결책 : 블록을 사용한다
- 거래를 한개씩 처리하지 않고 묶음(batches)단위인 '블록'으로 기록한다.
- 검증된 수많은 거래를 담은 블록을 생성하는건 개별거래에 비해 빈도가 낮으므로 네트워크 전반의 합의에 더 도움이 됨
- 다수의 장부 관리자가 어떻게 서로 동기화 상태를 유지하나?
- 문제점 4 : 누가, 얼마나 자주 블록을 만드는가?
- 중앙 통제자 없이 , 익명의 블록 생성자들이 적당한 속도로 공정하게 돌아가면서 블록을 만들게 하려면 어떻게 해야할까?
- 해결책 : PoW (proof-of-work) 작업증명
- 모든 블록 생성자는 확률 게임을 해서 이겨야한다. 평균적으로 10분이 걸린다.
- 이 게임은 속임수를 못써야하고, 승리를 증명할 수 있는 공개적인 증거가 있어야한다. 또한 승리 시 보상이 주어져야한다.
PoW (작업증명 : Proof-of-Work)
- 블록 생성자는 기록되지 않은 트랜잭션들을 모아서 블록을 만든다.
- 블록 데이터의 크립토 해시값을 계산한다.
- 규칙 :
- 블록의 해시값 < target number 이면 블록은 유효하고, 모든 관리자가 이를 받아들인다.
- 채굴 :
- 만약 계산한 해시값이 >= target number 이라면, 블록에는 임의의 숫자를 넣을 수 있는 Nonce ( number used once )라는 공간이 있는데, 목표값보다 작은 해시가 나올 때까지 이 숫자를 계속 바꿔가며 해시값을 다시 계산한다.
- 이는 쉽지만 지루한 작업이다.
- 블록을 생성한 후에, 블록 생성자는 블록을 다른 사람들에게 보내고 다른 사람들은 이의 유효성을 검증한 후에 받아들인다.
- 비트코인에서 블록을 생성할 확률은 자신이 가진 해싱파워(컴퓨팅파워)에 비례한다.
- 비트코인은 SHA-256 알고리즘을 사용한다.
- 문제점 5 : 블록 생성자에겐 어떻게 인센티브를 줘야할까?
- 채굴, 즉 해시 계산에는 컴퓨터, 전기, 대역폭 같은 자원이 들어간다. 때문에 블록을 만들 동기부여가 필요하다.
- 인센티브 제 3자 지급 불가 : 제 3자가 채굴자에게 보상을 지급할 수는 없다. 이는 censorship resistance, 검열 저항성이라는 목표를 무의미하게 만든다.
- 법정 화폐는 은행 계좌가 필요하므로 검열의 대상이 될 수 있어 이또한 사용할 수 없다.
- 해결책 : 거래 수수료 (transaction fees)
- 각 트랜잭션이 스스로 수수료를 결정한다.
- 네트워크가 혼잡할 때(많은 거래가 블록에 들어가려고 대기중일 때) 는 수수료가 올라가고, 한산할 때는 내려간다.
- 참고 : 비트코인의 블록 크기 제한은 1MB이다.
- 문제점 6 : Bootstraping의 문제
- 거래 수수료만으로는, 초기 단계나 거래가 적은시기에 채굴자에게 동기부여가 될 수 없다.
- 해결책 : 블록 보상 (block rewards)
- 채굴자에게 지급되는 고정 보상으로, 시스템 초기 확산을 돕는다.
- 점차 보상이 줄어들며, 나중에는 거래 수수료가 이를 대체한다.
- Coinbase transaction :이 블록 보상에 해당하는 트랜잭션이 바로 코인베이스 트랜잭션인데, 이는 비트코인을 새로 생성하는 유일한 거래이며 나머지 거래는 이동일 뿐이다.
- 비트코인 초기에는 블록당 50BTC를 지급했다.
- 반감기 : 210,000 블록마다(약 4년임) 보상이 절반으로 줄어들며, 2024년 이후 현재 3.125 비트코인이 블록 보상이다.
- 비트코인의 최대 발행량은 2100만개다.
- 문제점 7 : 해쉬파워 증가로 인한 인플레이션
- 기술과 자금의 증가로 해싱파워가 증가하여 블록이 너무 빨리 생성되면 어떻게 될까?
- 해결책 : 해시 계산의 Target Number 를 변경한다.
- 2016블록(약 2주)마다 난이도가 변경된다.
- next difficulty = current difficulty x (2weeks/T) 여기서 T는 직전 2016개의 블록이 채굴된 시간임. 난이도와 목표값은 반비례 관계다. (당연함. 더 작은 범위의 숫자가 해시값으로 나올 확률이 더 작으니까)
- 난이도가 알고리즘으로 인해 자동으로 조절되면서, 채굴파워가 증가하면 난이도가 높아지고, 채굴파워가 감소하면 난이도가 낮아진다.
- 문제점 8 : 블록 순서 - 누군가가 미리 채굴해버리는 걸 어떻게 방지하는가?
- 예를 들어, 100번 블록이 나왔을 때 누군가 101번을 건너뛰고 102번 블록을 미리 만들어 보상을 챙기려할 수 있다.
- 해결책 : BlockChain (체인으로 연결된 블록)
- 각 블록은 이전 블록의 해시를 포함해야한다.
- 즉, 102번 블록을 만드려면 101번 블록의 해시를 알아야한다.
- 블록들이 해시로 연결되면서, '객체 불변성'(immutability)를 얻는다.
- 만약 99번 블록을 조작하려고하면, 그 이후의 모든 블록의 해시도 다시 계산해야한다.
- 따라서 조작 시도가 즉시 드러난다. (Tamper-evidence)
- 문제점 9 : 블록충돌 ( 블록 인정에 대한 consensus 문제)
- 동시에 여러 채굴자가 유효한 블록을 생성해내면 어떻게 될까?
- 해결책 : 가장 긴 체인을 선택함
- 일시적으로 블록체인이 몇갈래로 나뉠 수 있지만, 결국 어느 한 쪽에 다음 블록이 먼저 붙게 된다. 그렇게 되면, 가장 긴 체인만을 유효한 기록으로 인정하고, 선택받지 못한 체인의 블록은 고아(Orphan)블록이 되어 버려진다.
- 문제점10 : 이중 지불 (Double Spend) - 같은 비트코인을 두번 사용하는 것
- 공격 시나리오 :
- 공격자는 상인에게 지불하는 트랜잭션을 방송하고 물건을 받는다
- 동시에 자신에게 돈을 보내는 트랜잭션을 포함한 비밀체인을 더 길게 만든다.
- 물건을 받은 후, 더 긴 비밀 체인을 공개한다
- 가장 긴 체인 규칙에 의해 상인에게 보낸 거래가 포함된 체인은 Orphan이 되고, 공격자는 물건과 돈을 모두 챙기게 된다.
- 해결책 : 6 Confirmation 대기
- 상인(Bob)은, 거래가 포함된 블록 뒤에 추가로 블록이 몇개 더 붙을 때까지 기다린다.
- 체인이 길어질수록(컨펌 수가 늘어날수록) 그 거래를 뒤집기 위해 공격자가 재연산해야하는 작업량이 기하급수적으로 늘어나 사실상 불가능해진다.
- 공격 시나리오 :