관리 메뉴

개발이야기

[Blockchain core] 블록체인 코어 개발 - Basic 본문

블록체인 /블록체인 개발

[Blockchain core] 블록체인 코어 개발 - Basic

안성주지몬 2018. 6. 16. 23:01

이번 포스팅은 https://hackernoon.com/learn-blockchains-by-building-one-117428612f46  을 바탕으로 작성하였습니다. 또한 이번 포스팅에서 사용하는 코드는 https://github.com/dvf/blockchain/blob/master/blockchain.py  에서 확인할 수 있습니다.



new_block

먼저 블록체인을 구성하는 새로운 블록이 어떻게 생성되는지 확인해보자.


























코드에서 블록 정보를 담는 block 변수를 자세하게 살펴보자.










코드를 통해서 알 수 있듯이 블록에는 index, timestamp, transactions, proof, previous_hash 변수가 포함되어 있다.
index는 블록의 인덱스값 , 즉 몇 번째 블록인지 알려주는 변수이다. chain 길이에 +1 을 해서 인덱스 값을 정해준다. timestamp는 블록이 생성되는 시간을 의미하고. python에 time함수를 이용한다. transactions 변수는 거래를 의미하며, current_transactions 변수의 값을 넣어준다. proof 는 추후 살펴볼 proof_of_work 함수를 통과했다면 proof 는 1이상을 가진다. 즉 작업 증명을 통해 블록에 대한 증명이 되었는가를 확인해준다. previous_hash 는 자신 이전 블록 해쉬값을 가지며, previous_hash에 값이 없다면 자신 이전의 index 블록의 해시값을 넣어준다. 

블록의 알맞은 변수값들을 넣어주고 current_transaction에 값을 다시 초기화 시켜준다. 이후 chain의 append를 이용하여 chain에 블록을 연결해준다. 


new_transaction

그렇다면 새로운 거래를 어떻게 추가해줄 수 있을까. 


















new_transaction은 특별한 것 없이 거래 정보를 current_transactions 에 append 해준다.
이 코드에서 부족한 부분은  amount에 대한 타당성을 확인하는 코드가 없다는 것이다. 나중에 추가를 해주어야할 부분이다.

genesis block

첫번째 블록, 시작 블록인 genesis block은 어떻게 생성될까












계속 등장하는 current_transactions 은 트랜잭션을 모아두는 임시풀이고, chain은 chain들을 모아둔다.


hash

블록체인에 등장하는 sha256함수를 생성하는 함수이다. 












json.dumps 는 인자를 스트링화해서 넘겨준다. 파라미터중 sort_keys=True는 딕셔너리 자료형은 순서가 없기 때문에 순서가 섞이는 것을 방지하기 위해 넣어준다. 이후 hashlib에 sha256 매서드를 사용하여 sha256값을 반환해준다. 

valid_proof

Proof_of_Work (PoW)는 작업을 통해 새로운 블록을 검증한다. 여기서 말하는 작업은 임의의 sha256해시값 보다 작은 값을 찾는 과정이다. 그렇다면 임의의 해시값은 코드로 어떻게 구성되어있을까





코드에서 보면 guess_hash 는 임의의 sha256 해시값이다. 이때 반환해주는 부분에서 앞의 4자리를 "0000"으로 바꿔서 반환을 해준다. 이 "0000"이 작업에 대한 난이도를 나타낸다. 0이 많아질 수록 난이도가 올라간다. sha256은 임의로 나오는 값으로 앞자리가 0이 많아질 수록 찾기가 어려워지기 때문이다. 비트코인은 평균 10분마다 블록이 생성되게 하는데 이는 난이도 조정을 통해서 이뤄진다. 비트코인은 2016개의 새로운 블록이 생길때마다 난이도를 조절하는데. 2016개의 블록이 2주 생기도록 사토시는 설계를 하였다. 만약 2016개의 블록이 2주보다 늦게 생성이 되었다면 난이도가 높다는 것으로 난이도를 낮추고 2주보다 빨리 생성되었다면 난이도가 낮다는 것으로 난이도를 높인다. 이 코드에서는 이런 난이도를 조절하는 부분이 없으며 코드를 수정정하거나 추가해야한다.

register_node

아래 코드에서 node는 무엇을 의미하는 것일까. 









노드의 진짜 주소는 노드의 ip + 포트번호로 이뤄진다. 









valid_chain

블록체인을 검증하는 코드는 어떻게 구성되어 있을까 
















genesis block부터 검증을 하므로 last_block은 chain[0]의 값을 가진다. 즉 genesis block을 나타낸다. 
valid chain은 모든 체인을 검증한다. 





 block[‘previous_hash’] != self.hash(last_block) 내가 계산한값과 이전 블록해쉬의 값이 다르거나 위조 된경우 네트워크상에서 문제가 발생한 경우를 의미한다. 

resolve_conflicts

블록체인 상에서 발생할 수 있는 문제를 해결하는 코드이다. 
























이웃들의 정보 neighbours 노드의 값들이 저장되어 있다. 
Max_length = 체인의 길이를 의미한다. 
Response = request.get(-) 노드의 주소 받기 위함이다.
Response.status_cod == 200: http 200 은 제대로 잘 받았다는 것을 의미한다.
 
If length > max_length 부분은 가장 긴 체인을 인정해 주는 부분.



New_chain이 업데이트가 안됐으면 none 인 상태 none이면 false,
True이면 new_chain이 업데이트 되었다는 것을 의미한다. 

짧게나마 블록체인 코어 소스를 보았다. 추가해야하고 보완해야될 부분을 다시 정리해보면.
1. 트랜잭션의 amount 검증
2. 난이도 조절
3. 트랜잭션이 리스트 자료형으로 되어있지만 머클트리 자료형으로 바꿔야 한다.


Comments