Hubeen's Home

2018/02 1건이 검색되었습니다.

안녕하세요.


저는 공주대학교 컴퓨터공학부 컴퓨터소프트웨어전공 17학번 문승현입니다.


현재 블록체인 기술에 대해 공부를 하여 공부한 내용을 정리하고자 게시글을 작성하였습니다.


미리 읽어주시는 분들께 감사하며 잘못된 지식이 있을 경우 마음 편하게 피드백주시면 감사하겠습니다.


현재 게시글에 대한 깃허브는 아래에 주소를 기입하도록 하겠습니다.


https://github.com/schedutron/SnakeCoin


블록 내부 구조


 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 __str__(self):
        return 'Block #{}'.format(self.index)

    def hash_block(self):
        sha = hasher.sha256()
        seq = (str(x) for x in (
               self.index, self.timestamp, self.data, self.previous_hash))
        sha.update(''.join(seq).encode('utf-8'))
        return sha.hexdigest()


index : 현재 블록의 위치 (첫 블록 0)

timestamp : 블록이 생성된 시간

data : 블록체인에 포함하고자 하는 데이터

previous_hash = 이전 블록의 해쉬

hash : sha256으로 index + timestamp + data + previous_hash들을 암호화함


함수 분석

* 현재 저는 깃허브에 올라와있는 코드들을 한 곳으로 모아놨으므로 깃허브와 함수 이름 혹은 코드가 다를 수 있습니다.


 
 def make_genesis_block():
    """Make the first block in a block-chain."""
    block = Block(index=0,
                  timestamp=datetime.now(),
                  data="Genesis Block",
                  previous_hash="0")
    return block

make_genesis_block()

위의 함수는 코드를 보시면 아시겠지만 index를 0으로 설정하여 현재 시간과 데이터는 Genesis Block 이라는 문장과 이전 해쉬가 없기때문에 0으로 설정되어 블록이 생성되는 것을 볼 수 있습니다.

첫번째 블록을 만드는 함수라는 것을 알 수 있습니다.



def next_block(last_block, data=''): """Return next block in a block chain.""" idx = last_block.index + 1 block = Block(index=idx,

timestamp=datetime.now(),

data='{}{}'.format(data, idx),

previous_hash=last_block.hash)

return block

next_block(last_block, data='')

인자는 2개로 하나는 이전 블록을 넘겨받으며, 새로 추가할 데이터를 받는 것을 볼 수 있습니다.

idx 는 이전 블록의 인덱스 +1 을 한 값으로 설정된 뒤에 인덱스를 넣으며 새로운 블럭이 생성되는 것을 볼 수 있습니다.

그렇습니다.

이전 블럭을 받아 새로운 블럭을 만드는 함수라는 것을 알 수 있었습니다.



채굴 알고리즘

처음에 블록체인을 공부하다 채굴이라는 개념을 잡기가 많이 어려웠습니다.

멘토님에게 질문을 드렸는데

새로운 블럭을 생성하는 것이 채굴이라는 것을 알게 되었다.


그렇다 이 코드에서 채굴 알고리즘은 있지 않다.


이쯤에서 채굴이 무엇인지 Araboza.


채굴

* 채굴 필요성

   - 공급자 역할

   - 수요공급법칙

* 작업 증명 : (Proof of Work) 

   - 작업 증명은 새로운 블록을 블록체인에 추가하는 ‘작업’을 증명한다는 것이라고 한다.


그렇다면 현재보다 채굴의 난이도를 올리는 방법은 무엇이 있을까?


뭐 딜레이를 줘서 간단하게 난이도를 올리는 방법과 암호화 알고리즘들을 사용하여 브루트포싱 기법으로 때려맞춰서 난이도를 올리는 방법들이 있다고 합니다!


필자는 후자의 방법을 사용하였습니다.


코드는 아래와 같습니다.




 
 def next_block(last_block, data, i):
    """Return next block in a block chain."""
    sw = False
    while(sw == False):
        print("mining...")
        if(base64.b64encode(str(i)) == base64.b64encode(str(random.randrange(0, i+1)))):
            sw = True;
        else:
            sw = False;

    if(sw):
        idx = last_block.index + 1
        block = Block(index=idx, timestamp=datetime.now(), data='{}{}'.format(data, idx),previous_hash=last_block.hash)

    return block


간단한 코드로써 브루트 포싱으로 채굴을 하게 해보았다.

random 함수로 n번째로 생성되는 블럭의 n을 암호화한 값을 랜덤으로 초이스하여 때려맞추는 브루트 포싱으로 채굴되게 해보았다.



난이도는 채굴이 된 블럭 수 만큼 증가하는 것을 볼 수 있었다.


이것에 대해 더 채굴 난이도를 올리고자하면 많은 코인들이 사용하는 암호화 알고리즘을 이용하여 코드를 작성한다면 난이도는 많이 올를 것이라는 것을 알게 되었다.


'0x30 Study > 0x32 Blockchain' 카테고리의 다른 글

g-coin 분석(2)  (2) 2018.03.05
g-coin 분석(1)  (1) 2018.03.03
g-coin 분석(0)  (0) 2018.03.01
BlockChain을 공부하자! (0)  (0) 2018.02.28

댓글 0