파이썬으로 블록체인 만들기 Part 2

Min Seo Park
CAU_CLink
Published in
7 min readAug 6, 2018

원본은 https://hackernoon.com/learn-blockchains-by-building-one-117428612f46

원저자 : Daniel Van Flymen , https://twitter.com/van_flymen

part 1 에 이어서 계속 구현해 나가도록 하겠습니다.

Step 3 : 블록체인 시스템 상에서 거래하기

이제 우리가 구현한 API 로 거래를 진행해 보려고 한다. 클래식한 방법인 cURL을 쓸 수도 있고, Postman 을 사용해도 된다.

서버를 만든다 :

$ python blockchain.py* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

이제 GET 요청을 이용하여 블록을 채굴해보자

http://localhost:5000/mine
<New Block Forged 라는 메세지와 함께 블록이 채굴 되었다.>

transaction 으로는 오직 1개 밖에 없다. 왜냐하면 이 블록은 새로 채굴된 블록이기에 블록 채굴자에 대한 보상으로 발생한 거래 밖에 없기 때문이다. Part 1에서 잠깐 언급했듯이 보상에 대한 거래는 recipient 만 존재하고 sender 는 존재하지 않게 된다.

이번에는 새로운 거래를 기존에 정해놓은 거래의 형식에 맞추어 아래의 명령어를 사용하고 POST 요청을 통해서 만들어보자.

http://localhost:5000/transactions/new
<sender 와 recipient 의 주소를 넣어서 거래를 진행한다.>

만약에 Postman 을 이용하지 않는다면, 아래의 명령을 이용하여 똑같이 요청을 할 수 있다.

$ curl -X POST -H “Content-Type: application/json” -d’{
“sender” : “d4ee26eee15148ee92c6cd394edd974e”,
“recipient” : “someone-other-address”,
“amount” : 5
}’ “http://localhost:5000/transactions/new

거래 요청을 보낸 후에, 수번의 채굴을 다시 하고 난 후, 전체 체인을 http://localhost:5000/chain: 에 요청하여 살펴보자. 7번 블록의 transactions 부분에 거래 내역이 담겨 있음을 확인할 수 있다.

<7번 블록에 거래내역이 담겨있다.>

Step 4 : 합의 (Consensus)

이 부분이 많은 것들이 일어나는 부분이다. 우리는 이제 거래를 승낙하고 새로운 블록을 캘 수 있는 기본적인 블록체인을 갖게 되었다. 그런데, 블록체인에 있어서 가장 중요한 점은 ‘탈중앙화’ 되어야 한다는 것이다. 그리고 만약에 그것이 탈중앙화 되었다면 어떻게 우리가 모든 노드들이 같은 체인을 가지고 있는지 그리고 누구의 노드가 유효한 노드인지 확인할 수 있을까? 그 문제를 해결하는 것이 바로 ‘합의 알고리즘’ 이다.

새로운 노드 등록하기

합의 알고리즘을 적용하기 전에 우리는 네트워크에 있는 이웃 노드들이 누군지를 알아내는 방법이 필요하다. 우리 네트워크의 각 노드들은 네트워크 내 다른 노드들의 정보를 가지고 있어야 한다. 그러므로 우리는 몇가지 endpoint 들이 필요하다:

  • /nodes/register : URL 형태로 새로운 노드들을 등록하고 노드 리스트를 받아냄
  • /nodes/resolve : 가장 긴 체인을 가지고 있는 노드가 정확한 체인을 가지고 있다는 가정아래, 모든 분쟁을 해결할 수 있는 합의 알고리즘을 적용함

위의 2가지 기능을 이제 구현해 보자 :

set() 는 노드의 리스트를 포함하기 위해서 사용됨을 알 수 있다. 이것이 새로운 노드가 멱등원임을 보증하는 가장 쉬운 방법이다 - 즉, 아무리 많이 특정 노드를 더해도 오직 한번만 추가되어 나타난 다는 것이다.

합의 알고리즘 적용하기

