블록체인, 51퍼센트 해킹은 어떻게 일어나는가?

|

image -fullwidth


블록체인은 해킹이나 데이터 위변조에 아주 강력하다고 알려져 있습니다. 하지만, 항상 따라붙는 말은 ‘완벽한 보안 솔루션은 없다, 블록체인의 경우 리소스의 과반수 이상을 독점하면 해킹이 가능하다.’ 라는 말입니다.

사실 블록체인 중에서도 비트코인에 해당하는 말이긴 하지만, 과반수, 즉 51% 이상의 리소스를 독점할 경우 어떤 식으로 해킹이 일어날 수 있을까요?


블록체인 분기

비트코인에서는 종종 다음 블록이 동시에 발견되는 경우가 발생합니다. 아무래도 전 세계에 뿌려져있는 노드들이 많다 보니 그 중에서는 다음 블록의 해시값을 동시에 찾는 노드들도 분명히 생길 수 있습니다. 물론 그 빈도가 낮은 편에 속하지만, 2015년 기준으로 1주일에 1~2번 발생할 수 있다는 글을 본 적이 있습니다. (지금은 노드 수가 훨씬 더 많아졌으니 더 자주 발생하겠죠.)

다음 블록 해시값을 찾은 노드들은 재빠르게 이웃 노드들에게 그 값을 전파시키는데, 만약 해시값을 찾은 노드들이 여러 개 있을 경우 그 사이에 있는 노드들은 양쪽에서 그 값을 전달받게 됩니다. 이 때 시간차가 발생하게 되면 각 노드들은 먼저 전달받은 노드의 정보를 우선시하고 나중에 전달받은 정보는 무시하게 됩니다.

image -fullwidth

결국 위 그림과 비슷한 형태로 2개 이상의 체인이 발생하는 현상이 발생하게 되고, 이 경우 각자 자기가 알고 있는 진짜 블록을 기반으로 그 다음 블록의 해시값을 계산하게 됩니다. 그리고 그 다음 해시값을 찾게 된 경우 계속해서 블록을 쌓게 됩니다.

그러다보면, 나누어진 체인들마다 블록의 길이가 다르게 될 것이며, 블록체인 알고리즘에서는 이 중 가장 긴 블록을 채택합니다. 즉, 가장 많은 작업 증명(PoW, Proof of Work)이 이루어진 블록을 신뢰한다는 원칙을 갖고 있습니다.


51퍼센트 공격

자, 그러면 51퍼센트 공격은 어떤 방식으로 이루어질 수 있는지 알아보겠습니다.

해시 파워의 절반 이상을 독점하는 노드가 있다면, 해킹이 가능해집니다. 블록체인 특성상 지나간 노드들을 해킹하는 건 거의 불가능에 가깝지만, 앞으로 쌓을 블록을 해킹하는 건 충분히 가능성이 높습니다.

51퍼센트 공격을 하는 구체적인 방법은 다음과 같습니다.

해시 파워의 절반 이상을 가진 노드가 마이닝을 통해 해시값을 찾더라도 이웃 노드들에게 전파를 하지 않습니다. 그리고 그 다음 블록을 계속해서 만들어갑니다. 과반수 이상의 해시 파워를 갖고 있기 때문에 다른 마이너들보다 긴 블록체인을 만들 수 있는 가능성이 높습니다.

즉, 비트코인에서 가장 긴 블록체인이 올바른 블록체인이며 짧은 블록체인을 파기하는 특성을 이용한 공격입니다.

요즘은 단독으로 마이닝을 하지 않고, 연합을 형성하여 마이닝 풀(Mining Pool)을 형성해서 작업하는 경우가 많기 때문에 51퍼센트 공격의 가능성이 과거에 비해서 많이 높아진 상태입니다. 이더리움(Ethereum)같은 경우는 이러한 문제점들을 해소하기 위해서 계산 능력에 대한 독점을 하기 쉬운 ASIC에 대한 내성이 있는 Ethash라는 프로토콜과 약소 마이너들도 불리한 상황을 극복하고 보상을 받을 수 있는 GHOST 프로토콜을 준비하기도 했습니다.

51퍼센트 공격은 비트코인이 처음 나올 때부터 나오던 약점이며, 실제로는 그런 일이 발생할 가능성은 현저하게 낮다라는게 그에 대한 반박이었습니다. 하지만, 전 세계 비트코인의 해시 파워 절반 이상을 중국이 가져가게 되고 거대 마이닝 풀들이 생겨남에 따라 살짝 걱정은 되는 수준까지는 도달한 거 같습니다. 그래도 개인적인 생각으로는 비트코인의 경우는 너무나 거대하고 많은 노드들이 있기 때문에 51퍼센트 공격은 현실적으로는 아직 불가능에 가까울 것 같긴 합니다.

Hyperledger 소개

