합의 알고리즘
이더리움은 블록체인 기술을 기반으로 한 플랫폼이기 때문에 중앙 서버에서 블록과 트랜잭션의 유효성을 판단해주지 않습니다. 때문에 전달된 정보가 문제가 없다는 것을 참여자들이 스스로 검증하고 그 유효성을 판단해야 합니다. 이뿐만 아니라 완전히 탈중앙화된 P2P 네트워크에서는 네트워크 지연, 중복 수신, 의도적인 변조 등의 이유로 정보 전달과정에 문제가 발생할 수 있습니다.
따라서 다음과 같은 문제들을 합의 수단, 즉 consensus mechanism을 통해서 해결해야 합니다. 첫째, 특정 노드가 임의로 블록체인을 조작하지 못 하도록 해야 합니다. 둘째, 블록과 트랜잭션 등의 유효성 여부를 검증할 수 있는 방법이 필요합니다.
셋째, 블록을 체인에 연결할 때, 동시에 두 개 이상의 유효한 블록체인이 존재한다면 이 중에 하나를 선택할 수 있는 규칙이 있어야 합니다. 작업증명(Proof of Work)은 복잡한 계산 문제의 해답을 가장 빨리 찾은 마이너의 블록을 블록체인에 연결하고 이러한 작업에 대해서 보상해주는 방식입니다.
이러한 방법에서는 블록헤더의 해시값을 계산하는데, 블록헤더에 있는 Nonce 값을 계속 변경하여 목표값보다 작거나 같은 값이 나올 때까지 계속 해시값을 반복적으로 계산합니다. 계산 문제를 빨리 풀기 위해서는 많은 양의 컴퓨터 연산 파워가 필요한데, 블록을 생성하기 위해서 어려운 계산 문제를 수행하게 함으로써 악의적으로 블록을 위변조하여 블록체인을 조작하는 것을 막을 수 있습니다.
체인 분기(체인 포크)
포크(Fork)는 블록체인 시스템 업그레이드라고 말할 수 있습니다. 즉, 소프트웨어의 버전 업그레이드라고 하면 이더리움에서는 포크라 한다고 생각하셔도 됩니다. 또 한편으로는 현재의 블록체인을 기반으로 새로운 블록체인을 만드는 데도 사용이 되기도 합니다. 포크의 종류는 하드 포크, 소프트 포크, 레귤러 포크가 있습니다.
소프트 포크는 이전 버전과 신규 버전의 블록체인이 호환되기 때문에 사용자는 반드시 업그레이드할 필요가 없지만, 마이너들은 업그레이드를 해야 합니다. 왜냐하면 마이너의 마이닝 컴퓨팅 파워의 50% 이상이 업그레이드해야 새로운 블록체인 구조로 변경되고 그 유효성을 유지할 수 있기 때문입니다.
하드 포크는 실제 소프트웨어의 데이터 구조 등이 변경되어 이전 버전과 호환되지 않기 때문에 모든 마이너와 사용자가 반드시 업그레이드 해야 하는 경우입니다. 이더리움도 2016년 7월에 DAO 토큰 도난 사건으로 발생한 이더 손실 문제를 해결하기 위해서 하드 포크를 진행했습니다.
이때 기존 블록체인을 계속 유지하려는 사람들이 있었는데, 이 사람들은 이전 이더리움을 이더리움 클래식(ETC)이라는 이름으로 운영하고 있습니다. 추가적으로 레귤러 포크는 동시에 두 개의 블록이 생성되었을 경우에 나타나는 일시적인 충돌이고, 긴 블록체인을 선택함으로써 해결합니다. 중요한 것은 참여자 모두가 합의한 하나의 체인을 유지해야 합리적이기 때문에 블록체인이 항상 단일 체인으로 존재해야 한다는 것입니다.
Ethash 합의 알고리즘
비트코인의 PoW 합의 알고리즘은 강력한 해시 연산이 필요합니다. 해시 결과가 미리 지정된 숫자보다 작은 Nonce 값을 찾는 게임에서 일등을 해야 블록을 연결하고 보상받기 때문입니다. 이러한 이유로 강력한 해시 연산을 위해 특화된 ASIC 칩들이 개발되었고 마이너들은 ASIC 기반의 마이닝 전용 하드웨어를 확보하여 해시 파워를 늘리고 있습니다.
이것은 해시 연산력을 중앙집중화시키는 문제를 야기하는데, 이더리움의 합의 엔진인 이대시(Ethash)는 이런 문제가 발생하지 않도록 개발되어 있습니다. Ethash는 이더리움의 메모리 기반의 PoW 합의 엔진이며, 메모리상의 일정량의 데이터를 읽은 후 이것을 Nonce와 함께 해시 계산을 반복하는 방식을 사용합니다.
이때 메모리 계산을 위해서는 DAG (Directed Acyclic Graph) 파일이 사용되며, 매 3만 블록마다 수 GB의 DAG 파일이 새로 만들어집니다. 이렇게 메모리를 사용하는 방식을 채택한 이유는 이더리움이 ASIC 칩을 이용한 마이닝을 지양하기 때문입니다. 일반적으로 메모리를 읽고 복제하는 속도가 해시 계산보다 느리기 때문에 해시 계산력을 높이는 것은 해당 PoW에서 큰 의미가 없습니다. 그리고 Ethash는 10~15초마다 새로운 블록을 생성하도록 설계되어 있습니다.
DAG 파일
DAG 파일은 시드 해시(seed hash)로 생성된 약 2GB 정도의 캐시 데이터 집합을 말합니다. 이 파일을 만들기 위해서, 블록의 번호를 스캔하여 시드 해시값을 추출합니다. 참고로, 첫 번째 이포치에서 시드 해시는 0으로 이루어진 32바이트의 hash 값입니다. 이어지는 이포치에는 이전 시드 해시의 hash 값이 다시 새로운 시드 해시로 사용됩니다.
그 다음 해당 시드를 통해서 16MB의 pseudo random cache를 계산합니다. 다음 해당 cache를 통해 1GB 이상의 Full Dataset 을 생성할 수 있습니다. 이 해당 Full Dataset 이 DAG 파일을 의미하며, 해당 Full Dataset 의 랜덤한 부분을 마이닝의 해싱 부분에 포함시키는 것이 Ethash의 핵심입니다.
Ethash에서는 이 DAG을 통해서 미리 알 수 없는 메모리 읽기 연산을 요구하고, Dataset 저장 공간 등의 제약을 주어 ASIC 제작을 어렵게 만듭니다. 현재 30,000블록 주기로 이 DAG 파일 전체를 재생성하게 되어있고, 그 크기는 선형적으로 증가하고 있습니다. 2020년 8월 7일 기준으로 DAG는 약 3.7GB 정도 크기를 갖습니다. 추가적으로 이더리움에서 30,000블록 단위를 이포치(Epoch)라고 부릅니다.
이대시(Ethash)의 목적은 정확한 nonce와 mixDigest를 찾는 것입니다. 그림은 이더리움 마이닝을 도식화한 것이며 Ethash가 DAG 파일을 이용해서 어떻게 마이닝을 수행하는지 전체적인 처리 과정을 보여줍니다. 참고로 오른쪽에 보이는 것은 Ethash 알고리즘의 계산식이며, nonce와 mixDigest를 제외한 새로운 블록 헤더, 헤더의 nonce, 현재 DAG 파일을 입력했을 때 목표값보다 작은 mixDigest를 찾으면 nonce와 함께 반환해 줍니다.
이제 Ethash Hashing 알고리즘을 살펴보겠습니다. (1) 우선, 입력 받은 새로운 블록 헤더와 임의로 추정한 Nonce를 SHA3(Keccak256) 해시를 통하여 첫 번째 믹스 해시를 구성합니다. (2) 첫 번째 믹스 해시를 사용하여 DAG로부터 임의의 페이지 두 개를 추출합니다. (3) 이더리움의 믹싱 함수를 사용하여 추출된 DAG의 페이지들과 첫 번째 믹스해시로부터 다음 번 믹스 해시를 생성시킵니다.
(4) 앞의 (2)~(3)의 과정을 64번 반복하여 마지막 64번째 믹스 해시를 생성합니다. (5) 이 64번째 믹스 해시에 후처리함수를 적용해 32바이트 MixDigest를 만듭니다. (6)이 생성된 MixDigest와 미리 정의된 32바이트 마이닝 목표값 (Target Threshold)를 비교하여, 마이닝의 성공 여부를 판단합니다.
만약 MixDigest가 목표보다 작거나 같다면 현재 nonce는 성공한 것으로 간주하고, nonce와 MixDigest를 블록에 포함시킨 후 네트워크의 다른 노드들에게 브로드캐스팅합니다. 하지만 목표보다 크다면 해당 nonce를 변경하여 설명한 과정을 (1)부터 다시 시작합니다.
난이도와 타겟
이렇게 마이너는 MixDigest가 목표값보다 작을 때까지 nonce를 계속 증가시켜서 부합하는 값을 찾습니다. 마이닝 작업에서 목표값(Target)이 비교를 위해서 사용되는데, 목표값은 난이도(Difficulty)를 이용해서 계산됩니다. 이 난이도는 고정값이 아니라 계속 조정이 이루어지며, 타임 스탬프값을 기준으로 계산됩니다. 타임 스탬프는 모든 블록의 헤더에 포함되어있고 블록의 유효성 검사를 위해 사용됩니다.
만약 실제 타임 스탬프 대신 조작된 다른 타임 스탬프를 사용하면 유효성 검사를 통과할 수 없기 때문에 블록을 생성할 수 없게 됩니다. 추가적으로, 목표값은 다음과 같은 수식으로 계산됩니다. (Target = 2^256 / Difficulty). 이 난이도가 낮으면 목표값이 커지게 되고, 그러면 목표값 기준을 만족하는 nonce를 찾기 쉬워지기 때문에 블록 생성 타임이 짧아집니다.
이더리움에서 ASIC에 저항하는 Ethash라는 새로운 PoW 합의 방식을 도입하긴 했지만, 여전히 합의 과정에서 불필요한 해싱 연산을 통한 에너지 소비가 존재하기 때문에 장기적으로 PoW를 유지하기는 어렵습니다.
Proof of Stake(POS)
그래서 이더리움은 PoW의 문제점들을 극복하기 위해서 다른 합의 알고리즘인 Proof of Stake (PoS)를 도입할 준비를 하고 있습니다. PoW의 문제점은 첫째로 컴퓨팅 파워를 의미 없는 해시값을 찾아내는 데 사용해야 해서 무의미한 에너지 소비를 증가시키는 자원 낭비 문제가 있습니다.
둘째로 빨라지는 블록생성 주기를 PoW의 Difficulty로 유지하는 데 한계가 있기 때문에, 컴퓨팅 파워가 큰 마이너의 영향력이 커진다는 문제가 있습니다. 따라서 이를 해결하기 위해서 PoS를 도입하려 합니다. 그러면 PoS (Proof of Stake)는 무엇일까요?
이 방식에서는 마이너(Miner)는 없고 검증자(Validator)가 존재합니다. 검증자(Validator)가 자신이 가진 지분(Stake)에 비례한 확률로 블록을 생성할 권한을 갖게 되고, 블록을 생성한 후에는 자신이 원하는 체인에 블록을 연결하고 그에 대한 보상을 받는 방식을 의미합니다.
PoS의 장점으로 더 이상 블록 생성을 위해서 마이닝이 필요 없기 때문에 에너지 비용이 절감한다는 점, PoS에서 지분에 비례하여 블록 생성의 권한을 얻기 때문에 중앙화 위험이 감소한다는 점이 있습니다. 또한, Finality를 부여해 이미 체인에 연결된 블록들이 변경되기 힘들게 만듭니다.
마지막으로 공격자의 악의적인 행동이 발각되면 모든 자산을 0으로 만드는 페널티를 부여해 공격이 일어나지 못 하도록 합니다. 이러한 장점들은 PoW의 단점을 보완합니다.
이더리움에서 PoS의 기본 컨셉에 대해서 설명하겠습니다. 첫째, 이더를 스마트 컨트랙트에 예치하면, 해당 어카운트는 Validator가 될 수 있으며 해당 예치금은 한동안 사용할 수 없게 묶입니다. 둘째, Validator가 되면 새로운 블록을 메인체인에 추가할지 여부를 투표할 수 있습니다.
이때, 항상 가능한 것은 아니고 지분의 비율을 고려해서 랜덤하게 권한이 부여됩니다. 셋째, Validator가 컨센서스 규칙을 따르지 않으면 불이익을 당하게 되는데, 예를 들어 잘못된 블록에 투표하거나 투표를 아예 안 할 때 불이익이 발생합니다.
이더리움에서는 장기적으로 합의 엔진을 PoW에서 PoS로 변경하려는 계획을 가지고 있습니다. 현재 고려하는 것은 checkpoint를 도입하여, 기존에 없었던 finality를 부여하는 것이 있습니다. 이는 100번째 블록마다 PoS를 이용한 투표를 해서 블록체인을 Finalize 합니다.
한번 Finalize 되면 되돌릴 수 없어 51% 공격, 이중지불 등을 방지할 수 있습니다. 추가적으로 Finalize를 위해서는 2/3 이상의 투표를 받아야 합니다. 이번 모듈에서는 합의 메커니즘이 필요한 이유와 이더리움에서 적용하고 있는 합의 알고리즘에 대해 알아보았습니다.
이더리움의 PoW 합의 엔진인 Ethash에 대해 공부해보았고, 마이닝 과정에 대해 살펴보았습니다. 그리고 PoW의 문제를 극복하기 위해 이더리움에서 전환을 시도하고 있는 PoS (Proof of Stake)에 대해서도 알아보았습니다.
참조
http://www.kmooc.kr/courses/course-v1:POSTECHk+CSED490U1+2021_T1/about
'SW > 블록체인' 카테고리의 다른 글
블록체인 : 이더리움의 P2P 네트워크, 데이터베이스, 인코딩 방법 및 노드 디스커버리 과정 (0) | 2022.02.05 |
---|---|
블록체인 : 이더리움에서 지원하는 스마트 컨트랙트 : 스마트 컨트랙트를 실행하기 위한 실행엔진 (EVM), 실행 프로세스 (0) | 2022.02.04 |
블록체인 : 이더리움 네트워크에서 사용되는 암호화폐인 이더와 토큰인 Gas : 이더리움의 전반적인 트랜잭션 처리 과정 (0) | 2022.02.02 |
블록체인 : 이더리움의 데이터 계층의 블록의 구조 : 비트코인의 머클트리를 개선한 머클 패트리샤 트리 (0) | 2022.02.01 |
블록체인 : 이더리움의 데이터 계층 : 어카운트, 트랜잭션, 트랜잭션 리시트의 구성 요소 (0) | 2022.01.31 |