Bitcoin and Blockchain(2)

in #blockchain8 years ago

비트코인의 원리

- 머클트리(Merkle tree)

머클트리는 블록구조에서 블록바디(body)부분에 있는 이진트리(binary tree)라고 표현한다.
머클트리에는 거래내역을 해시한 값들이 들어가 있고 이 해시값들을 2개씩 묶어서 트리형태로 만든 것이라고 보면 된다.
그래서 머클트리를 보면 거래들이 변조되었는지 확인할 수 있고 그보다 더 쉽게 머클루트(root)라는 것을 블록헤더에 넣어서 거래의 유효성을 검증하며, 머클경로를 제공하여 SPV에서 효율적으로 거래확인이 가능하다.

수백, 수천개의 거래들을 2개씩 묶어 해싱하고 이렇게 묶은 것들을 다시 해싱하는 과정을 통해 가장 위에 위치한 하나의 32바이트의 데이터로 만든다. 이렇게 만든 머클트리는 특정 거래를 찾기 쉬운 경로를 제공해준다. 경로의 수도 Log2스케일로 줄어들어 32개의 거래들의 경로수는 log2(32)인 5번이면 찾는다. 이렇게 특정거래를 찾기 쉽고 위변조 여부도 금방 알 수 있게 된다.

- SPV(Simplified Payment Verification)

단순지불검증이라고 불린다. 말 그대로 단순하게 거래를 확인한다는 의미이다.
비트코인 노드는 코어프로그램을 다운받아 운영할 수 있는데 2009년 최초 블록부터 현재블록까지 모두 다운받아야 하고 계속 최신장부를 업데이트해야 한다. 이를 Full node라고 하는데 용량도 너무 크고 다운받는 시간도 길다.
SPV는 전체블록을 다운받지 않고 블록헤더(블록헤더와 블록바디 중 블록헤더만)만 다운받아 거래를 검증할 수 있게 하는 방법이다. 이렇게 하면 전체 블록체인 용량의 1/1000정도만 부담하면 돼서 Full node보다 상대적으로 가볍다.
주로 휴대폰이나 지갑 소프트웨어, 사물인터넷기기같은 저장공간이 많지 않은 곳에서 쓰인다.

Full node와는 달리 SPV는 거래를 증명할 때 해당 거래가 특정 블록에 존재하는지를 확인한다. 그 방법 중 하나가 Merkle tree를 추적하는 것이다. Merkle 경로를 따라가서 해당 거래가 담긴 블록 위에 6컨펌이 이루어진 것을 확인하는 방법이다.
즉 컨펌수로 거래가 존재함을 증명한다.

하지만 SPV는 어떤 특정 거래가 존재함을 증명하기 위해서는 머클경로를 이용해 선택적으로 거래를 검색해야하기 때문에 최대한 다양한 노드들과 의존해 연결되어 있어야 한다. 실제로는 여러 공격에 대비해 하나 이상의 Full node와 연결되어 있다.
그리고 SPV노드는 특정 거래의 존재확인은 가능하지만 전체 블록히스토리가 없으므로 그 거래에 대해 존재하지 않는다는 판단 하지 못한다. 그래서 다른 노드에게 특정 정보를 요청해야 할 때가 있는데 이 때 주소를 노출해야 하는 문제가 있다.
이 문제는 아래의 Bloom filter(블룸 필터)를 이용해 해결한다.

- Bloom filter

블룸 필터는 특정 원소가 그 데이터집합에 속하는지 안속하는지 검사하는데 사용되는 확률 자료 구조이다(위키백과 참조).
비트코인에서 어떻게 쓸 수 있는가?
SPV에서 비트코인 블록체인처럼 큰 용량에서 하나의 거래가 이 블록체인에 속해있는지 그렇지 않은지를 정확하게 판단하기 힘들 경우 Bloom filter를 이용하면 모든 정보를 공개하지 않고 해당 거래를 쉽게 검증할 수 있다.
Bloom filter의 원리는 어떤 패턴(필터링할 조건)들을 해싱해서 나온 해시값을 각각 데이터 테이블(Bit array)에 필터링을 하고 이들을 그대로 합쳐 블룸 필터를 만든다. 데이터테이블에 필터링한다는 것은 필터링할 조건들(패턴)을 해시하여 나온 값의 이진수를 확인하여 데이터테이블에 아까 나온 이진수에 맞는 array에 1표시를 하는 것이다. 그리고 SPV가 제시한 어떤 조건들을 해싱하고 이 해싱한 값을 데이터 테이블에 투사시키고 블룸필터와 대조하여 틀리다면 명백히 틀리다는 것을 나타낸다. 따라서 이 조건들은 블룸필터에서 걸러진다(필터링 된 것이다.).

