포크(fork), 주체인(main chain), 51% 공격(51% attack), 머클 트리 또는 해시 트리(Merkle tree or hash tree), memory pool 등 블록체인에 대한 많은 개념이 있다. 하나부터 열까지 총망라하고자 한다.
블록체인의 개념
블록체인은 간략히 '분산 원장'(分散元帳, distributed ledger) 기술이라고 한다. 즉, 거래내역을 기록한 원장을 다수의 사람들에게 분산하여 저장·관리하는 기술이다.
자세히 설명하면, 블록체인이란 다수의 온라인 거래 기록을 묶어 하나의 데이터 블록(block)을 구성하고, 해시(hash) 값을 이용하여 이전 블록과 이후 블록을 마치 체인(chain)처럼 연결한 뒤, 이 정보의 전부 또는 일부를 피투피(P2P) 방식으로 전 세계 여러 컴퓨터에 복사하여 분산 저장·관리하는 기술이다.
-해시 넷-
즉, 중앙화 된 은행 같은 기관이 아닌 일반 사용자들이 데이터의 저장/관리에 참여하는 것이다.
거래내역들을 Peer-to-peer 방식으로 분산 저장/관리한다.
블록체인의 목적
블록체인은 사이버펑크 운동에 뿌리를 두고 있다. 중앙 집권화된 거대 기업이나 국가에 대항하여 개인의 프라이버시를 보호하기 위해 암호 기술을 통해 익명성을 보장하는 탈중앙화 시스템을 만들려는 것이 사이버펑크 운동이다. (특정 게임이나 문학 장르를 뜻하기도 한다)
블록체인의 창시자 사토시 나카모토는 이렇게 말했다.
've been working on a new electronic cash system that's fully peer-to-peer, with no trusted third party.
나는 새로운 전자화폐 시스템을 개발하고 있는데, 완전한 피투피 방식이고, 신뢰할 수 있는 제삼자가 필요 없다.
- 사토시 나카모토(Satoshi Nakamoto), 2008.10.31.
그는 악의적인 사용자가 네트워크에 포함되어 있더라도 정상적으로 작동하는 전자화폐 시스템을 개발하기 위해 블록체인 기술을 고안해냈다.
블록체인의 구조
블록체인은 근복적으로 거래 내역들이다. 하지만 이를 구조화하고 암호화하여, P2P 방식을 분산 저장/관리되어도 신뢰할 수 있는 거래내역들이다.
가장 작은 단위부터 보자.
트랜잭션(Transaction 또는 줄여서 Tx)
더 이상 쪼갤 수 없는(atomic) 거래 단위이다.
돈을 주고받는 거래 행위에서 돈을 준 사람만 있고, 받은 사람은 없을 수 있는가?
돈을 주고 받는 행위 자체를 서로 분리할 수 없는 atomic 한 사건으로 보고,
블록체인에서 그런 거래내역 하나를 트랜잭션이라고 부른다.
또 이런 트랜잭션은 이전 트랜잭션의 아웃풋(해시값)을 현재 트랜잭션의 인풋(해시 키)으로 하여 서로 직렬 화하여 묶인다.
트랜잭션의 구조
트랜잭션은
- 거래 내역 = 돈 주는 사람 + 돈 받는 사람 + 거래 액수
- 해시 키 = 이전 트랜잭션의 아웃풋, 돈 주는 사람의 개인키
- 해시 값 = 난독화된 해시값. (돈 주는 사람의 공개키로만 해독 가능 -> 이를 통해 트랜잭션 검증)
메모리 풀(memmory pool)
이렇게 검증되어 블록에 기록될 준비가 된 트랜잭션들을 모아 놓은 저장 공간이 메모리 풀이다.
이 메모리 풀을 해킹하여 거래 기록을 넣으려면.. 전체 네트워크의 51%를 동시에 해킹하여 동일한 정보를 수정해야 수정된 정보가 올바르다고 판단된다.
즉 불가능하다고 보면 된다.
(이 메모리 풀 공격은 51% 공격이라고 부르지 않는다)
트랜잭션 검증
트랜잭션 생성되면 다른 피어(peer)들에게 전파(broadcast)된다. 이 과정에서 전파받은 transaction을 피어들이 계속 전파할 것인가 폐기할 것인가를 결정하고 이에 따라 전체 네트워크에 해당 트랜잭션이 전파되어 실제 블록에 기록될 것인가가 결정된다.
- 만약 암호화된 transaction output을 giver public key로 복호화(decode)를 했는데 거래내역 원문(plain text)과 비교했는데 같다.
- 유효한 트랜잭션으로 판단하고 다른 노드들에게 해당 트랜잭션을 계속 전파한다.
- 다르다.
- 해당 트랜잭션을 폐기하고 더 이상 전파하지 않는다.
트랜잭션의 배경
컴퓨터는 언제나 하나의 작업만을 수행하지 않는다. 여러 작업을 동시에 수행하고 있다. 예를 들면, 지금 이걸 보고 있는 당신의 컴퓨터도, 웹브라우저를 띄우는 동시에 알약 같은 백신이나 카카오톡 같은 메신저 프로그램을 백그라운드에서 실행하고 있을 것이다.
이런 작업을 어떻게 동시에 처리하는가? 한 CPU를 가진 컴퓨터는 동시에 작업을 할 수 없다. 그럼 우리 컴퓨터는 어떻게 카카오톡을 하면서 웹서핑을 동시에 하고 있는 것인가? 컴퓨터는 작업들을 우리가 인식하지 못하는 시간만큼 잘게 쪼개어 돌아가면서 수행하고 있는 것이다.(한 CPU가 여러 작업을 할 수 있게 해주는 위와 같은 기술을 멀티 스레드(multi thread)라고 한다.)
마치 닌자의 분신술 같다고 할까? 여러 작업을 엄청 빠르게 돌아가면서 하면 한 사람이 여러 사람으로 보이는 착각 비슷한 것이라고 볼 수 있다.
그러면 많은 CPU를 가진 컴퓨터가 하나의 데이터를 동시에 조작하려고 한다면 어떻게 할 것인가?(멀티 프로세싱(multi processing))
둘 중 하나의 데이터가 손실되지 않겠는가?(race condition)
컴퓨터는 lock을 통해 한 데이터에 하나의 작업만이 접근이 가능하도록 열쇠를 준다.
마찬가지로, DB에서는 그 DB(데이터베이스)를 값을 조작할 때 한 번에 실행되어야 하는 일련의 작업이 있다. 예를 들면, 돈을 결제하는 작업은, 돈을 주는 사람의 잔액을 빼고, 돈을 받는 사람의 잔액을 더 해야한다. 이 일련의 작업이 한번에 실행되지 않으면 이중 지불 등의 문제가 생길 수 있다.
DB에서 한번에 실행되어야하는 일련의 작업을 부르는 용어가 트랜잭션이고, 이걸 블록체인도 일종은 분산형 DB 이니까 그대로 차용한 것으로 보인다.
블록(block)
블록은 유효한(검증된) 트랜잭션들과 그 트랜잭션들로부터 나온 머클 트리, 체인을 위한 여러 정보를 담고 있는 데이터 구조이다.
이 블록은 일정한 시간(비트코인은 10분에 하나)에 하나 생성되고, 이렇게 생성된 블록을 블록체인에 채굴자들이 접합하기 위해 채굴하는 것이다.
블록 구조(block stucture)
- block hash(block address) : 블록의 고유 주소 또는 이름
- prior block hash : 체인(chain)으로 연결되어 있는 이전 블록 주소
- version : 주 체인(main chain)과 fork 등으로 생성된 여러 버전 chain 중 하나
- time stamp : 분산 time stamp 시스템이 해당 시각에 해당 블록이 존재했음을 증명해주는 도장
- merkle root : 트랜잭션들로부터 나온 머클 트리의 루트 값.
- difficulty : 이 블록을 생성할 당시의 블록 생성 난이도
- nonce : PoW(작업 증명) 문제의 해, 이 임시 값(nonce)을 찾기 위해 채굴자들은 해시 연산을 계속한다.
- transaction list : 평문(plain text)으로 저장되어 있는 검증된 거래기록들.
위의 설명만으로는 부족한 부분이 많다. 특히 version이나, merkle root, 난이도, 작업 증명 등..
블록 - version
많은 채굴자들이 동시에 블록을 생성하는 블록체인에서는, 일시적으로 같은 높이에서 다른 block이 있을 수 있다. 마치 여러 세계선의 분기처럼 블록체인의 분기가 일어나는 것이다. 이런 현상을 fork라고 한다.(프로그램을 완전히 복사한다는 다른 뜻도 있다).
이렇게 fork가 일어날 때마다 계속 새로운 version이 만들어진다.(그 version이 유효한지는 제쳐두고)
이 블록들 중 누가 유효한지는 "누가 더 빨리 특정 길이에 도달하는지"로 결정된다.
위 사진에서는 검은색 블록들이 주 체인(main chain)에 소속된 가장 긴 블록체인이다.
유효한 가장 긴 chain을 주 체인(main chain)이라고 하고, 주 체인에 속하지 못한 유효하지 않는 블록들은 모두 고아 블록(orphan block)이라고 부른다.
오직 주 체인(main chain)의 생성에 참여한 채굴자들만 보상을 받고 고아 블록(orphan block)을 만든 채굴자들은 보상을 받지 못한다.
보상을 받으려는 대다수의 선량한 참여자들은 여러 version 중 가장 높은 점수(score)의 version을 선택하여 채굴을 진행한다. 해당 체인 버전에 대한 점수는 해당 체인을 이루는 블록이 유효한지, 검증된 트랜잭션으로 이루어져 있는지 등을 기준으로 하여 특정 알고리즘이 판단한다.
아무도 실패할 버전의 고아 블록을 생성하는데 연산 비용을 소모하고 싶지 않기 때문에 집단화된 이기심으로 인해 공정한 화폐 시스템이 완성되는 것이다.
블록 - merkle root
원본의 데이터를 해시값으로 암호화하고, 계속 쌍을 이루어 올라가며 트리를 만드는 것이다.
이 데이터 구조는 모든 트랜잭션을 1대 1로 비교하는 것보다 훨신 빠르다.
n개의 트랜잭션이 있는 블록이 있는데, 다른 노드와 비교하여 서로 같은 블록체인을 공유하고 있는지 알고 싶다면,
- 1대1로 비교하면.. n번 연산해야 한다.
- 각자 머클 루트를 구해서 머클 루트만 비교하면 2*log(n)+1번 연산하여 다른지 알 수 있다.
획기적으로 빠른 비교가 가능해지는 것이다.
블록 - 작업 증명(PoW)과 nonce(임시 값), 난이도(difficulty)
작업 증명(Proof of Work)은 난이도(difficulty)에 따라 설정된 목푯값 보다 낮은 해시값을 도출하는 nonce(임시 값)을 찾기 위해 끝없이 해시 연산을 수행하는 과정을 의미한다.
위 그림처럼 블록에 대한 고정된 정보를 input으로 하고, 임시 값인 nonce를 계속 순차적으로 올려가면서 목푯값 이하의 해시값을 찾는 것이 작업 증명이다.
그리고 그 결과(해시값)는 그 블록의 주소가 된다.
블록체인
이렇게 구조화된 데이터들(트랜잭션, 블록)들이 체인 형태로 리스트를 이루게 된 것을 블록체인이라고 하고, 이 하나의 블록체인을 모든 노드들이 공유하고, 지속적으로 통합(intergration)한다.
이 블록체인에 있는 거래 기록들은 이제 신뢰 가능한 기록들이 된다.
블록체인 - intergration
지속적인 integration을 통해 하나의 공통된 블록체인을 유지한다.
블록체인 - 내 잔고
블록체인에서는 거래 기록만이 존재하기 때문에, 내 잔고를 확인하려면 main chain을 깊이를 타고 계속 거래기록(트랜잭션 = Tx)을 추적해야 한다. 아래는 실제 코드 중 일부이다.
아래는 tx가 신뢰 가능한지 확인하는 코드이다.
이 포스팅은 다음 웹사이트에서 자료를 얻었다.
이다음 포스팅에서는 여러 시나리오에서 블록체인이 어떻게 공격을 막는지 포스팅하겠다.
'IT정보' 카테고리의 다른 글
석사 전문연구요원 합격 후기 및 난이도, 경쟁률 (3) | 2024.03.03 |
---|---|
석전연(석사 전문연구요원) 정리 (1) | 2021.03.16 |
TV와 PC 연결하는 법(셋톱박스 없이) (0) | 2021.02.22 |
댓글