블록체인의 유효성 확인
1. 블록체인 해시 함수
- 전체 블록이 유효한지 확인
import datetime
import hashlib
import json
from flask import Flask, jsonify
class Blockchain:
...
코드 생략
...
def hash(self, block):
encoded_block = json.dumps(block, sort_keys = True).emcode()
return hashlib.sha256(encoded_block).hexdigest()
- 블록을 입력값으로 갖고 해당 블록에 대한 SHA256 암호화 해시를 그 결과로 반환합니다.
Json
라이브러리의 dumps
함수를 이용해 블록의 딕셔너리를 문자열로 변경 합니다.
2. chain valid()
- 이전 블록의 해시와 동일한지 확인
def is_chain_valid(self, chain):
previous_block = chain[0]
block_index = 1
while block_index < len(chain):
block = chain[block_index]
if block['previous_hash'] != self.hash(previous_block):
return False
- 이전 블록의 해시가 동일한지를 파악하는 것이기 때문에 이전 블록 변수 또는 초기화해야 합니다.
- 최종 인덱스
len(chain)
에 도달하기 전까지 반복하여 확인합니다.
- previous_hash 키로 현재 블록과 비교해 체인이 유효한지 확인합니다.
- 작업 증명 문제에 따라 각 블록이 증명이 유효한지 확인
previous_proof = previous_block['proof']
proof = block['proof']
hash_operation = hashlib.sha256(str(proof**2 + previous_proof**2).encode()).hexdigest()
if hash_operation[:4] != '0000':
return False
- 증명 키
proof
를 호출해 블록의 증명을 볼 수 있습니다.
- 현재 블록에 대한 증명과 이전 블록에 대한 증명 간 해시 연산을 수행해 값을 확인합니다.
코드
import datetime
import hashlib
import json
from flask import Flask, jsonify
class Blockchain:
...
코드 생략
...
def is_chain_valid(self, chain):
previous_block = chain[0]
block_index = 1
while block_index < len(chain):
block = chain[block_index]
if block['previous_hash'] != self.hash(previous_block):
return False
previous_proof = previous_block['proof']
proof = block['proof']
hash_operation = hashlib.sha256(str(proof**2 + previous_proof**2).encode()).hexdigest()
if hash_operation[:4] != '0000':
return False
privouse_block = block
block_index += 1
return True