결국 SPV는 자신에게 필요한 조건들을 블룸필터에 추가하고 Full node들은 이 블룸필터를 받아 필터링하여 나온 거래들을 SPV노드에게 전송하여 검증하게 된다.

비트코인의 특징

비트코인은 블록체인의 시스템(암호학) 덕분에 높은 수준의 보안성을 가진다. 따라서 위조, 변조를 할 수 없다.(이러한 메커니즘은 아래에서 설명한다.)
그리고 모든 기록은 블록체인에 기록되어 공개되며 누구나 거래기록을 볼 수 있다. 이로써 투명한 거래관리가 가능하다. 또한 코어설치 및 지갑설치하고 송금할 때 신원확인을 하지 않으므로 익명성도 보장된다.
누구나 24시간 장소에 구애받지 않고 상대방에게 신뢰가 필요 없는 즉시 이체가 가능하다. 그리고 초기에는 낮은 수수료로
초소액결제(micro-payment)가 가능하다는 기대가 있었지만 현재는 블록사이즈의 제한과 네트워크사용량의 증가로 인해 수수료가 증가해(현재 30000원 이상) 이는 더 이상 가능성이 없어보인다.(라이트닝 네트워크나 다른 획기적인 스케일링솔루션이 실현된다면 다른 이야기가 될 수 있겠다.)

비트코인을 실생활에 사용하는데 아직까지는 개선해야 할 점도 많다.
우선 가치안정성문제이다. 거래소만 들어가 봐도 비트코인의 가치는 시간대별로 다르고 일별로는 천차만별일 때가 있다. 가치의 변동성이 심해 실생활에 이용되는데 리스크가 있다.
그리고 보안문제이다. 비트코인의 서비스 사업자(거래소 등)들은 해킹에 취약하다.(블록체인이 해킹된다는 것이 아니다.) 이때까지 이러한 해킹사례는 몇 차례 있어왔고 명확한 규제가 없어 피해보상도 미흡하다.
그리고 은행과 같은 중앙집권적인 기관들이 만들어온 시스템에 비해 비트코인이 제공해온 사용자경험은 아직까지 미흡하다.

비트코인의 보안

비트코인은 기술적이고 경제적인 방법으로 보안을 한다.

  • 기술적 : 비트코인의 현재 블록들은 이전블록의 해시값을 포함한다. 따라서 해커가 어떤 블록을 해킹한다고 하는 것은 블록의 거래내역을 변조한다는 의미인데 그렇게 되면 그 블록의 해시값이 변경되게 된다. 따라서 그 이후 최신블록까지 연결된 모든 블록과의 연결(체인)에 문제가 생기는데 그렇게 되면 블록체인은 그 변조된 블록을 폐기한다. 따라서 해커는 해킹하려는 블록에서부터 최신블록까지 모두 해킹해야 한다. 해킹하는 사이 10분마다 추가되는 블록까지도 해킹해야하고 심지어 그보다 더 빠른 속도로 해킹하여 원 체인보다 길어져야 한다. 그래야 블록체인으로부터 주체인으로 인정받고 해킹한 블록 내 거래기록이 정당성을 얻게 되기 때문이다. 결론은 해커가 다수가 합의하는 컴퓨팅 파워(해시파워)보다 더 많은 양의 컴퓨팅 파워를 가지고 있어야 한다. 이미 비트코인 네트워크 과반수의 해시파워는 성능좋은 수 많은 슈퍼컴퓨터 수백대를 합친 것보다 많다. 따라서 해킹은 기술적으로 불가하다고 이야기한다.
  • 경제적 : 해킹을 통한 경제적 이득이 없다. 내가 그 많은 컴퓨팅 파워를 얻기까지 들인 비용과 해킹비용 등 들어간 비용보다 돌아오는 이득이 별로 없기 때문에(해킹을 통한 네트워크 불신이 비트코인의 가치를 떨어뜨릴 것이기 때문) 굳이 하지 않을 것이다. 물론 연합한 채굴풀이 경제적 이유와 관계없는 단순 악의를 갖는다면 가능하기도 하겠지만 그러한 일은 앞으로도 없어 보인다.

비잔틴 장군의 문제

