검수요청.png검수요청.png

"이더해시"의 두 판 사이의 차이

해시넷
이동: 둘러보기, 검색
잔글
 
(사용자 2명의 중간 판 14개는 보이지 않습니다)
1번째 줄: 1번째 줄:
'''이더해시'''(Ethash)는 러시아, 캐나다의 프로그래머이며 이더리움의 개발자인 [[비탈릭 부테린]](Vitalik Buterin)이 개발한 블록 체인 통화의 [[작업 증명]](POW; Proof Of Work) 기능이다.  
+
'''이더해시'''(Ethash)는 [[이더리움]](Ethereum)[[작업증명]](PoW) [[합의 알고리즘]]이다.
  
 
==개요==
 
==개요==
이더해시는 비트코인의 [[합의 알고리즘]]에 특화된 [[주문형 반도체]](ASIC; Application Specific Integrated Circuit) 장비로 인해 채굴자가 대형화된 연산력을 바탕으로 이뤄진 중앙화를 해결하기 위해 개발된 알고리즘이다.
+
이더리움은 현재 작업증명 [[블록체인]]으로, 동일한 기본 목표를 위한 동일한 기본 인센티브 시스템에서 동일한 작업증명 알고리즘을 사용하며, 탈중앙화된 제어 상황에서 블록체인을 지키는 역할을 한다. 이더리움의 작업증명 알고리즘은 [[비트코인]]과 약간 다른데, 이더해시라고 한다. 원본 블록체인 고안자인 비트코인은 작업증명이라는 합의 알고리즘을 개발했다. 아마도 작업증명은 비트코인을 뒷받침하는 가장 중요한 발명품일 것이다. 작업증명의 구어체 용어는 [[채굴]]로, 합의의 주요 목적에 대한 오해를 불러일으킨다. 실세계 채굴의 목적은 귀금속 또는 기타 자원의 추출이기 때문에, 사람들은 종종 채굴의 목적이 새로운 통화의 창출이라고 생각한다. 하지만 오히려 실제 채굴의 목적은 가능한 한 많은 참가자로부터 탈중앙화된 시스템에 대한 통제권을 유지하면서 블록체인을 보호하는 것이다.
[[대거]](Dagger) 알고리즘과 [[하시모토]](Hashimoto) 알고리즘을 결합해 만든 [[대거-하시모토]](Dagger-Hashimoto) 알고리즘을 사용한다. 이 알고리즘은 메모리를 활용하는 알고리즘이며, 연산장치의 물리적 한계를 사용함으로써 [[ASIC]]의 효율성을 낮춘다.
+
 
 +
새로 발행된 화폐의 보상은 시스템의 보안에 기여하는 사람들에게 주는 [[인센티브]]다. 즉, 목적을 위한 수단이다. 그런 의미에서 보상은 수단이며, 탈중앙화된 보안은 목적이다. 작업증명 합의에서 채굴에 참여하는 데 필요한 에너지 비용은 보상에 상응하는 처벌이다. 즉, 참가자가 규정을 지키지 않고 보상을 얻지 못한다면 이미 채굴을 위해 전기에 투자한 자금을 위험에 빠뜨릴 수 있다. 따라서 작업증명 합의는 참여자가 자기 이익 앞에서 정직하게 행동하도록 유도하는 위험과 보상의 면밀한 균형이다.<ref>박성훈, 류길성, 강동욱, ''Mastering Ethereum'', J-Pub, 2019, p.364</ref>
  
 
==특징==
 
==특징==
* [[2차원 배열 데이터]](DAG; Directed Acyclic Graph) 파일을 이용해 [[GPU]] 연산의 효율성은 높힌다. ASIC 무력화를 위해 메모리를 사용하며, 컴퓨터 메모리 일정량의 데이터를 읽은 후 [[nonce]][[hash]] 계산을 반복한다. <ref>니르바나,〈[https://ihpark92.tistory.com/51 이더리움의 합의 알고리즘 - 작업증명]〉, 《티스토리》, 2018</ref>
+
이더해시는 [[비탈릭 부테린]](Vitalik Buterin)의 [[대거]](Dagger) 알고리즘과 [[타데우스 드리자]](Thaddeus Dryja)의 [[하시모토 알고리즘]](Hashimoto algorithm)의 조합인 [[대거-하시모토]](Dagger-Hashimoto)의 진화된 알고리즘을 사용한다. 이더해시는 [[방향성 비순환 그래프]](directed acyclic graph, DAG)로 알려진 대규모 데이터 세트의 생성 및 분석에 의존한다. DAG의 초기 크기는 약 1GB이고, 천천히 선형으로 크기가 커지며, 매 순간 업데이트된다.
* 목적 자체가 ASIC의 효율성을 낮춰 제작에 어려움을 주는 것이기 때문에 그를 위해 3만 블록마다 수 GB의 [[DAG]]을 새로 생성해 해싱에 사용한다. 블록의 헤더들을 스캔해 [[seed]]값을 추출할 수 있으며 당 seed를 통해 16mb의 [[pseudo random cache]]를 계산할 있고 당 cashe를 통해 1gb 이상의 Full Dataset을 생성할 있다. 30000 블록 단위 별로 Full Dataset이 완전히 변형되며 선형으로 증가한다. 또 해당 Full Dataset의 랜덤값을 마이닝 해싱 작업에 포함 시키도록 하여 메모리의 읽기 연산과 Dataset 저장 공간에 제약을 줘 ASIC 제작에 어려움을 주며 [[마이닝]] 과정에서 페이지를 불러올 때 mix 과정을 통해 다음에 불러올 페이지를 예측할 없게 설계되어 있다. 캐시 용량 자체가 8kb~32kb의 작은 크기로 DAG를 저장하기가 현실적으로 불가하며 [[캐시 미스]]의 확률이 높기 때문에 일부를 캐시에 저장하는 것 또한 불가능하다.  
+
 
cache data를 이용해 64bytes의 데이터를 생성하고 이를 계산 결과에 맞는 Data size크기만큼 생성하도록 반복해 DAG 파일을 생성한다.
+
DAG의 목적은 자주 접근하는 대규모 [[데이터]] 구조를 유지하는 데 필요한 이더해시 작업증명 알고리즘을 만드는 것이다. 이는 이더해시가 [[에이식]](ASIC) 저항성을 갖게 만들려는 것으로, [[GPU]] 채굴 장비를 만들기가 더 어려워진다는 의미다. 이더리움의 창립자는 특수 실리콘 제조 공장 및 대규모 예산에 접근할 있는 사람들이 채굴 인프라를 지배하고 합의 알고리즘의 보안을 훼손할 있는 작업증명 채굴의 중앙 집중화를 피하고자 했다.
* Memory Hard Computation이다.
+
 
* Memory Easy Validation이다.
+
이더리움 네트워크에서 작업증명을 수행하기 위해 소비자 수준의 GPU를 사용하면 전 세계의 더 많은 사람이 채굴 공정에 참여할 수 있다. 채굴자들이 더 독립적일수록 채굴 파워는 더 탈중앙화되어 있다. 이는 비트코인 같은 상황을 피할 수 있음을 의미한다. 비트코인에서는 채굴 파워 대부분이 몇 군데 대규모 산업 채굴 작업의 손에 집중되어 있다. 채굴을 위한 GPU 사용의 단점은 2017년에 전 세계적으로 GPU 부족 현상을 일으켜 가격이 급등하고 게이머들의 항의를 불러일으켰다는 것이다. 이로 인해 소매 업체의 구매 제한이 발생하여 구매자가 고객당 1~2개의 GPU만 구매하도록 제한을 했다.
* [[KECCAK]]([[SHA-3]])을 사용한다.<ref>dongsamb,〈[https://steemit.com/kr/@dongsamb/ethereum-pow-ethash Ethereun PoW 알고리즘 비교 및 원리]〉, 《steemit》, 2018</ref>
 
  
'''비트코인과의 비교'''
+
최근까지 이더리움 네트워크에서 에이식 채굴자의 위협은 거의 존재하지 않는다. 이더리움을 위해 에이식을 사용하려면 고도로 맞춤화된 [[하드웨어]]의 설계, 제조 및 배포가 필요하다. 그것들을 생산하려면 시간과 돈에 상당한 투자가 필요하다. 이더리움 개발자가 지분증명 합의 알고리즘으로 이동하려는 오랜 계획은 에이식 공급 업체가 이더리움 네트워크를 오랫동안 타깃팅 하지 못하게 했을 가능성이 크다. 이더리움이 [[지분증명]](PoS)으로 이동하자마자 작업증명 알고리즘용으로 설계된 에이식은 [[채굴자]]가 다른 [[암호화폐]]를 채굴하는 데 사용할 수 없으면 쓸모 없어진다. 후자의 가능성은 [[펄]](PIRL) 및 [[유빅]](Ubiq) 같은 다양한 이더해시 기반 합의 코인을 통해 현실이 되었으며, 이더리움 클래식은 가까운 미래에 작업증명 블록체인으로 남을 것을 약속했다. 이것은 에이식 채굴이 작업증명 합의에 따라 운영되는 동안 이더리움 네트워크에 영향을 기치는 것을 의미한다.<ref>박성훈, 류길성, 강동욱, ''Mastering Ethereum'', ''J-Pub'', 2019, p366</ref>
  
[[비트코인]]은 [[SHA256]] 연산만을 필요로 하지만 이더해시는 [[DAG]]를 사용해 예상 불가능한 순차적 메모리 연산을 필요로 해 [[ASIC]]의 제작이 어렵다. 비트코인과 같은 [[Pow]] 구조를 갖고 있으나 다른 매커니즘을 갖는다.
+
==과정==
 +
다음은 이더해시의 채굴 과정이다.
  
==채굴 과정==
+
# 32개 길이의 배열의 [[에포크]](Epoch)수만큼 해싱한다. 그 값을 [[시드]](Seed)값으로 삼는데, 이 시드값을 30,000[[블록]]마다 변경된다.
# 32개 길이의 배열의 [[Epoch]]수만큼 해싱한다. 그 값을 [[Seed]]값으로 삼는데, 이 Seed값을 30000블록마다 변경된다.
+
# 시드 값으로 무작위 추출(pseudo-random)캐시 데이터(cache data)를 생성한다. 생성 시 [[메모리]]를 사용하게 되는데 메모리를 타 용도로 사용한다면 캐시 데이터의 생성 속도가 매우 느려지므로 주의한다.
# Seed 값으로 [[pseudo-random]][[cache data]]를 생성한다. 생성 시 메모리를 사용하게 되는데 메모리를 타 용도로 사용한다면 cache data의 생성 속도가 매우 느려지므로 주의한다.
+
# 1GB 이상의 데이터 세트을 생성한다. 이때 풀 클라이언트(full client)채굴자는 데이터세트 DAG를 저장하며, 데이터 세트는 선형으로 커진다. DAG 파일은 캐시 데이터를 이용해 생성하는데 한 번에 64바이트의 데이터를 생성하고 이를 데이터 사이즈만큼 생성하도록 반복한다.
# 1GB 이상의 dataset을 생성한다. 이때 [[full client]][[miner]]는 dataset([[DAG]]를 저장하며 dataset은 [[linear]]하게 커진다. DAG 파일은 cache data를 이용해 생성하는데 한 번에 64bytes의 데이터를 생성하고 이를 data size만큼 생성하도록 반복한다.
+
# 채굴 과정에서 데이터 세트의 일부를 같이 해싱한다.
# [[mining]] 과정에서 dataset의 일부를 같이 해싱한다.
 
 
# [[Keccak156]]해시를 해 결과값이 조건에 맞으면 채굴에 성공한다.
 
# [[Keccak156]]해시를 해 결과값이 조건에 맞으면 채굴에 성공한다.
# Digest와 Nonce는 블록 헤더에 포함되는데 Digest 필드, Nonce 필드가 포함되지 않아 해시값에 변경이 없다.
+
# [[다이제스트]]와 [[논스]]는 [[블록헤더]]에 포함되는데 다이제스트 필드, 논스 필드가 포함되지 않아 [[해시값]]에 변경이 없다.
 +
 
 
===사용 함수===
 
===사용 함수===
'''[[Folwer-Noll-Vo]]'''
+
* '''Folwer-Noll-Vo'''
 +
 
 
  hash = FNV_offset_basis
 
  hash = FNV_offset_basis
 
   for each byte_of_data to be hashed
 
   for each byte_of_data to be hashed
31번째 줄: 33번째 줄:
 
   hash = hash XOR byte_of_data
 
   hash = hash XOR byte_of_data
 
   return hash
 
   return hash
 +
 
* 출력 비트에 따라 FNV_offset_basis 값을 정한다.
 
* 출력 비트에 따라 FNV_offset_basis 값을 정한다.
 
* 입력 바이트에 FNV 함수의 출력 비트에 따라 정해지는 FNV 소수를 곱한다.
 
* 입력 바이트에 FNV 함수의 출력 비트에 따라 정해지는 FNV 소수를 곱한다.
 
* 입력 바이트와 XOR 연산을 수행한다.
 
* 입력 바이트와 XOR 연산을 수행한다.
  
===mining 과정===
+
===채굴 과정===
 
   def mine(full_size, dataset, header, difficulty):  
 
   def mine(full_size, dataset, header, difficulty):  
 
   # zero-pad target to compare with hash on the same digit  
 
   # zero-pad target to compare with hash on the same digit  
43번째 줄: 46번째 줄:
 
   while hashimoto_full(full_size, dataset, header, nonce) > target:  
 
   while hashimoto_full(full_size, dataset, header, nonce) > target:  
 
     nonce = (nonce + 1) % 2**64  
 
     nonce = (nonce + 1) % 2**64  
     return nonce  <ref>야옹메롱,〈[https://blog.naver.com/mage7th/221493945127 크립토알고리즘 개념 및 종류]〉, 《네이버 블로그》, 2018-10-03</ref><ref>bero in TOMAK, 〈[https://medium.com/tomak/%EC%9D%B4%EB%8D%94%EB%A6%AC%EC%9B%80-ethash-%EC%97%B0%EA%B5%AC-16677ed7da50 이더리움 Ethash 연구]〉, 《Medium》, 2018-7-26</ref>
+
     return nonce  <ref>야옹메롱, 〈[https://blog.naver.com/mage7th/221493945127 크립토알고리즘 개념 및 종류]〉, 《네이버 블로그》, 2018-10-03</ref><ref>bero in TOMAK, 〈[https://medium.com/tomak/%EC%9D%B4%EB%8D%94%EB%A6%AC%EC%9B%80-ethash-%EC%97%B0%EA%B5%AC-16677ed7da50 이더리움 Ethash 연구]〉, 《미디엄》, 2018-7-26</ref>
  
 
{{각주}}
 
{{각주}}
  
 
== 참고자료 ==
 
== 참고자료 ==
야옹메롱,〈[https://blog.naver.com/mage7th/221493945127 크립토알고리즘 개념 및 종류]〉, 《네이버 블로그》, 2018-10-03
+
* 박성훈, 류길성, 강동욱, ''Mastering Ethereum'', J-Pub, 2019
 
+
* 야옹메롱, 〈[https://blog.naver.com/mage7th/221493945127 크립토알고리즘 개념 및 종류]〉, 《네이버 블로그》, 2018-10-03
니르바나,〈[https://ihpark92.tistory.com/51 이더리움의 합의 알고리즘 - 작업증명]〉, 《티스토리》, 2018
+
* 니르바나, 〈[https://ihpark92.tistory.com/51 이더리움의 합의 알고리즘 - 작업증명]〉, 《티스토리》, 2018
 
+
* dongsamb, 〈[https://steemit.com/kr/@dongsamb/ethereum-pow-ethash Ethereun PoW 알고리즘 비교 및 원리]〉, 《스팀잇》, 2018
dongsamb,〈[https://steemit.com/kr/@dongsamb/ethereum-pow-ethash Ethereun PoW 알고리즘 비교 및 원리]〉,《steemit》, 2018
+
* bero in TOMAK, 〈[https://medium.com/tomak/%EC%9D%B4%EB%8D%94%EB%A6%AC%EC%9B%80-ethash-%EC%97%B0%EA%B5%AC-16677ed7da50 이더리움 Ethash 연구]〉, 《미디엄》, 2018-07-26
  
bero in TOMAK, 〈[https://medium.com/tomak/%EC%9D%B4%EB%8D%94%EB%A6%AC%EC%9B%80-ethash-%EC%97%B0%EA%B5%AC-16677ed7da50 이더리움 Ethash 연구]〉, 《Medium》, 2018-7-26
+
== 같이 보기 ==
 +
* [[이더리움]]
 +
* [[채굴]]
 +
* [[해시]]
  
 
{{알고리즘|검토 필요}}
 
{{알고리즘|검토 필요}}

2019년 7월 15일 (월) 20:27 기준 최신판

이더해시(Ethash)는 이더리움(Ethereum)의 작업증명(PoW) 합의 알고리즘이다.

개요[편집]

이더리움은 현재 작업증명 블록체인으로, 동일한 기본 목표를 위한 동일한 기본 인센티브 시스템에서 동일한 작업증명 알고리즘을 사용하며, 탈중앙화된 제어 상황에서 블록체인을 지키는 역할을 한다. 이더리움의 작업증명 알고리즘은 비트코인과 약간 다른데, 이더해시라고 한다. 원본 블록체인 고안자인 비트코인은 작업증명이라는 합의 알고리즘을 개발했다. 아마도 작업증명은 비트코인을 뒷받침하는 가장 중요한 발명품일 것이다. 작업증명의 구어체 용어는 채굴로, 합의의 주요 목적에 대한 오해를 불러일으킨다. 실세계 채굴의 목적은 귀금속 또는 기타 자원의 추출이기 때문에, 사람들은 종종 채굴의 목적이 새로운 통화의 창출이라고 생각한다. 하지만 오히려 실제 채굴의 목적은 가능한 한 많은 참가자로부터 탈중앙화된 시스템에 대한 통제권을 유지하면서 블록체인을 보호하는 것이다.

새로 발행된 화폐의 보상은 시스템의 보안에 기여하는 사람들에게 주는 인센티브다. 즉, 목적을 위한 수단이다. 그런 의미에서 보상은 수단이며, 탈중앙화된 보안은 목적이다. 작업증명 합의에서 채굴에 참여하는 데 필요한 에너지 비용은 보상에 상응하는 처벌이다. 즉, 참가자가 규정을 지키지 않고 보상을 얻지 못한다면 이미 채굴을 위해 전기에 투자한 자금을 위험에 빠뜨릴 수 있다. 따라서 작업증명 합의는 참여자가 자기 이익 앞에서 정직하게 행동하도록 유도하는 위험과 보상의 면밀한 균형이다.[1]

특징[편집]

이더해시는 비탈릭 부테린(Vitalik Buterin)의 대거(Dagger) 알고리즘과 타데우스 드리자(Thaddeus Dryja)의 하시모토 알고리즘(Hashimoto algorithm)의 조합인 대거-하시모토(Dagger-Hashimoto)의 진화된 알고리즘을 사용한다. 이더해시는 방향성 비순환 그래프(directed acyclic graph, DAG)로 알려진 대규모 데이터 세트의 생성 및 분석에 의존한다. DAG의 초기 크기는 약 1GB이고, 천천히 선형으로 크기가 커지며, 매 순간 업데이트된다.

DAG의 목적은 자주 접근하는 대규모 데이터 구조를 유지하는 데 필요한 이더해시 작업증명 알고리즘을 만드는 것이다. 이는 이더해시가 에이식(ASIC) 저항성을 갖게 만들려는 것으로, GPU 채굴 장비를 만들기가 더 어려워진다는 의미다. 이더리움의 창립자는 특수 실리콘 제조 공장 및 대규모 예산에 접근할 수 있는 사람들이 채굴 인프라를 지배하고 합의 알고리즘의 보안을 훼손할 수 있는 작업증명 채굴의 중앙 집중화를 피하고자 했다.

이더리움 네트워크에서 작업증명을 수행하기 위해 소비자 수준의 GPU를 사용하면 전 세계의 더 많은 사람이 채굴 공정에 참여할 수 있다. 채굴자들이 더 독립적일수록 채굴 파워는 더 탈중앙화되어 있다. 이는 비트코인 같은 상황을 피할 수 있음을 의미한다. 비트코인에서는 채굴 파워 대부분이 몇 군데 대규모 산업 채굴 작업의 손에 집중되어 있다. 채굴을 위한 GPU 사용의 단점은 2017년에 전 세계적으로 GPU 부족 현상을 일으켜 가격이 급등하고 게이머들의 항의를 불러일으켰다는 것이다. 이로 인해 소매 업체의 구매 제한이 발생하여 구매자가 고객당 1~2개의 GPU만 구매하도록 제한을 했다.

최근까지 이더리움 네트워크에서 에이식 채굴자의 위협은 거의 존재하지 않는다. 이더리움을 위해 에이식을 사용하려면 고도로 맞춤화된 하드웨어의 설계, 제조 및 배포가 필요하다. 그것들을 생산하려면 시간과 돈에 상당한 투자가 필요하다. 이더리움 개발자가 지분증명 합의 알고리즘으로 이동하려는 오랜 계획은 에이식 공급 업체가 이더리움 네트워크를 오랫동안 타깃팅 하지 못하게 했을 가능성이 크다. 이더리움이 지분증명(PoS)으로 이동하자마자 작업증명 알고리즘용으로 설계된 에이식은 채굴자가 다른 암호화폐를 채굴하는 데 사용할 수 없으면 쓸모 없어진다. 후자의 가능성은 (PIRL) 및 유빅(Ubiq) 같은 다양한 이더해시 기반 합의 코인을 통해 현실이 되었으며, 이더리움 클래식은 가까운 미래에 작업증명 블록체인으로 남을 것을 약속했다. 이것은 에이식 채굴이 작업증명 합의에 따라 운영되는 동안 이더리움 네트워크에 영향을 기치는 것을 의미한다.[2]

과정[편집]

다음은 이더해시의 채굴 과정이다.

  1. 32개 길이의 배열의 에포크(Epoch)수만큼 해싱한다. 그 값을 시드(Seed)값으로 삼는데, 이 시드값을 30,000블록마다 변경된다.
  2. 시드 값으로 무작위 추출(pseudo-random)한 캐시 데이터(cache data)를 생성한다. 생성 시 메모리를 사용하게 되는데 메모리를 타 용도로 사용한다면 캐시 데이터의 생성 속도가 매우 느려지므로 주의한다.
  3. 1GB 이상의 데이터 세트을 생성한다. 이때 풀 클라이언트(full client)와 채굴자는 데이터세트 DAG를 저장하며, 데이터 세트는 선형으로 커진다. DAG 파일은 캐시 데이터를 이용해 생성하는데 한 번에 64바이트의 데이터를 생성하고 이를 데이터 사이즈만큼 생성하도록 반복한다.
  4. 채굴 과정에서 데이터 세트의 일부를 같이 해싱한다.
  5. Keccak156해시를 해 결과값이 조건에 맞으면 채굴에 성공한다.
  6. 다이제스트논스블록헤더에 포함되는데 다이제스트 필드, 논스 필드가 포함되지 않아 해시값에 변경이 없다.

사용 함수[편집]

  • Folwer-Noll-Vo
hash = FNV_offset_basis
  for each byte_of_data to be hashed
    hash = hash × FNV_prime
  	hash = hash XOR byte_of_data
  return hash
  • 출력 비트에 따라 FNV_offset_basis 값을 정한다.
  • 입력 바이트에 FNV 함수의 출력 비트에 따라 정해지는 FNV 소수를 곱한다.
  • 입력 바이트와 XOR 연산을 수행한다.

채굴 과정[편집]

 def mine(full_size, dataset, header, difficulty): 
 # zero-pad target to compare with hash on the same digit 
 target = zpad(encode_int(2**256 // difficulty), 64)[::-1] 
 from random import randint 
 nonce = randint(0, 2**64) 
 while hashimoto_full(full_size, dataset, header, nonce) > target: 
   nonce = (nonce + 1) % 2**64 
   return nonce  [3][4]

각주[편집]

  1. 박성훈, 류길성, 강동욱, Mastering Ethereum, J-Pub, 2019, p.364
  2. 박성훈, 류길성, 강동욱, Mastering Ethereum, J-Pub, 2019, p366
  3. 야옹메롱, 〈크립토알고리즘 개념 및 종류〉, 《네이버 블로그》, 2018-10-03
  4. bero in TOMAK, 〈이더리움 Ethash 연구〉, 《미디엄》, 2018-7-26

참고자료[편집]

같이 보기[편집]


  검수요청.png검수요청.png 이 이더해시 문서는 알고리즘에 관한 글로서 검토가 필요합니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 문서 내용을 검토·수정해 주세요.