나만의 블록체인 구축
📖 12 분 읽음 · 🐍 Python
Quick Answer
블록체인을 이해하는 가장 좋은 방법은 블록체인을 구축하는 것입니다. 약 50줄의 Python에서 비트코인을 보호하는 것과 동일한 핵심 아이디어인 해싱, 블록 체인, 작업 증명 마이닝 및 변조 감지 기능을 갖춘 작동하는 장난감 블록체인을 만들 수 있습니다. 사전 블록체인 지식이 필요하지 않습니다.
⚠️ 이는 프로덕션 코드가 아닌 학습 모델입니다. 이는 비트코인의 데이터 구조를 가르쳐줍니다. 이는 안전한 화폐가 아니며 실제 가치를 보유해서는 안 됩니다.
1단계 - 블록과 지문
블록은 일부 데이터(트랜잭션), 이전 블록에 대한 링크 및 "nonce"(변경할 수 있는 숫자)를 보유합니다. 해당 ID는 모든 콘텐츠의 SHA-256 해시입니다. 문자 하나를 변경하면 해시가 완전히 변경됩니다. 해당 해시는 블록의 변조 방지 지문입니다.
import hashlib, json, time
class Block:
def __init__(self, index, transactions, previous_hash, nonce=0):
self.index = index
self.timestamp = time.time()
self.transactions = transactions
self.previous_hash = previous_hash
self.nonce = nonce
def hash(self):
# A block's fingerprint = SHA-256 of all its contents.
payload = json.dumps({
"index": self.index,
"timestamp": self.timestamp,
"transactions": self.transactions,
"previous_hash": self.previous_hash,
"nonce": self.nonce,
}, sort_keys=True).encode()
return hashlib.sha256(payload).hexdigest()2단계 - 채굴(작업 증명)
마이닝은 규칙을 충족하는 해시를 찾는 것을 의미합니다. 여기서는 설정된 수의 0으로 시작합니다. 공식은 없습니다. 해시가 맞을 때까지 nonce를 무차별 대입합니다. 해결책을 확인하는 것은 즉각적이지만 해결책을 찾는 데는 노력이 필요합니다. 이러한 비대칭성은 작업 증명의 핵심입니다.
DIFFICULTY = 4 # require this many leading zeros
def mine(block):
# Proof of Work: keep changing the nonce until the hash
# starts with DIFFICULTY zeros. There is no shortcut —
# you just have to guess, which is what costs energy.
target = "0" * DIFFICULTY
while not block.hash().startswith(target):
block.nonce += 1
return block.hash()3단계 - 블록 연결
각각의 새로운 블록은 이전 블록의 해시를 저장하여 하드 코딩된 "창세기" 블록으로 시작하는 체인으로 용접합니다. 모든 블록은 이전 블록에 커밋되기 때문에 순서가 고정되고 기록이 서로 연결됩니다.
class Blockchain:
def __init__(self):
# The genesis block — the very first, hard-coded block.
genesis = Block(0, [{"note": "genesis"}], "0")
mine(genesis)
self.chain = [genesis]
def add_block(self, transactions):
prev = self.chain[-1]
block = Block(len(self.chain), transactions, prev.hash())
mine(block) # do the work
self.chain.append(block)
return block4단계 - 체인 검증
체인을 신뢰하려면 체인을 다시 확인해야 합니다. 모든 블록은 이전 블록의 실제 해시를 가리켜야 하며 모든 블록은 작업 증명 규칙을 충족해야 합니다. 어느 곳에서든 검사가 실패하면 체인이 유효하지 않은 것입니다.
def is_valid(chain):
for i in range(1, len(chain)):
current, previous = chain[i], chain[i - 1]
# 1) Each block must point to the real hash of the one before it.
if current.previous_hash != previous.hash():
return False
# 2) Each block must satisfy the proof-of-work rule.
if not current.hash().startswith("0" * DIFFICULTY):
return False
return True5단계 - 실행하고 부정행위 시도
이제 몇 개의 블록을 추가한 다음 이전 거래를 변조해 보세요. 과거 데이터를 변경하는 순간 해당 블록의 해시는 더 이상 다음 블록이 예상하는 것과 일치하지 않으며 유효성 검사는 즉시 False를 반환합니다. 이것이 바로 비트코인의 역사를 조용히 다시 쓸 수 없는 이유입니다.
bc = Blockchain()
bc.add_block([{"from": "Alice", "to": "Bob", "amount": 5}])
bc.add_block([{"from": "Bob", "to": "Carol", "amount": 2}])
print("Chain valid?", is_valid(bc.chain)) # True
# Now try to cheat: tamper with an old transaction.
bc.chain[1].transactions[0]["amount"] = 5000
print("Chain valid?", is_valid(bc.chain)) # False — tampering is caught!🔑 핵심 내용
블록체인은 데이터 구조에 규칙을 더한 것일 뿐입니다. 즉, 각 블록을 해시하고 마지막 블록에 연결하며 작업 증명을 통해 비용이 많이 드는 블록을 추가합니다. 변조는 해시 체인을 깨뜨립니다. 이것이 바로 비트코인이 중앙 권한 없이 변조 방지를 유지하는 방식입니다.
실제 비트코인이 추가하는 것
우리 장난감 체인은 뼈대를 가르칩니다. Real Bitcoin은 글로벌 P2P 노드 네트워크, 누가 코인을 사용할 수 있는지 증명하는 디지털 서명, 자동 난이도 조정, UTXO 모델, 블록 보상 및 반감기, 낯선 사람이 신뢰 없이 동의할 수 있도록 하는 합의 규칙을 추가합니다. 아래 설명에서 각각을 살펴보세요.
자주 묻는 질문
비트코인 같은 진짜 블록체인인가요?▼
이는 비트코인의 핵심 아이디어(해싱, 체인, 작업 증명)를 공유하지만 비트코인을 글로벌 규모로 안전하게 만드는 네트워킹, 디지털 서명 및 경제적 인센티브를 제외하는 단순화된 교육 모델입니다. 돈을 벌기 위해서가 아니라 배우기 위해서입니다.
프로그래머가 되어야 합니까?▼
Python에 대한 기본적인 지식이 있으면 도움이 되지만 설명은 누구나 논리를 따라갈 수 있도록 작성되었습니다. 코드를 실행하지 않고도 개념을 이해하기 위해 읽을 수 있습니다.
채굴은 왜 0만 추가하나요?▼
해시가 여러 개의 0으로 시작하도록 요구하는 것은 확인하기 쉽지만 찾기 어려운 조건입니다. 유효한 해시를 찾는 유일한 방법은 계속 추측하는 것(논스 변경)이며, 이것이 바로 실제 채굴에 에너지가 드는 이유입니다.
실제 비트코인과 비교하여 무엇이 빠졌나요?▼
실제 노드 네트워크, 소유권을 증명하는 디지털 서명, P2P 프로토콜, 난이도 조정, UTXO 모델 및 블록 보상. 이 튜토리얼에서는 데이터 구조를 가르칩니다. 전체 시스템에 대한 설명을 참조하세요.