비잔틴 장군 문제 (Byzantine Generals Problem)
비잔틴 장군 문제는 분산 시스템을 공부할 때 나오는 유명한 문제로, 1980년에 발표된 람포트라는 컴퓨터 과학자의 논문에서 처음 소개되었다.
그림과 같이 여러 장군들이 하나의 성을 점령하기 위해 일제히 공격을 하려고 한다.
그리고 각각의 장군들은 메신저를 보내 메세지를 전달하는 방식으로 통신해야 한다.
(현대로 치면 네트워크를 통해서 메세지를 전달하는 것과 같다. 속도는 훨씬 느리겠지만..)
그런데 이 장군들 사이에 스파이가 있다고 해보자.
안 그래도 실시간으로 동시에 공격하려면 적절하게 의견을 합의해야하는데, 스파이까지 고려하면서 스파이가 아닌 장군들이 같은 의견을 공유하는 것은 쉽지 않을 것이다.
비잔틴 장군 문제는 스파이를 제외하고 정직한 장군들이 의견을 합의를 보는 방법이 있는지를 묻는 문제다.
이 문제가 소개된 논문에서는 여러가지 제한조건이 등장한다.
그 중하나로 적의 스파이가 전체 장군 수의 1/3을 넘지 않으면 정직한 장군들이 의견이 합의될 수 있다고 한다.
Consensus Protocol
이제 이 비잔틴 장군 문제를 비트코인에 적용해서 생각해보자.
비트코인과 같은 Permissionless Blockchain은 누구나 아무런 제한없이 비트코인 p2p 네트워크에 참여할 수 있다.
만약 참여하고자 한다면 나의 IP주소를 기준으로 제일 가까운 p2p 네트워크의 노드를 알려주는 사이트가 있다.
이 사이트에 연락해서, 비트코인 네트워크에 신규로 참여하고 싶다고 요청을 보내고, 그 사이트에서 허가하면 노드에 연결된다.
이때 내가 연결되는 노드는 무작위 노드라서 나와 연결된 노드가 하필 비잔틴 장군 문제의 스파이와 같은 역할을 하는 노드일 수도 있다.
그렇다면 이 시스템을 흔들기 위해 참여하는 스파이 노드의 참여를 어떻게 막을 수 있을까?
사카시 나카모토는 '인센티브'를 통해 이 문제를 해결하고자 했다.
이 시스템을 공격하는 사람은 자신의 경제적 이익에 반하는 결과가 나오도록 시스템을 설계하면 공격하지 않을 것으로 예측한 것이다.
그래서 지금도 이 설계에 따라 비트코인의 견고성과 신뢰성이 유지된다.
따라서 비트코인은 100% 안전한 시스템은 아니다.
만약 어떤 돈이 많은 사람이 작정하고 굉장히 많은 노드를 자신의 편으로 끌어들인다음 함께 모아서 공격을 가하면 이 시스템이 깨진다.
물론 비트코인 프로토콜을 깨뜨리려면 어마어마한 돈을 투자해서 여러 장비를 준비해야 하기 때문에, 일론 머스크같은 사람이 몇십조의 돈을 투자하는 정도가 되면 시스템이 흔들리게 된다.
Proof of Work (작업 증명)
이제 사카시 나카모토가 생각한 비트코인의 신뢰성을 유지하는 방법을 살펴보자.
대표적인 방법이 바로 '작업 증명'이다.
이 방법은 스팸 메일을 차단하거나, DoS 공격을 방지하는데 사용될 수 있다.
예를 들어, 내가 스팸 메일을 너무 자주 받아서 스트레스를 받는다고 하면,
나에게 메일을 보내려는 사람들은 모두 여러가지 작업을 해야만 메일을 보낼 수 있도록 만드는 것이다.
물론 이렇게 하면 정상적으로 메일을 보내는 사람도 불편하고 귀찮아지겠지만, 정말 메일을 보내야만 하는 상황이라면 어쩔 수 없이 요구하는 작업을 해서 메일을 보낼 것이다. (작업을 통해 내가 공격자가 아니라는 것을 증명하는 것이다.)
반면 스팸메일을 보내는 사람들은 하나의 스팸 메일을 보내기 위해 여러 작업을 해야만 하기 때문에 스팸 메일을 보내서 얻는 이득보다 작업으로 인해 얻는 손실이 더 커져서 스팸 메일을 보내지 않게 된다.
이때 해야 하는 작업은 예를 들면 메일을 보낼 때 특정 해시 값을 첨부해서 보내도록 요구하는 것이다.
이때 이 해시값은 스팸 메시지의 내용을 어떤 특정한 Nonce 값과 함께 해싱한 결과가 특정 개수의 0으로 시작하는 값이 나와야 한다.
그리고 이런 해시 값이 아니라면 메일을 받아도 그냥 바로 휴지통으로 보내버린다고 하자.
그러면 스팸 메일을 보내려는 사람은 메일을 읽도록 하기 위해서 Nonce 값을 찾기 위해 무수히 많은 해시 값 계산을 시도해볼 것이다.
비트코인에도 이 아이디어가 그대로 들어가있다.
즉, 정상적인 목적으로 비트코인 시스템에 참여하는 사람이라면 시도할만 하면서, 공격을 목적으로 하는 사람이 시도하기에는 부담스러운 정도의 작업을 요구함으로써 시스템의 안전성을 지키는 것이다.
비트코인에서도 마찬가지로 이메일이나 헤더 정보와 같은 값을 Nonce 와 같이 해싱한 값이 특정 0의 개수 이상으로 시작하면 통과하도록 하는 작업증명을 요구한다. 그리고 이때 필요한 0의 개수가 채굴 난이도가 된다.
이때 사용되는 크립토 해시 함수의 성질 중 하나를 사용한다.
바로 해시의 결과값과 그 결과값을 내보내는 인풋의 일부를 알아도, 나머지 인풋을 알아내는 것이 매우 어렵다는 성질이다.
비트코인 블록을 채굴하기 위해서는 이전 블록의 해시 값, 내가 포함하고 싶은 트랜잭션들을 모두 모은 merkle tree의 root 해시, 지금 채굴하고 있는 현재 시점의 timestamp 값을 모두 더한 뒤, 여기에 임의의 nonce 값을 더해서 SHA256으로 해싱한 값이 정해진 값보다 작으면 채굴에 성공한다. 정해진 값보다 작다는것은 그 값의 앞쪽 비트가 모두 0이라는 것과 같으므로, 이 0의 길이를 통해서 난이도를 조절할 수 있다.
(해시 결과값의 경우에는 256 bit 중 앞에 0의 길이는 난이도에서 정한 만큼 고정해두고 나머지 값은 임의로 정해두면 결과값을 알고 있다고 볼 수 있다.)
그리고 이 결과값을 내는 Nonce 값을 빠르게 알아내는 것은 매우 힘들다는 것을 수학자들이 보장하기 때문에, 비트코인을 채굴하려는 사람들인 이 Nonce 값으로 다양한 값을 집어 넣으면서 원하는 해시 값이 나올 때까지 무수히 많은 해시 연산을 수행해야 한다.
이 사진은 3개의 블록들이 서로 연결된 모습을 나타낸다.
이 모습은 블록 헤더의 일부 모습이며, Nonce 값, 코인 베이스 트랜잭션으로 부터 얻은 돈, 내가 포함한 트랜잭션, 이전 블록 헤더의 해시값을 기반으로 현재 블록 헤더의 해시를 계산할 수 있다.
4, 5번 블록도 코인베이스 트랜잭션을 포함하는 블록이며, Nonce, 이전 블록의 해시값만 다르다.
이때 누군가 코인 베이스 트랜잭션의 수신 주소를 Ander 에서 Gary 로 바꿨다고 해보자.
이 순간 현재 블록의 해시 계산값이 바뀌면서 5번 블록의 Prev 값과 5번 블록의 해시 값도 같이 변하는데,
이때 4번 블록과 5번 블록의 해시값이 0 5개로 시작했던 해시에서 0으로 시작하지 않는 해시가 되어 조건에 맞지 않게 되고, 유효하지 않은 블록이 되어버린다.
그러면 5번 블록 이후의 채굴자들은 5번 블록이 더 이상 유효하지 않기 때문에 5번 블록 뒤에 이어서 블록을 붙이려고 하지 않게 된다.
(물론 그럼에도 불구하고 이어붙이려는 채굴자들이 있을 수도 있지만, 유효하지 않은 블록이기에 의미가 없다.)
Longest Chain
비트코인에는 지금 내가 이어붙이는 블록 체인 중에 어떤 블록체인이 가장 대세를 이루고 있는지, 해시에 의해서 결정하는 규칙이 있다. 이 규칙을 가리켜 'Longest Chain' 이라고 하며, 이 체인을 향해 컨센서스가 일어난다.
그림에서 제일 왼쪽에 있는 녹색블록은 최초의 블록으로서 제네시스 블록이라고 부른다.
채굴자들이 블록을 채굴할 때는 내가 채굴하는 블록이 이전에 어떤 블록과 연결되는지 결정해야 한다.
내가 해시 퍼즐을 풀어서 비트코인의 블록의 해시값을 결정할 때 이전 블록의 해시 값이 사용되기 때문이다.
이때 나의 이익을 극대화하려면 대세 블록, 즉 다른 채굴자들도 모두 이 블록이 유효한, 긴 블록이라고 인정하는 블록 라인에 이어서 채굴하는 것이 유리하다. (그림에서는 검은색 블록 라인이다.)
왜냐하면 가장 긴 체인이 합의를 이룬 체인이기 때문이다. (가장 길다는 것은 가장 많은 컴퓨테이션을 한 체인이라는 말과 같다.)
길이가 짧은 체인은 그 체인 뒤에 이어붙이기 위해 컴퓨테이션을 많이 했지만 실패했다는 것과 같다.
따라서 길이가 긴 체인을 따라잡아 뒤집는 것이 쉽지 않으므로, 가장 긴 체인을 따라서 채굴하게 된다.
(비트코인에서는 가장 긴 체인을 가리켜 컨센서스를 이룬 체인이라고 한다.)
대세 블록에서 빠져나온, 보라색 블록과 같은 곁가지 블록도 있다.
이런 블록은 채굴 과정에서 하나의 블록에 이어붙이는 블록을 채굴한 결과가 2개가 발생한 경우다.
즉, 해시 퍼즐을 거의 동시에 두 군데에서 푼 것이다.
그러면 이제부터는 채굴자는 2개의 그룹으로 나뉘어 각각의 블록 뒤에 새로운 블록을 잇고자 할 것이다.
이때 한 쪽 그룹이 다른 그룹의 잇는 속도를 따라가지 못하여 뒤쳐지면 대세 블록에서 벗어나게 된다.
< 여기까지 공부했을 때 나의 궁금증 >
비트코인은 블록을 채굴한 순간 채굴 보상을 받게 되는데, 이때 보라색 블록과 검은색 블록 채굴자 모두 채굴 보상을 받을까?
다양한 트랜잭션들을 포함해서 채굴하여 트랜잭션 수수료를 받는데, 보라색 블록과 검은색 블록 모두 트랜잭션 수수료를 보상으로 받을까?
이 둘이 서로 다른 트랜잭션을 포함해서 채굴한 경우, 이 둘이 서로 같은 트랜잭션을 포함해서 채굴한 경우, 둘 다 수수료를 보상으로 받을까?
서로 같은 트랜잭션을 포함해서 채굴한 경우, 수수료는 이중으로 받을 수 있는 걸까?
보라색 블록과 같이 대세 블록에서 밀려난 블록 속 트랜잭션 수수료가 지불되지 않았다면 나중에 대세 블록체인의 블록이 다시 해당 트랜잭션들을 포함해서 수수료를 받을 수 있을까?
작업 증명의 난이도 조절
비트코인의 작업 증명 난이도 (해시 값의 범위) 는 자동으로 조절된다.
이때 자동으로 조절하는 기준은 채굴자들의 컴퓨팅 파워를 기준으로 조절한다.
비트코인은 지난 2016블록이 채굴되는 동안, 블록당 평균 채굴 시간이 10분보다 길다면 난이도를 낮추고, 10분보다 짧다면 난이도를 높여 10분에 가까워지도록 조절한다.
따라서 2016블록이 평균적으로 블록당 10분에 하나씩 채굴되도록, 대략 2주에 한번 난이도를 조절하게된다.
채굴에 대해 다시 정리하자면, 채굴은 사카시 나카모토가 정한 sha 256 해시 함수를 이용한 해시 퍼즐을 푸는 것과 같다.
이 해시 함수를 사용하면 256 bit 의 0과 1로 이루어진 시퀀스가 나올 것이다.
이때 이 시퀀스를 숫자로 보면 그 숫자가 어떤 특정한 타겟 넘버보다 작아지면 성공으로 간주한다.
어떤 숫자가 특정한 타겟 넘버보다 작다는 것은 그 해시값의 앞 부분이 다 0이라는 것과 같다.
따라서 난도 조절은 해시 결과 앞에 나타나는 0의 개수를 통해 조절한다.
만약 기존의 난도는 해시를 계산한 결과가 50보다 작은 것이었는데, 더 어렵게 만들어야 한다고 하면, 이 결과 값이 30보다 작아야 성공하도록 만들면 더 어려워진다.
반대로 난도를 낮추려면 50에서 80으로 성공하는 기준을 높여주면 된다.
최초의 블록(제네시스 블록)이 채굴될 때의 난도는 8개의 (16진수) 0이었고, 2018년 9월 18일 기준에 채굴된 블록의 난도는 18개의 (16진수) 0이었다. (비트 기준으로 세면 4 x 18 = 72개의 0이 필요한 것과 같다.)
요즘은 이 해시 계산을 빠르게 하기 위해 그래픽 카드를 병렬로 연결해서 해시 계산을 매우 빠르게 돌리는 전문 공장을 만들어 비트코인을 채굴한다. (따라서 평범한 사람이 집에 있는 컴퓨터로 채굴하는 정도로는 비트코인을 채굴할 가능성이 매우 낮다. 0은 아니지만..)
그리고 그런 공장에는 여러 사람이 모여서 함께 채굴하고, 채굴에 성공하면 보상을 나눠갖는 시스템으로 돌아가기도 한다.
채굴이 거의 운의 영역이기 때문이다. (이를 가리켜 '풀' 이라고도 표현하며, 다양한 풀이 존재한다.)
다양한 Consensus Protocol
내가 공격의도가 없는 사용자라는 것을 확인하는 컨센서스 프로토콜은 작업 증명 외에도 여러가지가 있다.
Proof of Stake, Proof of Activity, Proof of Burn, Proof of Capacity 와 같은 것들이 있는데,
Proof of Activity 는 POW와 POS가 섞인 형태이다. (pos = proof of stake)
비트코인에서는 PoW를 사용하고, 이더리움이 PoS 방식을 사용하고 있다.
Native Currency
만약 채굴에 성공했을 때 기존의 화폐인 달러를 주었다면 그 달러를 어딘가로부터 가져와서 제공해야 했을 것이다.
그리고 비트코인의 등장 배경인 탈중앙화와도 거리가 멀다.
따라서 비트코인은 채굴 보상으로 미국 달러 대신 비트코인 시스템 내부의 자체 화폐인 '비트코인'을 보상으로 지급했다.
그리고 이것이 비트코인의 핵심 아이디어이다.
비트코인은 비트코인을 전송하는 트랜잭션들을 확인시켜주면 (트랜잭션을 모아서 검증하고 블록으로 만들어주면) 비트코인을 보상으로주는 시스템을 채택했다.
그러면 채굴자는 언젠가는 이 비트코인을 법정화폐로 바꾸어 수익을 얻고자 할 것이고, 그러면 채굴자들은 더더욱 비트코인의 신뢰성을 쌓고 사람들의 관심을 유지하면서 잘 나가도록 신경을 쓰게 된다.
그래야만 내가 채굴에 성공해서 얻은 비트코인의 가격이 떨어지지 않을 것이기 때문이다.
이렇게 자체 통화 시스템을 통해 비트코인은 자체 시스템의 견고성과 신뢰성을 높이고, 채굴자들이 채굴할 동기부여를 제공했다.
이 통화 시스템의 이름이 '비트코인' 이고 영어로는 BTC라고 쓴다.
비트코인은 코인베이스 트랜잭션이라는, 인풋이 없는 독특한 형태의 트랜잭션을 통해 블록마다 새로운 비트코인이 생성되어 채굴자의 주소로 전송된다.
비트코인은 '비트코인 코어' 라는 일종의 프로그램을 통해 시작되었다.
이 프로그램은 사카시 나카모토가 논문을 발표하기 전부터 만들어서 논문 발표 이후 얼마 지나지 않아 돌아가기 시작한 것으로 여겨진다.
비트코인 코어는 사카시 나카모토가 발표한 논문을 코드로 구현한 참조 프로그램이다.
사카시 나카모토는 처음에 채굴에 성공하면 50개의 비트코인을 지급했다가, 이후에는 21만개의 블록이 채굴될 때마다 지급하는 양을 반으로 줄이도록 시스템을 설계했다.
그리고 이 리워드는 점점 줄어들다가 최종적으로 2100만개의 비트코인까지만 지급될 것이라고 한다.
여기에서 더 늘어나려면 다수의 합의가 필요하고, 기존시스템을 하드 포크한 새로운 프로젝트가 시작되어야 한다.
2100만개 코인은 수학으로도 간단하게 계산할 수 있다.
21만개의 블록이 채굴될 때마다 처음에는 50에서 시작해서 점점 반씩 줄어드니 25, 12.5, 6.25와 같은 순으로 줄어들 것이다.
이는 21만 x 50 x (1 + 1/2 + 1/4 + ... ) 와 같으며, 등비급수의 계산값이 2 이므로 2100만이라는 값이 나온다.
사카시 나카모토가 이렇게 전체 비트코인의 발행량에 제한을 둔 이유는 비트코인의 가치를 지키기 위함이었다고 추측한다.
일반 화폐와 달리 무작정 찍어내지 못하도록 프로토콜 상에 제한을 둔 것이다.
그리고 다른 블록체인 프로젝트와의 차별점도 여기서 등장한다.
다른 프로젝트에서는 갑자기 발행량 제한을 늘리기도 하기 때문이다.
또한 비트코인은 Market based transaction 이라는 우리가 비트코인을 전달하는 데 사용된 트랜잭션에 수수료를 매기는 시스템이 있다.
이 수수료는 이전 트랜잭션의 output 에서 현재 아웃풋에 지불하고 남은 금액이 된다.
트랜잭션을 발생시키길 원하는 사람은 가급적 적은 수수료를 매기길 원하지만, 트랜잭션은 채굴자에 의해 채굴이 되어야 실제 트랜잭션 대로 코인이 이동하는 효과가 발생되기 때문에 채굴자가 자신의 트랜잭션을 포함시켜 채굴하도록 채굴자의 기대에 맞는 수수료를 책정해야 한다. 그리고 이 과정에서 수수료에 대한 시장가격이 형성된다.
대부분의 경우 트랜잭션의 수수료는 비트코인의 채굴보상보다는 작지만, 가끔씩 예외가 있다.
대표적인 예외는 21만 블록마다 발생하는 반감기 이후 최초로 채굴되는 블록이다.
현재까지 채굴보상은 3.125까지 내려왔고, (2024년 4월) 다음 반감기는 2028년으로 예상되는데, 이 반감기를 넘어가는 블록은 독특한 블록이다보니 여기에 트랜잭션을 넣고 싶어하는 사람들이 많다.
이 사람들은 자신의 트랜잭션을 기록으로 남기기 위해 이 트랜잭션에는 높은 수수료를 매긴다.
그래야 채굴자들이 자신의 트랜잭션을 포함시켜서 블록을 채굴할 것이기 때문이다.
그래서 그 블록의 트랜잭션 수수료를 합한 값이 블록의 채굴 보상보다도 큰 적도 있었다.
그 외에도 23년 10월 경 어떤 사람이 40억원 어치에 해당하는 비트코인을 수수료로 하는 트랜잭션을 만들어 화제가 되기도 했었다.
이런 트랜잭션이 있다면, 머클 트리를 계산하는 것조차도 비용이므로 다른 트랜잭션을 넣지 않고 이 트랜잭션만을 넣어서 빠르게 해시 계산을 시도하는 것이 이득이다. (채굴자는 자신이 넣고 싶은 트랜잭션을 자유롭게 넣어서 블록을 채굴할 수 있다.)
'CS > 블록체인' 카테고리의 다른 글
[블록체인] 8. 비트코인 스크립트 (0) | 2024.10.17 |
---|---|
[블록체인] 7. 비트코인 네트워크 (0) | 2024.10.15 |
[블록체인] 5. 트랜잭션 포맷 (0) | 2024.10.10 |
[블록체인] 4. 디지털 서명과 비트코인 주소 (0) | 2024.10.10 |
[블록체인] 3. 블록체인의 구조와 해시 함수 (0) | 2024.10.09 |