지금까지 인턴 때 배운 내용을 토대로 개발 포스팅을 진행했다. 이 포스트는 내가 관심을 가지고 공부를 지속해온 블록체인이 무엇인지, 비트코인은 무엇이고 어떤 구조로 되어있는지 설명하는 글이 될 것이다.
블록체인에 관심을 가지고 공부를 하기 시작한 건 2018년 KISA에서 진행한 블록체인 아이디어 공모전에 참여하기 시작하면서였다. 그 당시 들어본 것이라고는 비트코인 광풍, 유시민 작가와 정재승 박사가 블록체인에 대해 나누던 토론 정도였다. 블록체인 거번먼트
라는 책을 읽으면서 블록체인이 무엇인지, 활용도는 무엇인지에 대해 배웠고 이후 관심이 생겨 쭉 공부 중이다.
어쨋든 일단 설명을 해본다.
블록체인: 탈중앙화 분산 원장
이라고 정리할 수 있을 것 같다. 분산 컴퓨팅 기술 기반 데이터 위변조 방지 기술이다. P2P 방식 기반이며 거래와 같은 데이터를 트랜잭션 (Database에서 사용한 트랜잭션과 비슷) 이라는 단위로 모아 블록 을 만들고, 이 블록들이 체인 형태로 연결되어 있는 구조이다. 여기서 체인은 이전 블록에 대한 정보가 해쉬형태로 현재 블록에 들어가, 데이터 위변조가 불가하다는 것을 의미한다.
기존에는 중앙서버, 즉 중앙화된 거래 기록 보관 방식이었다면, 블록체인은 모든 사용자가 거래 기록을 볼 수 있고, 가지고 있다. 이를 활용해 위조를 막는다.
블록체인을 공부하다보면 항상 비잔틴 장군 문제를 접하게 된다.
비잔틴 장군 문제는 분산 시스템에서 발생하는 문제이다.
중앙 집중형 시스템: 중앙 시스템이 운영이 잘되는 경우 빠른 속도로 운영 가능하다.
분산 시스템: 각 장군들이 동등한 권한과 역할을 가지게 된다. 의견이 다를 수도 있는데 이 때 문제가 발생한다.
이 문제를 해결하기 위해서는 다수가 참가한 것이 확실해야 하고, 다수가 진짜 참가자이어야 한다. 비트코인은 이를 PoW (작업증명) 합의 알고리즘을 활용해 해결했다. 이에 대해서는 밑에서 설명할 예정이다.
간단하게 얘기하자면, 참여자 모두가 가장 최신의 원장을 동일하게 보유할 수 있다는 점을 수학적으로 보장했다.
비잔틴 장애 허용은 장애가 있어도 전체의 3분의 1을 넘지 않는다면, 시스템이 정상 작동하로고 허용하는 합의 알고리즘이다. 일부가 고장 나거나 악의적으로 행동해도 계속 작동 가능하도록 만든 시스템 설계이다.
암호화폐(가상화폐)와 블록체인
비트코인, 이더리움과 같은 암호화폐 자체가 블록체인이 아니라, 암호화폐 네트워크가 정상적으로 돌아갈 수 있도록 하는 기반 기술이 블록체인이다.
Node
블록체인 네트워크 상에서 말하는 노드는 네트워크에 참여하는 사용자들의 컴퓨터, 자원을 의미한다.
51% 어택
블록체인에 참여하는 51% 이상, 과반수의 노드가 동시에 거래내역을 조작하는 행위이다. 채굴 그룹이 작거나, 아직 성숙하지 않은 초기 코인의 경우 충분히 공격이 가능해진다.
이중지불 문제
동일한 암호화폐로 두 번 이상 지출하는 것을 의미한다. 충돌되는 트랜잭션이 있을 때 더 많은 노드가 받아들인 트랜잭션을 받고, 받아들여지지 않은 트랜잭션은 취소해버린 특성을 이용했다. 하지만 다른 노드에게 적발될 확률이 크고 51% 어택을 제외한 더블스펜딩 공격은 실질적으로 의미있지 않다. 비트코인 기준으로 거래 후 컨펌 수가 일정 수치 (비트코인은 6)를 넘어갔는지 확인하는 방식으로 피해를 막는다.
비트코인: 블록체인이라는 개념을 처음 실증하고 정상적인 블록만 남기기 위해 PoW 방식 도입했다. (채굴: 새로운 블록 후보들의 블록 헤더값을 해시 함수에 넣고 돌려, 실행 결과가 난이도 이하의 값이 될 때까지 블록 헤더의 논스 값을 바꿔나가는 과정), 50% 이상의 노드들이 정직한 노드일 경우 무결성을 유지한다.
이더리움: 스마트 컨트랙트라는 개념을 처음 구현했다. (개념 제시는 1980년대 나왔다.) 비트코인은 트랜잭션에 넣을 수 있는 정보가 한정되어 있었음. (입출금 이력 or 문자열 or 메타데이터 등) 이를 확장시켜 탈중앙화 응용 프로그램 (dApp)을 구동시킬 수 있게 했다.
비트코인은 2008년, 사토시 나카모토 (익명)이라는 개발자가 백서를 포함한 이메일을 전세계 곳곳에 보내면서 시작되었다. 이 이메일에는 이런 말이 적혀 있었다 한다.
We define an electronic coin as a chain of digital signatures. Each owner transfers the coin to the next by digitally signing a hash of the previous transaction and the public key of the next owner and adding these to the end of the coin. A payee can verify the signatures to verify the chain of ownership.
우리는 전자 화폐를 디지털 서명의 체인으로 정의합니다. 코인 소유자는 거래 내역에 디지털 서명을 한 후 다음 사람에게 전달하고, 이를 받은 사람은 자신의 공개 키를 코인 맨 뒤에 붙입니다. 돈을 받은 사람은 앞 사람이 유효한 소유자였다는 것을 확인할 수 있습니다.
비트코인의 등장에는 그 당시 이슈가 많이 연관되어 있다. 사이퍼 펑크, 경제 위기, 서브프라임 모기지 사태, 리먼 브라더스 파산 등 많은 금융 이슈를 배경으로 중앙 집중식 금융 시스템에 비판과 함께 비트코인이 탄생하게 되었다. 주로 비트코인 개발자가 주도하는 Bitcoin Core 클라이언트를 구동하는 블록체인을 비트코인이라 칭하고 BTC 코드를 쓴다.
기존 화폐와 달리 정부나 중앙은행, 금융기관의 개입없이 P2P 형태로 빠르고 안전한 거래가 가능하며, 정부가 원하면 더 찍어낼 수 있는 원래 화폐와 달리 최대 발행량 (2100만개) 이 한정되어 있다.
블록을 생성하기 위해서는 앞 블록 헤더의 정보 + 논스 + 포함된 트랜잭션 루트 해시값을 포함해 해시 함수를 입력해야 한다.
기본적인 비대칭 암호화 기법
- 거래를 하려면 한 쌍의 개인키와 공개키가 필요하다. 송금자는 한 쌍의 키를 생성한다. 개인키는 전자 서명 생성 용도, 공개키는 전자 서명을 이용한 데이터 검증 용도이다.
- 송금자는 공개키를 미리 수신자에게 전달한다. 송금자의 전자 서명을 검증하기 위해 수신자는 자신이 받은 공개키로 전자 서명을 검증할 수 있다.
- 송금자는 데이터의 해시값을 생성하고, 생성된 해시값을 개인키를 이용해 암호화한다. 이 때 만들어진 암호문이 전자 서명 (디지털 서명)
- 송금자는 생성된 전자 서명을 원래 보내려는 원본 데이터에 붙여서 수신자에게 전달한다.
- 수신자는 원본 데이터의 해시값을 스스로 계산해본다. 또, 공개키를 사용해 받은 전자 서명을 복호화하면 데이터가 생성된다.
- 수신자는 원본 데이터의 해시값과 복호화한 결과를 비교한다. 결과가 일치하면 데이터는 변조되지 않았다.
비대칭 암호화 기법을 사용해 송금자가 수신자의 주소로 비트코인을 보내고, 수신자는 거래의 서명을 확인함으로써 거래가 마무리된다.
개인키는 자신의 잔고에 대한 접근 권한 역할을 한다.
개념은 이렇고 구조를 살펴보면 좀 더 어렵다.
참고로 이더리움은 계좌 (Account) 잔고 모델을 사용한다.
비트코인에서 Account 방식을 사용하지 않는 이유는 과거의 내역을 검증할 수 있지만 내역을 확인할 수는 없기 때문이다. 그래서 특정 Address에 대한 잔액 조회 형식으로 진행했다.
UTXO는 지폐 또는 동전이라 생각하면 비슷하다. 다만, UTXO는 무수한 단위로 형성될 수 있다. 비트코인의 단위는 사토시
단위이며 1satoshi = 0.000000001 BTC 이다. UTXO는 1사토시 단위이다. 비트코인 지갑에는 이렇게 단위가 다른 UTXO 가 여러 개 존재하는 형식으로 잔고가 계산된다. 한 꺼번에 어떤 숫자로 나타나지 않는다. UTXO는 입금이 될 때마다 형성되며, 한 번 인출하면 바로 사라진다.
UTXO를 사용하게 될 때는 송금할 양 이상의 UTXO를 찾아 사용한다. (수수료를 줄이기 위해) 그리고 남은 양은 다시 새로운 UTXO를 만들어 입금된다.
UTXO가 두 개로 나뉘고 (송금량, 채굴자), 남은 양은 또 새로운 UTXO로 만들어지는 개념이 어려울 수도 있지만 모두 효율적인 거래를 하기 위해 만들어진 개념이다.
비트코인은 타임스탬프 (Timestamp) 와 서명 (Sign or Key)를 통해 비잔틴 장군 문제를 해결했다. '장군(노드)은 메시지를 보내기 위해 10분의 시간을 가지며, 메시지는 모든 장군(노드)의 메시지와 메시지를 보내기 위해 10분을 들였다는 증거를 포함한다.' 비잔틴 장군 (장애를 일으키는 노드)이 존재하더라도 다른 장군들은 이 장군이 거짓임을 밝혀낸다.
비트코인에서는 새로 만들 블록의 고유번호 (기본적인 규정인 특정 숫자 여러 개)를 찾는 일종의 퍼즐게임을 풀도록 했는데, 이 과정이 작업 증명
이고 퍼즐이 풀리면 블록이 만들어지며, 이를 채굴
이라 한다. 작업 증명 수행해 퍼즐이 풀렸다면 결국 블록은 부정이 없도록 각종 규정을 지킨 정상 거래를 모아, 정상적인 방법으로 만든 원장이라는 의미이다. 블록의 고윳값이 정상이면 계산 과정에 들어간 모든 숫자 역시 올바른 값이므로 수학적으로 수용해도 좋다는 의미를 나타낸다.
참고로 해시 함수에 들어가는 입력값에는 거래내역 등으로 이루어진 텍스트 + 논스(nonce)를 추가해 이 논스 값을 찾는 과정 (이리 저리 바꾸어 보면서 정해진 목표값보다 작은 해시 값을 얻을 때까지 해시 함수 실행)이 작업 증명이다.
이후 작업 증명 거친 블록을 실시간 공유해 모두가 같은 원장 상태에 도달하게 된다.
이러한 방식은 즉각적인 거래 확정이 필요한 서비스에서는 적용이 어렵다. 그래서 PBFT (Practical Byznatine Fault Tolerance) 합의 알고리즘을 사용하기도 한다. 이외에도 여러 합의 알고리즘이 나왔다.
좀 더 자세히 살펴보면 이렇다
송금을 의로한 여러 거래 기록을 1개의 블록에 모으고, P2P 네트워크로 거래 기록을 복제 형식으로 송수신해 데이터를 확산시킨다. 네트워크의 모든 참가자는 동일한 거래 기록을 보유한다.
P2P 네트워크로 거래 기록을 받은 모든 참가자들은 거래 기록을 승인하는 작업을 수행한다. 승인은 거래 기록에 포함된 어려운 계산 작업을 가장 빨리 해결한 참가자가 수행할 수 있고, 그 대가로 비트코인의 발신자가 설정한 송금 수수료를 받는다. 승인한 그 사람은 기존 블록체인에 새로운 블록을 추가하고, 이 블록을 P2P 네트워크를 통해 참가자 전원에게 브로드캐스트(전파)한다.
블록을 받은 각 노드는 정당한 블록인지 검증한다. 이전 블록 정보와 해답을 매개변수로 해시값을 구해 조건을 만족하는지 확인한다. 조건을 만족한다면 그 거래 기록은 정당한 기록으로 수신한 자신의 로컬 디스크에 있는 블록체인에 추가한다. 이 시점에서 거래가 성립된다.
소프트 포크
이전 블록과 호환성을 가지는 포크 방식이다. 기존 블록체인을 그대로 유지하면서 새로운 기능을 도입할 때 사용한다. 채굴자들만 새로운 코드가 적용된 지갑을 사용하면 된다. 비트코인에서는 거래 시 2~3개 이상의 개인 키를 제출해야 하는 멀티시크 (Multi-Sig) 기능을 추가할 때 소프트 포크를 진행했다.
하드 포크
이전 블록과 호환성을 가지지 않는 포크 방식이다. 모든 사용자가 새로운 코드가 적용된 지갑을 사용해야 한다. 업그레이드에 강제성이 없기 때문에 특정 사용자가 기존 지갑 계속 사용할 경우 호환되지 않는 새로운 블록체인이 이어나가질 수 있다. 실제로 비트코인 캐시, 비트코인 SV 등 다양한 블록체인이 생성 되었다.
대표적으로 세가지 방식으로 지갑을 생성할 수 있다.
풀 노드 월렛
자신의 컴퓨터를 비트코인 블록체인 일원으로 가입시켜 거래 검증, 수락, 발신하면서 내장된 지각 기능도 이용한다. 컴퓨터를 항상 켜두어야 하고, 엄청난 양의 블록체인 데이터를 받아와야 돼서 개인들은 많이 사용하지 않는다.
라이트 월렛
모든 블록을 다운로드 하지 않고, 자신의 거래와 관련된 부분만 내려받으며 거래 중계를 이용 시 원격 서버를 이용하는 방법이다. 컴퓨터를 항상 켜두지 않아도 된다는 단점이 있다.
웹 월렛
복잡한 개인 키가 아닌 아이디, 비밀번호로 접근 가능하지만 모든 자금의 관리를 회사에게 일임하기 때문에 보안성이 낮다. 거래소가 보통 이러한 방식이고, 개인 키를 제공하지 않고 핫 월렛을 운영한다.
지갑을 생성하면 지갑 주소와 개인키가 나온다. 지갑 주소는 계좌 번호와 같고 이 주소로 송금을 한다.
개인키는 대칭키, BIP32, BIP39, BIP44 등 다양한 개인키가 있다.
생성 방식은 이러하고 지갑의 종류는 또 여러 가지가 존재한다.
비결정적 지갑 (Nondeterministic(Random) Wallets)
무작위로 생성된 개인키의 모음. 처음에 100개의 임의의 개인키를 미리 생성하고 각 키를 한 번만 사용하여 필요에 따라 더 많은 키를 생성한다. 많은 키를 생성할 경우 모든 키의 복사본을 보관해야 해서 지갑을 자주 백업해야 한다는 단점이 있다. 주소 재사용을 피하고 싶으면 이 지갑 사용 안하는게 좋음.
결정적 지갑 (Deterministic (Seeded) Wallets)
단방향 공통 시드에 단방향 해시 함수를 통해서 개인키를 연속적으로 생성한다. seed 는 인덱스 키 또는 체인 코드와 같은 다른 데이터와 결합돼 임의로 생성된 숫자이다. 시드하나로 키 복구가 가능하기 때문에 한 번 백업하는 것으로 충분하다.
HD Wallets (Hierarchical Deterministic Wallet)
다중주소를 가지고 있는 지갑 (하나의 지갑에 여러 주소가 있음) 이다. 하나의 시드에서 많은 키를 쉽게 파생하고, 가장 진보된 형태는 BIP-32 표준에 의해 정의된 형태이다. 부모키가 자식키들을 만들어낼 수 있고, 각각의 자식키가 손자키들을 무한정 만들어 낼 수 있다. 루트 시드로부터 마스터 개인키, 마스터 체인코드를 생성하고, 매 거래마다 새로운 주소를 생성한다.
Seed를 관리하는 방법으로 니모닉 (mnemonic) 이 있고 표준은 BIP-39에 의해 정의된다.
지극히 제가 이해한 방식으로 서술했기 때문에 이상한 내용이 있다면 말씀해주시기 바랍니다!!!
출처: 비트코인 공식 홈페이지, 나무위키, 해시넷, 마스터링 비트코인