논스(Nonce)라는 용어는 영어 “number used once”의 줄임말 입니다. 블록체인에서는 이전 블록의 해시값과 논스를 조합하여 새로운 블록의 해시값을 계산하는 과정에서 논스값은 단 한번만 사용되어야 합니다. 이러한 논스값의 단 한번 사용되는 특성 때문에 이를 “number used once”라는 영어 용어로 표현하게 되었습니다.

Nonce는 매우 쉽게 설명하면 “찾기 어려운 숫자”라고 할 수 있습니다. 논스는 블록체인 채굴에서 중요한 역할을 하는데, 이는 블록 해시값을 만족시키기 위해 사용되는 임의의 숫자입니다. 블록 해시값을 만족시키기 위해서는 매우 작은 확률로 유효한 해시값이 생성되기 때문에 논스는 계속해서 변경되며 이를 통해 유효한 블록을 찾을 수 있습니다.

이를 개인적인 비유로 생각해보면, 비밀번호를 찾는 것과 비슷한 과정입니다. 비밀번호를 찾기 위해서는 가능한 모든 조합을 시도해야하며, 이를 통해 올바른 비밀번호를 찾을 수 있습니다. 비슷하게, 블록체인 채굴에서도 모든 가능한 조합을 시도해 블록 해시값을 만족시키기 위해 논스를 변경하며 계속해서 유효한 블록을 찾는 것입니다.

논스는 일반적으로 32비트 정수 값으로 표현됩니다. 이 정수 값을 이용하여 블록의 해시 값을 찾습니다. 가장 간단하게 빠르게 계산할 수 있는 코드는 다음과 같습니다. 조금만 난이도를 높여도 시간이 꽤 걸리기 때문에 엄청나게 간단하게 했습니다.

실행하기

import hashlib

# 이전 블록의 해시 값
previous_block_hash = "0000000000000000000000000000000000000000000000000000000000000000"

# 블록 데이터
block_data = "Hello, world!"

# 논스 값 범위
nonce_range = range(100000)

# 이전 블록의 해시 값과 블록 데이터를 합쳐서 문자열로 만듭니다.
block = previous_block_hash + block_data

# 블록 해시 값이 "0000"으로 시작하는 논스 값을 찾습니다.
for nonce in nonce_range:
    # 논스 값을 블록 문자열에 추가합니다.
    block_with_nonce = block + str(nonce)
    # SHA-256 해시 함수를 이용하여 블록 해시 값을 계산합니다.
    block_hash = hashlib.sha256(block_with_nonce.encode()).hexdigest()
    if block_hash[:4] == "0000":
        print(f"Block hash found: {block_hash}")
        print(f"Nonce value: {nonce}")
        break

이 코드는 이전 블록의 해시 값과 블록 데이터를 이용하여 블록 문자열을 만들고, 이 문자열에 논스 값을 추가하여 SHA-256 해시 함수를 이용하여 블록 해시 값을 계산합니다. 블록 해시 값이 “0000”으로 시작하는 논스 값을 찾을 때까지 논스 값을 증가시키며 반복합니다. 논스 값을 찾으면 블록 해시 값을 출력하고 블록의 논스 값을 출력합니다.