쏭의 개발 블로그
파이썬으로 간단한 블록체인 만들기 본문
1. 블록체인 클래스 구조
(1) blockchain 클래스 생성
import datetime
import hashlib
import json
class Blockchain:
def __init__(self):
self.chain=[] # chain이라는 인스턴스 변수가 리스트에 할당
# 가장 처음 블록인 제네시스(genesis)블록을 생성해주기 위해 proof=1, previous_hash='0'이라는 인수 사용
self.create_block(proof=1, previous_hash='0') # create_block 메소드 호출
def create_block(self,proof,previous_hash):
block={ # json으로 구조화된 block 생성
'index':len(self.chain)+1,
'timestamp': str(datetime.datetime.now()),
'proof':proof,
'previous_hash': previous_hash
}
self.chain.append(block) # chain이라는 인스턴스 변수에 append
return block # 변수 return
def get_previous_block(self): #chain 리스트에 잇는 가장 마지막 블록을 리턴
return self.chain[-1]
def proof_of_work(self,previous_proof): #이전 proof 값을 받고 previous_proof와의 연산 해시값이 특정 조건을 만족하는 new_proof를 찾아 리턴함
new_proof=1
check_proof=False
while check_proof is False:
hash_operation=hashlib.sha256(str(new_proof**2-previous_proof**2).encode()).hexdigest()
if hash_operation.startswith('0000'):
check_proof=True
else:
new_proof+=1
return new_proof
def hash(self,block): # 딕셔너리 형태의 block을 받아서 json으로 dump하고 인코딩하여 해시값을 얻어 리턴함
encoded_block=json.dumps(block,sort_keys=True).encode()
return hashlib.sha256(encoded_block).hexdigest()
(2) 블록을 채굴
blockchain=Blockchain()
previous_block=blockchain.get_previous_block()
previous_proof=previous_block['proof']
proof=blockchain.proof_of_work(previous_proof)
previous_hash=blockchain.hash(previous_block)
block=blockchain.create_block(proof,previous_hash)
print(blockchain.chain)
(3) 결과
# output
[{'index': 1,
'timestamp': '2022-08-08 17:23:32.659877',
'proof': 1,
'previous_hash': '0'},
{'index': 2,
'timestamp': '2022-08-08 17:23:32.660909',
'proof': 533,
'previous_hash': 'bd7a6a2915534ab488430ff684a586b0cd079627615eae840489f5abea1e4f47'
}]
블록체인 규칙에 맞게 생성되어있는지 확인
Blockchain 클래스에 포함시키기
def is_valid_chain(self,chain):
previous_block=chain[0]
block_index=1
while block_index < len(chain):
block=chain[block_index]
#previous_hash값이 이전블록의 hash값과 동일한지 검증
if block['previous_hash']!=self.hash(previous_block):
return False
# proof값이 previous_proof값과 연산 후 해시 값 계산 시 특정 조건('0000'으로 시작)을 만족하는지 검증
previous_proof=previous_block['proof']
proof=block['proof']
hash_operation=hashlib.sha256(str(proof**2-previous_proof**2).encode()).hexdigest()
if not hash_operation.startswith('0000'):
return False
previous_block=block
block_index+=1
return True
2. flask를 이용해 api로 제공
from flask import Flask, jsonify
app = Flask(__name__)
app.config['JSONIFY_PRETTYPRINT_REGULAR']=False
blockchain=Blockchain()
@app.route('/mine_block',methods=['GET'])
def mine_block():
previous_block=blockchain.get_previous_block()
previous_proof=previous_block['proof']
proof=blockchain.proof_of_work(previous_proof)
previous_hash=blockchain.hash(previous_block)
block=blockchain.create_block(proof,previous_hash)
responses= {
'message': 'Congratulations, you just mined a block!',
**block
}
return jsonify(responses), 200
@app.route('/get_chain',methods=['GET'])
def get_chain():
response={
'chain':blockchain.chain,
'length':len(blockchain.chain)
}
return jsonify(response),200
app.run(host='0.0.0.0', port=6060)
결과
https://kadensungbincho.tistory.com/139?category=981086
파이썬으로 간단한 블록체인 만들기
블록체인은 블록이라고 불리는 것들이 암호기법을 통해 체인처럼 연결된 것 [1]을 말합니다. 흔히 아래와 같은 형태로 표현되는데요: 위의 정의에서 '암호기법을 통해 연결된다'와 같은 부분들
kadensungbincho.tistory.com