[번역]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

통합게시판

글쓰기
[ubuntu] apt-get update 에러 Yungyikim 2018-03-13 2018-03-13
Remote access to GUI environment using VNC in Ubuntu 16.04 Yungyikim 2017-12-28 2017-12-28
Postgresql, Resetting a sequence of column Yungyikim 2017-12-20 2017-12-20
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

장성군 추천 맛집 '낙지한마당'

전주시 추천 맛집 '조점례남문피순대'

금산군 추천 맛집 '너구리의피난처'

합천군 추천 맛집 '대산식육식당'

거창군 추천 맛집 '구구식당'

서초구 추천 맛집 '탐라도야지'

종로구 추천 맛집 '피맛골'

구로구 추천 맛집 '구정숙추어탕'

금천구 추천 맛집 '총각네부추곱창'

영등포구 추천 맛집 '가족천하'

영등포구 추천 맛집 '대한옥'

영등포구 추천 맛집 '희정식당'

관악구 추천 맛집 '복돈이 부추삼겹살'

부천시 추천 맛집 '복사꽃피는집'

서초구 추천 맛집 '강남교자'

강남구 추천 맛집 '첨벙아구찜'

강남구 추천 맛집 '영천영화'

강남구 추천 맛집 '온더보더 COEX 도심공항점'

서초구 추천 맛집 '도셰프 논현점'

서구 추천 맛집 '대나무통밥맛정식 만년점'

강남구 추천 맛집 '토말'

고양시 추천 맛집 '화동갈비'

마포구 추천 맛집 '김덕후의곱창조 홍대본점'

마포구 추천 맛집 '제임스치즈등갈비 본점'

용산구 추천 맛집 '삼각정'

관악구 추천 맛집 '밀향기칼국수'

종로구 추천 맛집 '교대이층집 광화문점'

연수구 추천 맛집 '송도갈매기'

강남구 추천 맛집 '이태원더버거 강남점'

영등포구 추천 맛집 '애슐리 여의도점'

강남구 추천 맛집 '아나고야'

중구 추천 맛집 '안동장'

성동구 추천 맛집 '소문난 성수 감자탕'

광진구 추천 맛집 '애슐리 강변점'

광진구 추천 맛집 '애슐리 건대점'

광진구 추천 맛집 '어반나이프'

강동구 추천 맛집 '샘밭막국수올림픽공원점'

연수구 추천 맛집 '화톳불'

연수구 추천 맛집 '겐로쿠우동'

연수구 추천 맛집 '군봉 묵은지 김치찜'

연수구 추천 맛집 '머노까머나 송도점'

남구 추천 맛집 '동락반점'

연수구 추천 맛집 '피에스타'

남구 추천 맛집 '길손물텀벙'

중구 추천 맛집 '맘모스회센터'

남동구 추천 맛집 '무지락설렁탕'

만수6동 추천 맛집 '이화찹쌀순대'

남동구 추천 맛집 '애슐리 인천뉴코아아울렛점'

남구 추천 맛집 '연중반점'

남구 추천 맛집 '금문종가집설렁탕'

남동구 추천 맛집 '함춘원(고추짬뽕)'

남구 추천 맛집 '짬뽕타임(주안점)'

남동구 추천 맛집 '스시라인'

연수구 추천 맛집 '삿뽀로'

중구 추천 맛집 '내고향강원도'

중구 추천 맛집 '신성루'

서구 추천 맛집 '희래등'

중구 추천 맛집 '스시민'

부평구 추천 맛집 '청마루뼈해장국'

중구 추천 맛집 '마복림떡볶이할머니'

부평구 추천 맛집 '동해해물탕'

부평구 추천 맛집 '애슐리 부평역점'

부평구 추천 맛집 '께딸 ¿QUÉ TAL?'

부평구 추천 맛집 '함흥관'

남동구 추천 맛집 '할머니추어탕'

강남구 추천 맛집 '하동관'

강서구 추천 맛집 '공항칼국수'

강남구 추천 맛집 '루비 떡볶이'

영등포구 추천 맛집 '고봉삼계탕'

금천구 추천 맛집 '애슐리 가산점'

구로구 추천 맛집 '모메존칼국수'

금천구 추천 맛집 '애슐리 마리오아울렛점'

강서구 추천 맛집 '매드포갈릭 발산점'

양천구 추천 맛집 '매드포갈릭 목동점'

서구 추천 맛집 '유천가든'

서대문구 추천 맛집 '이찌멘 신촌점'

마포구 추천 맛집 '죠티인도레스토랑'

마포구 추천 맛집 '하카다분코'

서대문구 추천 맛집 '애슐리 신촌점'

마포구 추천 맛집 '시간돼지'

마포구 추천 맛집 '경스시'

파주시 추천 맛집 '파주운정 맛집 코다리밥상'

김포시 추천 맛집 '상화'

고양시 추천 맛집 '元(원)가든능이버섯백숙'

고양시 추천 맛집 '서정돌솥순대국'

고양시 추천 맛집 '게장부페'

고양시 추천 맛집 '한우대장'

고양시 추천 맛집 '오장동함흥냉면'

고양시 추천 맛집 '108@돌삼겹'

고양시 추천 맛집 '가나안덕 일산본점'

고양시 추천 맛집 '군원'

고양시 추천 맛집 '설참치 일산백석점'

고양시 추천 맛집 '밀레폴리에'

고양시 추천 맛집 '몽화가락'

고양시 추천 맛집 '토우정육식당'

고양시 추천 맛집 '육대장일산대화점'

고양시 추천 맛집 '밤비노경양식'

고양시 추천 맛집 '온더보더 일산원마운트점'

고양시 추천 맛집 '내동시골보신탕'

고양시 추천 맛집 '오말리 레스토랑'