brunch

You can make anything
by writing

C.S.Lewis

by 손동하 Apr 11. 2019

Bitcoin#9: 세그윗의 탄생과 다양한 공격

NiceHash와 Selfish mining, BWH,FAW attack

이 글은 성균관대학교 블록체인 네트워크 Skkrypto 브런치에도 연재가 되어 있습니다.


블록체인에서의 보안은 키 관리 , 난수 생성, 스마트 컨트랙트의 문제점등이 있지만 PoW 기반의 블록체인의 경우 해시율 분포등이 매우 중요한 요소 중 하나다. PoW(Proof of Work, 작업증명방식) 기반 블록체인의 경 해시파워에 의해 블록체인의 안전성이 좌지우지하는 이는 블록형성에 있어 채굴 능력, 즉 해시 파워가 중요한 역할을 하기 때문이다.

2019.01.04 기준 해시율 분포

해시 파워가 세다면, 블록을 다른 노드들에 비해 빠른 속도로 채굴할 수 있으며 정확히 말해 매순간 블록을 생성할 확률이 높다. 이는 블록체인에 있어서 큰 위험 요소이다. 만약 n번째 블록이 형성되어있는 블록체인에서 다른 노드들이 n+1번째 블록을 채굴하고 있다면 해시파워가 큰 노드는 확률적으로 n+1번째 블록을 먼저 만들어 n+2번째 블록을 이어서 채굴할 수 있다. 이처럼 해시파워가 크다면, 독자적으로 블록을 형성해 체인을 이어나갈 수 있으며, 가장 긴 체인(정확히 말하자면 '누적 난이도가 제일 큰 체인')을 채택하는 프로토콜에 의해 블록체인은 해시파워가 큰 노드가 만드는 체인과 같아질 것이다. 이러한 경우를 '51% 해시파워 공격' 이라고 한다. 사실 51%라는 숫자는 단순히 '과반수'라는 표시에 불가하다.


51% 해시파워 공격

블록체인의 안정성을 언급할때 빠지지 않는 개념중에 하나이지만 다소 오해의 소지가 있는 용어이다. 컴퓨팅 파워, 즉 해시 파워는 '해시'를 통해 블록들을 암호화하고 연결해나가는 블록체인 구조에 있어서 보안의 핵심 요소가 된다. 컴퓨팅 파워가 세서 다른 채굴자보다 빠른 속도로 해시값을 찾아내어 새로운 블록을 형성한 후 연결하면 그 누구보다 긴 블록체인을 만들어 정당성을 인정받을 수 있다. 그렇다면 평균적으로 빠른 컴퓨팅 파워를 가지고 있다면 확률적으로 해당 컴퓨터를 통해 블록을 생성하고 이어나갈 가능성이 크다. 그러한 확률적인 의미로 51%라는 숫자를 쓰기 시작했고 결국 이는 수학적으로 정확한 수치가 아닌 '과반수'라는 의미를 포함한다.

실제로 컴퓨팅 파워가 30%이상을 소유하고 있다면 공격을 할 수 있다는 연구도 발표된 적 있다.


재밌는 사실은, '51% 해시파워' 개념을 고려하였을때 소프트 포크(Soft Fork)의 정확한 의미는 "50% 이상의

채굴자가 업데이트를 진행하여야지만 새로운 변경사항이 적용된 블록체인을 형성할 수 있음"을 알 수 있을 것

이다.


다시 돌아와서, 블록이 메인체인에 담기는지에 따라 블록안에 담긴 거래가 블록체인에 안전하게 저장되어 있는지가 판별된다. 그렇다면 어떠한 기준이 이런 공격으로부터 안전하다고 생각할 수 있을까?


6 confirmation

오른쪽으로 갈수록, 새로 만들어 질수록 안전하지 않다

위에서 언급한 '51% 해시 공격'으로 부터 안전하다고 말할 수 있는 기준 중 하나로 '6 confirmation'을 주로

언급한다. 이는 말 그대로 6번의 블록 검증을 거쳐야 한다는 의미로서, 해당 거래가 포함된 블록이 이후에 추가

적으로 6개의 블록이 이어져야지만 51% 해시파워와 같은 공격에 상대적으로 안전하다고 볼 수 있다는 의미이

