1. 아키텍처만 설계
- datetime 라이브러리 : 블록이 생성되고 채굴된 정확한 날짜의 타임스탬프를 각 블록이 가짐
- hashlib 라이브러리 : 블록을 해시할 때 사용
- json 라이브러리 : 블록을 해시하기 전 블록 인코딩을 위해 라이브러리에 dumps 함수를 사용
- Flask 라이브러리에서 Flask 클래스의 객체를 생성
- Jsonify : Postman에서 블록체인과 상호 작용할 때 메세지를 보내기 위해 사용
- Jsonify를 사용하여 요청에 관한 응답을 표시
2. 초기화
블록체인은 클래스 안에 블록체인의 모든 컴포넌트와 모든 특징을 정의, init 함수에 들어가는 체인도 초기화
클래스로 시작할 때는 init 메서드로 시작
self는 self 앞에 오는 변수가 객체의 변수를 적용하도록 지정하는데 사용
- self.chain : 초기화를 하여 새로운 변수를 삽입
- create_block 메서드 : 제니시스 블록 생성
- proof 인수
- previous_hash 인수
3. create block 생성
mine_block 함수 : 작업 증명을 얻게 되며 문제를 정의하고 작업 증명을 찾기 위한 알고리즘을 정의
mine block 함수에서 증명을 얻어내 create_block 함수 적용
인수
- self 인수 : 객체의 변수를 고려
- proof 인수 : create_block 함수는 블록 채굴 직후에 사용하며 블록 채굴 직후이기 때문에 자연스럽게 증명을 취하게 됨
- previous_hash 인수 : 이전 블록을 채굴한 새 블록에 연결
정의
채굴된 새 블록을 정의
아래 4개의 필수 키로 딕셔너리 생성 후 postman에 표시하기 위한 반환 진행
- 블록의 인덱스
- index : 체인의 길이 +1
- 채굴된 타임스탬프
- timestamp : now 함수를 호출하여 정확한 시간 반환, 문자열에 넣어 Json 형식 작업에 오류 줄이기
- 채굴할 때 괜찮았다는 블록의 증명
- proof : 지정한 인수 호출
- 이전 해시
self.chain.append : 블록을 생성했으니 체인 추가
4. 작업증명
작업 증명 : 새로운 블록을 채굴하기 위해 찾아내야 하는 데이터 또는 숫자
특징
- 채굴이 어려울수록 가치는 올라가기 때문에 찾기가 어려움
- 첫 번째 채굴자인지 확인할 수 있어야 하기 때문에 검증은 쉬움
인수
- self 인수 : class로부터 생성될 인스턴스 객체에 작업 증명 메서드를 적용하기에 필요
- previous_proof 인수 : 채굴자들이 해결할 문제를 생성하기 위해 이전 증명을 고려해야 하기에 필요
정의
- new_proof : 새로운 증명 변수에 대해 올바른 증명을 얻기까지 while 루프를 거쳐 1씩 증가
- check_proof : 신규 증명이 올바른 증명인지 확인, 신규 증명이 문제에 대한 해답이 아니기에 우선 false로 지정
- while문 : 증명이 참일 때까지 반복
- 채굴자가 해결해야 하는 문제
- SHA256 암호화 함수 + hexdigest 함수 결합하여 64자 문자열 도출
- 해당 문자열은 4개의 선행 제로로 시작해야 함
- *선행 IDE는 채굴자들이 작업 증명을 찾기 위해 문제를 정의하는 대표적인 방법
- *선행 제로가 더 많을수록 채굴자가 문제를 해결하기는 더욱 어려워짐
- 채굴자가 해결해야 하는 문제
- hash_operation : 64자 문자열로 16진수 숫자만을 포함하는 이중 길이 문자열
- hash.lib.sha256() : 어느 연산이든 올 수 있으나 비대칭이여야 함
- hash.lib.sha256(new_proof + previous_proof) : 해당 괄호 안의 연산은 증명 간 위치가 바뀌어도 동일하기 때문에 신규 증명을 증가시키다보면 어느 시점에 신규 증명이 과거의 이전 증명이 됨. 다만, 대칭임.
- hash.lib.sha256(new_proof - previous_proof) : 두 자리가 바뀌었을 때 연산은 완전히 달라지며 비대칭임.
- hash.lib.sha256(str(new_proof**2 - previous_proof**2).encode()).hexdigest() : 제곱 및 인코딩을 하여 문자열로 만들어 좀 더 복잡하게 만들고 hexdigest를 추가함.
- if hash_operation[:4] == '0000' : 해시 연산의 처음 4자가 0으로 시작하여 확인 증명이 참인 경우
- else : 확인 증명이 거짓인 경우
📍코드 출처 : 유데미 강의
'솔리디티 및 블록체인' 카테고리의 다른 글
블록체인 part.03 _ 채굴 (0) | 2024.08.03 |
---|---|
블록체인 만들기 part.02 _ 블록체인 설계 (0) | 2024.08.02 |
블록체인 만들기 part.01 _ 환경설정 (0) | 2024.07.21 |
블록체인 직관적 이해.zip (0) | 2024.07.13 |
솔리디티 13. super (0) | 2024.06.12 |