Python 블록 체인-채굴 자 생성
채굴을 가능하게하기 위해서는 채굴 기능을 개발해야합니다. 마이닝 기능은 주어진 메시지 문자열에 대한 다이제스트를 생성하고 작업 증명을 제공해야합니다. 이 장에서 이에 대해 논의하겠습니다.
메시지 다이제스트 기능
다음과 같은 유틸리티 함수를 작성합니다. sha256 주어진 메시지에 대한 다이제스트 생성-
def sha256(message):
return hashlib.sha256(message.encode('ascii')).hexdigest()
그만큼 sha256 함수는 message 매개 변수로 ASCII로 인코딩하고 16 진 다이제스트를 생성하고 값을 호출자에게 리턴합니다.
마이닝 기능
이제 우리는 mine자체 채굴 전략을 구현하는 기능입니다. 이 경우 우리의 전략은 주어진 메시지에 주어진 숫자의 접두사가 붙은 해시를 생성하는 것입니다. 주어진 1의 수는 매개 변수로 지정됩니다.mine 난이도로 지정된 기능.
예를 들어, 난이도를 2로 지정하면 주어진 메시지에 생성 된 해시는 11xxxxxxxx와 같이 2 개의 1로 시작해야합니다. 난이도가 3이면 생성 된 해시는 111xxxxxxxx와 같이 3 개의 1로 시작해야합니다. 이러한 요구 사항을 감안할 때 아래 단계와 같이 마이닝 기능을 개발할 것입니다.
1 단계
마이닝 기능은 메시지와 난이도의 두 가지 매개 변수를 사용합니다.
def mine(message, difficulty=1):
2 단계
난이도는 1 이상이어야합니다. 다음 assert 문으로이를 보장합니다.
assert difficulty >= 1
3 단계
우리는 prefix 설정된 난이도를 사용하여 변수.
prefix = '1' * difficulty
난이도가 2이면 접두사는“11”이되고 난이도가 3이면 접두사는“111”이되는 식입니다. 이 접두사가 생성 된 메시지 다이제스트에 존재하는지 확인합니다. 메시지 자체를 요약하기 위해 다음 두 줄의 코드를 사용합니다.
for i in range(1000):
digest = sha256(str(hash(message)) + str(i))
계속해서 새 번호를 추가합니다 i각 반복의 메시지 해시에 추가하고 결합 된 메시지에 대해 새 다이제스트를 생성합니다. 입력으로sha256 함수는 모든 반복에서 변경됩니다. digest가치도 변할 것입니다. 우리는 이것이digest 값이 이상 설정 됨 prefix.
if digest.startswith(prefix):
조건이 충족되면 당사는 for 루프 및 반환 digest 발신자에게 가치.
전체 mine 여기에 코드가 나와 있습니다.
def mine(message, difficulty=1):
assert difficulty >= 1
prefix = '1' * difficulty
for i in range(1000):
digest = sha256(str(hash(message)) + str(i))
if digest.startswith(prefix):
print ("after " + str(i) + " iterations found nonce: "+ digest)
return digest
이해를 돕기 위해 print 함수에서 반환하기 전에 조건을 충족하는 데 걸린 다이제스트 값과 반복 횟수를 인쇄하는 문입니다.
마이닝 기능 테스트
마이닝 기능을 테스트하려면 다음 문을 실행하십시오.
mine ("test message", 2)
위의 코드를 실행하면 아래와 비슷한 출력을 볼 수 있습니다.
after 138 iterations found nonce:
11008a740eb2fa6bf8d55baecda42a41993ca65ce66b2d3889477e6bfad1484c
생성 된 다이제스트는 "11"로 시작합니다. 난이도를 3으로 변경하면 생성 된 다이제스트가 "111"로 시작하며 물론 더 많은 반복이 필요할 것입니다. 보시다시피, 더 많은 처리 능력을 가진 채굴자는 주어진 메시지를 더 일찍 채굴 할 수 있습니다. 그것이 광부가 수익을 얻기 위해 서로 경쟁하는 방법입니다.
이제 블록 체인에 더 많은 블록을 추가 할 준비가되었습니다. 다음 장에서 이것을 배우도록합시다.