다. 쉽게 말하면, 내가 생성한 거래가 n번째 블록에 담겨져서 블록체인상에 등록되어 있을때, 현재 블록체인이

n+6번째 블록까지 생성되어 연결이 된다면 해당 블록(n번째)은 더 이상 다른 블록에 의해 대체될 가능성이 적

기에 안전하다고 볼 수 있는 것이다.


실생활의 예시로 설명하면 다음과 같다.

https://bit.ly/2DBblS1
내가 비트코인으로 스타벅스에서 커피를 결제한다.

비트코인을 송금한 나는 바로 매장을 떠나도 무관하지만, 스타벅스의 입장은 다르다. 결제가 안전하게 처리되

었음을 확인이 되야지 나를 매장 밖으로 보낼 수 있게 된다.


비트코인으로 결제를 한 경우, 다음과 같은 문제가 생긴다.

해당 결제 내역이 담긴 블록이 아무리 순간적으로 메인 체인에 등록되었을지라도, 가장 긴 체인을 메인체인으

로 등록하게 설계된 비트코인 프로토콜상 언제든지 내 거래가 담긴 블록은 채택되지 않을 수 있다.


즉, 스타벅스 입장에서

나에게서 받은 비트코인이 확실히 소유권이 이전되어 이후에 사용 가능하기 위해서는 대략 6번의 검증이 필요하고, 이는 1번의 검증(다음 블록 생성)에 필요한 시간이 대략 10분이므로 총 60분, 즉 1시간을 기다리게 한 후 떠날 수 있게 할 수 있다.


이와 같은 이유로 비트코인이 화폐로서 사용 가치가 떨어진다라는 평을 받기도 한다.


이러한 점들의 근본적인 위험인 '51% 해시 공격'은 PoW의 알고리즘을 이용하고 있는 블록체인의 경우 언제나

가지고 있는 위험중에 하나이다. 하지만 비트코인, 이더리움과 같은 대중적인 PoW 블록체인의 경우 언제나 이

러한 공격의 위험을 가지고 있더라도 그 누구도 마음먹고 공격하러 하지 않는다. 이유는 무엇일까?


블록체인은 trust machine으로 부르기도 한다. 결국 '신뢰'를 기반으로 한 블록체인은 그 가치가 유지 되어야

지만 신뢰를 유지할 수 있다. 만약 누군가가 블록체인의 안정성을 깨뜨려 신뢰가 무너진다면 그 누구도 해당 블

록체인을 더이상 신뢰하지 못할 것이다. 그렇게 된다면 해당 토큰의 가격은 물론, 블록체인의 가치마저도 무너져 더이상 쓸모없는 생태계가 될 것이다.

이러한 이해관계로 인해 블록체인은 아직까지 신뢰를 확보하며 유지되고 있고 공격을 받지 않고 있다.

하지만 이러한 문제점을 실제로 겪은 블록체인이 여러 존재한다. 실제로 51% 해시파워를 이용하여 이중지불을 만들어 블록체인을 망가뜨린 사례가 존재하며 대표적인 예시로 비트코인 골드의 이중지불 사건, 최근에 발생한 이더리움 클래식 이중지불 사건이 존재한다. 전자의 경우, 22개의 블록을 되돌려 이중지불을 가능하게 한 사건으로 버지(XVG)에서도 일어났으며 이는 PoW 를 이용하는 블록체인의 초기 시장에 발생할 수 있는 문제점이다.

이러한 해시파워의 문제점은 클라우드 채굴풀인 NiceHash의 공격에도 살펴볼 수 있다.


NiceHash

Nicehash

NiceHash는 클라우드 채굴 풀로서 PoW 방식의 채굴을 클라우드 풀로 모아서 진행하는 회사이다.

초기 블록체인의 경우 해시파워가 골고루 분포되어 있지 않아 안전성을 확보하는 것에 어려움을 겪는다. 이때 PoW에 특화된 해시파워를 가지고 있는 채굴 풀이 마음먹고 특정 블록체인의 채굴을 진행한다면, 각 난이도 설정 알고리즘에 의해 블록생성 난이도는 급격하게 증가하게 된다. 하지만 난이도가 상승한 후 이러한 채굴풀은 난이도가 낮은 다른 블록체인의 채굴과정을 이어나가고 결국 기존 블록체인의 선량한 채굴자들은 높아진 난이도에 있어서 고군분투하게 된다. 이후 난이도 조정에 있어서 채굴 난이도가 다시 하락하게 되면, 채굴풀은 다시 방향을 틀어 채굴을 진행하게 된다.

결국 해시파워가 충분한 집단이 이러한 채굴 방식을 유지하며 난이도를 마음대로 조작하고 장악하게 된다.  


이러한 문제점을 막기위해 비트코인 캐시는 초기 난이도 조정을 보다 체계적으로 확립하고자 하였다.


비트코인 캐시 난이도 조절

초기 비트코인 캐시는 EDA(Emergency Difficulty Adjustment) 라는 난이도 조절 시스템을 도입하였다. 이는 초반의 낮은 해시 분포를 대비한 비상 난이도 조절 시스템이다. EDA는 초기 난이도 조절에 도움을 주었지만, 급격한 참여자 수 상승에 대해 채굴 난이도 또한 급격하게 변하였다. 이러한 현상은 알트코인 커뮤니티에 알려지게 되며 같은 방식의 PoW 기반 블록체인을 채굴하는 풀에게 타겟이 되었다. 채굴자들은 난이도가 증가하면 해시력을 빼고 다시 난이도가 낮아지면 해시력을 대거 투입하는 행태를 보였다. 이러한 난이도 진동은 계속되었다.  

  

난이도 변동 (비트코인 Vs 비트코인 캐시)

이러한 문제점에 대한 대안으로 여러 제안들이 나왔으며, 이를 토대로 기존의 EDA 시스템에서 벗어나 새로운 난이도 조정 방법 도입하였다. 이는 2017년 11월 13일 하드포크로 진행되었으며, 매 블록 생성시마다 앞의 144개의 블록 채굴 속도에 맞추어 10분당 1개의 블럭이 생성되도록 였다.

이후 비트코인 캐시의 난이도 조절은 안정화를 위해 매순간 조절되었고 다소 안정화 되었음을 확인할 수 있다.

난이도 안정화 (비트코인 Vs 비트코인 캐시)

실제로 비트코인(오렌지색)의 경우 난이도가 계단식 상승을 보이나, 비트코인캐시(파랑색) 의 난이도는 10분의 블록 생성주기를 맞추기 위해 끊임없이 변하는 것을 볼 수 있다.


이와 같은 PoW 합의 알고리즘의 단점뿐만 아니라 거래가변성(Transaction Malleability) 또한 자주 언급되었다.


거래가변성 (Transaction Malleability)

세그윗 적용 전 거래의 형태는 이전에 거래 구조에서 설명하였듯, 거래와 서명을 이어서 적용하였다. 

Transaction 구조

기존의 거래(Transaction)을 살펴볼 때, script에 대한 서명은 거래와 함께 이어져 있었다.


하지만 이와 같은 경우 서명의 작은변화로 같은 거래이지만 다른 Txid를 만들 수 있게 하였다. 

이는 개인 사용자가 거래소에 거래를 요청 후, 본인이 스스로 비트코인 네트워크에 참여하여 거래의 서명을 바꿔 거래를 조작한 후 기존 거래를 성사시키지 못하게 유도한다. 이후 거래소에 재 거래를 요청함으로써 거래를 성사시켜 이중으로 거래를 진행할 수 있도록 유도하는 것이다. 이는 중앙화된 거래소의 단점을 보여주기도 한 공격이기도 하다.


전세계 암호화폐 거래의 70%를 담당하던 대형 거래소 마운트곡스(Mt.Gox) 파산 사건의 정확한 원인은 밝혀지지 않았지만 거래 가변성 문제를 이용한 해킹으로 추측되어지기도 한다.

이러한 거래 가변성을 막기 위해 서명을 거래와 따로 분리하자는 의견이 제시되었고 그것이 바로 Segwit이다.


Segwit(Segregated Witness)

