일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- mac hadoop 설치
- mac hadoop
- mac hadoop 설정
- Could not open client transport with JDBC Uri: jdbc:hive2://localhost:10000
- 백준 18428
- mac hive 3
- 이더리움 #ethereum
- 도커 교과서
- hive beeline 에러
- Safe mode is ON
- is not allowed to impersonate hive (state=08S01
- mac hive
- 자소서 빨리
- 자소서 너무 오래 걸림
- hive beeline 실행
- 자소서 빨리 쓰는 법
- 카카오 2020 코테
- hive beeline 설정
- Resources are low on NN
- 자소서 시간 줄이기
- 이더리움
- hadoop safe mode leave
- mac hadoop 3
- code=0)
- 기업 조사 빨리 하는 법
- hadoop safe mode
- 카카오 자물쇠와 열쇠
- Failed to connect to localhost:10000
- 카카오 2020 코딩테스트
- hive beeline
- Today
- Total
A seeker after truth
이더리움과 솔리디티 입문(6) - 이더 채굴 본문
*본문은 경희대 블록체인 학회원으로서 상반기 동안 블록체인 기초 교육을 이수한 뒤 2019년 7월 경 <이더리움과 솔리디티 입문>(위키북스,2018) 을 읽으며 문서에 메모한 내용을 옮겨온 것입니다.
*소웨 = 소프트웨어, 하웨 = 하드웨어, 플밍 = 프로그래밍, 데베 = 데이터베이스, 컴터 = 컴퓨터, 컴과 = 컴퓨터 과학, 알고 = 알고리즘, 컴네 = 컴퓨터 네트워크 의 줄임말입니다.
- 채굴 = 일정 기간 동안 이더리움 네트워크가 합의에 이르고 이더가 생성되는 과정. EVM은 채굴을 통해 유효한 상태 전환을 만들 수 있다. 비트도 채굴을 통해 합의에 도달하지만 이더는 스마트 계약으로 인해 그 방식이 조금 다르다.
-
탈중앙화 네트워크의 개발자는 뼛속부터 암호주의자이며 그들의 목표는 단 한 가지이다. 접근 가능하고, 만들기보다 파괴하기가 더 어려워서 믿을 수 없을 만한, 전 세계적인 컴터를 만들어 내는 일이다.
채굴 보상은 EVM의 상태 전이 기능에 플밍된 계정 잔액 증가를 통해 이뤄진다. 이 보상은 블록을 찾아내는 임의의 채굴자에게 지급된다.
- 채굴자 = 이더리움 노드를 자택이나 사무실에서 운영하며 전세계의 네트워크 트랜잭션 순서를 검증하고 그 대가로 이더를 취하는 암호화폐 지지자의 광대한 네트워크. 채굴 과정은 각 개별 노드가 수행하지만, 채굴이라는 용어 자체는 네트워크의 집단적 노력을 의미함. 여기서 블록 = 트랜잭션 집합. 채굴자는 이것을 처리한다.
채굴은 pow 알고리즘 쓰긴 하나, 비트에서 드러났던 채굴의 중앙 집약 문제를 해결하기 위해 개발자들이 이더리움 프로토콜 작업 증명 알고리즘은 따로 만들었다.
- 해시파워 = 채굴자가 네트워크에 기여하는 계산량
블록체인은 트리 구조를 형성한다. 여기서 노드가 뿌리부터 가지까지의 경로가 진정한 블록체인인지에 대해 동의하지 않으면 상태 포크가 발생하며 EVM이 두 가지로 분할되는 재앙이 발생한다.
- 채굴이 돈이 되는 이유: 일단 네트워크 보안을 유지하는 대가로 수익을 얻음. 그리고 시간에 따른 우위가 있다 초기에는 수수료 경쟁률이 낮기 때문에 더 많은 수익을 올릴 수 있다. 더 나아가, 유용한 암호화폐 네트워크에 속한 토큰은 보통 시간에 따라 가격이 상승하기 때문에 채굴을 통해 미리 토큰을 확보해 놓으면 채굴자가 이익을 실현할 기회가 늘어난다.
1) 난이도, 자율 규제, 채산성 경쟁
네트워크에 참여하는 사람이 늘어감에 따라 더 많은 채굴 해시파워가 이익을 위해 합류하고, 블록을 찾아내는 시간이 심히 단축될 수 있다. 이 문제의 해결책으로써, 15초 정도의 이상적인 블록 시간을 유지하기 위해 동적으로 조절되는 난이도라는 값이 증가하게 된다. 블록을 찾아내는 시간이 너무 빠르거나 너무 느리면 시스템은 난이도를 조정해 블록 시간을 이상적인 값으로 조절한다.
일반적으로, 시간이 갈수록 네트워크 난이도는 높아진다.
난이도라는 변수는 인센티브 구조의 일부이기도 하다. 채굴자가 최대한 빨리 네트워크에 참여하고자 하는 동기를 부여하기 때문이다. 그런데 EVM에서는 난이도가 또 다른 용도를 가진다. 바로 블록의 점수 또는 중량(heaviness)을 결정하는 용도이다. 트랜잭션 데이터 구조 중에서 가장 중량이 큰, 즉 점수가 가장 높은 경로가 가장 긴 경로가 되고, 대부분의 채굴자가 수렴되는 경로라고 할 수 있다. 이더랑 비트에선 가장 길거나 가장 중량이 큰 체인을 공식 체인으로 간주할 수 있다. 시스템은 블록을 발견할 때마다 가장 높은 점수를 가진, 가장 중량이 큰 블록을 선택하고 그것을 찾아낸 채굴자에게 보상을 지급한다. 가장 많은 작업 증명이 차지하는 블록만이 가장 높은 점수를 가질 수 있다.
(1) 블록 검증을 위한 요소
각 채굴자가 생성, 검증하는 모든 후보 블록에는 아래 네 가지 데이터가 포함된다.
- 블록에 대한 트랜잭션 원장의 해시(해당 채굴기가 수신한 트랜잭션에만 해당)
- 전체 블록체인 루트 해시
- 체인이 시작된 이후의 블록 번호
- 해당 블록의 난이도
이 데이터가 모두 확인되고 나면, 해당 블록은 승자 블록 후보가 된다. 그러나 데이터가 정확해도 채굴자는 여전히 PoW 알고를 해결해야 한다. 본질적으로 이더 작업 증명 알고는 15초 이상의 블록 시간이 소요되도록 설계된 추측 게임이다.
올바른 추측을 하고 나면 올바른 추측값, 즉 논스라는 최종 조건을 통해 블록이 승자 블록으로 인정된다. 정확한 데이터를 담은 정당한 블록임에도 승자 블록으로 인정받지 못한 블록은 엉클 블록(uncle)이 된다.
2) 작업 증명과 블록 시간 규율
PoW 알고를 최적화할 수 있는 사람은 유효 블록을 더 빨리 찾을 수 있고, 다른 채굴자들이 만든 엉클 블록을 승자 블록에서 한참 뒤처지게 만들면서 앞서 나갈 수 있다. 비트 네트워크에서는 채굴기라는 것 때문에 채굴이 중앙화되며 소수에게 독점됐다. 그와중에 느린 기계는 블록을 해결할 수 있는 기회를 얻지 못하고, 결국 엉클 블록조차 승자 블록의 뒤를 따라가기 힘들게 된다. 반면 이더에서는 엉클 블록이 승자 블록을 보강해야 한다. 엉클 블록이 승자 블록에서 많이 분리될수록 네트워크는 진짜 블록을 찾기 힘들게 되기 때문에 엉클 블록의 유효성 역시 중요한 요소다.
Ethash 알고는 채굴 하웨의 최적화를 막기 위한 이더 프로토콜의 방어책이다. 이는 비트 채굴기서 널리 쓰이는 주문형 특수 집적 회로(ASIC)를 사용하더라도 강제로 수행할 수 없는 메모리 하드 알고이다. 이 메모리 하드 알고의 핵심은 직접 비순환 그래프(directed acyclic graph, DAG) 파일에의 의존성이다. 이는 트리 구조의 일종으로, 각 노드가 루트를 포함해 10단계에 걸쳐 최대 225개의 상위 트리 개체를 가질 수 있는 구조를 일컫는 전문 용어이다. DAG 파일은 PoW의 풀이 시간을 표준화하는 방법이라고도 말할 수 있다. 이 파일은 채굴 경쟁을 표준화하며, 나아가서 대용량의 컴퓨팅 성능으로도 경쟁자보다 훨씬 정확한 논스를 추측할 수 없도록 해 15초의 블록 시간이 유지되도록 한다.
이더와 비트에서는 각 노드가 마지막으로 알려진 승자 블록의 해시를 보고 시드를 얻는다.
잘못된 블록에 대한 작업 증명을 수행하면 승자 블록을 얻을 수 없다. 덕분에, 누군가가 PoW 방식의 허점을 노려 대규모 채굴 풀을 통해 이더를 빼돌리는 가짜 블록을 계속 쌓기가 매우 어렵다. 노드가 실제로 PoW 추측 게임을 수행하는 과정은 아래와 같다.
- 채굴 노드는 블록 헤더에서 파생된 암호화된 시드로부터 16MB의 의사 난수 캐시를 생성한다.
- 캐시는 노드 사이에 일관성이 유지되는 대규모 1GB 데이터셋을 생성하는 데 사용된다. 이게 DAG. 이 데이터셋의 크기는 시간이 지남에 따라 선형적으로 증가하며 모든 전체 노드에 저장된다.
- 논스를 추측하려면 컴터가 DAG 데이터셋의 임의의 조각을 잡고 함께 해시해야 한다. 이것은 해시 함수에 솔트를 사용하는 방식과 유사하다.
*암호학에서 단방향 해시 함수에 첨가하는 임의의 데이터를 솔트라고 한다. 솔트는 논스와 마찬가지로 무작위성을 늘리는, 즉 보안을 강화하는 역할을 한다.
3) 빠른 블록 시간을 위한 접근
이더리움 구성 요소 중 비트 패러다임을 수정한 부분은 모두 빠른 블록 시간 실현을 위한 수정이었다. 비트와 이더의 블록 시간은 트랜잭션을 수집하기 위한 이상적인 기간이라고 한다. 이 시스템이 인체가 항상성을 유지하려 하는 것처럼 블록을 가능한 한 이상에 가깝게 유지하기 때문.
비트코인 프로토콜은 10분의 블록 시간을 목표로 하며, 이더는 15초를 목표로 한다. 진짜 블록이 발견되면 다른 노드가 그 블록을 발견하기 전까지 약간의 시간이 걸리게 된다. 이 시간 동안 고아 블록을 버리고 새로운 블록 위에서 채굴하기 전까진 새로운 블록에 대한 합의가 아닌 경쟁이 일어나며, 그 결과 고아 블록에 소비된 에너지는 낭비된다.
이더리움은 블록 시간을 단축한 덕택에 더 빠른 트랜잭션 확인이 가능해졌지만, 이번 장의 뒷부분에서 볼 수 있듯 빠른 블록 시간으로 인한 보안성 감소를 해결하기 위해 프로토콜 상에 대안을 마련해야 했다. 스마트 계약이 없는 비트코인에서는 이론적으로 전체 63% 정도만이 블록 시간 내에 트랜잭션이 처리된다. 전체 약 13% 정도는 트랜잭션 확인이 이뤄지기까지 20분 이상 소요된다. 이 시간 동안 취소될 수도 있는 트랜잭션은 최대 20%에 달한다.
이더는 블록 시간을 단축하기 위해 약간 다른 방식으로 채굴에 접근한다.
빠른 블록 시간이 꼭 좋지만은 않다. 이를테면, 노드가 전 세계에 위치하고 있기 때문에 완벽하게 동기화되기 어렵다. 이 시간을 대기시간(latency)이라 한다. 이더/비트 네트워크로 트랜잭션이 전파되는 데는 평균적으로 약 12초가 걸린다. 이 시간의 상당 부분은 노드가 트랜잭션을 다운로드하는 데 소비된다. 노드는 새로운 블록 발견 소식을 듣기 전에 이전 블록 위에서 채굴을 계속하고, 새 승자 블록이 나타나면 채굴하던 블록을 버리게 된다. 유효한 블록에 니트워크의 다른 위치에서 발견된 후에도 계속 채굴되는 엉클 블록을 실효 블록(stale blk) 또는 폐지 블록(extinct blk)이라 함. 비트코인에서는 이를 고아블록이라고 한다. 실효 블록에는 더 이상 새로운 블록(자식)이 추가되지 않지만, 그 블록 헤더 자체는 유효할 수 있다.
블록 시간이 빨라지면 실효 블록이 발생할 확률이 높아지고, 실효 블록이 많을수록 네트워크는 공격에 취약해진다. 더 큰 문제는, 이 블록의 비율이 높을수록 채굴 풀이 단독 채굴자보다 효율성 측면에서 큰 이점을 갖게 되고 채굴 보상을 독점할 가능성이 커진단 점이다. 시스템이 불공평해진다는 점을 차치하고서라도, 네트워크 공격에 필요한 비용이 줄어든다는 큰 문제가 생기게 된다.
4) 이더리움 실효 블록 활용
고스트 프로토콜은 가장 많은 작업 증명의 지지를 받는 블록을 계산하는 데에 엉클 블록을 포함함으로써 보안 문제를 해결한다. 엉클 블록 보상은 또한 채굴의 중앙화를 막기 위한 수단으로, 승자 블록을 찾아내지 못하더라도 네트워크 보안에 기여하는 채굴자에게 대가를 지불하는 수단이다.
하지만 이 고스트 프로토콜이 비판 대상인지라, PoS 알고리즘으로 옮겨가고 있는 중이다.
암호화폐 시장에서 가치를 갖는 논리 중 하나는, 발행량에 대한 제한이 있단 점이다. 비트코인의 경우 블록당(즉, 매 10분마다) 12.5비트코인이 주어진다. 이 비율이 2020녀 중반까지 유지되며, 그 이후는 2년 주기로 반씩 줄어 최종적으로 2140년까지 2100만 비트코인이 발행된다. PoS(지분 증명)의 경우 채굴과 그에 수반되는 에너지 소비 없이도 네트워크가 합의에 도달할 수 있다는 점이다. 이는 합의 알고리즘으로 전환하는 동시에 이더 발급 기간을 제한하기 위한 노력의 일환으로, 이더리움 개발진은 난이도 폭탄을 발동시켜 17년 하반기부터 작업 증명 채굴의 효율성을 낮추고 있으며 최종적으로 2021년에 이르면 이더리움에서의 채굴이 불가능하도록 준비 중이다.
승자 블록을 찾아낸 채굴자는 일정 납부금, 트랜잭션 수수료, 승리에 도움이 된 모든 엉클 블록의 현상금 일부를 받는다.
*프로그래밍에 등장하는 많은 데이터 구조들은 컴퓨터가 먼저 읽어야 하는 필수 정보가 포함된 헤더가 있다.
헤더에 모든 단일 트랜잭션을 넣으면 크고 다루기 힘들어지므로, 이를 피하기 위해 비트코인과 이더리움에서는 머클 트리라는 데이터 구조를 사용한다. 이더리움은 evm의 상태를 나타내는 데이터 구조인 상태 트리라는 것도 추가했다. 전역 상태는 패트리샤 트리라고 알려진 또 다른 트리 구조로 이더리움 블록에 표시된다.
<블록 유효성 검사 알고>
참조된 이전 블록이 존재하는지, 그리고 유효한지 확인 -> 현재 블록의 타임스탬프가 참조된 이전 블록으로부터 15분 이내 있는지 확인 -> 블록 번호, 난이도, 트랜잭션 루트, 엉클 루트 및 가스 한도가 유효한지 -> 블록의 논스가 유효한지 확인, 이를 통해 작업 증명의 유효성 검증 -> 유효성 검사가 완료된 블록의 모든 트랜잭션을 EVM 상태에 적용한다. 오류가 발생하거나 총 가스가 가스 한도를 초과하는 경우 오류를 반환하고 상태 변경을 롤백한다. -> 블록 보상을 최종 상태 변경에 추가한다 -> 머클 트리 루트의 최종 상태 루트와 동일한지 확인한다
이 과정을 거쳐야만 진짜 블록이 될 수 있다.
5) 트랜잭션과 블록 계통 평가
컴과에서 연관 배열 = 사전 = 키/값 쌍의 모음.
여기서 키와 값 사이의 연결을 변경할 수 있으며,이 연결을 바인딩이라고 한다.
쌍 추가/제거/수정/값 찾기 문제를 푸는 방법으로는 해시 테이블, 검색 트리, 기타 특수 트리 구조가 있다.
수학에서 트리는 키/값의 연관 배열을 저장하는 데 사용되는 데이터 구조다. 트리 종류 중 기수 트리(radix tree)는 압축되어 메모리가 덜 필요한 방식이다. 일반적인 기수 트리에서 키의 각 문자는 그에 해당하는 값을 얻기 위해 데이터 구조를 통과하는 경로를 담는다.
181~184
머클 트리는 트랜잭션 원장을 저장하기 위한 이상적인 구조지만, 그게 전부다. EVM의 관점에서 머클 트리의 한 가지 한계는 루트 해시에 트랜잭션이 포함되는지 여부를 증명하거나 반증할 순 있지만 주어진 사용자 계정의 잔고와 같은 네트워크의 현재 상태를 확인하거나 증명할 수가 없다는 점이다. 이 단점을 수정하고 evm이 상태 저장 계약을 실행할 수 있게 하기 위해 이더리움의 모든 블록 헤더에는 머클(트랜잭션) 트리 하나가 아닌 세 가지 개체의 세 가지 트리가 포함된다
: 트랜잭션 트리, 영수증 트리(각 거래의 결과를 보여주는 데이터), 상태 트리
6) 포크
가장 길고 무거운 사슬에 동의하지 않으면 채굴자의 네트워크가 둘로 나뉠 수 있다. 암호화폐 커뮤니티에서 이 포크는 심각한 문제로, 사람 커뮤니티의 균열이 기계 네트워크의 합의 붕괴로 이어진다는 시사점을 가진다.
포크는 두 개의 유효한 블록이 같은 상위를 가리키고 있지만 채굴자 집단이 유효한 두 블록으로 나뉘어 각자 채굴을 진행할 때 발생한다. 그 결과 두 가지 버전의 진실이 만들어지고, 두 채굴자 집단은 더 이상 같은 네트워크에 있다고 말할 수 없는 상태가 된다.
프로토콜 포크에서는 데이터 변경이 없고, 단자 채굴자가 노드에서 매개 변수를 조정하거나 코드를 수정해 커뮤니티가 동의한 사양으로 채굴을 진행할 수 있다. 프로토콜 포크는 자발적이라 할 수 있지만 상태 포크는 반드시 그런 것이 아니며, 이는 프로토콜 포크보다 훨씬 더 큰 사건이다.
'Blockchain' 카테고리의 다른 글
투표 dapp 강의(작성중) (0) | 2020.02.12 |
---|---|
이더리움과 솔리디티(7) - 암호경제학 (0) | 2019.10.11 |
이더리움과 솔리디티 입문(5) - 스마트 계약과 토큰 (0) | 2019.10.11 |
이더리움과 솔리디티 입문(4) - 솔리디티 (0) | 2019.10.11 |
이더리움과 솔리디티 입문(3) - EVM (0) | 2019.10.10 |