티스토리 뷰
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 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Python
- 면접정답
- 문과 코딩
- 모바일 스킨 적용
- virtualenv
- 모바일 테마 적용
- 장고
- Tistory
- django
- wsgi
- 파이썬 강좌
- 파이썬 프로그래밍
- 면접답변
- 파이썬 독학
- PuTTYGen
- 문서 비교
- 엑셀 비교
- 파이썬 입문
- 플러스친구 자동응답
- admin.py
- pycrypto
- chatbot
- 장고 플러스친구 자동응답
- gitlab
- gitignore
- 장고 카톡 자동응답
- django chatbot
- 이미지 비교
- 파이썬
- GIT
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함