세그윗은 블록 사이즈에 대한 확장성 문제를 해결하기 위해 도입되었다는 이야기가 많지만 본래 거래가변성(Transaction Malleability)을 해결하기 위해 BIP141에 제시되어 BIP148에 적용되었다

세그윗 원리

그 결과 세그윗이 적용되기 전에는 거래는 서명과 함께 1Mb 블록에 담았지만, 서명과 분리하여 거래만을 1Mb에 담게 되어 실질적으로 대략 4배 정도 거래를 담을 수 있게 되다. 이러한 방식의 스크립트 구조 P2WPKH, P2WSH가 제시되었다.


이러한 세그윗 적용은 구버전의 필수적인 업데이트가 필요하지 않으며, 새버전 노드들의 검증을 통해 상호 호환이 가능하여 소프트포크의 일종이라 볼 수 있다.


위와 같이 프로토콜 상의 문제로 여러 취약점들이 존재하였다면, 채굴자들의 이기적인 행동을 토대로 다양한

공격 가능성이 제시되었다.


그 외 공격

비트코인 블록체인을 위협하는 여러가지 공격들이 존재한다. 그 중 채굴자들이 본인의 이익을 취하기 위해 일으키는 대표적인 공격들을 간단히 살펴보고 글을 마무리 하려 한다.


1) Selfish Mining

이는 단어의 의미를 파악한다면 이해하기 쉽다. 방식은 다음과 같다.


A 채굴자는 n번째 블록을 채굴한 후 주변 노드에게 전파를 하지 않는다. 대신 해당 블록을 토대로 n+1번째 블록 채굴을 진행한다. 하지만 단순히 n+1번째 블록을 채굴하는것은 그다지 경쟁력이 있는 방법이 아니다. 하지만 포크의 특성과 2차 체인과 메인체인을 이용하면 상황은 다르다. n+1번째 블록을 채굴하던 A가 주변 이웃에게서 다른 채굴자가 n번째 블록을 채굴했다는 소식을 받는 순간, A는 본인이 채굴했던 n번째 블록을 전파한다. 같은 n번째 블록이 전파됨에 따라 n번째 블록체인은 포크가 발생한다. 하지만 기존 본인이 채굴한 n번째 블록의 정보를 미리 알아 채굴을 먼저 진행했던 채굴자 A는 상대적으로 n+1번째  블록을 채굴할 확률이 높음을 알 수 있다. 이러한 방식으로 포크를 유발하여 공격을 하는 것을 selfish mining이라고 한다.

이러한 공격은 비트코인 블록체인의 취약점으로 오래전부터 논의되어 왔다. 이러한 개인 채굴자들의 공격에 취약한 점과 다르게 채굴 풀에 의한 공격이 진행되는 경우가 있다.


채굴 풀은 다음과 같은 원리로 진행이 된다.

마이닝 풀(Mining Pool)

채굴풀은 풀 매니저가 비트코인 시스템의 채굴자로 참여함으로써 작동된다. 대신 매니저는 단독 채굴자로서 진행하지 않으며 작업증명(회색 퍼즐)을 풀에 참여한 채굴자들에게 전달한다. 

채굴자들의 기여도를 측정하기 위하여 매니저는 각 채굴자들의 채굴 내역을 파악하며 이는 실제 진행했던 작업증명내역(노란 퍼즐조각)을 통해 평가한다. 한명의 채굴자가 답을 찾으면(FPoW) 해당 답을 매니저가 비트코인 네트워크에 제출하게 되고, 그에 따라 받은 보상을 매니저는 채굴자들에게 부분적으로 나눠주는 역할을 하게 된다.


즉, 채굴풀에서 채굴의 방식은 크게 2가지 종류로 나뉜다.
FPoW (Full PoW): 실제 채굴에 성공하는 경우. (초록색 퍼즐조각)
PPoW (Partial PoW): 채굴에 성공하지는 않았지만, 채굴 풀을 위해 해시파워를 제공했음을 나타내는 증거 (노란색 퍼즐조각)


이러한 채굴풀에서 진행되는 대표적인 공격이 BWH Attack이다.


2) BWH Attack (Block withhold attack)    원본