분산 컴퓨팅에서 항상 문제가 되어왔던, 그렇지만 해결하지 못했던 비잔틴 장군의 딜레마는 비트코인의 합의 알고리즘으로 인해 해결되었다고 한다. 중앙시스템에서는 한 관리자나 기관에서 의사결정하고 실행하면 되었지만, 분산 네트워크에서는 의사결정하기 위해 다수의 합의를 이끌어 내야 한다.
그렇다면 어떻게 다수의 합의를 이끌어 낼 것인가? 그리고 여기서 소수의 악의를 가진 개인(노드)들이 있다면 그럼에도 불구하고 올바른 의사결정을 해낼 수 있는 방법은 무엇인가? 분산된 네트워크는 심지어 서로 신뢰를 전제로 하지 않는다.
비트코인은 작업증명(PoW)를 이용해 이런 문제를 해결한다.
우선 비잔틴 장군의 딜레마란 무엇인가? 다만 여기서 비잔틴장군의 문제는 실제 역사적 사실이 아닌 분산컴퓨팅에서 일어날 수 있는 합의문제에 관한 이론이다.
비잔틴 제국의 장군들은 자신의 병력을 가지고 적군의 도시를 공격해야 한다고 한다. 서로 멀리 떨어진 위치에 각 장군들이 있고(따라서 모여서 합의할 수 없는 위치에 있다.) 각 장군들은 전령을 보내 의사를 결정해야 한다. 여기서 의사결정은 적군의 도시를 침략하는 시간이다. 모든 장군들이 동시에 공격해야 성공할 수 있는 게임이다.
하지만 전령을 보내는 중 적군의 계략에 의해 잘못된 정보를 보내게 할 수 있고 더 큰 문제는 비잔틴 장군들 중 배신자가 있을 수 있다는 것이다. 배신자들은 공격시간을 지키지 않거나 임의로 다른 공격시간 정보를 보내 혼란을 야기할 수 있다. 이는 즉 각 장군들이 서로를 신뢰할 수 없는 상황에 있음을 나타낸다.
이 모든 리스크를 감수하고도 같은 시간에 공격할 수 있는 합의를 이끌어 낼 수 있는가가 비잔틴 장군의 문제이다.
(분산컴퓨팅에 옮겨와서 보면 배신자들은 악의적인 의도를 갖는 노드이고 각 장군들은 선량한 다수의 노드(정확하게는 다수의 컴퓨팅파워)일 것이다.)

비트코인은 위에 언급한 바와 같이 블록체인과 작업증명 합의알고리즘을 이용해 이 문제를 해결한다.
작업증명을 도입하여 각 장군들에게 10분간 어려운 수학 문제를 풀게 한다. 평균 푸는 시간이 10분이 걸리게 한 난이도이다.
다음 문제에 넘어가기 위해서는 이 문제의 해답을 찾아야 한다. 그리고 한 명의 장군이 해답을 찾으면 나머지 장군들은 풀던 문제를 접고 즉시 다음 문제로 넘어가야 한다. 문제를 푼 장군은 공격시간을 전령을 통해 보낼 수 있는 권한을 갖게 된다.
이런 식으로 계속 문제를 풀다 보면 다수의 선량한 장군들이 푼 답지들이 소수의 배신자들이 푼 답지들보다 더 많은 묶음을 만들어낼 것이다. 여기서 블록체인은 소수의 정답묶음은 자동으로 폐기한다. 따라서 다수의 올바른 정답묶음을 채택하게 되고 결국 다수의 장군들의 공격시간정보가 확산되어 모두가 하나의 합의를 이룰 수 있게 된다. 그리고 각 장군들은 이런 합의를 신뢰할 것이다.

여기서 생각해볼 수 있는 것은 과연 장군들이 같은 시간대에 동시에 공격하는 시간을 맞출 수 있을 것인가 하는 점이다. 이 문제는 비트코인은 100% 완전한 합의를 이룰 수 있는가로 바꾸어 생각할 수 있다. 필자는 비트코인은 100% 완전한 합의를 이룰 수 없다고 생각한다. 확률적으로 100%에 가깝게 합의를 할 뿐이다. (이론상이지만) 엄청난 컴퓨팅 파워만 있다면 어느 시점부터 다시 블록을 변조해 새로 써내려갈 수 있다. 새로 작업증명을 하고 다수의 컴퓨팅파워를 능가하는 속도로 블록을 만들어나가서 주체인보다 길게 만들어간다면 새로운 주체인으로 블록체인은 인정할 것이다. 아무리 컨펌을 많이 받았다고 해도 100% 완결된 거래가 아니라는 것이다. 내 거래가 컨펌되고 6개의 블록이 그 위에 쌓여도 어느 순간 내 거래가 정당하지 않게 될 수 있다. 따라서 완전한 합의(100%)를 이루지 못하기 때문에 비잔틴 장군의 딜레마 역시 100% 완전해결하지 못한 것일 수 있다.

                                               ----- 다음 편에 계속

Coin Marketplace

STEEM 0.04
TRX 0.32
JST 0.082
BTC 59866.06
ETH 1573.69
USDT 1.00
SBD 0.42