가볍게만 이해하는 블록체인과 해쉬

이해하기 쉽고, 장황하지 않은 자료를 기반으로 강의를 진행합니다.
잔재미코딩 소식 공유
좀더 제약없이, IT 컨텐츠를 공유하고자, 자체 온라인 사이트와, 다음 두 채널도 오픈하였습니다
응원해주시면, 곧 좋은 컨텐츠를 만들어서 공유하겠습니다
●  잔재미코딩 뉴스레터 오픈 [구독해보기]
●  잔재미코딩 유투브 오픈 [구독해보기]

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

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

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를 가짐
  • 각 블록의 해시는 블록의 인덱스, 타임스탬프, 데이터 및 이전블록 해시의 해시를 암호화 하는 해시
    • 데이터는 원하는 어떤 데이터이든 가능함
본 자료와 같이 IT 기술을 잘 정리하여, 온라인 강의로 제공하고 있습니다
체계적으로 전문가 레벨까지 익힐 수 있도록 온라인 강의 로드맵을 제공합니다
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)
본 자료와 같이 IT 기술을 잘 정리하여, 온라인 강의로 제공하고 있습니다
가장 빠르게 풀스택 개발자가 될 수 있도록, 최적화된 로드맵을 제공합니다
  • 블록체인 첫번째 블록 만들어보기
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
본 자료와 같이 IT 기술을 잘 정리하여, 온라인 강의로 제공하고 있습니다
체계적으로 전문가 레벨까지 익힐 수 있도록 온라인 강의 로드맵을 제공합니다
프로그래밍 연습
위 코드를 기반으로 다음과 같은 데이터를 가진 블록체인 리스트 만들 수 있도록 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)은 순서를 거꾸로 읽어도 제대로 읽은 것과 같은 단어와 문장을 의미함
스택과 큐를 사용해서 회문을 판별하는 함수를 만드세요 No description has been provided for this image
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(남에게 설명하면, 자신이 배운답니다.!)
다음 엑셀 파일에서 이름과 나이를 사전 변수에 넣고, 이름을 입력하면 나이를 알려주는 프로그램 만들기
본 자료와 같이 IT 기술을 잘 정리하여, 온라인 강의로 제공하고 있습니다
가장 빠르게 풀스택 개발자가 될 수 있도록, 최적화된 로드맵을 제공합니다
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 이라는 쉬트를 만들고 넣기