Part 1에서도 잠깐 언급했다싶이, 한 노드가 다른 노드와 서로 각기 다른 체인을 가지고 있을 때, 이 문제를 해결하기 위해 가장 긴 검증된 체인이 권위적이다 라는 규칙을 만들자. 다르게 말하면, 네트워크의 가장 긴 체인이 사실상의 체인이라는 것이다. 이 알고리즘을 이용하면, 우리의 네트워크 내의 노드들 간 서로 다른 체인을 보유하고 있을 시 합의 할 수 있게 된다.

첫 번째 함수 valid_method() 는 노드가 보유하고 있는 체인이 유효한지를 체크하는 역할을 한다. ( 각각의 블록의 hash 와 proof 값이 맞는지를 확인하면서)

resolve_conflicts()는 모든 이웃 노드들로 하여금, 그들의 체인을 다운 받고 위의 규칙에 의거(가장 긴 체인이 맞는 체인이다)하여 유효한 체인(가장 긴 체인을 보유하고 있는지)인지를 확인하는 함수이다. 만약에 valid chain 이 우리의 것보다 더 길다면, 우리 것은 대체된다.

우리의 API 에 2개의 endpoint 를 등록하자, 하나는 이웃 노드들을 더하기 위함 다른 하나는 체인 길이가 서로 다를 때, 유효한 체인등록을 하여 모든 모드가 같은 체인을 갖게 하기 위함이다.

여기서 다른 기계를 사용해도 되고 그냥 하나의 네트워크에서 여러 노드들을 돌아가게 해도 된다. nodes/register을 통하여 다른 노드들을 등록한다. 필자는 3개의 노드를 돌리고 있었으므로, 5000번에 5001, 5002 번을 등록하였다. (5001, 5002번에도 똑같이 해준다.)

<New nodes have been added 라는 메세지와 함께 이웃노드로서 등록된다.>

1번째 노드(5000번) 에서 새로운 블록들을 많이 채굴한다, 그리고 이 체인이 2,3(5001, 5002번)번째 보다 더 긴 것임을 확인한다.

그런 후에, GET/nodes/resolve을 사용하여 컨센서스 알고리즘에 의해서 체인이 대체될 2,3번 노드에서 요청한다.

<”Our chain was replaced” 라는 메세지와 함께 체인이 교체되었다.>

더 짧은 체인을 가지고 있었던 5002번의 체인은 교체가 되고 Our chain was replaced 라는 메세지와 함께 체인이 바뀌게 된다.
(필자가 글을 쓰면서 이것저것 많이 시도해봤었기 때문에, 모든 스크린샷이 하나의 상황을 대표하고 있다고는 할 수없다. 하지만, 이웃 노드들 보다 더 짧은 체인을 가지고 있는 노드가 체인을 더 긴 것으로 교체하는 상황임은 잘 알 수있다.)

위의 튜토리얼을 그대로 따라해보고 연습한다면, 블록체인을 이해하고 추가로 개발하는데 있어서 훨씬 편해질 것이다. 본 게시물에서 보여지는 블록체인은 Bitcoin 계열의 블록체인이고 그 구현과정에서 보여지는 기능이 모두 Bitcoin 에도 있다는 것을 알 수 있다.

물론, 위의 블록체인이 완벽하다고 할 수는 없다. 예를 들면, merkle tree 구조나 난이도 조정 문제 잔고에 따른 거래 거부 등은 포함하고 있지 않다. 하지만, 본 게시물만큼 직관적이고 기본적이면서 강력한 게시물은 찾기 힘들 것이라고 자신 할 수 있다.

다시 한번, 번역하여 재배포를 허락해준 원 저자 Daniel Van Flymen , https://twitter.com/van_flymen 에게 감사하다는 말을 전하고 싶다.

본 블록체인에 대한 구현 동영상 강의도 중앙대학교 블록체인 학회 C-Link 의 페이스북 페이지, 미디엄 그리고 유투브 채널에 올라갈 것이다. 글을 보고 이해가 안된 부분은 동영상을 보면서 보완할 수 있을 것이다.

자바스크립트로 블록체인 만들기 시리즈는 아래에서 볼 수 있습니다
Javascript 로 블록체인 만들기

--

--

Min Seo Park
CAU_CLink

Interested in Blockchain, Project Financing and Smart city and Love DJing and EDM