๐Ÿ”‘ Nonce(๋‚œ์Šค)์˜ ๊ฐœ๋…


Nonce๋Š” ๋ธ”๋ก์ฒด์ธ์˜ ์ž‘์—…์ฆ๋ช…(Proof of Work, PoW) ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ž„์˜์˜ ์ˆซ์ž๋กœ, ํŠน์ • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ํ•ด์‹œ๊ฐ’์„ ์ฐพ๊ธฐ ์œ„ํ•ด ๋ฐ˜๋ณต์ ์œผ๋กœ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฐ’์ž…๋‹ˆ๋‹ค.

๋ธ”๋ก์ฒด์ธ์—์„œ nonce ๊ฐ’์€:

  • ์ง์ ‘ ๋ฐ์ดํ„ฐ์— ์—ฐ๊ฒฐํ•˜์—ฌ ๋ฌธ์ž์—ด๋กœ ํฌํ•จํ•œ ํ›„ ํ•ด์‹œ๋ฅผ ๊ณ„์‚ฐํ•˜๊ฑฐ๋‚˜,
  • ๋ธ”๋ก ํ—ค๋”๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ณ„๋„์˜ ํ•„๋“œ๋กœ ์„ค์ •ํ•˜์—ฌ ํ•ด์‹œ ์ž…๋ ฅ์œผ๋กœ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๐Ÿงฎ ๊ณ„์‚ฐ์‹ ๋ฐ ํ•จ์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ nonce ์ „๋‹ฌ ์˜ˆ์‹œ

1๏ธโƒฃ ๋ฌธ์ž์—ด ์—ฐ๊ฒฐ ๋ฐฉ์‹

๊ฐ€์žฅ ์ง๊ด€์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ, ๋ฐ์ดํ„ฐ๋ฅผ ๋ฌธ์ž์—ด๋กœ ๊ตฌ์„ฑํ•ด nonce๋ฅผ ๋ถ™์ž…๋‹ˆ๋‹ค.

import hashlib

def calculate_hash(prev_hash, transaction_data, nonce):
    data = f"{prev_hash}{transaction_data}{nonce}"
    return hashlib.sha256(data.encode()).hexdigest()

# ์‚ฌ์šฉ ์˜ˆ์‹œ
prev_hash = "000000abc123"
transaction_data = "์‚ฌ์šฉ์ž A๊ฐ€ ์‚ฌ์šฉ์ž B์—๊ฒŒ 5์ฝ”์ธ์„ ๋ณด๋ƒ„"

nonce = 1
hash_result = calculate_hash(prev_hash, transaction_data, nonce)
print(hash_result)
  • ์œ„ ์˜ˆ์‹œ์—์„œ๋Š” prev_hash, transaction_data, nonce๊ฐ€ ๋ฌธ์ž์—ด๋กœ ์—ฐ๊ฒฐ๋œ ํ›„ SHA-256 ํ•ด์‹œ ํ•จ์ˆ˜๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

2๏ธโƒฃ ํ•จ์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ณ„๋„ ํ•„๋“œ๋กœ ๋„˜๊ธฐ๋Š” ๋ฐฉ์‹

๋ธ”๋ก์ฒด์ธ์˜ ์‹ค์ œ ๊ตฌํ˜„์—์„œ๋Š” nonce๋ฅผ ๋ธ”๋ก ํ—ค๋”์˜ ์ผ๋ถ€๋กœ ๋ณ„๋„์˜ ํ•„๋“œ๋กœ ๊ด€๋ฆฌํ•˜์—ฌ ๊ตฌ์„ฑํ•œ ๋ฐ”์ดํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ํ•ด์‹œ ํ•จ์ˆ˜๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

import hashlib
import struct

def calculate_hash(prev_hash, transaction_data, nonce):
    data = prev_hash.encode() + transaction_data.encode() + struct.pack("<I", nonce)
    return hashlib.sha256(data).hexdigest()

nonce = 1
hash_result = calculate_hash("000000abc123", "์‚ฌ์šฉ์ž A๊ฐ€ ์‚ฌ์šฉ์ž B์—๊ฒŒ 5์ฝ”์ธ์„ ๋ณด๋ƒ„", nonce)
print(hash_result)
  • ์—ฌ๊ธฐ์„œ๋Š” nonce ๊ฐ’์„ ์ •์ˆ˜๋กœ ๋ณ„๋„๋กœ ์ „๋‹ฌํ•˜์—ฌ ๋ฐ”์ดํŠธ ๋ฐฐ์—ด๋กœ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ ์‹ค์งˆ์ ์ธ ๋ธ”๋ก์ฒด์ธ ๊ตฌํ˜„์—์„œ๋Š”?

