블록 체인지 블로그

640?wx_fmt=jpeg

블록 체인,아마 당신은하지 않은 이상하고,더 많거나 적은 그것의 일부를 이해합니다. 그러나,이것을 이해할 수 있화되고 있습니다. 물었을 때 그 일부의 개념을 달성하는 방법입니다,당신은에 있을 수 있습니다”Monge circle”. 를 이해하고 구현하는 방법에 대한 세부 사항까요?

이 문서에서 사용할 수 있게 됩니다에 당신을 가르치를 구축 블록 체인에서 당신을 유지하는 기술 수준에 대한 자세한 이해의 블록 체인 구현을 세부 사항입니다. 나는 당신을 넣어 이 문서의 코드를 실행 그것은 다시,당신은”오! 원래 그래서”아이디어이다. 아래,우리는 그것을 시도하십시오.

저자|다니엘 반 Flymen

번역|오홀리압 코코스,

당신이 열린 이 문서에서,당신은 나 같은 것을보고,암호화 통화는 가격은 급증,그리고 그 밖으로 블럭 체인에서 결국은 무엇입니까? 뒤에 무엇을 기술합니다.

그러나,완전히 이해하기 위해 블록 체인은 쉽지 않은 것은,적어도 하다. 에서 이해하기 위하여 블록 체인데,많이 본 동영상,연구의 다양한 튜토리얼,그리고 몇 가지 경우,전체 프로세스는 자식의 마음입니다.

그래서 저는 연습을 하기로 결정했습니다. 의 연습에서 학습 주요 장점 중 하나는 힘을 이해하는 블럭 체인의 대부분의 기본 원리,그리고 쉬운 사람들이 그것입니다. 는 경우에 당신은 또한,이 방법을 시도하는 것이 좋을 읽을 통해 이 문서에 따르는 단계를 한 단계로 작동합니다. 따라서,당신은 수 있지만 개인적으로 개발한 완전한 기능을 기록하는 동안 또한 파악 블록 체인 메커니즘에는 무엇입니까?

작업 준비

우리가 시작하기 전에,우리는 몇 가지 작업을 수행해야 준비 작업이는 연구는 일부 문제입니다.

블록 체인은 무엇입니까? 블록 체인의 구성 변경할 수 없고,순차 기록 블록합니다. 그들이 포함될 수 있습 트랜잭션 데이터 파일 데이터,또는 다른 당신이 원하는 호환이 안되 사용이 되지 않습니다. 하지만 가장 중요한 것은 이러한 블록을 통해 해시 테이블이 함께 연결되어 있습니다.

 

는 무엇입에 대한 해시니까? 해시 함수는 입력 가치를 함수 입력에서 생성을 결정하는 입력 값의 값을 출력합니다. 더 많은 설명을 클릭 할 수 있는 아래 링크를 사용:

https://learncryptography.com/hash-functions/what-are-hash-functions

이 문서는,먼저 Python 프로그래머는 한,당신은 쉽게 읽고 쓰는 몇 가지 기본적인 Python 코드 그 두 번째는 HTTP 프로그래머이기 때문에,우리는 다음에 대해 이야기했 블록 체인에 내장되어 HTTP,위의 이야에서 최소한 방법을 이해하는 HTTP 요청이 작동합니다.

해야 할까요? 먼저 설치되어 있는지 확인하십시오 Python3.6 나 더 많은 환경 및 플라스크 이외에도를 설치할 필요가 벙커의 요청이 있습니다. 의 버전 정보는 다음과 같습니다:


  스템에서는 설치==0니다.12니다.2  요청==2니다.18니다.4  


그래서,당신은 또한 필요한 HTTP 클라이언트가 같은 우편 배달부 또는 컬

는 전체 코드를 다운로드하십시오 치열한 우표의:

https://github.com/dvf/blockchain 합니다.

다음과 같은 나를 따르는 단계별 작업입니다.

첫 번째 단계:만드는 블록 체인

오픈 너의 마음에 드는 편집,저는 개인적으로 선호하는 PyCharm 니다. 새로운 파일을 생성,이름 blockchain.py 합니다. 프로젝트 전반에 걸쳐 우리는 것만이 하나를 사용한 파일입니다. 이 명확하지 않은 장소,참조할 수 있는 소스 코드입니다.

을 나타냅 블록 체인

우리가 만들 것입니다 Blockchain 클래스고,그것의 생성자를 만듭니다 처음에 빈 목록을 저장하기 위한 우리의 블록 체인,트랜잭션 목록을 저장합니다. 아래의 클래스 코드:

클래스  Blockchain (객체):
    def __init__():
        자체입니다. chain=[]
        자체입니다. current_transactions=[]

    def new_block ():
        #새로 만든 블록에 추가합 체인
패스

    def new_transaction ():
        #새로운 트랜잭션의 트랜잭션
패스

@staticmethod
    def 해시 (블록):
        #해시 블록
패스

@property
    def last_block ():
        #반환합니다 마지막에서 블록 체인
패스

안전 매개 변수의 역할을 관리하는 것입 블록 체인이지만,또한을 저장하는 데 사용되는 트랜잭션 정보 및 블록을 추가하는 방법입니다.

블럭이 정말로 생겼는지 아십니까?

각 블록에 포함되는 인덱스,타임 스탬프,트랜잭션 목록한 후 인증서 더 이전 블록 해쉬값을니다.

다음과 같은 블록의 예:

블={
    '인덱스':1,
    'timestamp':1506057125.900785,
    '거래':[
{
            '보낸 사람': "8527147fe1f5426f9dd545de4b27ee00",
            'recipient': "a77f5cdfa2934df3954a5c7c7da5df1f",
            '양':5,
}
],
    '증거'를:324984774000,
    'previous_hash': "2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824"
}

코드는 왼쪽 슬라이더를 볼 수 있습니다 섹션이 표시되지 않은 아래와

여기,블록 체인 원칙을 이해하기 쉽다:각 블록의 고유 변수를,뿐만 아니라 이전 블록의 해쉬값을니다. 이것은 매우 중요하기 때문에,해쉬값을 보장하는 블럭 체인 손상되지 않은 특성이 있습니다. 는 경우 블록은 아래에서 공격을 해쉬값을 변경한 다음의 모든 블록의 해쉬값을 변경합니다.

습할 수 있습니다,나는 아직도 이해가 되지 않습니다. 좋아요,처음 다운 볼 수 있습니다.

블록에 추가한 트랜잭션

그래서,우리는 무엇을에서의 블록에 추가한 트랜잭션까? 사용할 수 있습니다 new_transaction()매개 변수입니다. 사용 방법이 간단하고,직접 다음과 같은 코드를 표시:

클래스  Blockchain (object):
...

    def new_transaction (자가 보낸 사람,받는 사람,금액):
        """
새로 만든 트랜잭션으로 이동하는 다음 채굴 블록

:param 보낸 사람:<str>발송자의 주소
:param 받는 사람:<str>의 주소를 받는 사람
:param 금액:<int>금액
::<int>인덱스의 블록하는 것이 트랜잭션
"""


자체입니다. current_transactions 니다. append({
            '보낸 사람':보
            'recipient':받는 사람
            '양':양,
})

        return . last_block['인덱스']+ 1

에 new_transaction()트랜잭션을 추가하는 정보의 목록을 반환합니다 다음 채굴 블록에서의 인덱스 번호,거래 정보 포장될 것입니다 이것으로 차단합니다. 이 나중에 제출하는 트랜잭션이 사용자에게 유용합니다.

새로 만드는 블록

블록 체인입니다 만,우리는 창세기 블록 블록 체인에서 첫 번째 블록에습니다. 물론,창의 블록 또한 요구하는 증명이 필요를 통해 포로 mining 메커니즘이 있습니다. 후 우리는 것이 더 소개하여 마이닝,이하지 않는 너무 많이 도입했습니다.

을 촉진하기 위해 이해하는 모든 사람에,내가 위의 코드를 추가,일부 의견니다. 여기,우리는 것입을 차단하는 체인의 속성으로 포괄적인 이해합니다. 그러나 우리는 여전히 알고 싶어 블록 체인을 만드는 방법을 개발하는 방법뿐만 아니라,광부입니다.

에 작업증명(PoW)

작업의 증거 알고리듬,작업의 증거는,블록 체인을 만들거나 새로운 개발을 블록의 증거입니다. 의 뒤에 그것을 찾기:시리즈 솔루션을 수학 문제에의 숫자로,이번호 두 가지 조건을 충족해야합니다: 첫째로,그것은 찾기 어려운,둘째,그것은 쉽게 확인하고 매우 쉽게 사람이 될 검증합니다.

우리는 아주 간단한 예제는 모두가 도움이 이해합니다.

우리가 살펴보고 이를 들어,정수 x 곱하여 다른 번호를 y,결과의 해쉬값을 0 이 되어야 한다. 할 수 있는 단순히 표현했으로:해시(x*y)=ac23dc 다.0 니다. 그래서,우리의 목표는 이 조건에 맞는 하나의 y 값이다. 기 위해서 대한 이해를 촉진하기 위하여,우리는 잠정적으로 x=5 습니다. 아래에는 우리가 사용하는 파이썬을 하는 등 계산:

에서  hashlib 가져오기  sha256
x= 5
y= 0 #것이 무엇인지 우리는 알지 못 y 해야한다.
sha256(f{x*y}'니다. 코딩()). hexdigest()[-1]!= "0":
y+= 1
인쇄(f,'솔루션 y= {y}')

마지막으로,계산 결과에 y=21 습니다. 따라서,결과 0 의 끝에서 해쉬값:

해쉬 (5*21)=1253e9373e...5e3600155e860

비트 코인,포로 알고리즘으로 알려진 Hashcash,의 원칙은 위의 예에는 거의합니다. 광부들은 순서를 새로 만드는 블록,铆足劲儿을 위한 수학만 승자가 추가 할 수 있습니다 차단하다. 일반적으로,증거의 어려움에 따라 달라집 문자열에서 검색 문자 번호,첫째로 찾아 올바른 숫자의 결근에서 각각 거래를 얻을 비 같이 보상합니다.

시스템에 쉽게 확인할 수 있을 솔루션을 제공합니다.

를 구현하는 기본적인 작업 증명

에서 다음과 같은 우리는 그냥 만든 체인 블록을 달성하기 위해,비슷한 작업 증명 알고리즘이 있습니다. 규칙과의 상단에는 간단한 예제:

번호를 찾을 수 있 p,그리고 전면의 블록의 주소는 숫자에 대한 해시를 생성하는 4 비트 0 의 해쉬값을니다.

여기에서 특정한 파이썬 코드를 달성하기:

가져오기  hashlib
가져오기 json

에서 시간을 가져오는 시간
에서 uuid 가져오기 uuid4


클래스 Blockchain (object):
...

    def proof_of_work (자가,last_proof):
        """
간단한 작업의 증거 알고리즘:
-찾을 수 p'같은 해시(pp')을 포함한 선도적 4 제로,p 은 이전의 p'
-p 가 이전 증거,p'은 새로운 증거
:param last_proof:<int>
::<int>
"""


증거= 0
         자입니다. valid_proof(last_proof,증거) 거짓:
증+= 1

         증거

@staticmethod
    def valid_proof (last_proof,증거):
        """
유효성을 검사 증명:hash(last_proof,증거)포함한 4 개 주요 제로니까?
:param last_proof:<int>이전 증명
:param 증거:<int>현재 증거
::<bool>진정한 올바른 경우,잘못된 경우입니다.
"""


guess= f{last_proof} {증거}'니다. 코딩()
guess_hash=hashlib 니다. sha256(추측). hexdigest()
         guess_hash[: 4]== "0000"

우리는 수정할 수 있는 해시기 전에 값을 0 으로 번호를 조정하는 알고리즘의 어려움에서 일반적으로,4-비트가 이미 충분합니다. 각각에서 해쉬값을 하기 전에 0,계산의 소요되는 시간이 될 것 기하 급수적으로 곱해집니다.

여기,우리의 기본적인 잘 작성합니다. 다음으로,우리는 준비를 통과하는 HTTP 요청과 상호 작용입니다.

두 번째 단계:을 만들 API

우리가 사용하려는 파이썬 플라스크 framework 는 경량 프레임워크를,당신은 쉽게 달성할 수 있는 end-to-Python-기능을 매핑합니다. 따라서,우리가 사용할 수 있는 HTTP 요청을 통해 웹 페이지 방문의 블록 체인합니다.

우리는 다음 세 가지 방법을 만들기:

  • /트랜잭션/에 대한 새로운 블록을 만들 새로운 트랜잭션

  • /내게 우리의 서버는 광 새로운 블록;

  • /체인 반환을 완료하는 안전 클래스입니다.


설정 플라스크 framework

우리의 서버에서 블록 체인에서 네트워크 형성하는 단일 노드입니다. 아래의 몇 개 만들어 보일러 코드:

가져오기  hashlib
가져오기 json
에서 textwrap 가져오기 dedent
에서 시간을 가져오는 시간
에서 uuid 가져오기 uuid4

from flask import Flask


클래스 Blockchain (object):
...


#인스턴스화는 우리의 노드
app=Flask(__name__)

#생성하는 전 세계적으로 독특한 주소에 대한 이 노드
node_identifier=str(uuid4()). replace('-', ")

#인스턴스화 기록
blockchain=Blockchain()


@app. route('/내',methods=['GET'])
def 광산 ():
    return "우리는 광산은 새로운 구획"

@app. route('/트랜잭션/새로운',methods=['POST'])
def new_transaction ():
    return "우리는 추가로 새로운 트랜잭션"

@app. route('/체인',methods=['GET'])
def full_chain ():
응답={
        '체인':blockchain 니다. 체인
        '길이':len(blockchain 니다. 체인)
}
     jsonify(응답), 200

if __name__== '__main__':
용합니다. run(host='0.0.0.0',port=5000)

우리는 간단한 설명에서 최고의 코드:

  • Line15:인스턴스의 우리의 노드,로드 플라스크 framework.

  • Line18:에 대한 우리의 노드를 만듭니다.

  • Line21:의 인스턴스 Blockchain 클래스입니다.

  • 24-line26:을 만들/내 끝점,이는 GET 요청합니다.

  • 28-30 이 행성/트랜잭션/새로운 끝점,이것은 POST 요청을 사용할 것입을 데이터를 보낼 수 있습니다.

  • 첫 번째 32-선 38:을 만들/체인의 끝점에 사용되는 반 전체 Blockchain 클래스입니다.

  • 첫 번째 40-41 라인:서버가 실행되 port5000.


트랜잭션 노드

트랜잭션을 요청은 무엇인가? 아래에 우리를 살펴 사용자가 서버로 보내 세그먼트를 요청 코드:

{
 "sender": "내 주",
 "받는 사람": "다른 사람의 주소",
 "양은": 5
}

우리가 가지고 있기 때문에 작성된 트랜잭션이 패키지 코드 블록,나머지는 간단합니다. 만 이 메소드를 호출을 달성하기 위해,를 추가하는 무역 기능이다. 다음은 특정한 코드를 달성하기:

가져오기  hashlib
가져오기 json
에서 textwrap 가져오기 dedent
에서 시간을 가져오는 시간
에서 uuid 가져오기 uuid4

from flask import Flask,jsonify,요청

...

@app. route('/트랜잭션/새로운',methods=['POST'])
def new_transaction ():
값=요청합니다. get_json()

    #확인하는 필수 필드에 있는 포스트'ed 데이터
필요=['sender', 'recipient', '양']
     하지 않 는 모든(k 에서 에 대한 k 에서 필수):
        반환 되는 값이', 400

    #새로 만드 트랜잭션
index=blockchain 니다. new_transaction(['sender']값이['recipient']값이['양'])

응답={'메시지가': f'Transaction 추가될 것입을 차단 {index}'}
     jsonify(응답), 201

Mining 노드

Mining 노드가 전체 프로세스의 가장 재미있는 부분야를 달성하는 다음과 같은 세 가지 용도로 사용:

  1. 계산 작업량;

  2. 패키지를 통해 거래를 보상하는 광부의 동전;및

  3. 에 의해 새로운 블록을 추가한 체인을 위조하는 새로운 블록이다.

가져오기  hashlib
가져오기 json

에서 시간을 가져오는 시간
에서 uuid 가져오기 uuid4

from flask import Flask,jsonify,요청

...

@app. route('/내',methods=['GET'])
def 광산 ():
    #우리는 실행하는 증거의 일을 알고리즘을 다 증거다.
last_block=blockchain 니다. last_block
last_proof=last_block['증거']
증거=blockchain 니다. proof_of_work(last_proof)

    #리에 대한 보상을받을 수 있을 찾는 증거입니다.
    #보낸 사람입니다"0"을 의미하는 노드가 채굴로 새로운 동전.
blockchain 니다. new_transaction(
보낸 사람="0",
받는 사람=node_identifier,
금액=1,
다)

    #위조은 새로운 블록을 추가하여 체인
previous_hash=blockchain 니다. 해쉬(last_block)
블=blockchain 니다. new_block(증거,previous_hash)

응답={
        '메시지가': "새로운 블록이 위조된",
        '인덱스':['인덱스'],
        '거래는'블록['거래],
        '증거'를:['증거'],
        'previous_hash':['previous_hash'],
}
     jsonify(응답), 200

여기에 참고 채굴 블록을 받는 사람은 우리의 노드 주소입니다. 여기에 대부분의 작동과 안전한 방법 클래스에 상호 작용입니다. 다음으로 시작할 수 있습니다 우리는 블록 체인 상호 작용입니다.

세 단계를 구현했으로 안전 클래스의 상호 작용

당신이 사용할 수 있는 평범한 컬 또는 우편 배달부 네트워크를 통해 단지를 생성하 API 상호 작용입니다.

서버를 시작합니다:

$python blockchain.py
*실행 http://127.0.0.1:5000/(CTRL+C 를 눌러 종료)

에 의하여 다음과 같은 주소를 요청을 보내다,우리는 시도 할 수 있습 mining 니다.

http://localhost:5000/광산

640?wx_fmt=png

를 사용하여 우편 배달부하는 GET 요청을 보내

아래을 통해 우리는 아래 링크를 보내는 게시물을 요청하는 새로 만드 트랜잭션:

http://localhost:5000/transactions/new 합니다.

요청에 포함되는 우리의 거래 구조입니다.

640?wx_fmt=png

사용 우편 배달을 보내는 게시물을 요청

만약 당신이 사용하여 컬 사용할 수 있습니다,다음 코드를 달성했다.

$curl-X POST-H "Content-Type:응용 프로그램/json" -d'{
 "sender": "d4ee26eee15148ee92c6cd394edd974e",
 "받는 사람": "사람-기타-주소",
 "양은":5
}' "http://localhost:5000/transactions/new"


의 완료를 상기 단계에서,당신은 서버를 재시작해야합니다. 이 시간,나는 파 2 블록을 얻 3 동전을 보상합니다. 여기,우리는 또한처럼 될 수 있습니다 다음 주소로 보내는 요청을 전체 체인을 확인할 수 있습니다.

{
  "chain":[
{
      "지수는": 1,
      "previous_hash": 1,
      "증거": 100,
      "timestamp": 1506280650.770839,
      "트랜잭션":[]
},
{
      "지수는": 2,
      "previous_hash": "c099bc...bfb7",
      "증거": 35293,
      "timestamp": 1506280664.717925,
      "트랜잭션":[
{
          "양은": 1,
          "받는 사람": "8bbcb347e0634905b0cac7955bae152b",
          "sender": "0"
}
]
},
{
      "지수는": 3,
      "previous_hash": "eff91a...10f2",
      "증거": 35089,
      "timestamp": 1506280666.1086972,
      "트랜잭션":[
{
          "양은": 1,
          "받는 사람": "8bbcb347e0634905b0cac7955bae152b",
          "sender": "0"
}
]
}
],
  "길": 3
}


네 단계:합의 양식

마지막으로 작성하여 합의,합의 메커니즘은 제가 생각하는 블럭 체인합니다. 가장 흥미로운 부분입니다. 상기 단계에서,우리가 만들어 간단한 블록 체인,그리고 달성할 수 있는 거래,광업 및 다른 기본적인 기능입니다. 그러나,블록 체인의 노드를 분산되어 있습니다. 면 그들은 분산,우리는 정확히는 방법을 지키는 자신의 레코드가 동일한 체인가? 이것은이라고 합의 문제입니다. 는 경우 우리의 네트워크의 요구에 더 많은 노드,우리가 달성해야 하는 알고리즘에 합의한다.

등록 새로운 노드

에서 우리의 합의 알고리즘을 필요로 문제를 해결하기:동일한 네트워크에서 할 수 있도록,하나의 노드를 알고 이웃 노드입니다. 각 노드가 필요합의 다른 노드 네트워크에서 등록합니다. 따라서,우리는 더 많은 것을 필요로 할 것이라는 노드:

  1. /노드/register 을 받아 URL 형식의 새로운 노드 목록입니다.

  2. /노드/확을 달성하기 위해 합의 알고리즘,그것을 해결할 수 있는 모든 분쟁을 보장하기 위해,노드는 올바른 체인합니다.


다음,우리가 필요한 수정하는 안전 클래스는 구조뿐만 아니라 등록된 노드를 달성하는 방법입니다.

...
에서 urllib 니다. 분석 수입 urlparse
...


클래스 Blockchain (object):
    def __init__(자):
...
자체입니다. 노=set()
...

    def register_node (자기 주소):
        """
추가로 새로운 노드 노드 목록
:param 주소:<str>주소의 노드입니다. 예를 들어,.'http://192.168.0.5:5000'
::None
"""


parsed_url=urlparse(주)
자체입니다. 노드입니다. 추가(parsed_url 니다. netloc)

상기 valid_chain()메소드에 대한 책임 검증인은 유효하는 방법을 확인하는가? 을 통해 각 블록 확인,그들의 해시 및 노력을 증명합니다.

resolve_conflicts()에 통과 우리 모두 인접 노드의 방법,그것은 그들을 다운로드 체인에서,그리고 그 위를 사용하는 방법을 확인합니다. 을 찾은 경우 유효한 체인의 길이보다 더 큰 우리의 체인하는 것이 우리의 체인 보충한다.

여기서 우리는 API,등록 두 개의 노드에 대해 하나를 추가하는 인접 노드를 다른 방법에 대한 충돌을 해결하기:

@app. route('/노드 등록/',methods=['POST'])
def register_nodes ():
값=요청합니다. get_json()

노=값입니다. get('노드)
    는 경우 노드가 없음:
        반품 "오류가:원을 제공하는 유효한 목록의 노드에", 400

    에 대한 노드 에서 노드:
blockchain 니다. register_node(노드)

응답={
        '메시지가': '새로운 노드가 추가되었습',
        'total_nodes':(blockchain 니다. 노드),
}
     jsonify(응답), 201


@app. route('/노드/확',methods=['GET'])
def 합의 ():
대체=blockchain 니다. resolve_conflicts()

    을 경우 교체:
응답={
            '메시지가': '우리의 체인 대체되었다',
            'new_chain':blockchain 니다. 체인
}
    다른다:
응답={
            '메시지가': '우리의 체인의 신뢰할 수 있는',
            '체인':blockchain 니다. 체인
}

     jsonify(응답), 200

이 경우에는 사용할 수 있는 다른 컴퓨터 또는 사용을 동일한 기계의 다른 포트를 시작하는 다른 노드입니다. 내가 사용하여 동일한 시스템에서 다른 포트에서 만든 다른 노드,등록하고 그것은 현재 노드입니다. 따라서,두 개의 노드:http://localhost:5000http://localhost:5001。

640?wx_fmt=png

등록 새로운 노드

그런 다음에서 두 번째 노드를 발굴의 일부를 새로운 블록을 보장하기 위해,그 두 번째 노드의 체인 보다는 처음 노드 체인의 이상합니다. 후에서 처음 노드를 호출을 얻/노드/를 해결하도록,하나의 체인에 의해 합의 알고리즘은 두 번째 노드의 체인으로 대체:

640?wx_fmt=png

의 작업에서 알고리즘에 합의

좋아요,당신은 성공적으로 만들어진 블록 체인 응용 프로그램 호출에 친구들을 테스트!

최신 뜨거운 영어:

관련 게시물

Leave a Reply

Your email address will not be published. Required fields are marked *