|

Hyperledger Project

image -fullwidth

하이퍼레저는 Linux Foundation으로 진행되고 있는 블록체인 오픈소스 중 하나입니다. 하이퍼레저 프로젝트의 창립 멤버였던 IBM이 44,000 라인의 블록체인 소스를 Hyperledger Fabric에 기부하면서 본격적인 프로젝트화가 진행되었습니다.

하이퍼레저는 다음과 같은 기능들을 제공합니다.

  • 체인코드(Chaincode)를 통한 스마트 컨트랙트(Smart Contract)
  • 디지털 자산(Digital Assets)
  • 저장 시스템 & 기록 보관소
  • 분산 합의 네트워크
  • 플러그인 형태의 합의(Consensus) 알고리즘


하이퍼레저 구조

하이퍼레저는 다음과 같은 구조로 되어 있습니다.

image -fullwidth

크게 Membership, Blockchain, Chaincode로 이루어져 있다고 생각할 수 있습니다. Membership을 통해 가입이나 참여자의 신원 확인 등을 할 수 있고, Blockchain은 HTTP/2 기반의 P2P 분산 장부 프로토콜이 구현되어 있습니다. Chaincode 부분은 일반적인 스마트 컨트랙트 부분이라고 생각하시면 되고 여기에서 다양한 서비스들이 응용되어질 수 있습니다.


Hyperledger White Paper

Hyperledger Whitepaper

하이퍼레저 백서는 20페이지 가량으로 간단하게 소개를 하고 있어 읽어볼만한 문서입니다.


하이퍼레저 프로젝트들

하이퍼레저는 크게 다음과 같은 프로젝트들로 이루어져 있습니다.

  • Blockchain Explorer
  • Fabric
  • Iroha
  • Sawtooth Lake

Blockchain Explorer는 블록체인 런타임의 다양한 정보를 모니터링하기 위한 웹기반 어플리케이션을 개발하는 프로젝트입니다.

Fabric는 블록체인 엔진을 다루고 있는 프로젝트이며, 가장 중심이 되는 프로젝트라고 볼 수 있습니다. 최근에 0.6에서 1.0으로 버전업이 되었습니다.

Iroha는 기존 시스템에 블록체인의 분산 원장을 쉽게 도입시키려는 목적을 가진 프로젝트입니다. 대표적으로 다음과 같은 특징을 갖고 있습니다.

  • 기존 시스템에 쉽게 연동
  • 최신 도메인 지향 C++ 디자인
  • Mobile Application 지원 강화
  • 비잔틴 장애 허용 알고리즘(Sumeragi) 채택

Sawtooth Lake는 인텔(Intel)의 모듈라 방식의 블록체인 제품군으로 기존 산업에 블록체인을 활용할 수 있도록 하기위한 프로젝트입니다.


Hyperledger Fabric

위 프로젝트들 중에서 Fabric는 하이퍼레저의 핵심 프로젝트로 블록체인 엔진을 다루고 있습니다. 문서화도 상당히 잘되어 있으며, 최근에 1.0 버전으로 업데이트 했습니다.

1.0 버전이 되면서 개인 인증 부분에 아주 큰 변화가 있었고, 사용자별로 인증할 수 있는 기능이 추가되었습니다.

image -fullwidth

퍼블릭 블록체인이 은행에 사용하기 어려운 이유

|

흔히 블록체인이라는 단어를 들으면 ‘비트코인(Bitcoin)’부터 떠올리게 됩니다. 비트코인은 가상화폐이고 그러면 은행에서 사용할 수 있는 기술이 아닌가?라는 궁금증을 갖는 사람들이 은근히 많았습니다.

결론부터 말씀드리면 ‘비트코인은 은행에서 사용하기 어렵다’입니다. 사실 비트코인은 블록체인을 이용해서 만들어진 가상화폐중 하나일 뿐이며 대부분의 엔진이 고정되어 있기 때문에 다른 서비스로의 확장이 쉽지는 않습니다.

그러면, ‘비트코인’이 아니라 ‘블록체인’은 은행에서 사용하기 좋은 기술일까요?

은행에서도 블록체인에 많은 관심을 갖고 있습니다. 하지만, 은행이 관심을 가지는 건 ‘퍼블릭 블록체인(Public Blockchain)’이 아닌 ‘프라이빗 블록체인(Private Blockchain)’입니다.

그러면 퍼블릭 블록체인이 왜 은행이나 다른 금융 기관에 적용하기 어려운 지 이유를 알아보도록 합시다.


익명성

은행에서는 모든 계좌주의 신원을 확인해야 할 의무가 있습니다. 사실, 현재의 비트코인도 거래소라는 실제 금융 서비스와 연동되는 순간 익명성은 사라지고 있습니다. KYC(Know Your Customer)라고 해서 금융과 관련된 서비스는 당사자의 신원을 확인해야 하는 법적 규제가 대부분의 나라에 적용이 됩니다. 그래서 비트코인을 실제 화폐로 교환하기 위해서는 본인 확인 절차가 필요한 곳이 대부분입니다.


투명성

블록체인의 장점 중 하나가 투명성입니다. 모든 거래 내역은 모두에게 공유되고 그로 인해 투명성이 보장되고 위변조가 방지됩니다. 하지만, 금융권에서는 이러한 정보들은 개인 정보이기 때문에 은행이 독자적으로 관리해야 할 의무가 있습니다. 고객들이 서로의 잔고와 거래 내역을 공개하는 것과 은행들이 각자의 고객 정보를 투명하게 공개하는 것은 현재의 금융 규제에서는 불가능한 사항입니다.


합의 방법

현재의 퍼블릭 블록체인은 합의를 위해 ‘작업 증명(PoW, Proof of Work)’ 또는 ‘지분 증명(PoS, Proof of Stake)’ 방식을 사용하고 있습니다. 증명을 위해서 많은 양의 컴퓨팅 파워가 필요하고 그 보상을 위해 화폐가 필요합니다. 하지만, 은행에서는 이런 일들은 의미가 없고 불필요한 작업들입니다. 보다 효율적인 합의 방법이 필요합니다.


참여 자격

누구나 참여 가능하다는 것은 악의적인 목적을 가진 해커들도 참여가 가능하다는 것을 의미합니다. 이건 퍼블릭 블록체인의 입장에서는 너무나 당연한 일이지만, 은행이나 금융권에서는 부담이 되는 일입니다. 허가된 사람들만 참여 가능해야 하며, 접속 권한들도 따로 설정이 가능해야 합니다.


성능

현재의 퍼블릭 블록체인은 성능이 비교적 낮습니다. 누구나 참여할 수 있는 개방성으로 인해 악의적인 해커들을 방어해야 하는 기능을 블록체인 내에 갖고 있어야 하며, 네트워크에 참여한 모든 사람들의 합의를 얻는 과정이 필요하기 때문에 성능 저하 문제가 발생할 수 있습니다. 현재 금융권에서는 초당 수 천번이 넘는 트랜잭션이 필요한데, 비트코인을 비롯한 퍼블릭 블록체인은 이를 만족시킬 수가 없습니다.

튜링 완전(Turing Completeness)

|

튜링 완전(Turing Completeness)라는 단어가 있습니다. 형용사적인 표현으로 Turing Complete라는 표현을 쓰기도 하는데, 어떤 뜻이 있는지 포스팅해보도록 하겠습니다.


튜링 머신

1936년 수학자 앨런 튜링(Alan Mathison Turing)이라는 사람이 제시한 개념입니다. 계산하는 기계라는 설명하기 위한 단어로, 원래는 Automatic에서 따온 a-machine이라고 명칭했지만, 앨런 튜링 사망 이후 창시자의 이름을 따서 ‘튜링 머신’이라고 부르기 시작했습니다.

튜링머신은 다음과 같은 구성 요소로 이루어져 있습니다.

  • 테이프(Tape) : 일정한 크기의 셀(Cell)로 이루어져 있으며, 길이는 무한
  • 헤드(Head) : 테이프를 읽어들이는 헤드, 테이프의 위치간 이동이 가능
  • 상태 기록기(State register) : 현재 튜링 머신의 상태를 기록하는 장치
  • 행동표(Action Table) : Instruction Table이라고도 하며, 특정 조건에서 수행해야 할 행동을 기록함


대략적인 예시를 들면 다음과 같습니다.

  • 현재 상태가 'A'인데 테이프에서 '1'이라는 값을 읽으면 상태를 'C'로 하고 테이프 한 칸 전진
  • 현재 상태가 'B'인데 '100'이라는 값을 읽으면 상태를 그대로 하고, 테이프 한 칸 전진


현재의 컴퓨터는 Turing Complete

현재의 컴퓨터들은 대부분 Turing Complete하다고 할 수 있습니다. 하지만, 엄밀히 따지면 보통 메모리의 한계 등이 있기 때문에 Turing Completeness에 가깝다고 하는 것이 더 정확할 것 같습니다. 과거에는 Turing Complete하지 않은 컴퓨터도 있었다고 합니다.


프로그래밍 언어

Turing Completeness는 오히여 프로그래밍 언어에서 더 많이 사용됩니다. 하지만, 우리가 자주 사용하는 대표적인 언어들인 C, Java, Python 등은 Turing Complete한 언어입니다. 보통 대표적으로 다음 기능을 갖고 있으면 Turing Complete하다고 합니다.

  • Conditional Branch : 조건 분기문을 가질 수 있어야 합니다. IF 문 또는 FOR, WHILE 등의 반복문 또한 여기에 해당합니다.
  • 메모리의 임의 위치의 값을 변경할 수 있어야 한다.