์‹ค์ œ ๋ธ”๋ก์ฒด์ธ ๊ตฌํ˜„(Bitcoin, Ethereum ๋“ฑ)์€ nonce ๊ฐ’์„ ํฌํ•จํ•œ ๋ธ”๋ก ํ—ค๋”๋ผ๋Š” ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค์–ด ์ด ๋ธ”๋ก ํ—ค๋” ์ „์ฒด๋ฅผ ํ•ด์‹œํ•ฉ๋‹ˆ๋‹ค.

๋ธ”๋ก ํ—ค๋” ๊ตฌ์„ฑ ์˜ˆ์‹œ:

| Version (๋ฒ„์ „) | Previous Block Hash | Merkle Root | Timestamp | Difficulty | Nonce |

์ด๋•Œ Nonce๋Š” ๋…๋ฆฝ๋œ ์ •์ˆ˜ ํ•„๋“œ๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ, ๋ธ”๋ก ํ—ค๋” ์ „์ฒด๋ฅผ ์ง๋ ฌํ™”(serialize)ํ•˜์—ฌ SHA-256 ํ•ด์‹œ ํ•จ์ˆ˜์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ” ๋ฐ˜๋ณต์  ๊ณผ์ •์˜ ์›๋ฆฌ

์œ„์˜ ์˜ˆ์‹œ์—์„œ ๋ณด๋“ฏ์ด, nonce ๊ฐ’์„ ๋ฐ˜๋ณต์ ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด์„œ ํ•ด์‹œ๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ , ๋ชฉํ‘œ ์กฐ๊ฑด(์˜ˆ: ์•ž์˜ ์ผ์ • ๊ฐœ์ˆ˜์˜ 0์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ํ•ด์‹œ๊ฐ’)์„ ๋งŒ์กฑํ•  ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰,

  1. Nonce ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ฉฐ ๋ฐ์ดํ„ฐ ์กฐํ•ฉ
  2. ๋ฐ์ดํ„ฐ ์กฐํ•ฉ์„ ํ•ด์‹œ ํ•จ์ˆ˜์— ์ž…๋ ฅ
  3. ์ถœ๋ ฅ๋œ ํ•ด์‹œ๊ฐ’์„ ์กฐ๊ฑด๊ณผ ๋น„๊ต
  4. ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜์ง€ ์•Š์œผ๋ฉด nonce ์ฆ๊ฐ€ ํ›„ ๋ฐ˜๋ณต

์œ„ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋‹ค๊ฐ€ ์กฐ๊ฑด์„ ์ถฉ์กฑํ•œ nonce ๊ฐ’์„ ์ฐพ์œผ๋ฉด ํ•ด๋‹น nonce๊ฐ€ ์ตœ์ข… ๋ธ”๋ก์˜ ์ผ๋ถ€๋กœ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค.


๐Ÿ“ ์ •๋ฆฌ

nonce ๊ฐ’์€:

  • ๋ฌธ์ž์—ด ํ˜•ํƒœ๋กœ ์ง์ ‘ ๋ฐ์ดํ„ฐ์— ํฌํ•จ์‹œํ‚ค๊ฑฐ๋‚˜,
  • ํ•จ์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ •์ˆ˜ ํ˜•ํƒœ๋กœ ๋”ฐ๋กœ ์ „๋‹ฌ๋˜์–ด,
  • ํ•ด์‹œ ๊ณ„์‚ฐ ์ž…๋ ฅ๊ฐ’์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ฐ˜๋ณต์ ์ธ nonce ๋ณ€๊ฒฝ ์ž‘์—…์ด ๋ธ”๋ก์ฒด์ธ์˜ PoW ์ž‘์—…์ฆ๋ช…์˜ ํ•ต์‹ฌ์  ์›๋ฆฌ์ž…๋‹ˆ๋‹ค.

์ฝ”๋ฉ˜ํŠธ

๋‹ต๊ธ€ ๋‚จ๊ธฐ๊ธฐ

์ด๋ฉ”์ผ ์ฃผ์†Œ๋Š” ๊ณต๊ฐœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•„์ˆ˜ ํ•„๋“œ๋Š” *๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค