[공부하자! 블록체인]3. PoW(Proof of Work) - 암호학을 통한 부정방지

in #blockchain7 years ago

이번에 설명하는 PoW(Proof of Work)는 비트코인을 비롯한 블록체인 서비스에서 합의 알고리즘으로 소개되는 경우가 많습니다. 그러나, 원래는 1999년 Markus Jakobsson과 Ari Juels가 제창한 서비스의 부정이용을 방지하기 위한 프로토콜입니다. 우선은 PoW에 대한 의미에 대해서부터 알아봅시다.

PoW(Proof of Work)이란?


PoW는 서비스 제공자가 특정 작업을 이용자에게 요구하는 작업을 완료한 사용만이 서비스를 이용할 수 있는 프로토콜입니다. 서비스 제공자가 이용잘로부터 보내진 내용을 검증해야 합니다. 그러나, 검증할 때 시간을 필요로 하지만, 최소화하기 위해 검증 자체를 비교적 쉽게 해야 합니다. 그러면, 작업 완료, 확인이 작업 자체보다 상대적으로 쉽게 처리된다고 생각해 봅시다.

이런 특정을 쉽게 이해하려면 스도쿠라는 숫자게임을 생각해 봅시다. 9x9칸에 1부터 9까지의 숫자를 채워가는 퍼즐로 스도쿠 열과 행 모두 숫자가 중복되는 것을 불가하며, 3x3 블록내에서도 동일한 숫자가 중복되는 것을 허용하지 않는 규칙이 있습니다.

이 퍼즐 게임을 풀기 위해서는 숫자를 채워가는 시행오차를 통해 상응하는 머리싸움을 해야 하지만, 퍼즐 답이 맞는지 확인하는 것 자체를 비교적 쉽습니다. 스도쿠 게임을 푸는 방법과 정답 검증하는 작업을 PoW(Proof of Work) 작업이라고 말합니다.

PoW프로토콜은 일반적인 사용자에게는 별다른 영향을 주지 않지만, 부정 사용자에게는 안좋기 때문에 부정방지에 도움이 된다고 생각됩니다. 물론 부정 사용은 일반적인 이용방법에 비해 많은 리소스를 시스템에 요구하여 사용할 수 있습니다. 예로 불특정 다수의 이메일주소로 대량의 스팸메일을 보내는 행위나 특정 서비스에 대량의 요청을 보내서 서비스 제공을 방해나는 DDOS공격등이 있습니다. 만약, PoW작업에 1초정도의 시간이 필요하다면, 1통의 이메일 당 1초를 기다려야 하지만, 스팸메일로 10,000통이 보내지면 10,000초가 걸리기 때문에 현실적이지 못합니다. DDoS공격의 경우도 1개 요청에 1초작업을 요구하는 프로토콜이라면 대량을 요청을 시켜 서비스를 다운시키는 것은 어렵습니다.

그러나, PoW를 이용한 시스템은 메일이나 웹서비스 분야에서는 그다지 보급되지 못했습니다. 이유는 PoW를 이용한 작업이 예상만큼 알맞은 난이도가 없습니다.

스도쿠 게임에서는 잘하는 사람일수록 해결속도가 빨라집니다. 컴퓨터에서 처리하는 PoW작업은 몇 가지 제안되었지만, 많은 작업을 컴퓨터 계산 리소스를 많이 투입한 만큼 해결도 빨라집니다. 앞에서 "만일 PoW작업에 1초가 필요하다"라고 정했지만, 개별 사용자가 가진 프로세스 리소스가 제각각인 이상 자체가 성립되지 않습니다. 반대로 비트코인 구조로 제안된 블록체인은 PoW의 단점을 해결하고 활용하고 있습니다.

비트코인에서 사용하는 PoW


비트코인에서 사용되는 PoW를 설명합니다. 비트코인은 암호화 해시함수의 출력의 값 이하로 입력을 찾는 작업을 PoW로 하고 있습니다.

예로, 출력이 0 ~ 9,999의 1만개가 존재하는 암호화 해시 함수를 생각해 봅시다. 해시함수 출력이 99 이하가 입력 x를 만나면, 출력에서 입력을 역산할 수 없는 것이 암호화 해시함수의 특징이기 때문에 입력을 알맞게 변화시키면서 x를 찾아낼 수밖에 없습니다. x값을 찾으려면 방대한 계산이 필요하지만, x값이 찾을만하면 유효성 검사는 1번만 하면 됩니다. 이런 작업은 PoW(Proof of Work)작업에 적합합니다.

비트코인 구현에서는 PoW작업으로 SHA-256이라는 암호화 해시함수를 두번 적용한 Double SHA-256을 사용하고 있습니다. 이 함수는 출력으로 256비트값을 리턴하여 출력패턴수는 10의 78제곱과 같은 숫자입니다.

PoW를 도입하는데, 비트코인 구조가 획기적이었던 이유는 비트코인 구조에 참여하는 모든 노드에서 같은 작업을 일제히 해결하는 구조로 되어 있습니다. 자세히 말하면, 블록체인의 블록 해시값이 특정값 이하의 해시값이 되는 블록을 일제히 찾씁니다. 여기서 블록의 해시값 상한이 되는 값을 target이라고 표현했습니다. 또한, 블록체인 블록의 해시값 입력은 이전 블록 해시값과 모든 데이터의 머클루트였지만 그외에도 nonce라는 일회용 암호가 추가되었습니다. 이 일회용 암호를 여러번 변경하여 블록의 해시값을 계산하고 해시값이 target이하가 nonce를 찾을 수 있는 비트코인의 PoW(Proof of Work)작업입니다. 이 조건에 따라 새 블록을 찾는 것을 비트코인에서는 마이닝이라고 하며, 마이닝노드를 마이너라고 합니다.

