본문 바로가기
쬬의 기초정리

[BlockChain] 블록체인 개념/구조 쉽게 이해하기, 블록체인 코드 작성

by Joooooooo 2023. 7. 1.
반응형

블록체인 이란?

블록체인은 네트워크를 통해 관리되는 분산 데이터베이스의 한 형태로 , 중앙서버에 집중된 상태가 아닌 탈 중앙화 상태에서 노드간의 공동 기록 및 관리하여 다양한 분야에 활용이 가능한 기술입니다.

블록체인의 형태는 초기 블록을 기준으로 각각 체인으로 연결된 형태입니다. 하나의 블럭에 헤더,바디로 존재하며 각각의 블럭은 고유의 해시값과 이전 블록의 해시값을 가지고 있습니다.

해시(Hash)는 점 하나 찍어도 완전히 다른 코드로 변하는 성질을 가지고 있으며 이런 Hash 의 특징을 이용해 이전 블럭과 현재 블럭의 상태를 블럭끼리 서로 공유할 수 있는 형태입니다.

 

[블록체인의 구조 - 헤더]

version - 소프트웨어 버전
previousHash - 앞에 위치한 블록의 해시
merkleHash - 개별 거래정보들을 2진 트리로 구성하여 , 트리에 위치하는 해시값
time - 블록이 생성된 시간 (유닉스 시간 기준으로 초 단위로 해당 블록의 채굴 시간이 기록됩니다)
bits - 채굴 난이도 조절용 수치/ 채굴 난이도 목표
nons - 해시값을 계산하기 위한 임의값 (채굴자들이 채굴기로 조절하는 값)

[블록체인의 구조 - 바디]

거래정보 (트랜잭션 정보/트랜잭션 구조는 코인마다 다름)

 

 

블록체인은 왜 각광받는가?

우리는 현실에서 어떠한 계약(부동산, 이체 등) 을 실행 할 때, 중앙에 집중된 시스템에서 관리를 받을 수 밖에 없습니다. 한마디로 중앙기관(은행, 법정) 을 거쳐 실행하고자 하는 어떤 행동을 증명해야 합니다. 이런 증명을 거치게 되면서 중앙기관에 일부의 금액을 지불하여 실행에 대한 검증 및 증명을 거치는데, 이러한 기록들은 중앙기관에서 관리하게 됩니다.

이런 검증의 단계를 거치는 과정에서 "중앙기관에 일부 금액을 지불하는 것이 꼭 필요한 것일까?" 라는 물음표에서 시작된 기술이 블록체인이라고 합니다. 블록체인의 가장 큰 특징은 "탈중앙화" 입니다. 중앙으로 집중되었던 검증단계를 네트워크로 연결된 각각의 노드들이 공유하게 되면서, 투명성을 가진 불변 원장을 가진다는 것이 블록체인이 각광받는 이유 중 가장 큰 이유이기도 합니다.

 

 

[중앙화 거래과정 or 탈중앙화 거래과정]

 

 

해커들이 블록체인을 해킹하지 못한다는 것도 하나의 이유입니다. 수많은 노드들이 불과 몇 초 사이에 블럭생성을 공유하기 때문에, 해킹을 하고 싶어도 이후에 생성된 수많은 블럭들을 모두 몇초만에 해킹해야합니다. 이러한 상황에서 해킹이라는 것 자체가 불가능하고, 노드가 들어오는 블록의 값에 복잡한 검증과정을 거치기 때문에 투명성과 안정성이 보장된다는 큰 특징을 가지고 있습니다.

 이런 이유때문에 불안전한 중앙기관을 통한 거래보다 블록체인에 대한 관심도가 높아지고 있습니다.

 

 

모두에게 이슈가 되었던 코인과 토큰은 이런 블록체인을 기반으로 한 프로토콜(규칙)과 서비스의 개념입니다.

코인 : 블록체인 기반의 프로토콜에 투자
토큰 : 코인이 제공해주는 프로토콜 기반으로 만든 서비스에 투자

 

 

참고 자료 🤨

보면 이해가 더 쉬워요!

https://www.kiri.or.kr/pdf/%EC%97%B0%EA%B5%AC%EC%9E%90%EB%A3%8C/%EC%97%B0%EA%B5%AC%EB%B3%B4%EA%B3%A0%EC%84%9C/nre2018-24_02.pdf 


 

블록체인의 핵심코드 작성

원리를 이해했다고 해서 바로 블록체인 코드를 작성 할 수 있는건 아닙니다. 비트코인이나 이더리움이 각광받는 이유 중 하나는, 설계된 모든 면들이 경제적인 부분이나 사람들의 심리를 자극할 만큼 체계적으로 짜여져 있기 때문입니다.(반감기, 블록 빈도,서비스 등등)

저도 강의를 들으며 차근차근 따라만든 소스라 디테일 한 부분까지는 표현하지 못하지만, 소스를 적어내려가면서 블록체인의 기본 구조와 작동원리를 더 쉽게 이해할 수 있었습니다.

 

 

 

설치 툴 

아나콘다 Anaconda > 스파이더 프로그램 사용 (파이썬)

 

Anaconda | The World’s Most Popular Data Science Platform

Anaconda is the birthplace of Python data science. We are a movement of data scientists, data-driven enterprises, and open source communities.

www.anaconda.com

포스트맨 (작동 확인용)

 

Postman API Platform | Sign Up for Free

Postman is an API platform for building and using APIs. Postman simplifies each step of the API lifecycle and streamlines collaboration so you can create better APIs—faster.

www.postman.com

 

설치 패키지 

Flask 마이크로 웹 프레임 워크

 

[Flask] Flask란? / Flask 장단점 및 Django 차이점 / Flask 사용 이유 및 용도

Flask (플라스크) 란? Flask는 파이썬 기반으로 작성된 마이크로 웹 프레임 워크(Micro Web Framework) 중 하나이다. 간단한 웹 사이트나 혹은 간단한 API 서버를 만드는 데에 특화된 Python Web Framework이다. Fl

parkjh7764.tistory.com

오류가 난다면 이렇게 다시 설치해보세요

pip install Flask==0.12.2

 

 

실행코드

control + enter

* 증명의 단계는 정해진 프로토콜마다 다릅니다. 증명의 절차도 매우 복잡합니다.
* 해당 코드는 임의로 작성된 코드이며, 학습용 코드입니다.
# Module 1 - Create a Blockchain

# To be installed;
# Flask == 0.12.2; pip install Flask==0.12.2
# Postman HTTP Cilent : https://www.getpostman.com
import datetime
import hashlib
import json
from flask import Flask, jsonify


# 블록 체인 설계
class Blockchain:
    
    def __init__(self):
        self.chain = []
        self.create_block(proof = 1, previous_hash = '0')
        
    def create_block(self, proof, previous_hash):
        block = {'index': len(self.chain) + 1,
                 'timestamp': str(datetime.datetime.now()),
                 'proof': proof,
                 'previous_hash': previous_hash}
        self.chain.append(block)
        return block
    
    # 작업 증명 방식 설계
    # 채굴자들이 풀어야 하는 문제들 (찾기는 어렵지만 증명은 쉬운 => 높은 가치를 위해)

    def get_previous_block(self):
        return self.chain[-1]
    
    def proof_of_work(self, previous_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[:4] == '0000':
                check_proof = True
            else:
                new_proof += 1
        return new_proof
    
    def hash(self, block):
        encoded_block = json.dumps(block, sort_keys = True).encode()
        return hashlib.sha256(encoded_block).hexdigest()
    
    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
            previous_block = block
            block_index += 1
        return True
            
            
            
            
# 웹 어플리케이션 생성

app = Flask(__name__)



# 블록체인 생성
blockchain = Blockchain()

@app.route('/main_block',methods = ['GET'])
def minde_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) # 블럭값
    
    response = {'message':'Congratulations, you just mined a block, !!',
                'index': block['index'],
                'timestamp' : block['timestamp'],
                'proof' : block['proof'],
                'previous_hash' : block['previous_hash']}
    return jsonify(response), 200


# 블록체인 리스트
@app.route('/get_chain',methods = ['GET'])
def get_chain():
    response = {'chain': blockchain.chain,
                'length': len(blockchain.chain)}
    
    return jsonify(response), 200



@app.route('/is_valid',methods = ['GET'])
def is_valid():
    blockchain.is_chain_valid(blockchain.chain)
    if is_valid:
        response = {'message':'good'}
    else:
        response = {'message': 'housaton bad'}
    return jsonify(response), 200


app.run(host = '0.0.0.0', port = 5000)
반응형