[번역]A blockchain in 200 lines of code

Yungyikim   2017-11-15   추천:0   반대:0
원문: A blockchain in 200 lines of code

블록체인의 기본 컨셉은 매우 단순하다: 지속적으로 증가하는 정렬된 레코드를 유지 관리하는 분산 데이터베이스이다.

“블록체인”이라는 용어는 일반적으로 트랜젝션, 스마트 컨트렉트 또는 암호 화폐와 밀접한 관련이 있다. 이로인해 블록체인에 대해 이야기 할 때는 필연적으로 블록 체인 기반의 인기있는 프로젝트인 Bitcoin과 Ethereum에 대해 이야기를 하게 되고 보통은 혼란을 주게 된다.

이것은 필연적으로 블록체인을 이해하는 것에 어려움을 준다. 여기서는 NaiveChain이라는 자바스크립트 200라인으로 구현 한 매우 간단한 블록체인을 살펴볼 것이다.

Block structure

첫 번째 논리적 단계는 블록 구조를 결정하는 것이다. 가능한 구조를 간단하게 하기 위해서 필수 요소만을 포함한다: index, timestamp, data, hash and previous hash.


체인의 무결성을 유지하려면 블록에서 이전 블록의 해시를 찾아야 한다.

Block hash

블록은 데이터 무결성을 유지하기 위해서 해시(해시값 생성) 되어야 한다. SHA-256은 블록의 내용을 대신한다. 작업 증명(Proof of Work)은 빠져있기 때문에 해당 해시값은 마이닝(mining)과는 아무 관련이 없다.

Generating a block

블록을 생성하기 위해서는 이전 블록의 해시값을 알아야하고 필요한 나머지 내용(=index, hash, data and timestamp)를 만들어야 한다. 블록 데이터는 최종 사용자가 제공하는 데이터이다.

Storing the blocks

블록체인을 저장하는데는 인-메모리 자바스크립트 배열이 사용된다. 블록체인의 첫 번째 블록은 “genesis-block”이라 호칭되는 하드코딩된 블록이 사용된다.

Validating the integrity of blocks

다른 노드에서 새 블록을 수신 할 때 이를 받아들이는지 여부를 결정하기 위해서 블록 또는 블록의 체인이 무결성 측면에서 유효한지 검증 할 수 있어야한다.

Choosing the longest chain

주어진 시간에 체인에는 블록의 세트가 항상 하나만 존재해야 한다. 충돌한 경우(예를 들어, 두 개의 노드가 모두 블록 번호 72를 생성) 가장 긴 블록의 세트를 가진 체인을 선택한다.


Communicating with other nodes

노드의 필수적인 부분은 블록체인을 다른 노드와 공유하고 동기화하는 것이다. 다음 규칙은 네트워크를 동기화 상태로 유지하는데 사용한다.

  • 노드가 새로운 블록을 생성하면 네트워크로 브로드캐스트 한다.
  • 노드가 새로운 피어에 연결하면 최신 블록을 쿼리한다.
  • 노드가 현재 알려진 블록보다 큰 인덱스를 가진 블록을 만났을 때, 블록을 현재 체인으로 추가하거나 전체 블록 체인에 대해 쿼리를 추가한다.


다음은 노드가 기술된 프로토콜을 따를 때 발생하는 몇 가지 일반적인 통신 시나리오를 보여 준다.

자동으로 피어를 발견하는 기능은 사용하지 않는다. 피어의 위치(=URLs)는 수동으로 추가해야 한다.

Controlling the node

사용자는 어떤 방식으로든 노드를 제어 할 수 있어야 한다. 이것은 HTTP 서버를 설정하여 수행된다.

위에서 볼 수 있듯이 사용자는 다음과 같은 방법으로 노드와 상호 작용할 수 있다.

  • 전체 블록 조회
  • 사용자가 지정한 내뇽으로 새 블록 생성
  • 피어 목록 조회 또는 추가

노드를 제어하는 가장 직접적인 방법은 Curl과 같은 도구를 사용하는 것이다.

#get all blocks from the node
curl http://localhost:3001/blocks

Architecture

노드가 실제로는 두 개의 웹 서버를 노출하고 있다는 것을 주목해야한다: 하나는 사용자가 노드를 제어하기 위한 HTTP server이고 다른 하나는 노드 간의 피어-투-피어 통신을 위한 Websocket HTTP server이다.

NaiveChain의 주요 구성 요소

Conlusions

NaiveChain은 데모 및 학습 목적으로 만들어졌다. “마이닝” 알고리즘(PoS of PoW)이 없으므로 공용 네트워크에서 사용할 수 없습니다. 그럼에도 불구하고 잘 동작하면서 블록체인의 기본 기능을 구현하고 있다.


#blockchain #블록체인 #번역 #코드

추천 0
반대 0
신고 0
댓글 0

통합게시판

글쓰기
3 Steps to Perform SSH Login Without Password Using ssh-keygen & ssh-copy-id Yungyikim 2017-12-04 2017-12-04
Django, flush the values in the database Yungyikim 2017-11-26 2017-11-26
[번역]Concurrent patterns in Golang: Context Yungyikim 2017-11-16 2017-11-16
ethereum 소스 코드 분석 + golang 공부 Yungyikim 2017-11-16 2017-11-16
리눅스, 디스크 사용량을 디렉토리별로 보여주기 Yungyikim 2017-11-15 2017-11-15
[번역]A blockchain in 200 lines of code Yungyikim 2017-11-15 2017-11-15
MySQL, 중복되는 row를 찾아내서 삭제하기 Yungyikim 2017-11-07 2017-11-07
[MFC]값 수정 가능한 리스트 컨트롤 - Editing Sub-Items in List Control Yungyikim 2017-10-24 2017-10-24
Detours 라이브러리를 이용한 Win32 API Hooking Yungyikim 2017-10-24 2017-10-24
0xC0000005: Access violation Yungyikim 2017-10-24 2017-10-24
timeval을 이용한 millisecond, microsecond 출력하기 Yungyikim 2017-10-24 2017-10-24
mecab-ko 윈도우에서 빌드하기 Yungyikim 2017-10-24 2017-10-24
How To Move a MySQL Data Directory to a New Location on Ubuntu 16.04 Yungyikim 2017-10-24 2017-10-24
django, Elasticsearch에 로그 남기기 Yungyikim 2017-10-22 2017-10-22
강원도 가족 여행 Yungyikim 2017-10-17 2017-10-17
django_table2에서 related model의 필드 사용하기 Yungyikim 2017-10-13 2017-10-13
python, weasyprint를 이용하여 html to pdf 변환시 한글 깨짐 Yungyikim 2017-10-13 2017-10-13
cffi.api.CDefError: cannot parse "typedef int __dotdotdot__ time_t;" Yungyikim 2017-10-13 2017-10-13
ubuntu 패키지 설치시 connection timed out 발생에 대한 대처 Yungyikim 2017-10-08 2017-10-08
banner