본문으로 건너뛰기
Change page

Ethash

페이지 최근 업데이트: 2026년 4월 15일

Ethash는 이더리움의 작업 증명 채굴 알고리즘이었습니다. 이제 작업 증명은 완전히 중단되었으며, 대신 지분 증명을 사용하여 이더리움을 보호합니다. 병합, 지분 증명, 스테이킹에 대해 자세히 알아보세요. 이 페이지는 역사적 참고 자료로만 제공됩니다!

이더해시는 Dagger-Hashimoto 알고리즘의 수정된 버전입니다. 이더해시 작업 증명은 메모리 집약적 (opens in a new tab)이며, 이는 이 알고리즘을 ASIC 저항적으로 만든다고 여겨졌습니다. 결국 이더해시 ASIC가 개발되었지만, 작업 증명이 중단될 때까지 GPU 채굴은 여전히 실행 가능한 옵션이었습니다. 이더해시는 이더리움이 아닌 다른 작업 증명 네트워크에서 다른 코인을 채굴하는 데 여전히 사용됩니다.

이더해시는 어떻게 작동하나요?

메모리 집약성은 nonce 및 블록 헤더에 따라 고정된 리소스의 하위 집합을 선택해야 하는 작업 증명 알고리즘을 통해 달성됩니다. 이 리소스(크기는 수 기가바이트)를 DAG라고 합니다. DAG는 30,000 블록마다 변경되며, 에폭(약 5.2일)이라고 하는 약 125시간의 기간이며 생성하는 데 시간이 걸립니다. DAG는 블록 높이에만 의존하기 때문에 사전 생성이 가능하지만, 그렇지 않은 경우 클라이언트는 블록을 생성하기 위해 이 프로세스가 끝날 때까지 기다려야 합니다. 클라이언트가 미리 DAG를 생성하여 캐시하지 않으면 각 에폭 전환 시 네트워크에 엄청난 블록 지연이 발생할 수 있습니다. 작업 증명을 검증하기 위해 DAG를 생성할 필요가 없으므로 낮은 CPU와 적은 메모리로도 검증이 가능합니다.

알고리즘이 따르는 일반적인 경로는 다음과 같습니다.

  1. 각 블록의 헤더를 해당 지점까지 스캔하여 계산할 수 있는 시드가 존재합니다.
  2. 시드에서 16MB 의사 난수 캐시를 계산할 수 있습니다. 라이트 클라이언트는 캐시를 저장합니다.
  3. 캐시에서 1GB 데이터세트를 생성할 수 있으며, 데이터세트의 각 항목은 캐시의 적은 수의 항목에만 종속된다는 속성이 있습니다. 풀 클라이언트와 채굴자는 데이터세트를 저장합니다. 데이터세트는 시간에 따라 선형적으로 증가합니다.
  4. 채굴에는 데이터세트의 무작위 슬라이스를 가져와 함께 해싱하는 작업이 포함됩니다. 캐시를 사용하여 필요한 데이터세트의 특정 부분을 재생성하여 적은 메모리로 검증할 수 있으므로 캐시만 저장하면 됩니다.

대용량 데이터세트는 30,000 블록마다 한 번씩 업데이트되므로, 채굴자 노력의 대부분은 데이터세트를 변경하는 것이 아니라 읽는 데 사용됩니다.

정의

다음과 같은 정의를 사용합니다.

'SHA3'의 사용

이더리움 개발은 SHA3 표준 개발과 동시에 이루어졌으며, 표준화 과정에서 최종 해시 알고리즘의 패딩이 늦게 변경되어 이더리움의 'sha3_256' 및 'sha3_512' 해시는 표준 sha3 해시가 아니라 다른 맥락에서 흔히 'Keccak-256' 및 'Keccak-512'라고 불리는 변형입니다. 예를 들어 여기 (opens in a new tab), 여기 (opens in a new tab), 또는 여기 (opens in a new tab)의 논의를 참조하세요.

아래 알고리즘 설명에서 'sha3' 해시가 언급되므로 이 점을 유념해 주시기 바랍니다.

파라미터

이더해시의 캐시 및 데이터세트 파라미터는 블록 번호에 따라 달라집니다. 캐시 크기와 데이터세트 크기는 모두 선형적으로 증가하지만, 주기적인 동작으로 이어지는 우발적인 규칙성의 위험을 줄이기 위해 선형적으로 증가하는 임계값보다 낮은 가장 높은 소수를 항상 사용합니다.

데이터세트 및 캐시 크기 값의 표는 부록에 제공됩니다.

캐시 생성

이제 캐시를 생성하는 함수를 지정합니다.

캐시 생성 과정은 먼저 32MB의 메모리를 순차적으로 채운 다음, 엄격한 메모리 집약적 해싱 함수(Strict Memory Hard Hashing Functions) (2014) (opens in a new tab)에서 Sergio Demian Lerner의 RandMemoHash 알고리즘을 두 번 통과시키는 것을 포함합니다. 출력은 524288개의 64바이트 값 집합입니다.

데이터 집계 함수

경우에 따라 XOR의 비결합적 대체물로 FNV 해시 (opens in a new tab)에서 영감을 받은 알고리즘을 사용합니다. 소수에 차례로 1바이트(옥텟)를 곱하는 FNV-1 사양과 달리, 전체 32비트 입력에 소수를 곱한다는 점에 유의하세요.

FNV_PRIME = 0x01000193

def fnv(v1, v2):
    return ((v1 * FNV_PRIME) ^ v2) % 2**32

옐로페이퍼에서는 fnv를 v1*(FNV_PRIME ^ v2)로 지정하고 있지만, 현재 모든 구현에서는 일관되게 위의 정의를 사용하고 있습니다.

전체 데이터세트 계산

전체 1GB 데이터세트의 각 64바이트 항목은 다음과 같이 계산됩니다.

기본적으로 256개의 의사 난수적으로 선택된 캐시 노드의 데이터를 결합하고 이를 해싱하여 데이터세트 노드를 계산합니다. 그런 다음 전체 데이터세트는 다음에 의해 생성됩니다.

def calc_dataset(full_size, cache):
    return [calc_dataset_item(cache, i) for i in range(full_size // HASH_BYTES)]

메인 루프

이제 특정 헤더와 nonce에 대한 최종 값을 생성하기 위해 전체 데이터세트의 데이터를 집계하는 메인 '해시모토'와 유사한 루프를 지정합니다. 아래 코드에서 headermixHashnonce 필드를 제외한 잘린 블록 헤더, 즉 RLP 표현의 SHA3-256 해시를 나타냅니다. nonce는 빅 엔디안 순서의 64비트 부호 없는 정수의 8바이트입니다. 따라서 nonce[::-1]는 해당 값의 8바이트 리틀 엔디안 표현입니다.

기본적으로 128바이트 너비의 '믹스'를 유지하고 전체 데이터세트에서 128바이트를 반복적으로 순차적으로 가져와 fnv 함수를 사용하여 믹스와 결합합니다. 128바이트의 순차적 액세스는 알고리즘의 각 라운드가 항상 RAM에서 전체 페이지를 가져오도록 하여 이론적으로 ASIC이 피할 수 있는 변환 색인 버퍼(TLB) 누락을 최소화하는 데 사용됩니다.

이 알고리즘의 출력이 원하는 대상보다 낮으면 nonce는 유효합니다. 마지막에 sha3_256을 추가로 적용하면 최소한의 작업이 수행되었음을 증명하기 위해 제공할 수 있는 중간 nonce가 존재하도록 보장합니다. 이 빠른 외부 PoW 검증은 안티-DDoS 목적으로 사용될 수 있습니다. 또한 결과가 편향되지 않은 256비트 숫자라는 통계적 보증을 제공하는 역할도 합니다.

채굴

채굴 알고리즘은 다음과 같이 정의됩니다.

def mine(full_size, dataset, header, difficulty):
    # 동일한 숫자의 해시와 비교하기 위해 대상에 0을 채움
    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

시드 해시 정의

주어진 블록 위에 채굴하는 데 사용될 시드 해시를 계산하기 위해 다음 알고리즘을 사용합니다.

 def get_seedhash(block):
     s = '\x00' * 32
     for i in range(block.number // EPOCH_LENGTH):
         s = serialize_hash(sha3_256(s))
     return s

원활한 채굴 및 검증을 위해 별도의 스레드에서 향후 시드해시 및 데이터세트를 미리 계산하는 것을 권장합니다.

더 읽어보기

도움이 되었던 커뮤니티 참고 자료를 알고 계신가요? 이 페이지를 편집해서 추가하세요!

부록

위의 파이썬 사양을 코드로 실행하는 데 관심이 있다면 다음 코드를 앞에 추가해야 합니다.

데이터 크기

다음 조회 테이블은 약 2048개의 표로 정리된 데이터 크기 및 캐시 크기의 에폭을 제공합니다.

이 아티클이 도움이 되었나요?