티스토리 뷰

1. 탈중앙화

- 은행의 모든 고객의 입출금 내역을 중앙에서 가지고 있는 방식이 중앙집중화 방식이다

- 중앙에 모든 리스크를 감수해야 하는 단점이 있다 

- 모든 유저들이 입출금 내역의 조각들을 가지고 있고 그것들을 모아서 유효성을 체크하는 방식

 

2. 해시를 이용한 무결성

- 블록체인은 해시의 무결성을 이용한 방법

- 블록안에 모든 정보를 바탕으로 해시를 생성한다

- 블록이 가진 정보에는 반드시 이전 블록의 해시도 가지고 있어야 한다.

 

3. 유효성 체크

- 어떤 블록 x 는 x가 가진 해시와 x가진 정보를 바탕으로 해시값을 계산했을 때 동일해야 한다.

> self.hash == self.cal_hash()

- 이전 블록의 cal_hash() 와 현재 블록이 가지고 있는 이전블록의 해시값은 값아야 한다.

 

4. 변조

- 기본적으로 블록들은 히스토리기 때문에 변경될 일은 없다.

- 변경된다면 유효성체크에서 통과하지 못할 것이다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

import hashlib
import datetime


class Block:
    __last_hash = None
    __next_index = 0

    def __init__(self, data=None):
        self.index = Block.__next_index
        self.timestamp = datetime.datetime.now()
        self.data = data
        self.prev_hash = Block.__last_hash
        self.hash = self.__cal_hash()
        Block.__next_index += 1
        Block.__last_hash = self.hash

    def __cal_hash(self, _hash="hash"):
        encodes = [str(value).encode() for key, value in list(self.__dict__.items()) if key != _hash]
        for encode in encodes:
            encodes[0] += encode
        return hashlib.sha256(encodes[0]).hexdigest()

    def __check_hash(self):
        return self.hash == self.__cal_hash()

    @classmethod
    def __compare(cls, cur, prev):
        if cur.prev_hash == prev.__cal_hash():
            return True
        return False

    @classmethod
    def is_valid(cls, chain):
        for i, block in enumerate(chain):
            if not block.__check_hash():
                return False
            if i:
                if not cls.__compare(chain[i], chain[i - 1]):
                    return False
        return True

    def __str__(self):
        return f"{self.__dict__}"


class BlockChain:
    def __init__(self, block):
        self.chain = list()
        self.__create_genesis(block)

    def __create_genesis(self, block):
        self.add(block)

    def add(self, block):
        self.chain.append(block)

    def __str__(self):
        return "\n".join(map(str, self.chain))


bk = BlockChain(Block())
for i in range(10):
    bk.add(Block(1))
print(bk)
print(Block.is_valid(bk.chain))
bk.chain[2].data = 2
print(Block.is_valid(bk.chain))

'python lecture > project' 카테고리의 다른 글

[python] 원소기호 맞추기  (0) 2020.05.09
[python] 주문시스템  (0) 2020.05.09
[python] 해시의 무결성  (0) 2020.05.07
[edu] 연락처 (class, 연산자 오버로드)  (0) 2020.03.16
[edu] pillow (영상 처리)  (0) 2019.03.19
댓글