비트코인 시스템은 이세상에 없던 기술들을 총 집합하여 탄생한것이 아니라 아주 오래전부터 그와 관련된 이론들과 논의들이 있었다는 내용과, 비트코인이 어떤 의미에서 혁신적이었는지에 대한 내용을 다뤘으며, 작업 증명 방식, 지분 증명 방식의 두가지 합의 알고리즘을 언급함으로써 이더리움에 시작은 작업 증명 방식으로 이루어지나 추후 지분 증명 방식으로 변화할것을 암시하였습니다.
또한, 기존의 비트코인 시스템에서 사용되는 '상태(State)'와 '상태 변환 함수(state transition function)'에 대한 개념에 대하여 먼저 설명한 후 이더리움에서는 이 부분을 어떻게 수정할지에 대한 내용을 다루게됩니다.
앞서 언급한 내용들을 중앙 집권화된 서비스 방식으로 구현하자면 매우 간단한 일입니다. 그 이유는 중앙 서버에 상태 변화과정을 저장하고 관리하면 어렵지 않게 구현할 수 있습니다.
하지만 탈 중앙화된 통화 시스템을 구축하기 위해서는 분산 합의 과정이 필요하고, 네트워크가 정상적으로 유지될 수 있도록 도와주는 노드들이 필요합니다. 또한, 이 노드들은 "블록(blocks)"이라 불리는 트랜잭션 패키지를 계속적으로 생성하고 합의하는 역할을 수행해야합니다.
비트코인 네트워크는 약 10분에 한번식 하나의 블록을 생성하도록 계획되었고, 각 블록은 타임스탬프, 논스(nonce), 이전 블록에 대한 참조(이전 블록의 해시), 그리고 이전 블록 이후에 발생한 모든 트랜잭션의 목록을 포함합니다. 이 과정을 통해서 지속적으로 성장하는 블록체인이 생성되며, 비트코인 장부의 최신상태(state)를 나타내기 위해 지속적인 업데이트가 이루어져야합니다.
* 생성된 블록이 유효한지 아닌지를 확인하기 위한 알고리즘은 아래와 같습니다.
S[0]
를 이전 블록의 마지막 상태(state)가 되도록 설정한다. TX
를 n
개의 트랜잭션을 가지는, 블록의 트랜잭션 목록으로 가정한다. 폐구간 0...n-1
의 모든 i에 대해, S[i+1] = APPLY(S[i], TX[i])
집합 중 어느 하나라도 에러를 리턴하면 거짓(false)을 리턴하며 종료한다. S[n]
를 이 블록의 마지막 상태로 등록한다. * 1 ~ 3번 과정은 새로운 블록에 대한 유효성 검증이며, 4 ~ 6번 과정은 지난 이더리움 백서 1편에서 언급한 비트코인의 상태 변화 시스템에 대한 내용입니다.
* 가장 최근의 블록의 상태 정보를 가져오고, 현재 블록에 있는 트랜잭션 목록들에 대한 유효성을 점검한 후 상태 정보를 업데이트한다고 생각하시면 쉬울것 같습니다. 이 과정이 이해가 되지 않으시다면 1편에서 설명한 상태 변화 시스템에 대한 내용을 다시 읽어보시면 좋을것 같습니다.
기본적으로 블록의 트랜잭션들은 유효한 상태변환을 진행해야합니다. 여기서 유심있게 살펴봐야하는점은 블록내에 어떠한 방법으로도 상태정보가 기록되지 않았다는 점을 주목해야합니다. 상태는 유효성을 검증하는 노드가 매번 계산해서 기억해야 하는 추상적(abstaction)인 개념이며, 이것은 원시 상태(genesis state), 즉 제네시스 블록으로 부터 현재 블록까지의 모든 트랜잭션을 순차적으로 적용함으로 계산할 수 있습니다.
채굴자(마이너)가 블록에 포함시키는 트랜잭션의 순서를 주목해보겠습니다. 만약 어떤 블록에 A와 B라는 트랜잭션이 있다고 가정해보겠습니다. 그리고 B의 트랜잭션은 A의 UTXO를 소비한다고 가정했을 경우 B는 A의 UTXO 정보가 필요하기 때문에 반드시 A의 트랜잭션이 먼저 블록에 담겨 있어야합니다. 만약 트랜잭션 A가 먼저 블록에 담겨 있지 않을 경우 B는 존재하지 않은 트랜잭션 A의 UTXO 정보를 사용하게됨으로 해당 블록의 유효성이 보장되지 않습니다. (즉 블록의 트랜잭션을 어떤순서로 담느냐에 따라 블록이 유효할수도, 유효하지 않을수도 있다는 의미입니다.)
블록 유효성 검증 알고리즘에서 "작업증명(proof of work)"의 조건은 256비트 숫자로 표현되는 블록의 이중-SHA256 해시 값이 동적으로 조정되는 목표값 보다 반드시 작아야 된다는 조건입니다.
작업 증명의 목적은 블록 생성을 계산적으로 어렵게 만들어서 sybil 공격자들이 마음대로 전체 블록체인을 조작하는 것을 방지하기 위함입니다. SHA256 함수는 예측 불가능한 유사난수 함수(pseudorandom function)로 설계되어 있기 때문에 유효 블록을 생성하기 위한 유일한 방법은 블록 헤더의 논스(nonce) 값을 계속 증가시키면 블록 해시 값이 목표값 보다 작은지에 대한 검증을 반복하는 방법밖에 없습니다.
현재 목표 값인 2187(이더리움 백서 작성 시간 기준)에서 하나의 유효블록을 발견하기 위해서는 평균적으로 264번의 시도를 해야합니다. 네트워크는 평균적으로 10분마다 새로운 블록이 생성될 수 있도록 2016개의 블록마다 목표 값을 변경하게됩니다.
채굴자들은 이러한 연산 작업에 대한 보상으로 25 BTC(이더리움 백서 작성 시간 기준)를 획득할 자격을 가지게 되며, 출력 금액보다 입력 금액이 큰 트랜잭션이 있다면 그 차액을 "트랜잭션 수수료(transaction fee)"로 얻게 됩니다. 이러한 과정이 비트코인이 발행되는 유일한 방법이며, 원시 상태(genesis state)에는 아무런 코인이 포함되어 있지 않습니다.
채굴 목적에 대한 이해를 위해 악의적인 공격자가 있을 떄 어떤 일이 발생하는지 생각해보겠습니다. 일반적으로 비트코인의 뼈대를 이루는 암호기법은 안전한 것으로 알려져 있습니다. 그렇기 때문에 공격자는 비트코인 시스템에서 암호 기법에 의해 직접적으로 보호되지 않는 부분인 '트랜잭션 순서'를 공격 목표로 잡을것입니다.
1번 과정이 발생하고 몇 분 후에 몇몇 채굴자들이 해당 트랜잭션을 블록에 포함하게됩니다. 그리고 이 블록 번호를 270000 이라고 가정해보겠습니다. 블록은 10분에 한번식 생성되기 때문에 대략 1시간 후에는 이 블록 다음의 체인에 5개의 블록들이 추가될 것입니다. 트랜잭션이 포함된 블록 이후 5개의 블록들이 연결되었기 때문에 컨펌(confriming)되었다고 생각할 수 있으며, 이 시점에서 판매자는 BTC 지불이 완료된 것으로 판단하고 상품을 전송하게됩니다. (상품은 디지털 상품으로 가정하에 전송하는 순간 상품을 받았다고 가정합니다.)
이제 공격자는 판매자에게 보낸 것과 동일한 100 BTC를 공격자 자신에게 보내는 트랜잭션을 생성합니다. 이때 만약 공격자가 그냥 단순하게 트랜잭션을 시도한다면, 채굴자들이 채굴자들이 APPLY(S,TX)를 실행하여 해당 트랜잭션(TX)은 더이상 존재하지 않는 UTXO를 소비하는 행위인것을 알게되고, 해당 트랜잭션은 진행되지 않습니다.
그렇기 때문에, 공격자는 판매자에게 보낸 시점의 이전 블록인 269999 블록으로 되돌아가 공격자 자신에게 보내는 트랜잭션을 포함한 270000 블록을 생성하여, 블록체인 "분기점(fork)"을 생성합니다.
비트코인 네트워크는 가장 긴 블록체인을 참으로 인식하기 때문에 메인 블록체인에 이미 연결된 270005번 블록까지 조작해야합니다. 그렇기 때문에 공격자는 자신의 체인을 가장 길게 만들기 위해서 네트워크에 연결된 다른 노드들의 계산능력 조합보다 더 큰 계산 능력을 가져야합니다. (이를 51% attack이라 한다.)
오늘 이더리움 백서 번역본에서는 비트코인의 채굴 방식과, 공격 방식에 대한 설명 부분에 대해서 다뤘으며, 백서 후반부에서 이더리움에서는 어떠한 방식의 채굴 방식을 선택할 것이고 공격자의 공격을 어떻게 막을것인지에 대한 이야기가 진행됩니다.
지난 포스팅에서도 잠간 언급되었지만, 탈 중앙화된 암호화폐는 어느 한순간에 나온 개념이 아니며, 아주 오래전부터 연구되어왔던 내용들을 비트코인에서 처음으로 구현하게된것입니다. 그렇기 때문에 블록체인의 개념을 한단어로 정의하기 어렵고, 내용이 방대하여 학습에 어려움이 있는것 같습니다.
하지만 하나식 천천히 반복적으로 뜯어서 학습을 진행하게되면 이해하는데 어려움이 없을것이라고 생각합니다. 이더리움에 대한 명확한 이해를 하기 위해서는 필수적으로 비트코인에 대한 이해가 선행되어야한다고 생각합니다.