대학생 서포터즈

파이썬으로 구현해본 블록체인

작성자
청연
작성일
2018-07-23 17:44
조회
721

파이썬으로 구현해본 블록체인


2018년 7월 20일, 양재R&CD 혁신허브에서 제 2회 AI혁신포럼인 아이포닷 블록체인이 열렸습니다. 이번 AI혁신포럼에서는 오전에는 세션 1 ‘블록체인, 서울에 가다’, 오후에는 세션 2 ‘서울에 온 블록체인, AI를 만나다’로 나눠 진행되었습니다.



2016년 다보스포럼에서 제 4차 산업혁명을 이끌어 갈 기술 중 하나로 블록체인을 선정하였습니다. 불과 몇 개월 전까지만해도 우리나라를 비롯한 전 세계에서 가상화폐와 블록체인에 투자 열풍이 불었습니다. 보안성과 투명성을 동시에 지닌 블록체인은 주식시장, 해외송금, 결제 서비스에서부터 국제 물류, 제조, 사회 문화 영역에까지 적용 가능한 분야가 무궁무진합니다. 특히 에스토니아에서는 블록체인 기술을 통해 신원관리, 전자 투표, 전자 건강 기록을 관리하고, 이어서 최근에는 국가 차원에서의 가상화폐 발행도 검토하고 있다고 합니다.



출처 : http://www.bitweb.co.kr/news/view.php?idx=638

발전 가능성이 무궁무진한 블록체인, 간단하게 파이썬으로 구현해봅시다!
import hashlib as haser
import datetime as date

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

def hash_block(self):
sha = haser.sha256()
sha.update((str(self.index) +
str(self.timestamp) +
str(self.data) +
str(self.previous_hash)).encode())
return sha.hexdigest()
먼저 블록체인의 블록을 정의해봅시다.

블록은 Block 클래스를 통해 타임스탬프와 선택적 인덱스를 넣어 만듭니다.
Block(index, timestamp, data, hash)
또한 블록체인의 무결성을 보장하기 위해 각 블록에서는 자체 식별 hash가 있습니다.

hash는 문자열을 쪼개서 일정한 키값으로 변환하는 것을 말합니다.

비트코인과 같이 각 블록의 hash는 블록의 인덱스 , 타임스탬프, 데이터 및 이전블록 hash의 hash를 암호화 하는 hash입니다.

비트코인에서 사용하는 sha256방식의 hash는 항상 256bit크기의 값을 가지게 됩니다.

이 hash의 특징은 어떠한 문자열이라도 256bit의 키로 나옵니다.

  • haser.sha256() : sha256 hash를 만들어줍니다.

  • sha.update() : 우리가 인자로 넣은 index, timestamp, data, previous_hash값을 가지고 새로운 hash값을 들어줍니다.

  • sha.hexdigest() : 위에서 만든 hash값을 16진수로 만듭니다. 이 값은 숫자가 아니라 문자열입니다.


def create_genesis_block():
return Block(0, date.datetime.now(), "Genesis Block", "0")
그렇다면 기반이 되는 첫번째 블록, 기원블록(genesis block)은 어디에 위치할까요?

기원 블록은 일반적인 블록들과 다른 특별한 블록입니다. 그래서 보통 수동으로 추가하거나 고유 로직을 사용하여 추가합니다. 우리는 간단하게 쉽게 기원블록을 반환하는 함수 create_genesis_block()을 통해 임의의 값을 반환하겠습니다.
def next_block(last_block):
this_index = last_block.index + 1
this_timestamp = date.datetime.now()
this_data = "Hey!  I'm block " + str(this_index)
this_hash = last_block.hash
return Block(this_index, this_timestamp, this_data, this_hash)
이제 기원블록에 이을 블록을 생성하는 함수를 만들어보겠습니다. 다음 블록을 만들 때는 이전의 블록을 매개 변수로 사용하여 새로 생성될 블록의 데이터를 만드는 구조입니다. 우리는 이러한 구조를 사용하여 과거정보 수정으로 인한 위험을 이겨낼 수 있습니다.
blockchain = [create_genesis_block()]
previous_block = blockchain[0]

num_of_blocks_to_add = 20

for i in range(0, num_of_blocks_to_add) :
block_to_add = next_block(previous_block)
blockchain.append(block_to_add)
previous_block = block_to_add

print("Block #{} has been added to the blockchain!".format(block_to_add.index))
print("Hash : {}\n".format(block_to_add.hash))
위 코드를 작성하면 간단한 블록체인을 만들 수 있게되고 아래와 같은 결과값을 볼 수 있습니다.
Block #1 has been added to the blockchain!
Hash : d02459692124d782ba2bae00775ed347bb3f0aa35cec1bc82763f2017ed3be78

Block #2 has been added to the blockchain!
Hash : 5564c90cff9278b7160f39701897b2ad0a4ec337050ff438894d2569518e0620



Block #19 has been added to the blockchain!
Hash : 76c8d6456a4027837cbbc3a2028527b2d0970702fa84cd564c6edbda76c789a2

Block #20 has been added to the blockchain!
Hash : 48668144231aa3fe8e1506f6a03ffa011236495788fa3cfbffb62935179b0329
이번 포럼에서 블록체인에 대해서 자세히 알 수 있어서 정말 좋았습니다. 또한 인공지능에 블록체인이 어떤 좋은 영향을 줄 수 있을지도 생각해 볼 수 있는 시간이었습니다. 인공지능에서 데이터는 굉장히 중요 요소입니다. 하지만 잘못된 데이터로 인해 인공지능의 정확도는 떨어지는 한계가 있는데 ,이런 한계를 블록체인의 기술을 통해 해결할 수 있다는 사실이 흥미로웠습니다. 인공지능을 잘 개발하기 위해서 블록체인에 대한 공부도 해보는 것도 좋을 것 같습니다.

2018. 7. 23.

취재 : 최유진 기자(barbby20@naver.com),    편집 : 이탁연 연구원
전체 0