블록체인 이란?
블록체인은 네트워크를 통해 관리되는 분산 데이터베이스의 한 형태로 , 중앙서버에 집중된 상태가 아닌 탈 중앙화 상태에서 노드간의 공동 기록 및 관리하여 다양한 분야에 활용이 가능한 기술입니다.
블록체인의 형태는 초기 블록을 기준으로 각각 체인으로 연결된 형태입니다. 하나의 블럭에 헤더,바디로 존재하며 각각의 블럭은 고유의 해시값과 이전 블록의 해시값을 가지고 있습니다.
해시(Hash)는 점 하나 찍어도 완전히 다른 코드로 변하는 성질을 가지고 있으며 이런 Hash 의 특징을 이용해 이전 블럭과 현재 블럭의 상태를 블럭끼리 서로 공유할 수 있는 형태입니다.
[블록체인의 구조 - 헤더]
version - 소프트웨어 버전
previousHash - 앞에 위치한 블록의 해시
merkleHash - 개별 거래정보들을 2진 트리로 구성하여 , 트리에 위치하는 해시값
time - 블록이 생성된 시간 (유닉스 시간 기준으로 초 단위로 해당 블록의 채굴 시간이 기록됩니다)
bits - 채굴 난이도 조절용 수치/ 채굴 난이도 목표
nons - 해시값을 계산하기 위한 임의값 (채굴자들이 채굴기로 조절하는 값)
[블록체인의 구조 - 바디]
거래정보 (트랜잭션 정보/트랜잭션 구조는 코인마다 다름)
블록체인은 왜 각광받는가?
우리는 현실에서 어떠한 계약(부동산, 이체 등) 을 실행 할 때, 중앙에 집중된 시스템에서 관리를 받을 수 밖에 없습니다. 한마디로 중앙기관(은행, 법정) 을 거쳐 실행하고자 하는 어떤 행동을 증명해야 합니다. 이런 증명을 거치게 되면서 중앙기관에 일부의 금액을 지불하여 실행에 대한 검증 및 증명을 거치는데, 이러한 기록들은 중앙기관에서 관리하게 됩니다.
이런 검증의 단계를 거치는 과정에서 "중앙기관에 일부 금액을 지불하는 것이 꼭 필요한 것일까?" 라는 물음표에서 시작된 기술이 블록체인이라고 합니다. 블록체인의 가장 큰 특징은 "탈중앙화" 입니다. 중앙으로 집중되었던 검증단계를 네트워크로 연결된 각각의 노드들이 공유하게 되면서, 투명성을 가진 불변 원장을 가진다는 것이 블록체인이 각광받는 이유 중 가장 큰 이유이기도 합니다.
[중앙화 거래과정 or 탈중앙화 거래과정]
해커들이 블록체인을 해킹하지 못한다는 것도 하나의 이유입니다. 수많은 노드들이 불과 몇 초 사이에 블럭생성을 공유하기 때문에, 해킹을 하고 싶어도 이후에 생성된 수많은 블럭들을 모두 몇초만에 해킹해야합니다. 이러한 상황에서 해킹이라는 것 자체가 불가능하고, 노드가 들어오는 블록의 값에 복잡한 검증과정을 거치기 때문에 투명성과 안정성이 보장된다는 큰 특징을 가지고 있습니다.
이런 이유때문에 불안전한 중앙기관을 통한 거래보다 블록체인에 대한 관심도가 높아지고 있습니다.
모두에게 이슈가 되었던 코인과 토큰은 이런 블록체인을 기반으로 한 프로토콜(규칙)과 서비스의 개념입니다.
코인 : 블록체인 기반의 프로토콜에 투자
토큰 : 코인이 제공해주는 프로토콜 기반으로 만든 서비스에 투자
참고 자료 🤨
보면 이해가 더 쉬워요!
블록체인의 핵심코드 작성
원리를 이해했다고 해서 바로 블록체인 코드를 작성 할 수 있는건 아닙니다. 비트코인이나 이더리움이 각광받는 이유 중 하나는, 설계된 모든 면들이 경제적인 부분이나 사람들의 심리를 자극할 만큼 체계적으로 짜여져 있기 때문입니다.(반감기, 블록 빈도,서비스 등등)
저도 강의를 들으며 차근차근 따라만든 소스라 디테일 한 부분까지는 표현하지 못하지만, 소스를 적어내려가면서 블록체인의 기본 구조와 작동원리를 더 쉽게 이해할 수 있었습니다.
설치 툴
아나콘다 Anaconda > 스파이더 프로그램 사용 (파이썬)
포스트맨 (작동 확인용)
설치 패키지
Flask 마이크로 웹 프레임 워크
오류가 난다면 이렇게 다시 설치해보세요
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)
'쬬의 기초정리' 카테고리의 다른 글
[websoket] 웹소켓 사용해 데이터 호출하기 / 웹소켓 데이터보기 (0) | 2023.07.16 |
---|---|
[Google Search Console] 색인생성 자동화 만들기 /구글서치콘솔 / Python (1) | 2023.07.12 |
[Git] git user name / email / password 기본정보 세팅하기 (0) | 2023.06.24 |
[javascript] 문자열을 숫자형으로 바꾸기 (0) | 2023.02.25 |
[svg] 개념과 도형의 기본이해하기 (0) | 2022.11.19 |