암호화폐의 주요 이슈
- 내가 받은 암호화폐가 진퉁이 맞나?
- 내가 받은 암호화폐가 이중지불된 건 아닌가?
- 내가 받은 암호화폐가 내 꺼라는 걸 다른 사람들도 인정할 수 있나?
본디 이 문제에 대한 해결책은 중앙에서 검증하고 보증하는 것이었으나, 중앙화 시스템은 근본적으로 공격에 취약하다는 단점이 있다. 이를 사토시 나카모토라는 인물이 기존 암호화폐 시스템을 발전시켜 탈중앙화된 개념을 사용하며 위 문제를 다 해결했다.
Bitcoin BlockChain에서 쓰이는 아이디어들
- 기존의 서버-클라이언트 구조에서 P2P 네트워크를 사용해 탈중앙화를 이룬다.
- P2P 네트워크에서 자신이 해당 암호화폐의 소유자임을 증명하기 다른 사람들이 이를 검증(즉 다른 사람들도 인정할 수 있게)하기 위해 전자서명(Digital Signature)을 사용
- P2P 네트워크의 각 노드들간의 데이터가 일관성이 있어야 함. 즉 모든 노드가 같은 상태의 데이터를 갖고 있어야 한다
- '합의 프로토콜'을 통해 P2P 네트워크의 모든 노드들이 데이터들의 일관성을 가지게 한다.
- '합의 프로토콜'에 의해 수학적 퍼즐이 제시되고, 이 문제를 푼 채굴자가 블록을 생성할 권한을 받는다(거래 승인 권한). 이 과정으로 신규 암호화폐가 발행되고 데이터의 일관성이 유지된다
블록체인 기술의 의의
블록체인의 의의는 안전하지 않은 인터넷 망에서 어떠한 중재자(중앙 시스템)도 없이 가치 있는 품목들을 안전하고 자유롭게 교환할 수 있게 하는 기술이라는 데 있다.
비트코인은 가치가 부여되는 품목 중 가장 단순한 형태인 '화폐'를 교환하는 시스템으로 1세대 블록체인이라 볼 수 있다. 이더리움은 화폐뿐만 아니라 계약서나 증명서까지 교환할 수 있도록 '스마트 컨트랙트' 기능을 추가한 2세대 블록체인 기술이라고 보면 된다.
※ 스마트 컨트랙트 : 블록체인을 기반으로 금융 거래, 부동산 계약 등 서면으로 이루어지던 다양한 형태의 계약을 디지털 명령어로 작성해 조건에 따라 계약 내용을 자동으로 실행하는 것. 특정 조건이 충족되지 않으면 해당 계약은 실행되지 않기 때문에 두 사람이 서로를 모르거나 신뢰하지 않더라도 계약을 체결할 수 있음. 그렇기 때문에 중개인(중앙 시스템) 없이도 계약을 이행할 수 있다는 것이 스마트 컨트랙트의 특징
비단 화페, 계약서 뿐만 아니라 인터넷 상에서 가치있는 모든 품목을 블록체인을 통해 안전하게 교환할 수 있으며 신뢰와 보안이 중요시되는 4차 산업혁명 시대에 기여할 주요 기술 중 하나로 평가받는 중이다.
블록체인 기술의 특징
- 탈중앙화 : 중앙 서버나 기관 없이 원하는 기능을 수행한다
- 투명성 : 모든 기록이 투명하게 공개된다
- 익명성 : 거래 당사자 간 익명성을 보장한다
- 불변성 : 모든 기록은 변경 불가하며 증거로써 활용할 수 있다
블록체인 기술이 활용되고 있는 곳들
- 금융산업 : 블록체인 플랫폼을 활용하면 낮은 비용으로 거래의 효율성과 보안성 향상을 기대 가능. 중앙 시스템이 없으니 거래 절차가 간소화되고 모든 거래 내역이 공유되니 부정거래의 발생을 줄일 수 있다는 점 등에서 금융산업에서 블록체인에 가장 관심을 보임
- 비금융 분야 및 공공 부문 : 제조업 분야에선 식품 원산지, 생산 방식 등 유통 정보의 투명성을 높일 수 있음. 공공서비스에서는 정부 예산 집행의 투명성과 효율성을 제고시킬 수 있음. 이 외에 의료기록문서, 보험청구서 등의 투명한 관리 역시 가능
P2P 네트워크
서버-클라이언트 구조와 달리 중앙시스템이 없고 각 노드가 대등한 위치에서 서로가 서비스하면서 자율적으로 운영되는 네트워크. 데이터도 각 노드에 분산돼있음. 통제나 업그레이드가 어렵긴 하지만 중앙시스템이 갖는 문제점(중앙만 때리면 다 막힌다 등..) 자체가 없다. 또한 일부 노드가 손상돼어 그 노드에 보관된 데이터가 유실돼도 정상 노드의 데이터로 복구가 가능.
비트코인 외에도 수많은 P2P 네트워크가 있으나, 일반적인 P2P는 가치가 부여된 품목을 교환하는게 아니어서 신뢰성에 대한 고려가 없음. 비트코인의 P2P 네트워크는 채굴, 거래 내역 검증 등의 업무를 각 노드가 분담하며, 각 노드는 사전에 정한 합의 프로토콜에 따라 각자의 업무를 수행. 각 노드가 가진 블록체인 데이터에 불일치가 발생(즉 내 데이터와 쟤의 데이터가 달라지면) 다수결 원칙에 따라 다수의 노드가 가진 데이터를 기준으로 복구함. 따라서 전체 노드의 50% 이상이 정상 데이터를 가지고 있으면 데이터의 일관성은 유지된다.
비트코인 네트워크의 각 노드들
1. 풀 블록체인 노드(풀 노드)
블록체인 데이터 전체를 관리하는 노드. 2009년 1월 3일부터 현재까지 발생한 모든 거래 내역(트랜잭션)들이 보관돼있다. 채굴자 노드가 최근 트랜잭션이 담긴 새로운 블록을 생성하고 네트워크로 전파하면, 풀 노드가 이 블록을 받아 합의 프로토콜에 따라 유효성을 검증하고 문제가 없으면 기존 블록체인에 연결한다. 또한 다른 풀 노드들에게 새로운 블록이 연결됐음을 알리기 위해 신규 블록의 헤더 정보(블록 헤더 hash)를 전파한 후, 이 정보를 받은 노드가 블록의 세부 내용을 요청하면 세부 내용도 보내준다. 이를 블록 Relay라고 함. 이 방식으로 다른 풀 노드들과 블록체인 데이터를 동기화해 데이터의 신뢰성과 일관성율 유지한다.
풀 노드가 개별 트랜잭션을 받으면 합의 프로토콜에 따라 유효성을 검증하고 자신의 메모리 풀(Memory pool)에 저장하고 다른 노드들로 전파하는데, 방식은 블록 Relay와 같다. 참고로 메모리 풀이란 각 노드들이 갖고 있는 임시 저장소로 아직 승인(즉 채굴)되지 않은 트랜잭션들이 담긴다. 채굴자들도 자신의 메모리풀에 이 트랜잭션들을 보관한다.
2. Lightweight 노드(SPV 노드)
블록체인 전체가 아닌 블록의 헤더 정보만 가지고 있는 노드다. 새로운 블록이 생성되면 풀 노드로부터 블록 헤더를 받아 자신의 헤더체인에 연결하는데, 블록 body에 비해 블록 head의 용량이 훨씬 적어서 저장 공간을 널널하게 쓸 수 있다.
비트코인 지갑 애플리케이션이 주로 SPV 노드이며, 자신의 송/수금과 관련된 트랜잭션들의 유효성을 검증한다. 자신의 트랜잭션이 승인(채굴)되어 정상적으로 블록체인에 포함됐는지 여부도 확인한다.
※ 참고: SPV노드는 블록체인 데이터가 아니라 헤더만 갖고 있으니 자신의 트랜잭션들을 검증하려면 풀 노드의 도움을 받아야 한다. 이 때 풀 노드로부터 필터(블룸 필터)를 통해 자신과 관련된 트랜잭션들만 선택적으로 받는다
3. 채굴자 노드
각 노드가 보내는 트랜잭션들의 유효성을 검증하고 이들을 모아 새로운 블록을 생성한 후 풀 노드로 보내는 역할을 한다. 풀 노드는 이 블록의 유효성을 재차 검증한 후 기존 블록체인에 추가한다. 이 절차가 트랜잭션을 승인하는 기능이다. 모든 트랜잭션은 채굴자가 블록에 포함시키고 풀 노드가 이 블록을 블록체인에 추가해야 유효한 거래로 인정되는 거라고 보면 된다.
채굴자들은 경쟁적으로 수학적 퍼즐을 풀고 블록 헤더에 그 해답을 명시한다(Nonce필드에 기록). 먼저 해답을 제시한 채굴자의 블록이 풀 노드로 보내지며, 풀 노드는 이 해답이 올바른지 확인하는 식으로 유효성을 검증한다.
채굴자가 이렇게 새로운 블록을 생성하면 일정량의 비트코인이 새롭게 발행되고 채굴자가 이걸 받는다. 그렇게 때문에 너도나도 채굴을 하는 것이며, 서로가 경쟁적으로 채굴하는 과정에서 신뢰성이 생기는 것이다.
블록체인의 구조
일종의 링크드 리스트라고 볼 수 있는데, 각 노드가 다음 노드가 아니라 이전 노드를 가리키는 형태의 링크드 리스트라고 보면 된다.
각 블록은 body와 header로 구성된다. body에는 여러 트랜잭션들이 저장돼있고, header에는 body정보가 요약돼있다. 그리고 header는 이전 블록의 header를 포인터로 가리킨다. 이런 식으로 각 블록들이 서로 체인으로 연결돼있다고 볼 수 있고, 이런 구조를 블록체인이라고 부른다.
헤더 뜯어보기
header는 블록의 요약 정보가 담겨 있다. 다음과 같이 생겨먹었다.
- Version: 비트코인의 소프트웨어 버전 정보
- 이전 블록 헤더의 해시: 말 그대로. 이전 블록을 가리키는 hash pointer역할을 하고, 블록들을 체인으로 연결하는 역할이다. 블록 안에 있는 트랜잭션들이 위조되면 헤더의 hash값이 변하는데, 내 다음 블록의 header에 저장된 이전 블록 헤더 hash값과 불일치하게 되는 것이므로 그 블록과의 연결이 끊어진다. 즉 한 번 체인으로 연결된 블록들은 그 내용이 바뀔 수 없다(정확히는 바뀌는 게 쉽게 감지된다고 해야 하나..) 이게 블록체인 데이터가 안전하게 유지되는 원리이다.
- 머클 루트: 머클 트리의 루트 노드 값이다. 머클 트리는 블록에 있는 모든 트랜잭션들의 hash값을 이진트리 형태로 구성한 것으로, 트랜잭션 데이터를 보호할 목적으로 사용된다. 특정 트랜잭션의 내용이 바뀌면 머클 루트 값이 바뀌고, 머클 루트 값이 바뀌면 블록 헤더의 hash값도 바뀌어서 hash값 불일치 현상이 발생하게 되고 체인이 끊어진다. 참고로 커틀 루트는 특정 트랜잭션이 이 블록에 들어있는지 판별할 때도 사용 가능하다.
- 타임스탬프: 이 블록이 생성된 날짜와 시각
- Bits: 채굴의 난이도. 채굴자들이 푸는 수학적 퍼즐의 해답이 이 bits가 표현하는 어떤 값보다 작아야 한다. 참고로 bits는 채굴 시간이 평균적으로 10분정도가 걸리게끔 조절된다.
- Nonce: 수학적 퍼즐의 답. 채굴자들이 유일하게 바꿀 수 있는 값으로, 이 Nonce값을 이리저리 바꿔가며 헤더의 hash를 구하다가 어느 날 우연히 특정 Nonce를 넣었더니 나온 hash값이 bits가 표현하는 값보다 작았다? 그 문제 푼 거다