이 두가지 기능을 갖고 있으면, 우리가 사용하는 거의 모든 기능들을 위 기능의 조합으로 만들어낼 수 있다고 합니다.

대부분의 언어들은 Turing Complete한 성격을 갖고 있습니다. 그럼 Turing Complete하지 않은 언어들은 무엇이 있을까요? 특수한 목적을 갖고 있는 스크립트(Script)언어들이 여기에 해당합니다. HTML이나 SQL, XML 등의 언어를 예로 들 수 있습니다.

퍼블릭 블록체인 vs 프라이빗 블록체인

|

블록체인의 종류는 그 성격에 따라 크게 3가지 형태로 나눌 수 있습니다.

  • 퍼블릭 블록체인(Public Blockchain)
  • 프라이빗 블록체인(Private Blockchain)
  • 컨소시움 블록체인(Consortium Blockchain)


퍼블릭 블록체인(Public Blockchain)은 이름 그대로 누구나 쉽게 네트워크에 참여할 수 있는 블록체인으로 대표적으로 비트코인(Bitcoin)이나 이더리움(Ethereum)을 예로 들 수 있습니다.

프라이빗 블록체인(Private Blockchain)은 하나의 기관에서 독자적으로 블록체인을 운영하는 것이고, 컨소시움 블록체인(Consortium Blockchain)은 여러 기관들이 컨소시움을 이루어서 블록체인을 같이 운영하는 것을 말합니다. 프라이빗과 컨소시움은 그 성격에서 상당 부분 비슷하기 때문에 일반적인 경우에서 둘을 엄격하게 나눌 필요는 없을 것 같습니다.


퍼블릭 블록체인

퍼블릭 블록체인은 누구나 참여할 수 있고, 또 누구나 운영할 수 있습니다. 즉, 운영 주체가 광범위하기도 하면서 또 불분명하기 때문에 법적 구속력에 상대적으로 자유롭습니다. 그리고 누구나 데이터를 읽을 수 있기 때문에 투명성 또한 더 크게 보장이 되는 장점도 있습니다.

하지만, 모든 노드들이 참여를 하기 때문에 각 트랜잭션의 내용은 모두에게 공개되며, 검증 또한 모든 노드들이 참여하기 때문에 성능이 저하될 수 있다는 단점이 있습니다. 또한 악의적인 의도를 가진 해커들도 손쉽게 참여할 수 있기 때문에 이러한 상황을 방지하기 위한 연산 또한 추가적으로 수행해야 하기 때문에 성능적인 저하는 더더욱 발생할 수 밖에 없는 구조로 되어 있습니다. 참고로, 비트코인의 경우 10분마다 1개의 블럭이 생성되며, 이더리움의 경우 12초마다 1개의 블럭이 생성되고 있습니다.

또한 블록체인의 엔진 수정이 어렵습니다. 참여하고 있는 많은 사람들의 동의를 얻어서 겨우겨우 수정을 할 수는 있지만, 그 과정이 오래걸리거나 복잡할 수 있습니다. 또한 심각한 경우 하드포킹(Hard-fork)등의 문제가 발생해서 해당 네트워크가 분기되는 상황이 발생할 수도 있습니다.

또한 퍼블릭 블록체인에서는 흔히 코인(Coin)이라고 불리우고 있는 내부 화폐가 필요합니다. 분산합의 후 블럭을 생성하기 위해 신뢰할 수 있는 노드를 선택하고 검증하는 단계가 필요한데, 이러한 작업을 위해서는 수고에 대한 댓가가 필요하기 때문입니다. 여기 쓰이는 화폐는 마이닝(Mining)이라고 불리우는 채굴 과정을 통해서 획득할 수 있습니다.


프라이빗 블록체인

프라이빗 블록체인은 퍼블릭 블록체인과 정반대의 장단점을 가지고 있습니다. 운영주체가 명확하기 때문에 법적인 규제를 준수해야 합니다.

하지만 노드간 권한을 다르게 설정할 수 있고, 허가받은 대상들만 노드로 참여할 수 있기 때문에 퍼블릭 블록체인에 비해 상대적으로 적은 노드수를 운영하게 되며 이는 성능 향상으로 이어지게 할 수 있습니다.

또한 블록체인 엔진을 수정하는데 드는 비용도 상대적으로 저렴하고, 블록체인에 참여한 각 노드들의 권한들도 다르게 설정할 수 있기 때문에 운영상의 자유도도 보장이 되는 등 여러 가지 장점들이 있습니다.


퍼블릭 블록체인 vs 프라이빗 블록체인

다음은 퍼블릭 블록체인과 프라이빗 블록체인을 비교한 표입니다.

image -fullwidth

image -fullwidth