이더리움 블록채굴과 합의프로토콜
제12강 이더리움 블록채굴과 합의프로토콜1
이더리움의 블록 채굴과 합의
- 목적
- 누구나 블록 생성자(채굴자)로 참여 가능
- 채굴자들의 합의로 거래들이 블록체인에 저장되는 순서를 정의하고, 동기화된 블록체인 유지를 보장
-
기본 정책
- 작업 증명(proof of work) 기반의 블록 생성
- 채굴자에게 블록 인센티브(block incentives) 지불
-
설계 목표
-
거래 승인 성능 향상
→ 10초 단위의 블록 생성
-
작업 증명 자원 낭비 축소(블록 생성간격 대비 전달시간 비중 상승에 따른)
→ 수정 GHOST 프로토콜
-
채굴 역량 집중화 방지(ASIC화에 따른)
→ 메모리 하드(memory-hard) 형 Ethash 작업 증명 알고리즘
-
블록 생성 간격
- 블록 생성 간격과 난이도 조절
- 블록 생성 간격이 10~19초 이내가 되도록 조정
- 부모 블록과의 시간 간격이 9초 이하이면 난이도 상향
- 20초 이상이면 난이도 하향 조정
- 짧은 블록 생성 간격의 문제점
- 블록 전달지연시간 비중이 커짐
- 블록 전달시간 동안 생성되는 부실 블록 발생률 상승
- 부실 블록(stale block)
- 적합하게 생성된 블록이지만 다른 채굴자에 의해 생성된 블록과의 승인 경쟁에서 패배하여 메인 체인에 포함되지 못하고 브랜치에 연결된 블록
- 부실 블록의 문제점
- 채굴 역량이 높은 채굴자가 다음 블록 채굴 조기 개시확률이 높음
- 채굴 역량 집중화 심화 초래 → 네트워크 안전성 훼손
수정 GHOST 프로토콜
-
이더리움의 수정 GHOST 프로토콜
- 최장 체인 대신 GHOST 프로토콜을 기본적으로 채택
- 구현의 복잡성을 고려하여 단순화된 GHOST 프로토콜 적용
-
삼촌 블록(uncle block) : 수정 GHOST 프로토콜에서 포함하는 부실 블록
- 새롭게 생성되는 블록은 부모 블록을 지정하여야 하고, 0~2개까지의 삼촌 블록을 포함할 수 있다.
- 새로운 블록에 포함되는 삼촌 블록은 2대의 부모 블록부터 시작하여 7대까지의 조상 블록에 직접 연결된 자식 블록이어야 한다.
- 삼촌 블록은 새로운 블록의 조상 블록이 아니어야 한다.
- 삼촌 블록은 적합한 블록 헤더를 가져야 한다.
- 삼촌 블록은 이전 블록에 포함된 블록이 아니어야 하고, 같은 블록에 포함된 다른 블록과 동일하지 않아야 한다.(이중 포함 금지)
- 삼촌 블록의 채굴자와 삼촌 블록을 포함시키는 블록(조카 블록)의 채굴자는 그에 따른 소정의 블록 인센티브를 지불 받는다.
블록 선택 : GHOST 프로토콜
- GHOST(Greedy Heaviest Observed Subtree) 프로토콜
- 비트코인 : 최장 길이 체인(longest chain)을 메인 체인으로 선택
- 이더리움 : 가장 무거운 서브 트리(heaviest subtree)의 최장 길이 체인을 메인 체인으로 선택
- GHOST 프로토콜 안전성
- 공격자가 B2 블록으로 교체하려면 B1 블록 이후에 현재 연결되어 있는 10개의 블록보다 많은 11개 이상의 블록을 생성해야 함
- 부실 블록이 블록체인 조작 방지에 기여 → 네트워크 안전성 제고
- 부실 브록과 거래의 적합성
- 메인 체인의 블록의 거래들만 승인된 거래로 인정
13강 이더리움 블록채굴과 합의프로토콜2
블록 인센티브
- 블록 인센티브
- 블록 보상(block reward)
- 거래 수수료(transaction fees) : 이더리움 거래 강의 참조
- 정규 블록 보상
- 5 ETH로 고정(2017년 10월 Metropolis-Byzantium 버전에서 3 ETH로 축소)
- 향후 Serenity 버전에서 지금의 작업 증명(proof of work)보다 훨씬 자원 소요가 적은 소유 증명(proof of stake)으로 합의 알고리즘이 변경될 경우 블록 보상 체계도 획기적으로 변경될 것으로 예상
Ethash 작업 증명 알고리즘
- 비트코인 해시캐쉬(Hashcash) 알고리즘
- 고정 크기의 블록 헤더에 대해 넌스를 변경하며 해시 함수 반복 적용
- ASIC화 용이 : 비교적 적은 투자로 해시파워 집중화 가능
- 이더리움의 Ethash 알고리즘
- 표준 메모리에 유지되어야 하는 크기의 DAG(Directed Acyclic Graph) 데이터셋 생성
- 넌스와 블록 헤더에 의해 반복적으로 결정되는 믹스(mix)에 의해 지정되는 DAG 페이지를 반복적으로 접근(64회)
- 최종 믹스의 해시값인 믹스 다이제스트(mix digest)를 난이도 목표 임계값과 비교
- 성공하는 경우 넌스와 믹스 다이제스트를 블록 헤더에 저장
-
DAG 데이터 생성
- 한 세대(generation)의 의미인 에퍽(epoch)이라 불리는 30,000개의 브록마다 한 번씩 반복
- DAG 데이터셋은 2015년 당시 ASIC 메모리에 저장하기에 충분히 어려운 크기로 초기화
- 매 에퍽마다 조금씩 증가하도록 알고리즘이 설정
- 매년 약 75% 정도 증가하여 ASIC 기술 발전에 따른 메모리 용량 증가 속도를 능가하도록 설계
- 현재 블록 수(block number)에 의존하는 유사 난수를 생성한 후 이에 근거하여 임의의 큰 데이터로 생성
- 128 바이트 데이터 페이지의 조합으로 구성
-
이더리움의 Ethash 알고리즘과 GPU
- Ethash 알고리즘은 메모리 I/O 대역폭을 충분히 활용하는 것이 성능에 큰 영향
- OS를 포함하여 많은 S/W가 메모리를 접근하는 CPU를 사용하는 것보다 메모리 대역폭 활용이 용이하고 충분한 크기의 메모리를 제공하는 GPU를 사용하여 구현하는 것이 성능 향상에 유리
- CPU에 비해 GPU가 DDoS 공격 등의 악성 S/W의 영향을 덜 받기 때문에 현재 대부분의 Ethash 기반의 이더리움 채굴 소프트웨어는 GPU 상에서 구현되어 사용
-
Ethash 해싱 알고리즘
-
블록 헤더와 너늣 초기값을 HSA3해시 함수와 유사한 keccak512 해시 함수에 적용하고 그 결과를 2배 확장하여 128바이트 믹스값(mix0)을 생성한다.
-
믹스값에 의존적인 인덱스 결정 함수를 사용하여 DAG 데이터셋 중에서 어떤 페이지를 접근할 것인지 결정하고 해당 DAG 페이지를 읽는다.
- 기존 믹스값과 읽은 DAG 페이지를 믹스 함수에 입력하여 새로운 믹스값을 생성한다.
- 2와 3을 63회 반복하여 최종 믹스값(mix64)을 생성한다.
- 최종 믹스값을 후처리 과저을 거친 다음 keccak256 해시 함수를 적용하여 32바이트 믹스 다이제스트(mix digest)를 생성한다.
- 믹스 다이제스트가 난이도 목표 임계치(target threshold) 보다 작거나 같으면 해당 넌스와 믹스 다이제스트가 작업 증명 결과가 된다. 그렇지 않으면 넌스를 증가시켜 2~6의 과정을 반복한다.
-
블록 난이도 조정
- 블록 생성 간격과 난이도 조절
- 블록 생성 간격이 10~19초 이내가 되도록 조정
- 부모 블록과의 시간 간격이 9초 이하이면 난이도 상향
- 20초 이상이면 난이도 햐향 조정
- 난이도 폭탄 로직
- 난이도를 점차 지수적으로 증가시켜 블록 채굴을 어렵게 함
- 현재의 작업 증명 기반의 블록 생성 합의 알고리즘을 새로운 소유 기반의 블록 생성 합의 알고리즘으로의 전환을 유도하기 위해 도입
- 2017년 10월 중순 적용이 개시된 Metropolis Byzantium 버전에서 블록 보상은 5 ETH에서 3 ETH로 조정