비트코인은 모든 마이너가 일제히 마이닝을 해서 평균 10분에 1회에서 새 블록이 생성되도록 target값을 조정합니다. 이 간격을 블록간격이라고 말합니다. 또한, 하나의 블록 상한선을 1MB로 정하고 있습니다. 이는 “1MB 데이터가 P2P네트워크를 통해 전세계 마이너를 통해 공유되는 대략 10분이 적당하다”라는 가정에서 시작되었습니다. 즉, 비트코인은 10분에 1회 블록이라는 시계 바늘이 계속 그 시계에 따라 사건의 존재 증명과 전후 관계를 정의함으로써 중심부 시계를 참조하지 않고 비중앙집권적인 P2P네트워크를 통해 금융거래를 실현하고 있습니다.

물론, 블록 간격이 10분인 것과 블록크기 1MB를 제한한 부분은 네트워크 상황과 비트코인 이용 빈도에 따라 동적으로 변해가는 것이고 실제로 블록 간격을 조정한 새 가상 통화가 등장하고 비트코인 블록 크기를 변경하는 움직임도 있습니다.

 

블록타임스탬프와 네트워크 조정시간

실제 시간과는 다른 해시체인을 기반으로 타임스탬프를 도입한 블록체인은 10분 1회 블록생성되는 것과 물리적인 시간과 동기화를 어떻게 실현하는지 궁금하지 않습니까? 비트코인은 “블록타임스탬프”와 “네트워크 조정시간(Network-adjusted Time)” 두가지를 이용하여 물리적인 시간과 블록체인 동기화를 도모하고 있습니다.

블록타임스탬프는 그 이름처럼 블록에 노드가 붙은 UNIX 타임스탬프입니다. 블록타임스탬프 블록의 해시값을 계산할 때 입력됩니다. 블록타임스탬프는 블록을 생성한 마이너가 마음대로 설정할 수 있기 때문에 몇 가지 제약이 있습니다.

“이전 11블록의 블록타임스탬프의 중심값”은 미래의 값이어야 합니다. 또한 네트워크 조정시간보다 2시간 이상의 미래값은 안됩니다. 네트워크 조정시간은 P2P네트워크에서 자신이 연결된 모든 노드가 리턴한 UNIX 타임스탬프의 중심값입니다. 이 블록타임스탬프는 엄격하게 차단한 타임스탬프가 현실 시간과 동기화 할 수 있는 것은 아닙니다. 블록 타임스탬프은 현실시간과 1~2시간 어긋날 수 있는 가능성이 있고, 전후 2개의 블록에서 타임스탬프 순서가 반대로 되어 있을 가능성도 있습니다. 그렇지만, 거시적으로 보면 블록 타임스탬프와 현실 시간이 알맞게 동기화할 수 있으며, 실질적인 이슈도 어느정도 적어지고 있습니다.

비트코인은 앞에서 이야기한 블록 타임스탬프에 따라 target값을 주기적으로 조정하고 평균 10분에 1회 블록이 생성되는 구조로 되어 있습니다. 자세히 이야기하면 2018블록의 target을 검토하고 최근 2018블록을 생성하는데 걸리는 시간이 2018 * 10분에 못미치면, target을 더 어렵게 변경하는 것이 아닌, 2018 * 10분을 더 필요로 하는 target을 더 쉽게 처리합니다. 그러나, 급격한 target 변동을 방지하기 위해 변동폭은 1/4~4배까지만 제한되어 있습니다.

PoW 구조를 통해 블록 생성간격은 평균 10분으로 유지되고 있어 네트워크 전체에 최신 블록정보가 공유됩니다. 그러나, 아쉽게도 최근 블록정보가 도달하기 전에새 블록이 생성될 수 있습니다. 즉, 동일한 블록번호로 내용이 다른 블록이 2개이상 존재하는 상태입니다.

직관적으로 블록타임 스탬프를 확인하고 우선 생성된 블록을 채용하면 좋다고 봅니다. 앞에서 이야기했듯이 블록 타임스탬프값은 현실 시간과 정확하게 동기화되지 않기 때문에 시간축처럼 전후 관계를 확인할 수 없습니다. 그래서, 블록체인은 블록이 연쇄적으로 오랫동안 분기하는 것이 올바른 것으로 간주하며 이 합의를 나카모토 합의라고 합니다.

나카모토 합의는 한쪽의 블록이 파괴되어 버린 경우에도 해당 블록에 포함된 데이터가 손실될 것은 없습니다. 다른쪽 블록은 아직 블록에 포함되지 않은 데이터로 간주되기 떄문에 해당 블록에 포함된 것으로 예상됩니다. 그러나, 분기 블록에서 충돌하는 데이터가 있으면 블록 번호가 새 블록에 포함된 데이터만 올바른 것으로 간주합니다. 여기서 모순된 데이터는 보유한 가상화폐 또는 토큰을 도시에 2명의 계정에 송금하는 이중 송금등을 말할 수 있습니다.

Sort: