SSAFY

[SSAFY] 블록체인 기본 개념 구현 및 해쉬의 이해

황성안 2021. 7. 12. 23:58
728x90

Block Chain

간단한 블록 체인 기술 경험해보기.

어떤 값을 넣더라도 hash 함수를 사용한 데이터를 만들어내는 함수를 오늘 만들어볼 예정입니다.

즉, 요즘 많이 알고계시는 비트코인, 이더리움 등의 기술을 쉽게 맛보기로 구현해보는 거라고 생각하시면될것같습니다!

단, hash 값이 암호화랑은 다릅니다. 암호화는 풀수가있지만.. 이런 hash값은 그냥 그 hash 값 자체입니다.

순서

  1. 블록의 출발점 만들기
    • 이를 Genesis Block 이라 명합니다. (씨앗 블록)
  2. 마이닝을 하도록 특정한 문제를 쥐어줍니다.
    • 과제에서는 0이 5개이상부터 취급해라했음!
    • 최소 기본 블록 데이터, 이전 해쉬값, 이후 나올 해쉬값을 나오게하는 변수는 최소 모델로 이루어져야한다.
  3. 코딩해보리기
    • 블록 클래스와 체인 클래스를 구현
      • hash는 python 라이브러리(hashlib- sha256) 사용

참고 : https://m.blog.naver.com/rkdudwl/221859815337

 

import hashlib
import time
import json

class Block():
    def __init__(self, index, timestamp, data):
        self.index = index
        self.timestamp = timestamp
        self.data = data
        self.previousHash = 0
        self.nonce = 0
        self.hash = self.calHash()

    def calHash(self):
        return hashlib.sha256(str(self.index).encode() + str(self.data).encode() +
                            str(self.nonce).encode() + str(self.timestamp).encode() + str(self.previousHash).encode()).hexdigest()

    def mine(self, difficulty):
        ans = ["0"]*difficulty
        answer = "".join(ans)
        while(str(self.hash)[:difficulty] != answer):
            self.nonce += 1
            self.hash = self.calHash()

        return self.hash


class BlockChain:
    def __init__(self, ):
        self.chain = []
        self.difficulty = 5
        self.createGenesis()

    def createGenesis(self):
        self.chain.append(Block(0, time.time(), 'Genesis Block'))

    def addBlock(self, nBlock):
        nBlock.previousHash = self.chain[len(self.chain)-1].hash
        nBlock.hash = nBlock.mine(self.difficulty)
        self.chain.append(nBlock)

    def getLatestBlock(self):
        return self.chain[len(self.chain)-1]

    def isValid(self):
        i = 1
        while(i<len(self.chain)):
            if(self.chain[i].hash != self.chain[i].calHash()):

                return False
            if(self.chain[i].previousHash != self.chain[i-1].hash):

                return False
            i += 1
        return True

onion = BlockChain()
onion.addBlock(Block(len(onion.chain),time.time(), "2nd"))
onion.addBlock(Block(len(onion.chain),time.time(), "3rd"))
onion.addBlock(Block(len(onion.chain),time.time(), "4rd"))
onion.addBlock(Block(len(onion.chain),time.time(), "5rd"))
for block in onion.chain:
    print(json.dumps(vars(block), indent=4))

 

심화과제

현재 hash 함수를 이용하는 사례

  • 배포한 소프트웨어의 불법적인 변경 여부를 점검하는 로직으로 사용합니다. CRC > HASH 함수로 발전하였음

  • 패스워드를 기초로한 암호화로

  • 메시지 인증코드

  • 디지털 서명 - Message Digest를 암호화하여 송수신으로 무결성 및 인증을 수행합니다.

  • Data De-duplication - cloud 데이터 저장공간을 확보하는 기술로 존재하는 파일인지 여부를 hash 값을 통해 검증

  • AWS, google 등 cloud 에서 고객 관리 암호화 키로 사용

728x90