쏭의 개발 블로그

파이썬으로 간단한 블록체인 만들기 본문

블록체인

파이썬으로 간단한 블록체인 만들기

songu1 2023. 1. 31. 13:19

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

 

'블록체인' 카테고리의 다른 글

블록체인이란?  (1) 2023.01.31