BWH attack은 주로 2가지 종류로 나눠있으며 첫번째로는 Finney Attack을 종종 언급한다. 이는 

0 confirmation 된 트랜잭션을 이용한 이중지불 공격을 일으키는 행동이다. (이와 같은 공격은 몇번 언급했으며 해당 링크를 타고 들어가면 쉽게 기억할 수 있으므로 넘어가겠다.)


하지만 주로 BWH attack은

채굴자가 PPoW는 제출하지만, FPoW는 제출하지 않는 경우를 주로 의미한다.

이는 특별한 기여를 하지 않은 채, 채굴풀에 의해 보상을 지속해서 받게 하여 풀 자체의 이익을 사실상 줄이는 효과를 만든다. 


이러한 공격은 다양하게 형성될 수 있다. 절반의 해시파워를 채굴풀을 이용하여 연산을 진행하며, 절반은 개인 채굴을 진행함으로써 채굴의 해답을 찾는 경우, 개인 채굴로의 보상으로 얻음과 동시에 풀에서는 PPoW에 대한 보상을 얻는 경우를 만들 수 있다.


이는 동시에 다른 풀에 참여함으로써도 공격이 가능하다.

다른 작업증명(다른 퍼즐)을 풀고 있는 풀에 들어가 한쪽 작업증명을 진행하며 실제적으로 다른 풀의 FPoW에 대해서는 고려하지 않는 경우를 고려해 볼 수 있다.


이러한 공격은 채굴풀의 이익을 낮추는 것으로, 다른 채굴 풀간의 공격을 야기할 수 있다.

하지만 이러한 공격은 2개 이상의 pool이 서로 BWH attack을 할때 양쪽의 손해를 일으켜 실제로 발생하지 않는다는 연구 결과가 있다. 이를 'The Miner's Dillema'라고 하며 이는 게임이론의 죄수 딜레마(Prisoners' Dillema)처럼 모두가 이익을 취하려 할 때, 모두 손해를 보는 것과 같은 현상을 본 따 이름이 지어진 것으로 유추할 수 있다.


3) FaW Attack  (Fork after witholding)    원본

이는 2017년 카이스트(KAIST)에서 발표한 논문의 내용으로서, BWH attack과 Selfish Mining을 합친 공격이라 볼 수 있다. 


채굴자는 본인의 해시 파워 절반을 개인 채굴을 진행하며, 절반은 '단일' 채굴풀에 참여하여 FPoW를 진행한다. 
이때 "FPoW를 채굴에 성공하나 전파를 하지 않을때" 3가지 경우의 수가 발생한다.

1. 같은 채굴풀의 다른 채굴자가 FPoW에서 채굴에 성공한 경우, 본인은 채굴풀에 참여한 대가로 보상을 받게 된다. 이는 위에서 설명한 BWH attack과 유사한 공격으로 볼 수 있다.

2. 다른 채굴풀의 다른 채굴자가 채굴을 성공한 경우, 미리 채굴해 놓았던 블록을 전파하여 fork를 유발한다. 이는 위에서 언급한 Selfish Mining과 같은 공격에 해당한다.

3. 절반의 해시파워로 개인채굴에 성공한 경우, 직접 개인이 네트워크상 주어지는 이익이 더 크므로 이 또한 BWH attack의 일부로 볼 수 있다.


위와 같은 경우를 살펴보았을 때, '단일'채굴풀에서 FAW attack의 발생 위험을 살펴 볼 수 있다. 


이어서 '여러개의 채굴풀의 참여할 경우', '풀과 풀간의 공격' 또한 언급되어 있으나 구체적인 내용 및 자세한 수학적 원리를 다루는 것은 본 글의 취지를 넘어가는 듯 하여 여기서 마무리 하도록 하겠다. 궁금하다면 원문의 링크를 참고해서 읽어보는게 좋을 듯 하다.



참고

https://medium.com/@Mengerian/bringing-stability-to-bitcoin-cash-difficulty-adjustments-eae8def0efa4

https://www.facebook.com/hyoungjoong.kim.1/posts/1987851737915963?__tn__=C-R

https://cryptokiwi.kr/currency?id=btc&category=2&content_id=217


손동하 / sohn@skkrypto.io

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari