파이썬과 컴퓨터 사이언스(데이터 구조) - 가볍게만 이해하는 블록체인과 해쉬 (해쉬의 예)

7. 가볍게만 이해하는 블록체인과 해쉬 (해쉬의 예)

새로운 해쉬값은 이전 해쉬값을 해슁한 값

In [161]:
import hashlib

data = b'Hello World'
hash_object = hashlib.sha256()                      # 어떤 해쉬 알고리즘 쓸래?
hash_object.update(data)                            # 어떤 값을 해슁할 것인가?
hex_dig = hash_object.hexdigest()                   # 16진수로 해쉬값을 리턴해줌
print(hex_dig)
a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e
In [162]:
hash_object.update(hex_dig.encode())                # 어떤 값을 해슁할 것인가?
hex_dig = hash_object.hexdigest()                   # 16진수로 해쉬값을 리턴해줌
print(hex_dig)
4afe87d29d3d489242643c9a25f2de654c5a9bacb627b4688af3fefbee064aa4
In [163]:
hash_object.update(hex_dig.encode())                            # 어떤 값을 해슁할 것인가?
hex_dig = hash_object.hexdigest()                   # 16진수로 해쉬값을 리턴해줌
print(hex_dig)
6d373c6397a08bebd16b14d282368127b1fee2232e82a6076a8919b20a64cdd8
  • 하나의 블록은 index, timestamp, data, prev_hash를 가짐
  • 각 블록의 해시는 블록의 인덱스, 타임스탬프, 데이터 및 이전블록 해시의 해시를 암호화 하는 해시
    • 데이터는 원하는 어떤 데이터이든 가능함
In [192]:
import hashlib

class Block:
    def __init__(self, index, timestamp, data, prev_hash):
        self.index = index
        self.timestamp = timestamp
        self.data = data
        self.prev_hash = prev_hash
        self.hash = self.hash_block()

    def hash_block(self):
        hash_object = hashlib.sha256()
        hash_data = str(self.index) + str(self.timestamp) + str(self.data) + str(self.prev_hash)
        hash_object.update(hash_data.encode())
        return hash_object.hexdigest()
  • 각 블록은 이전 블록에 대한 정보를 위해 이전 블록까지를 대표하는 prev_hash 를 가져옴
    • 그러면 첫번째 블록은 어떻게 prev_hash를?
    • 첫번째 블록(genesis block)은 특별한 로직이든, 직접 만들든 한다.
In [193]:
import datetime

def create_genesis_block():
    return Block(0, datetime.datetime.now(), "Genesis Block", "0")


  • 블록체인은 기존 블록을 기반으로 새로운 블록을 만들어냄
In [194]:
def next_block(prev_block):
    index = prev_block.index + 1
    timestamp = datetime.datetime.now()
    data = "Dave Block" + str(index)
    return Block(index, timestamp, data, prev_block.hash)
  • 블록체인 첫번째 블록 만들어보기
In [195]:
blockchain = [create_genesis_block()]
prev_block = blockchain[0]
  • 리스트변수로 블록체인 여러 블록 체인으로 만들어보기
In [133]:
for index in range(10):
    new_block = next_block(prev_block)
    blockchain.append(new_block)
    prev_block = new_block
    
    print ("Block Index: " + str(new_block.index))
    print ("Hash Value: " + str(new_block.hash))    
Block Index: 11
Hash Value: 9d57d5c2d36a4dcb3969eab7e5ab31402b0cc68b4484f03a3cf20dd8c8b7825d
Block Index: 12
Hash Value: 70553d821c112cb745af81358acb7859b384e410134b3f452ec5e730bd6ac848
Block Index: 13
Hash Value: 627987b3769ff1d2fe27d4e52b4cb09f9e22f367a6f8377c63b9541e829114d3
Block Index: 14
Hash Value: e169b46fbb903e5106fea45cb75a54f9af6dc29b7acd96c9d32c6260095639be
Block Index: 15
Hash Value: 37548409eae87307f398804e4f6bdf5d7125891768f77cca0035b05141dc2a9f
Block Index: 16
Hash Value: b9a9768ff4329a877e3aca1b06431fbbe5f0d100a977888fdcef0f838fee2f89
Block Index: 17
Hash Value: 13a4928e22180d92675064c686cc0a8f4cfb7284ba91af94e4a29159bef169a7
Block Index: 18
Hash Value: e973e3aedfc03551103a7ab2c923dd70b19d967912493384968ba79fe581989e
Block Index: 19
Hash Value: 2f1a19c32a899fa852bedafed3c992db85102e07def5972d0e8e417ddf36bd1d
Block Index: 20
Hash Value: dd06d5b8e2a3d3058815ad048f3041fca6c06c52c3b2b26a24e3a9c2eb4b4deb
프로그래밍 연습
위 코드를 기반으로 다음과 같은 데이터를 가진 블록체인 리스트 만들 수 있도록 next_block 코드 수정해보기
Block Index: 1
data = 
{
    "seller": "Dave",
    "buyer": "David",
    "amount": 100
}
Block Index: 2
data = 
{
    "seller": "David",
    "buyer": "Alex",
    "amount": 120
}
Block Index: 3
data = 
{
    "seller": "Alex",
    "buyer": "Mike",
    "amount": 150
}


In [196]:
def next_block(prev_block, data):
    index = prev_block.index + 1
    timestamp = datetime.datetime.now()
    return Block(index, timestamp, data, prev_block.hash)

data = { "seller": "Dave", "buyer": "David", "amount": 100 }
new_block = next_block(prev_block, data)
blockchain.append(new_block)
prev_block = new_block

data = { "seller": "David", "buyer": "Alex", "amount": 120 }
new_block = next_block(prev_block, data)
blockchain.append(new_block)
prev_block = new_block

data = { "seller": "Alex", "buyer": "Mike", "amount": 150 }
new_block = next_block(prev_block, data)
blockchain.append(new_block)
prev_block = new_block

block = blockchain[1]
block.data
협업 과제1(남에게 설명하면, 자신이 배운답니다.!)
회문(palindrome)은 순서를 거꾸로 읽어도 제대로 읽은 것과 같은 단어와 문장을 의미함
스택과 큐를 사용해서 회문을 판별하는 함수를 만드세요
string을 stack에 넣으면 맨 마지막에 넣은 것부터 가져올 수 있음
string을 queue(FIFO)에 넣으면 맨 처음 넣은 넣은 것부터 가져올 수 있음
string을 stack과 queue(FIFO) 에 일단 넣은 후에, 각각 하나씩 꺼내어 비교하면 위 코드가 가능함
In [212]:
import queue

def palidrome(string):
    data_list = list()
    data_queue = queue.Queue()
    
    for index in range(len(string)):
        data_list.append(string[index])
        data_queue.put(string[index])

    for index in range(len(string) // 2):
        data1 = data_list.pop()
        data2 = data_queue.get()
        print (data1, data2)
        if data1 != data2:
            return False
    return True

print (palidrome('arstsra'))
a a
r r
s s
True
협업 과제2(남에게 설명하면, 자신이 배운답니다.!)
다음 엑셀 파일에서 이름과 나이를 사전 변수에 넣고, 이름을 입력하면 나이를 알려주는 프로그램 만들기
In [166]:
import openpyxl
 
# 엑셀파일 열기
wb = openpyxl.load_workbook('data/train.xlsx')
 
# 현재 Active Sheet 얻기
ws = wb.active
# ws = wb.get_sheet_by_name("Sheet1")
name_list = dict()
for r in ws.rows:
    name_list[r[3].value] = r[5].value
    #if name[0] == 'F':
    #    ws.cell(row=r[0].row, column=2).value = 'F'
    # ws.cell(row=row_index, column=5).value = sum

print(name_list['Connolly, Miss. Kate'])
# 엑셀 파일 저장
# wb.save("score2.xlsx")
wb.close()
22
협업 과제3(남에게 설명하면, 자신이 배운답니다.!)
위 코드에서 스택 구조를 만들고, 남자만 이름을 넣은 후에, male 이라는 쉬트를 만들고 넣기
In [ ]: