첫 번째 부분 요약

첫 번째 부분에서는 Python의 기본 사항을 배웠습니다. 시스템에서 if-elif-else 및 루프가 작동하는 방식을 배웠습니다. 기본적으로 Python에서 간단한 코드를 수행하는 방법을 배웠습니다. 이 부분에서는 블록 체인 생성을 시작할 것입니다. 그러니 더 이상 고민하지 않고 시작하겠습니다.!

Python 및 블록 체인에 대한 궁극적 인 가이드 : 2 부

Python 블록 체인 생성 : 목록 소개

좋습니다. 기본으로 충분합니다. 이제 우리의 블록 체인을 만들어 봅시다!

우리는 목록을 소개함으로써 그렇게 할 것입니다. 목록은 기본적으로 모든 유형이 될 수있는 데이터 그룹입니다. 다음과 같이 정의됩니다.

List_name = [요소 1, 요소 2, 요소 3 …… 요소 n]

앞에서 설명한 것처럼 요소는 모든 데이터 유형이 될 수 있습니다. 정수, 부동 소수점, 문자열 또는 다른 목록 (나중에 사용할)이 될 수 있습니다. 이것이 어떻게 작동하는지 봅시다. 이를 위해 터미널을 사용할 것입니다.

위의 코드에서 참고할 사항.

목록의 개별 요소를 블록 체인의 블록으로 생각하십시오. 그다지 스트레칭은 아니지만 나중에 더 정교하게 만들 것입니다. 목록 자체는이 모든 데이터를 결합하여 블록 체인의 “체인”요소를 제공합니다..

이제 눈에 띄는 것은 각 요소의 색인 번호입니다. 첫 번째 요소의 인덱스는 0입니다. 이것이 첫 번째 요소를 인쇄 할 때 “blockchain [0]”이라고 말하는 이유입니다..

목록의 요소 수정

수정할 수없는 목록은 쓸모가 없습니다. 목록에서 요소를 추가하고 제거하려면 규정이 필요합니다. 이제 우리는 비트 코인과 같은 블록 체인에서는 요소를 제거하는 것이 불가능하다는 것을 알고 있지만, 지금은 여전히 ​​목록을 다루고 있습니다..

그래서 우리는 그것을 어떻게 할 것인가?

두 가지 목록 함수를 사용할 것입니다.

  • append ()
  • 팝()

추가 기능은 목록에 더 많은 요소를 추가합니다. 따라서 이전 목록을 다시 가져 오십시오.

블록 체인 = [1, 2, 5.6].

여기에 “Blockgeeks”를 추가하려면 간단히 다음과 같이 말하면됩니다. blockchain.append ( “Blockgeeks”)

이제 인쇄하면 다음과 같이 표시됩니다.

[1, 2, 5.6, ‘블록 괴짜’]

이제 일부 데이터를 제거하겠습니다..

이를 위해 목록에서 마지막 요소를 제거하는 pop () 함수를 사용할 것입니다. 따라서 blockchain.pop []을 수행하면 이제 “Blockgeeks”가 제거되고 다음이 표시됩니다.

[1, 2, 5.6]

함수를 통해 런타임 중에 요소 추가

이제 재미있게 보자.

런타임 동안 목록에 요소를 추가하는 함수를 사용할 것입니다. 이 프로그램을 고려하십시오.

블록 체인 = []

def add_list () :

   blockchain.append (3.2)

   인쇄 (블록 체인)

add_list ()

add_list ()

add_list ()

그래서 우리는 호출 될 때마다 블록 체인 목록에 3.2를 추가하는“add_list ()”라는 함수를 정의했습니다. 우리가 블록 체인 = []로 빈 목록을 선언 한 방법을 눈치 챘습니까? 처음부터 데이터를 입력하는 방법을 보여주기 위해 수행되었습니다..

그래서 우리가 그것을 인쇄하면 이것이 어떻게 보일 것입니다. Visual Studio Code btw로 돌아 왔습니다..

Python 및 블록 체인에 대한 궁극적 인 가이드 : 2 부

목록에 더 많은 블록 체인 유사 속성 제공

지금까지 우리는 일반 목록을 거의 다뤘습니다. 그러나 블록 사이에 더 유기적 인 연결이 필요합니다..

실제 블록 체인에서 블록이 서로 연결되는 이유는 이전 블록의 데이터도 포함하기 때문입니다. 이것이 바로 중첩 목록을 통해 마지막 요소의 데이터를 최신 요소에 추가하여 수행 할 작업입니다. 파이썬에서는 [-1] 인덱스를 사용하여 목록의 마지막 데이터를 가져올 수 있습니다..

따라서 블록 체인에 [1, 2, 3]이 있으면 블록 체인 [-1]은 3을 제공합니다..

어쨌든 코드를 확인해 보겠습니다. input () 함수를 사용하여 사용자로부터 블록 체인 요소의 값을 얻습니다..

element1 = 입력 ("블록 체인의 첫 번째 요소 제공 ")

블록 체인 = [element1]

def add_list () :

   blockchain.append ([블록 체인 [-1], 3.2])

   인쇄 (블록 체인)

add_list ()

add_list ()

add_list ()

이제 이것을 인쇄하면 다음을 얻을 수 있습니다.

Python 및 블록 체인에 대한 궁극적 인 가이드 : 2 부

좋아, 지금까지 우리는 블록 체인에 약간의 캐릭터를 부여했지만 여전히 우리의 작업 모델에 가까운 것은 없습니다. 곧 해결 될 것이라고 걱정하지 마십시오..

작동하는 블록 체인에 더 가까이 다가 가기

블록 체인 = []

“”” 섹션 1 “””

def get_last_value () :

   """ 블록 체인 목록의 마지막 요소 추출 """

   return (블록 체인 [-1])

def add_value (transaction_amount, last_transaction = [1]) :

   blockchain.append ([last_transaction, transaction_amount])

“”” 섹션 2 “””

def get_transaction_value () :

   user_value = float (input ( ‘거래 금액 입력’))

   user_value 반환

def get_user_choice () :

   user_input = 입력 ("여기에서 선택하십시오 : ")

   user_input 반환

“””섹션 3“””

def print_block () :

   블록 체인 블록의 경우 :

       인쇄("여기 당신의 블록입니다")

       인쇄 (블록)

“””섹션 4“””

def verify_chain () :

   색인 = 0

   valid = True

   블록 체인 블록의 경우 :

       인덱스 == 0 인 경우 :

           색인 + = 1

           계속하다

       elif 블록 [0] == 블록 체인 [인덱스-1] :

           valid = True

       그밖에:

           valid = False

           단절

       색인 + = 1

   유효한 반환

“””섹션 5“””

tx_amount = get_transaction_value ()

add_value (tx_amount)

True 동안 :

   인쇄("옵션을 선택하세요")

   print ( ‘새 거래를 추가하려면 1 개 선택’)

   print ( ‘블록 체인 인쇄를 위해 2 개 선택’)

   print ( ‘데이터를 조작하려면 3 개를 선택하세요’)

   print ( ‘종료하려면 다른 것을 선택하십시오’)

   user_choice = get_user_choice ()

   

   user_choice == 1 : 인 경우

       tx_amount = get_transaction_value ()

       add_value (tx_amount, get_last_value ())

   

   elif user_choice == 2 :

       print_block ()

   

   elif user_choice == 3 :

       len (블록 체인) >= 1 :

           블록 체인 [0] = 2

   

   그밖에:

       단절

   

   verify_chain ()이 아닌 경우 :

       print ( ‘블록 체인 조작’)

       단절

예, 이것이 거대한 코드 블록이라는 것을 알고 있습니다.하지만 코드의 모든 부분과 진행 상황을 이해하는 데 도움이되도록 전체를 여러 섹션으로 나누었습니다..

여기서 우리가 시도한 것은 정적 선언에 의존하지 않는 프로토 타입 블록 체인을 만드는 것입니다. 즉, 사용자는 런타임 중에 데이터를 직접 채울 수 있습니다. 이것이 코드의 첫 줄을 보면 빈 블록 체인으로 시작하는 것을 볼 수있는 이유입니다..

좋습니다. 이제 섹션을 살펴 보겠습니다..

노트 : 위의 코드를 복사하여 붙여넣고 새 창이나 문서 파일에서 열어 두는 것이 좋습니다. 아래 설명에서 코드의 다른 부분을 계속 참조 할 것이며 추적하는 것이 더 간단 할 것입니다..

섹션 1

def get_last_value () :

   """ 블록 체인 목록의 마지막 요소 추출 """

   return (블록 체인 [-1])

def add_value (transaction_amount, last_transaction = [1]) :

   blockchain.append ([last_transaction, transaction_amount])

따라서이 첫 번째 섹션은 지금 쯤이면 꽤 잘 알고 있어야합니다. 여기에서 두 가지 작업을 수행합니다.

  • 블록 체인의 마지막 요소 추출
  • 블록의 현재 요소와 함께 마지막 요소를 블록 체인에 추가.

add_value 함수의 인수를 살펴보십시오.

  • Last_transaction
  • 거래 _ 금액

transaction_amount는 블록 체인에 넣을 거래의 가치입니다. 반면에 last_transaction 변수는 새 블록에 넣을 마지막 블록의 트랜잭션 값입니다..

그래서 우리는 왜 last_transaction을 [1]로 초기화하고 있습니까??

이것은 순전히 런타임 동안 오류를 피하기 위해 수행됩니다. 생각해보십시오. 블록 체인의 첫 번째 블록을 다루면 “last_transaction”이 없을 것입니다. 맞습니까? “last_transaction”개념이 존재하려면 최소 2 개의 블록이 필요합니다. 이것이 첫 번째 블록의 오류 가능성을 제거하기 위해 last_transaction이 [1]로 초기화되는 이유입니다..

섹션 2

def get_transaction_value () :

   user_value = float (input ( ‘거래 금액 입력’))

   user_value 반환

def get_user_choice () :

   user_input = 입력 ("여기에서 선택하십시오 : ")

   user_input 반환

이 섹션을 입력 섹션이라고합시다. 여기에는 두 가지 기능이 있습니다.

  • get_transaction_value ()
  • get_user_choice ()

첫 번째 기능에서는 사용자가 블록 체인에 입력하고자하는 거래 금액의 값을 입력하도록 요청합니다. 이제 input () 함수는 문자열 값을 반환합니다. 따라서 float () 함수를 사용하여 해당 숫자를 부동 숫자로 변경합니다..

두 번째 기능에서는 사용자에게 선택 사항을 입력하도록 요청합니다..

이제“무슨 선택에 대해 이야기하고 있습니까?”라고 궁금해하실 수 있습니다.

음, 섹션 5를 봅시다. 특히 while 루프입니다. 우리가 거기에서 요구하는 옵션이 보이십니까??

인쇄("옵션을 선택하세요")

print ( ‘새 거래를 추가하려면 1 개 선택’)

print ( ‘블록 체인 인쇄를 위해 2 개 선택’)

print ( ‘데이터를 조작하려면 3 개를 선택하세요’)

print ( ‘종료하려면 다른 것을 선택하십시오’)

따라서 get_user_choice () 함수는 사용자가 원하는 것을 이해하는 데 도움이되도록 사용자의 선택을받는 데 사용됩니다..

섹션 3

def print_block () :

   블록 체인 블록의 경우 :

       인쇄("여기 당신의 블록입니다")

       인쇄 (블록)

이것은 매우 간단한 섹션입니다. for 루프를 사용하여 블록 체인의 각 블록을 인쇄합니다..

섹션 4

def verify_chain () :

   색인 = 0

   valid = True

   블록 체인 블록의 경우 :

       인덱스 == 0 인 경우 :

           색인 + = 1

           계속하다

       elif 블록 [0] == 블록 체인 [인덱스-1] :

           valid = True

       그밖에:

           valid = False

           단절

       색인 + = 1

   유효한 반환

이제 이것은 우리가 지금까지하지 않은 것입니다..

이 섹션에서는 블록 체인의 유효성을 확인합니다. 그게 정확히 무엇을 의미합니까?.

아시다시피 블록 체인은 불변이어야합니다. 아직 해시 함수를 사용하고 있지 않기 때문에 다른 것을 사용하여 체인이 변조되었음을 보여 드리겠습니다. 이것이 바로이 함수에서 verify_chain 함수를 사용하는 이유입니다..

그래서 우리는 여기서 무엇을하고 있는가?

첫째, 두 가지 변수가 있습니다.

  • 인덱스 = 블록 체인의 블록을 통과하는 데 사용할 카운터
  • Valid =이 함수의 최종 값으로 True 또는 False를 반환하는 부울 변수

그 후, 블록을 인쇄하기 위해 루프를 사용했던 이전 섹션과 매우 유사한 for 루프를 사용하여 블록 체인을 통과합니다. 루프 내에서 세 가지 조건문을 사용하고 있습니다. 각각을 살펴 보겠습니다.

if 하위 섹션

인덱스가 0인지 아닌지를 확인합니다. 그렇다면 인덱스는 1 씩 증가합니다.

elif 하위 섹션

탬 퍼링 여부를 확인하는 부분입니다. 이것이 어떻게 작동하는지 이해하려면 다음 시나리오를 상상해보십시오..

Python 및 블록 체인에 대한 궁극적 인 가이드 : 2 부

따라서 보시다시피 블록 B의 첫 번째 요소는 이전 블록의 내용입니다. 따라서이 하위 섹션에서는 블록의 첫 번째 요소가 이전 블록의 요소와 같은지 확인합니다. 그렇다면이 함수는 True이고 그렇지 않으면 False를 반환합니다..

섹션 5

tx_amount = get_transaction_value ()

add_value (tx_amount)

True 동안 :

   인쇄("옵션을 선택하세요")

   print ( ‘새 거래를 추가하려면 1 개 선택’)

   print ( ‘블록 체인 인쇄를 위해 2 개 선택’)

   print ( ‘데이터를 조작하려면 3 개를 선택하세요’)

   print ( ‘종료하려면 다른 것을 선택하십시오’)

   user_choice = get_user_choice ()

   

   user_choice == 1 : 인 경우

       tx_amount = get_transaction_value ()

       add_value (tx_amount, get_last_value ())

   

   elif user_choice == 2 :

       print_block ()

   

   elif user_choice == 3 :

       len (블록 체인) >= 1 :

           블록 체인 [0] = 2

   

   그밖에:

       단절

   

   verify_chain ()이 아닌 경우 :

       print ( ‘블록 체인 조작’)

       단절

따라서 이것은 긴 섹션이므로 다른 하위 섹션으로 (다시) 구분해야하는 이유입니다..

하위 섹션 1 : 초기화

tx_amount = get_transaction_value ()

add_value (tx_amount

블록 체인의 첫 번째 블록을 초기화하는 것으로 시작합니다. 거래 금액 (tx_amount)의 값을 얻은 다음 그 값을 블록 체인 블록에 입력합니다..

하위 섹션 2 : 선택하기

True 동안 :

   인쇄("옵션을 선택하세요")

   print ( ‘새 거래를 추가하려면 1 개 선택’)

   print ( ‘블록 체인 인쇄를 위해 2 개 선택’)

   print ( ‘데이터를 조작하려면 3 개를 선택하세요’)

   print ( ‘종료하려면 다른 것을 선택하십시오’)

   user_choice = get_user_choice ()

자, 서브 섹션 1 이후로, 다른 모든 서브 섹션은이 while 루프 내에서 실행될 것입니다. 따라서 우리가하는 첫 번째 작업은 사용자에게 정확히 원하는 작업을 선택할 수있는 옵션을 제공하는 것입니다.

  • 새 거래 추가
  • 블록 체인 인쇄
  • 데이터 조작
  • 프로세스 종료

그 후 user_choice는 사용자의 데이터를 저장합니다.

하위 섹션 3 : if-elif-elif-else

따라서 선택에 따라 4 가지 가능성이 있습니다. 코드는 다음과 같습니다.

user_choice == 1 : 인 경우

       tx_amount = get_transaction_value ()

       add_value (tx_amount, get_last_value ())

   

   elif user_choice == 2 :

       print_block ()

   

   elif user_choice == 3 :

       len (블록 체인) >= 1 :

           블록 체인 [0] = 2

   그밖에:

       단절

  • 먼저 블록 체인에 트랜잭션을 추가합니다. 사용자의 입력을 채우고 tx_amount에 저장합니다. 트랜잭션 가치가 확보되면 마지막 블록의 요소 값과 함께 블록 체인에 추가합니다.
  • 둘째, print 함수를 호출하여 블록 체인을 인쇄합니다.
  • 셋째, 조작 기능입니다. 데이터가 조작 될 때이 블록 체인이 어떻게 반응하는지 보여주기 위해 이것을 통합했습니다. 그래서 여기서 일어나는 일은 우리가 블록 체인의 첫 번째 요소를 2로 변경하는 것입니다. 이것은 블록 체인에 하나 이상의 요소가있는 경우에만 작동합니다 (if 조건이이를 확인합니다).

    다음에 무슨 일이 발생하는지 알아 보려면 다음 하위 섹션을 확인하십시오.

  • 마지막 부분은 매우 간단합니다. 사용자가 다른 옵션을 보내면 else 블록이 활성화되어 단순히 “break”를 사용하여 while 루프에서 빠져 나옵니다.

하위 섹션 4 : 확인 요청

verify_chain ()이 아닌 경우 :

       print ( ‘블록 체인 조작’)

       단절

사용자가 블록 체인을 조작하기로 선택하면이 하위 섹션이 영향을받습니다. 이제 verify_chain ()은 부울 값을 반환합니다.

  • 진실
  • 그릇된

조작이 완료되면 verify_chain ()에서 False를 반환합니다..

이제이 하위 섹션에서는 아니 False를 True로 바꾸는 키워드입니다. 이것은 차례로 “블록 체인 조작”을 인쇄하기 위해 if 블록 내의 인쇄 기능을 활성화합니다..

프로그램의 출력

좋습니다. 이제 프로그램이 어떻게 작동하는지 알게되었습니다. 출력을 확인합시다.

Python 및 블록 체인에 대한 궁극적 인 가이드 : 2 부

따라서 위에서 한 작업을 살펴 ​​보려면

우리는 블록 체인에 23.5, 43,1, 5.89의 3 가지 값을 입력했습니다.

그런 다음 다음을 제공하는 블록 체인을 인쇄했습니다.

Python 및 블록 체인에 대한 궁극적 인 가이드 : 2 부

그런 다음 데이터를 변경하여 블록 체인을 조작하려고 시도했지만 내장 된 검증 시스템이이를 포착하여 다음과 같은 결과를 제공했습니다.

Python 및 블록 체인에 대한 궁극적 인 가이드 : 2 부

좋아, 그래서 우리는 지금까지 꽤 좋은 구조를 가지고 있습니다. 그러나 우리는 여전히 해싱 코드에 작업 증명 기능을 추가했습니다. 따라서 목록이 무엇인지 이미 알고 있으므로 튜플과 사전에 대해 알아 봅시다..

튜플 및 사전

튜플과 사전은 목록과 함께 데이터 구조입니다. 이 세 가지를 비교하고 어떻게 작동하는지 알아 보겠습니다..

Python 및 블록 체인에 대한 궁극적 인 가이드 : 2 부

튜플은 목록과 매우 유사하지만 생성 된 후에는 편집 할 수 없습니다. 반면에 사전에는 위의 예에서 값을 저장하는 NAME1 및 NAME2와 같은 고유 식별자가 있습니다. 생성 된 후에는 편집 할 수 있습니다..

우리는 새롭고 개선 된 블록 체인에서 이러한 데이터 구조를 사용할 것입니다..

“그게 무슨 소용이야?”라고 궁금해하실 수 있습니다.

음, 트랜잭션, 블록 등은 저장해야하는 많은 메타 데이터를 포함합니다. 트랜잭션에 저장할 수있는 모든 메타 데이터를 생각해보십시오.

  • 발신자 ID
  • 받는 사람의 ID
  • 거래 날짜
  • 거래 금액

이 모든 데이터를 추가하면 거래를 추적하는 데 도움이됩니다..

마이닝 및 작업 증명 기능 추가

따라서 가장 먼저해야 할 일은 마이닝 기능과 작업 증명 기능을 추가하는 것입니다. 채굴은 채굴자가 블록 체인에 추가 할 블록을 찾기 위해 암호 학적으로 어려운 퍼즐을 해결하는 프로세스입니다. 이 블록을 채굴하기 위해 채굴자는 블록 보상이라는 보상을받습니다..

반면 작업 증명은 비트 코인과 같은 많은 암호 화폐에서 사용되는 채굴 및 합의 방법입니다. 우리는 블록 체인에서 작업 증명을 사용할 것입니다..

작업 증명 프로토콜이 블록 체인과 함께 작동하는 방식을 요약하면.

  • 채굴자는 블록 체인에 추가하기 위해 블록을 “채굴”하기 위해 암호화 퍼즐을 해결합니다..
  • 이 프로세스에는 엄청난 양의 에너지와 계산 사용이 필요합니다. 퍼즐은 시스템에 부담을주고 어렵게 만드는 방식으로 설계되었습니다..
  • 광부가 퍼즐을 풀면 검증을 위해 블록을 네트워크에 제시합니다..
  • 블록이 체인에 속하는지 여부를 확인하는 것은 매우 간단한 프로세스입니다..

좋습니다. 이제 코드를 살펴 보겠습니다.

“”” 섹션 1 “””

hashlib 가져 오기

json 가져 오기

보상 = 10.0

genesis_block = {

   ‘이전 _ 해시’: ”,

   ‘색인’: 0,

   ‘거래’: [],

   ‘nonce’: 23

}

블록 체인 = [genesis_block]

open_transactions = []

소유자 = ‘Blockgeeks’

def hash_block (블록) :

   return hashlib.sha256 (json.dumps (block) .encode ()). hexdigest ()

“”” 섹션 2 “””

def valid_proof (transactions, last_hash, nonce) :

   guess = (str (트랜잭션) + str (last_hash) + str (nonce)). encode ()

   guess_hash = hashlib.sha256 (guess) .hexdigest ()

   print (guess_hash)

   guess_hash 반환 [0 : 2] == ’00’

def pow () :

   last_block = 블록 체인 [-1]

   last_hash = hash_block (last_block)

   nonce = 0

   valid_proof (open_transactions, last_hash, nonce)가 아닌 동안 :

       nonce + = 1

   임시 값 반환

“””섹션 3“””

def get_last_value () :

   """ 블록 체인 목록의 마지막 요소 추출 """

   return (블록 체인 [-1])

def add_value (recipient, sender = owner, amount = 1.0) :

   거래 = { ‘sender’: 보낸 사람,

   ‘recipient’: 수신자,

   ‘금액’: 금액}

   open_transactions.append (트랜잭션)

“””섹션 4“””

def mine_block () :

   last_block = 블록 체인 [-1]

   hashed_block = hash_block (last_block)

   nonce = pow ()

   reward_transaction = {

           ‘보낸 사람’: ‘채굴’,

           ‘수신자’: 소유자,

           ‘금액’: 보상

       }

   open_transactions.append (reward_transaction)

   블록 = {

       ‘previous_hash’: hashed_block,

       ‘인덱스’: len (블록 체인),

       ‘거래’: open_transactions,

       ‘nonce’: nonce

   }

   blockchain.append (블록)

“””섹션 5“””

def get_transaction_value () :

   tx_recipient = input ( ‘거래 수신자 입력 :’)

   tx_amount = float (input ( ‘거래 금액 입력’))

   tx_recipient, tx_amount 반환

def get_user_choice () :

   user_input = 입력 ("여기에서 선택하십시오 : ")

   user_input 반환

“””섹션 6“””

def print_block () :

   블록 체인 블록의 경우 :

       인쇄("여기 당신의 블록입니다")

       인쇄 (블록)

“””섹션 7“””

True 동안 :

   인쇄("옵션을 선택하세요")

   print ( ‘새 거래를 추가하려면 1 개 선택’)

   print ( ‘새 블록 채굴을 위해 2 개 선택’)

   print ( ‘블록 체인 인쇄를 위해 3 개 선택’)

   print ( ‘종료하려면 다른 것을 선택하십시오’)

   user_choice = get_user_choice ()

   

   user_choice == 1 : 인 경우

       tx_data = get_transaction_value ()

       수신자, 금액 = tx_data

       add_value (수취인, 금액 = 금액)

       print (오픈 트랜잭션)

   elif user_choice == 2 :

       mine_block ()

   elif user_choice == 3 :

       print_block ()

   

   그밖에:

       단절

좋습니다. 이제 코드를 분석해 보겠습니다..

섹션 1

hashlib 가져 오기

json 가져 오기

보상 = 10.0

genesis_block = {

   ‘이전 _ 해시’: ”,

   ‘색인’: 0,

   ‘거래’: [],

   ‘nonce’: 23

}

블록 체인 = [genesis_block]

open_transactions = []

소유자 = ‘Blockgeeks’

def hash_block (블록) :

   return hashlib.sha256 (json.dumps (block) .encode ()). hexdigest ()

여기서 가장 먼저하는 일은 해시 라이브러리를 가져 오는 것입니다. 우리는 구체적으로 다음을 수입합니다.

  • hashlib : 해싱 함수를 사용하려면
  • json : 블록을 사전에서 문자열로 변환하려면이 패키지가 필요합니다..

그 후, 우리는 블록을 채굴하기 위해 채굴 자에게 줄 채굴 블록 보상을 저장할 전역 변수 인 “보상”을 선언합니다..

다음에는 제네시스 블록이 있습니다. 제네시스 블록은 블록 체인의 첫 번째 블록입니다. 블록에서 4 개의 메타 데이터를 사용하고 있습니다.

  • Previous_hash: 이전 블록의 해시를 저장합니다. 제네시스 블록에는 이전 해시가 없으므로 빈 문자열이됩니다..
  • 인덱스: 블록 체인의 블록 인덱스입니다. 제네시스 블록은 첫 번째 블록이므로 인덱스는 0으로 초기화됩니다. 프로그래밍 용어에서 목록의 첫 번째 요소는 0 번째 위치에 있습니다.
  • 트랜잭션: 블록 체인 내부에 저장되는 거래. 아무것도 없어서 빈 목록입니다.
  • 목하: 나중에 설명하겠습니다. 더미 값인 23으로 초기화됩니다..

제네시스 블록이 초기화 된 후 블록 체인 = [genesis_block]을 통해 다음 단계에서 블록 체인에 추가됩니다..

Open_transactions: 블록 체인의 모든 미결 거래를 관리하는 목록입니다. 처음에는 빈 목록입니다..

우리는이 거래의 소유자이자 발신자이기 때문에 처음에이 권한을 초기화했습니다.

다음으로 해싱 함수 hash_block ()이 있습니다.

그 안에서 우리는 다음 식을 사용하여 블록의 해시를 반환합니다.

hashlib.sha256 (json.dumps (block) .encode ()). hexdigest ()

자, 여기서 우리가 무엇을하는지 봅시다 :

  • hashlib의 sha256 해싱 알고리즘 사용.
  • 그런 다음 json.dumps 함수가 작동하여 사전 인 블록을 json 형식의 문자열로 변환합니다. 하지만 hashlib는 읽을 수 없으므로 다음 단계에서는 ….
  • encode () 함수. 이것은 json 형식의 문자열을 hashlib에서 읽을 수있는 UTF-8 문자열로 변환합니다..
  • hashlib의 출력은 바이트 해시입니다. 그래서 마침내 hexdigest () 메서드를 사용하여 일반 문자열로 변환합니다..

섹션 2

def valid_proof (transactions, last_hash, nonce) :

   guess = (str (트랜잭션) + str (last_hash) + str (nonce)). encode ()

   guess_hash = hashlib.sha256 (guess) .hexdigest ()

   print (guess_hash)

   guess_hash 반환 [0 : 2] == ’00’

def pow () :

   last_block = 블록 체인 [-1]

   last_hash = hash_block (last_block)

   nonce = 0

   valid_proof (open_transactions, last_hash, nonce)가 아닌 동안 :

       nonce + = 1

   임시 값 반환

섹션 2에는 두 가지 기능이 있습니다.

  • 유효한 _ 증명
  • pow 함수

valid_proof ()

def valid_proof (transactions, last_hash, nonce) :

   guess = (str (트랜잭션) + str (last_hash) + str (nonce)). encode ()

   guess_hash = hashlib.sha256 (guess) .hexdigest ()

   print (guess_hash)

   guess_hash 반환 [0 : 2] == ’00’

따라서 valid_proof () 함수에는 세 가지 인수가 있습니다.

  • 거래 : 블록 내부의 거래
  • 마지막 해시 : 마지막 블록의 해시
  • 목하

좋습니다. 그래서 nonce가 정확히 무엇입니까? 그 전에 우리는 어려움이 무엇을 의미하는지 알아야합니다. “난이도”는 채굴을 최대한 어렵게 만드는 아이디어입니다. 채굴이 어렵지 않으면 시스템의 모든 코인이 쉽게 펌핑되어 절대 쓸모가 없게됩니다..

따라서 시스템의 해시를 계산하는 방법은 트랜잭션, 마지막 블록의 해시 및 nonce를 단일 문자열로 연결 한 다음 해싱하는 것입니다. 해시는 처음 두 글자가 0 인 경우에만 허용됩니다..

그것이 우리가 어려움을 가져 오는 방법입니다. 해시가 어떻게 될지 예측하는 것은 불가능하며 행운의 추첨에 가깝습니다. 이것이 특정 패턴 (예 : 2 0)으로 시작하는 해시를 얻는 것이 매우 어려운 이유입니다..

이 함수는 프로그램에 유효한 해시가 있으면 True를 반환하고 그렇지 않으면 False를 반환합니다..

pow () 함수

다음으로 작업 증명 또는 pow () 함수가 있습니다..

def pow () :

   last_block = 블록 체인 [-1]

   last_hash = hash_block (last_block)

   nonce = 0

   valid_proof (open_transactions, last_hash, nonce)가 아닌 동안 :

       nonce + = 1

   임시 값 반환

이 기능은 매우 간단합니다.

  • 먼저 블록 체인에서 마지막 블록을 추출하여 last_block에 넣습니다.
  • 그런 다음 last_block을 해싱하고 last_hash에 넣습니다.
  • while 루프는 valid_proof 함수가 TRUE를 반환 할 때까지 계속 실행됩니다. (그만큼 아니 convert는 TRUE를 FALSE로 변환하므로 루프에서 나옵니다)
  • 그런 다음 nonce가 반환됩니다..

섹션 3

def get_last_value () :

   """ 블록 체인 목록의 마지막 요소 추출 """

   return (블록 체인 [-1])

def add_value (recipient, sender = owner, amount = 1.0) :

   거래 = { ‘sender’: 보낸 사람,

   ‘recipient’: 수신자,

   ‘금액’: 금액}

   open_transactions.append (트랜잭션)

이 섹션에는 다시 두 가지 기능이 있습니다.

  • get_last_value
  • 값을 추가

get_last_value ()

이것은 매우 간단합니다. 블록 체인의 마지막 블록을 추출합니다..

값을 추가()

이 함수는 트랜잭션의 메타 데이터, 즉 :

  • 발신자 이름
  • 받는 사람 이름
  • 거래 금액

그 후 트랜잭션은 open_transactions 목록에 추가됩니다..

섹션 4

def mine_block () :

   last_block = 블록 체인 [-1]

   hashed_block = hash_block (last_block)

   nonce = pow ()

   reward_transaction = {

           ‘보낸 사람’: ‘채굴’,

           ‘수신자’: 소유자,

           ‘금액’: 보상

       }

   open_transactions.append (reward_transaction)

   블록 = {

       ‘previous_hash’: hashed_block,

       ‘인덱스’: len (블록 체인),

       ‘거래’: open_transactions,

       ‘nonce’: nonce

   }

   blockchain.append (블록)

이 섹션에는 블록을 채굴 할 수있는 mine_block () 함수가 있습니다.

따라서이 함수에서 다음이 발생합니다.

  • 블록 체인의 마지막 블록을 추출하여 last_block에 넣습니다.
  • 마지막 블록 해시
  • nonce를 추출하려면 pow () 함수를 사용하십시오.
  • 채굴 자에게 보상하는 reward_transaction을 생성합니다. 즉, 이전에 설정 한 보상 금액 (10.0 코인)을 우리에게 제공합니다.
  • reward_transaction은 open_transaction 목록에 추가됩니다.
  • 마지막으로, 새로운 승인 된 임시 값을 사용하여 마침내 새 블록을 얻습니다. 이는 새 블록의 메타 데이터를 얻는 데 도움이됩니다.,
  • 새 블록이 블록 체인에 추가됩니다.

섹션 5

def get_transaction_value () :

   tx_recipient = input ( ‘거래 수신자 입력 :’)

   tx_amount = float (input ( ‘거래 금액 입력’))

   tx_recipient, tx_amount 반환

def get_user_choice () :

   user_input = 입력 ("여기에서 선택하십시오 : ")

   user_input 반환

이 섹션에는 두 가지 기능이 있습니다.

  • get_transaction_value ()
  • get_user_choice ()

# 1 get_transaction_value ()

이 함수는받는 사람의 이름 및 거래 금액과 같은 거래의 메타 데이터를 가져옵니다..

동시에 return 문을 살펴보십시오..

tx_recipient, tx_amount 반환

이 함수는 튜플을 반환합니다 (기억하기 전에 튜플에 대해 이야기 했습니까?).

# 2 get_user_choice

이 함수는 기본적으로 사용자의 선택을 받아 반환합니다. 이것은 이전 프로그램의 get_user_choice () 함수와 매우 유사합니다..

섹션 6

def print_block () :

   블록 체인 블록의 경우 :

       인쇄("여기 당신의 블록입니다")

       인쇄 (블록)

마지막 프로그램과 유사하게 블록 체인을 인쇄하는 인쇄 기능입니다..

섹션 7

True 동안 :

   인쇄("옵션을 선택하세요")

   print ( ‘새 거래를 추가하려면 1 개 선택’)

   print ( ‘새 블록 채굴을 위해 2 개 선택’)

   print ( ‘블록 체인 인쇄를 위해 3 개 선택’)

   print ( ‘종료하려면 다른 것을 선택하십시오’)

   user_choice = get_user_choice ()

   

   user_choice == 1 : 인 경우

       tx_data = get_transaction_value ()

       수신자, 금액 = tx_data

       add_value (수취인, 금액 = 금액)

       print (오픈 트랜잭션)

   elif user_choice == 2 :

       mine_block ()

   elif user_choice == 3 :

       print_block ()

   

   그밖에:

       단절

이것은 또한 마지막 프로그램과 유사합니다. 사용자는 다음 중 하나를 선택할 수 있습니다.

  • 거래 입력
  • 블록 채굴
  • 블록 체인 인쇄

이제 프로그램의 출력을 확인하겠습니다..

프로그램의 출력

가장 먼저 옵션 2를 선택하고 블록을 채굴합시다. 그렇게하면 다음과 같은 해시 블록이 생성됩니다.

Python 및 블록 체인에 대한 궁극적 인 가이드 : 2 부

조금 더주의를 기울이고 마지막 해시를 확인하기 전까지는 놀라 울 정도입니다.

‘001f946e8c2172affa830ef27761270aab2de515ffac8ae90e5de95b48dc366c’

이 해시의 특별한 점이 보이 시나요??

앞서 설정 한 어려움을 기억하십니까? 특별히 “00”으로 시작하는 해시를 찾고있었습니다. 이것이 컴퓨터가 주어진 난이도 기준을 충족하는 해시를 발견 할 때까지 임시 값을 변경하여 여러 해시를 실행 한 이유입니다..

좋습니다. 이제 거래를 추가하겠습니다. Sam, 2.4 코인을 보내고 싶다고 가정하면 옵션 1을 선택하고 다음 출력을 얻습니다.

Python 및 블록 체인에 대한 궁극적 인 가이드 : 2 부

마지막 줄에주의하십시오. 지금까지 수행 한 두 가지 트랜잭션을 보여줍니다..

잠깐… 두 번의 거래? 우리는 한 가지를 올바르게했습니다?

좀 빠지는. 우리가이 전에 블록을 채굴했음을 기억하십니까? 따라서 블록 보상 거래도 여기에 표시됩니다..

마지막으로 블록 체인을 인쇄 해 보겠습니다..

Python 및 블록 체인에 대한 궁극적 인 가이드 : 2 부

따라서 두 개의 블록이 있습니다.

  • 먼저 우리가 선언 한 제네시스 블록이 있습니다. nonce는 우리가 직접 넣은 것입니다.
  • 다음으로 두 번째 블록은 채굴 거래와 우리가“Sam”으로 한 거래를 포함합니다. 블록의 임시 값은 93입니다.

결론

그래서 거기에 있습니다. 우리는 적어도 약간의 작업이 블록 체인 Python을 통해 코딩되었습니다. 더 많은 것을 알고 싶으 시다면 계속해서 조사해보십시오. 우리는 파이썬이 개발에 들어가고 싶다면 마스터해야 할 언어라고 생각합니다. 무한한 기회의 문을 열 수있는 매우 재미 있고 배우기 쉬운 언어입니다..

Mike Owergreen Administrator
Sorry! The Author has not filled his profile.
follow me