You are looking for information, articles, knowledge about the topic nail salons open on sunday near me 파이썬 블록 체인 on Google, you do not find the information you need! Here are the best content compiled and compiled by the toplist.Experience-Porthcawl.com team, along with other related topics such as: 파이썬 블록 체인 파이썬 블록체인 만들기, 파이썬으로 배우는 블록체인 구조와 이론 pdf, 파이썬 블록체인 예제, 블록체인 가상화폐 만들기, 블록체인 언어, 파이썬 코인 만들기, 블록체인 지갑 구현, 블록체인 네트워크 구현
파이썬으로 간단한 블록체인 만들기 :: Kaden Sungbin Cho
- Article author: kadensungbincho.tistory.com
- Reviews from users: 13625 Ratings
- Top rated: 3.4
- Lowest rated: 1
- Summary of article content: Articles about 파이썬으로 간단한 블록체인 만들기 :: Kaden Sungbin Cho 블록체인 클래스 구조. 먼저, Blockchain이라는 클래스는 아래와 같은 생성자로 만들어 볼 수 있습니다: import datetime import hashlib import … …
- Most searched keywords: Whether you are looking for 파이썬으로 간단한 블록체인 만들기 :: Kaden Sungbin Cho 블록체인 클래스 구조. 먼저, Blockchain이라는 클래스는 아래와 같은 생성자로 만들어 볼 수 있습니다: import datetime import hashlib import … 블록체인은 블록이라고 불리는 것들이 암호기법을 통해 체인처럼 연결된 것 [1]을 말합니다. 흔히 아래와 같은 형태로 표현되는데요: 위의 정의에서 ‘암호기법을 통해 연결된다’와 같은 부분들은 실제로 간단한..SE, Creator, Minimalist
- Table of Contents:
블록체인 클래스 구조
flask를 이용해 api로 제공하기
TAG
관련글 관련글 더보기
인기포스트
티스토리툴바
파이썬(python)으로 만드는 간단한 블록 체인(block chain) :: ComDoc
- Article author: comdoc.tistory.com
- Reviews from users: 10144 Ratings
- Top rated: 3.7
- Lowest rated: 1
- Summary of article content: Articles about 파이썬(python)으로 만드는 간단한 블록 체인(block chain) :: ComDoc 까지만 이해할 수 있게 아주 가볍게 만들어 보겠습니다. (네트워킹 쪽은 pass). 블록체인이 암호화폐에서만 쓰이는 게 아니라 유통 과정을 기록하는 등에 … …
- Most searched keywords: Whether you are looking for 파이썬(python)으로 만드는 간단한 블록 체인(block chain) :: ComDoc 까지만 이해할 수 있게 아주 가볍게 만들어 보겠습니다. (네트워킹 쪽은 pass). 블록체인이 암호화폐에서만 쓰이는 게 아니라 유통 과정을 기록하는 등에 … 제 블로그에서 가장 인기 있는 글이 해시더군요. 해시가 나온 김에 간단한 블록체인을 만들어 보겠습니다. ‘블록체인의 의미’, ‘블록체인이 어떻게 데이터의 보안을 유지하나’ 까지만 이해할 수 있게 아주 가볍게..Computer, Music, Video.
- Table of Contents:
관련글 관련글 더보기
인기포스트
티스토리툴바
파이썬으로 배우는 블록체인 구조와 이론 | 조성현 | 위키북스 – 교보문고
- Article author: www.kyobobook.co.kr
- Reviews from users: 47096 Ratings
- Top rated: 4.9
- Lowest rated: 1
- Summary of article content: Articles about 파이썬으로 배우는 블록체인 구조와 이론 | 조성현 | 위키북스 – 교보문고 파이썬으로 배우는 블록체인 구조와 이론 비트코인, 암호학, 전자지갑, 트랜잭션, 채굴의 원리와 구현. klover9.0 (2건). 조성현 이광성 박혜리. 위키북스. …
- Most searched keywords: Whether you are looking for 파이썬으로 배우는 블록체인 구조와 이론 | 조성현 | 위키북스 – 교보문고 파이썬으로 배우는 블록체인 구조와 이론 비트코인, 암호학, 전자지갑, 트랜잭션, 채굴의 원리와 구현. klover9.0 (2건). 조성현 이광성 박혜리. 위키북스. 비트코인, 암호학, 전자지갑, 트랜잭션, 채굴의 원리와 구현 | ★ 이 책에서 다루는 내용 ★ ◎ 블록체인을 안전하게 구축하는 데 필요한 암호 기술인 대칭키, 공개키 암호, 해시, 전자서명의 이론과 실습◎ 지갑 애플리케이션에서 개인키, 공개키, 주소를 만드는 방법과 트랜잭션을 생성하는 원리, 채굴의 동작 원리에 대한 이론과 실습… | 이 책은 블록체인의 기능에 대한 문제점과 보완 방법 등에 관해 활발히 토론이 이뤄지고 있는 개발자 커뮤니티와 개발 제안 문서(Bitcoin Improvement Proposals, BIP)의 내용을 중심으로 집필이 됐다. 따라서 블록체인의 원천 기술인 비트코인 네트…파이썬으로 배우는 블록체인 구조와 이론, 조성현,,, 위키북스, 9791158391515
- Table of Contents:
키워드 Pick
가격정보
이 상품의 이벤트 1건
배송정보
이 책을 구매하신 분들이 함께 구매하신 상품입니다 KOR (개인)
이 책의 이벤트
책소개
상세이미지
목차
출판사 서평
Klover 리뷰 (0)
북로그 리뷰 (0)
쓰러가기
문장수집 (0) 문장수집 쓰기 나의 독서기록 보기
※구매 후 문장수집 작성 시 리워드를 제공합니다
안내
문장수집 안내
문장수집은 고객님들이 직접 선정한 책의 좋은 문장을 보여주는 교보문고의 새로운 서비스입니다
마음을 두드린 문장들을 기록하고 좋은 글귀들은 좋아요하여 모아보세요
도서 문장과 무관한 내용 등록 시 별도 통보 없이 삭제될 수 있습니다
1 리워드 안내
구매 후 90일 이내에 문장수집 작성 시 e교환권 100원을 적립해 드립니다
e교환권은 적립일로부터 180일 동안 사용 가능합니다
리워드는 작성 후 다음 날 제공되며 발송 전 작성 시 발송 완료 후 익일 제공됩니다
리워드는 한 상품에 최초 1회만 제공됩니다
주문취소반품절판품절 시 리워드 대상에서 제외됩니다
교환반품품절안내
기프트 BEST
이 분야의 베스트
이 분야의 신간
파이썬 Python 블록 체인 개발 입문 – 미국 실리콘밸리 현역 엔지니어와 함께 블록 체인을 구현해봅시다 | Udemy
- Article author: www.udemy.com
- Reviews from users: 43579 Ratings
- Top rated: 3.8
- Lowest rated: 1
- Summary of article content: Articles about 파이썬 Python 블록 체인 개발 입문 – 미국 실리콘밸리 현역 엔지니어와 함께 블록 체인을 구현해봅시다 | Udemy Facebook의 가상통화 Libra, Amazon, Microsoft, IBM 등으로 인해 다시 블록 체인 기술이 각광 받고 있습니다. IoT, 의료, 부동산의 분야에서도 기대받고 있는 차세대 … …
- Most searched keywords: Whether you are looking for 파이썬 Python 블록 체인 개발 입문 – 미국 실리콘밸리 현역 엔지니어와 함께 블록 체인을 구현해봅시다 | Udemy Facebook의 가상통화 Libra, Amazon, Microsoft, IBM 등으로 인해 다시 블록 체인 기술이 각광 받고 있습니다. IoT, 의료, 부동산의 분야에서도 기대받고 있는 차세대 … Facebook의 가상통화 Libra, Amazon, Microsoft, IBM 등으로 인해 다시 블록 체인 기술이 각광 받고 있습니다. IoT, 의료, 부동산의 분야에서도 기대받고 있는 차세대 기술을 배워봅시다.
- Table of Contents:
배울 내용
요구 사항
설명
이 강의의 대상
강사
파이썬으로 배우는 블록체인 구조와 이론 – YES24
- Article author: www.yes24.com
- Reviews from users: 36026 Ratings
- Top rated: 3.9
- Lowest rated: 1
- Summary of article content: Articles about 파이썬으로 배우는 블록체인 구조와 이론 – YES24 이 책을 통해 블록체인의 동작 원리를 설명하고 파이썬 프로그래밍을 통해 이론을 구체화했으므로 블록체인 기술을 더욱 깊이 이해하고 싶은 독자에게 … …
- Most searched keywords: Whether you are looking for 파이썬으로 배우는 블록체인 구조와 이론 – YES24 이 책을 통해 블록체인의 동작 원리를 설명하고 파이썬 프로그래밍을 통해 이론을 구체화했으므로 블록체인 기술을 더욱 깊이 이해하고 싶은 독자에게 … 파이썬을 통해서 블록체인의 기반기술을 깊게 이해하고 싶은 독자분들에게 추천한다!『파이썬으로 배우는 블록체인 구조와 이론』은 블록체인의 기능에 대한 문제점과 보완 방법 등에 관해 활발히 토론이 이뤄지고 있는 개발자 커뮤니티와 개발 제안 문서(Bitcoin Imp…파이썬으로 배우는 블록체인 구조와 이론,트랜잭션,블록체인,비트코인,비트코인, 암호학, 전자지갑, 트랜잭션, 채굴의 원리와 구현, 조성현|이광성|박혜리, 위키북스, 9791158391515, 115839151X9791158391515,115839151X
- Table of Contents:
YES24 카테고리 리스트
YES24 유틸메뉴
어깨배너
빠른분야찾기
윙배너
슈퍼특가
이책아나!
이휘준 아나운서가 추천하는 인생 도서
마이 예스24
최근 본 상품
단독 판매
마케팅 텍스트 배너
웹진채널예스
파이썬으로 배우는 블록체인 구조와 이론
파이썬으로 배우는 블록체인 구조와 이론
파이썬으로 배우는 블록체인 구조와 이론 – YES24
- Article author: medium.com
- Reviews from users: 27404 Ratings
- Top rated: 4.8
- Lowest rated: 1
- Summary of article content: Articles about 파이썬으로 배우는 블록체인 구조와 이론 – YES24 파이썬으로 블록체인 만들기. 수많은 사람들은 암호화폐의 부상에 대해 큰 관심을 가지고 있다. 그리고 많은 사람들은 블록체인이 어떻게 작동하는지 … …
- Most searched keywords: Whether you are looking for 파이썬으로 배우는 블록체인 구조와 이론 – YES24 파이썬으로 블록체인 만들기. 수많은 사람들은 암호화폐의 부상에 대해 큰 관심을 가지고 있다. 그리고 많은 사람들은 블록체인이 어떻게 작동하는지 … 파이썬을 통해서 블록체인의 기반기술을 깊게 이해하고 싶은 독자분들에게 추천한다!『파이썬으로 배우는 블록체인 구조와 이론』은 블록체인의 기능에 대한 문제점과 보완 방법 등에 관해 활발히 토론이 이뤄지고 있는 개발자 커뮤니티와 개발 제안 문서(Bitcoin Imp…파이썬으로 배우는 블록체인 구조와 이론,트랜잭션,블록체인,비트코인,비트코인, 암호학, 전자지갑, 트랜잭션, 채굴의 원리와 구현, 조성현|이광성|박혜리, 위키북스, 9791158391515, 115839151X9791158391515,115839151X
- Table of Contents:
YES24 카테고리 리스트
YES24 유틸메뉴
어깨배너
빠른분야찾기
윙배너
슈퍼특가
이책아나!
이휘준 아나운서가 추천하는 인생 도서
마이 예스24
최근 본 상품
단독 판매
마케팅 텍스트 배너
웹진채널예스
파이썬으로 배우는 블록체인 구조와 이론
파이썬으로 배우는 블록체인 구조와 이론
[python] 파이썬 블록 체인 시작 :: BelieveCom
- Article author: believecom.tistory.com
- Reviews from users: 49168 Ratings
- Top rated: 3.4
- Lowest rated: 1
- Summary of article content: Articles about [python] 파이썬 블록 체인 시작 :: BelieveCom 블록체인(Blockchain)은 거래 기록이 담긴 블록이. 체인처럼 서로 연결되어 있는 구조를 말합니다. 요즘 많은 사람들이 암호화폐에 대해서 관심 … …
- Most searched keywords: Whether you are looking for [python] 파이썬 블록 체인 시작 :: BelieveCom 블록체인(Blockchain)은 거래 기록이 담긴 블록이. 체인처럼 서로 연결되어 있는 구조를 말합니다. 요즘 많은 사람들이 암호화폐에 대해서 관심 … 블록체인(Blockchain)은 거래 기록이 담긴 블록이 체인처럼 서로 연결되어 있는 구조를 말합니다. 요즘 많은 사람들이 암호화폐에 대해서 관심 있어서 블록체인(Blockchain)은 더욱더 인기가 높아지고 있습니다…IT 이야기
- Table of Contents:
[Python] 블록체인 원리 및 구현
- Article author: parkeunsang.github.io
- Reviews from users: 11854 Ratings
- Top rated: 4.2
- Lowest rated: 1
- Summary of article content: Articles about [Python] 블록체인 원리 및 구현 [Python] 블록체인 원리 및 구현. by Edward Park. July 5, 2021. in Python. Block Chain. 사전 용어 정리. Block Chain. 말 그대로 데이터(Block)을 연결(Chain)한것 … …
- Most searched keywords: Whether you are looking for [Python] 블록체인 원리 및 구현 [Python] 블록체인 원리 및 구현. by Edward Park. July 5, 2021. in Python. Block Chain. 사전 용어 정리. Block Chain. 말 그대로 데이터(Block)을 연결(Chain)한것 … Block Chain
- Table of Contents:
사전 용어 정리
Block Chain 구현
Code
결과
Block Chain의 장점
파이썬으로 배우는 블록체인 구조와 이론
- Article author: brunch.co.kr
- Reviews from users: 4000 Ratings
- Top rated: 3.1
- Lowest rated: 1
- Summary of article content: Articles about 파이썬으로 배우는 블록체인 구조와 이론 지갑(Wallet) | 안녕하세요 스크립토 6기 박세연입니다. 블록체인에 관심을 가지고 공부를 시작했을때, 가장 흥미로웠던 부분들은 지갑과 거래 등에 … …
- Most searched keywords: Whether you are looking for 파이썬으로 배우는 블록체인 구조와 이론 지갑(Wallet) | 안녕하세요 스크립토 6기 박세연입니다. 블록체인에 관심을 가지고 공부를 시작했을때, 가장 흥미로웠던 부분들은 지갑과 거래 등에 … 지갑(Wallet) | 안녕하세요 스크립토 6기 박세연입니다. 블록체인에 관심을 가지고 공부를 시작했을때, 가장 흥미로웠던 부분들은 지갑과 거래 등에 대한 새로운 내용이었습니다. 현재 실제로 사용하는 지갑과 거래와는 다른 개념이었기때문입니다. 앞으로 약 세 편의 글을 통해 비트코인에서의 지갑, 거래에 대해서 더 공부하고 그리고 블록체인의 블록 채굴에 대해서 공부해보겠습니다. 이번
- Table of Contents:
1 비트코인 지갑 주소
2 개인키(Private key)
3 공개키(Public key)
4 지갑 주소(Address)
5 지갑의 백업 관리
6 지갑의 유형과 키 관리
7 계층 구조의 결정적 방식(Hierarchical Deterministic Wallets HD Wallets BIP-32) Type-2
See more articles in the same category here: toplist.Experience-Porthcawl.com/blog.
파이썬으로 간단한 블록체인 만들기
반응형
블록체인은 블록이라고 불리는 것들이 암호기법을 통해 체인처럼 연결된 것 [1]을 말합니다.
흔히 아래와 같은 형태로 표현되는데요:
Abstract blockchain – Image from Author
위의 정의에서 ‘암호기법을 통해 연결된다’와 같은 부분들은 실제로 간단한 블록체인을 만들어보면 복잡한 설명이 필요없이 쉽게 이해가 됩니다. 이번 글에서는 파이썬으로 구현된 간단한(100줄 이내 ^^) 블록체인을 살펴보면서, 블록체인의 일반적인 구조를 알아보겠습니다:
블록체인 클래스 구조
flask를 이용해 api로 제공하기
블록체인 클래스 구조
먼저, Blockchain이라는 클래스는 아래와 같은 생성자로 만들어 볼 수 있습니다:
import datetime import hashlib import json class Blockchain: def __init__(self): self.chain = [] self.create_block(proof = 1, previous_hash = ‘0’) def create_block(self, proof, previous_hash): block = { ‘index’: len(self.chain) + 1, ‘timestamp’: str(datetime.datetime.now()), ‘proof’: proof, ‘previous_hash’: previous_hash } self.chain.append(block) return block
chain이라는 인스턴스 변수에 리스트가 할당되고, create_block 메소드를 호출합니다. create_block은 json으로 구조화된 block을 생성하고 chain이라는 인스턴스 변수에 append 해주고 block을 리턴합니다. 생성자 __init__ 안에서 호출되는 self.create_block은 가장 처음 블록인 제네시스(genesis) 블록을 생성해주기 위해 proof = 1, previous_hash = ‘0’이라는 아규먼트를 사용합니다.
추가적으로 Block 클래스에는 아래와 같은 get_previous_block, proof_of_work, hash라는 메소드를 가집니다:
def get_previous_block(self): return self.chain[-1] def proof_of_work(self, previous_proof): new_proof = 1 check_proof = False while check_proof is False: hash_operation = hashlib.sha256(str(new_proof**2 – previous_proof**2).encode()).hexdigest() if hash_operation.startswith(‘0000’): check_proof = True else: new_proof += 1 return new_proof def hash(self, block): encoded_block = json.dumps(block, sort_keys = True).encode() return hashlib.sha256(encoded_block).hexdigest()
각각 아래와 같은 기능을 수행하는데요:
get_previous_block: chain 리스트에 있는 가장 마지막 블록을 리턴
proof_of_work: 이전 proof 값을 받고 previous_proof와의 연산 해시 값이 특정 조건을 만족하는 new_proof를 찾아 리턴함
hash: 딕셔너리 형태의 block을 받아서 json으로 dump하고 인코딩하여 해시값을 얻어 리턴함
위와 같은 클래스를 통해서 아래와 같이 블록을 채굴(mine)할 수 있습니다:
blockchain = Blockchain() previous_block = blockchain.get_previous_block() previous_proof = previous_block[‘proof’] proof = blockchain.proof_of_work(previous_proof) previous_hash = blockchain.hash(previous_block) block = blockchain.create_block(proof, previous_hash) print(blockchain.chain) #output [{‘index’: 1, ‘timestamp’: ‘2021-12-14 17:21:13.498696’, ‘proof’: 1, ‘previous_hash’: ‘0’}, {‘index’: 2, ‘timestamp’: ‘2021-12-14 17:21:13.500686’, ‘proof’: 533, ‘previous_hash’: ‘4fb3563bc622a0e4b3fea0f8c5b3eedd975e3d2f76825eedcb2bc7fbbf7163a8’}]
위의 상태를 이미지로 표현하면, 2개의 블록이 아래와 같은 형태로 연결되어 있다는 사실을 알 수 있습니다:
2 Blocks in a chain – Image from Author
이러한 블록체인이 규칙에 맞게 생성되어 있는지 확인하기 위해서는 아래의 is_valid_chain과 같은 메소드를 추가할 수 있습니다:
def is_valid_chain(self, chain): previous_block = chain[0] block_index = 1 while block_index < len(chain): block = chain[block_index] if block['previous_hash'] != self.hash(previous_block): return False previous_proof = previous_block['proof'] proof = block['proof'] hash_operation = hashlib.sha256(str(proof**2 - previous_proof**2).encode()).hexdigest() if not hash_operation.startswith('0000'): return False previous_block = block block_index += 1 return True 검증 방식은 genesis block의 다음 블록부터 마지막 블록까지 previous_hash 값이 이전 블록의 hash값과 동일한지 proof값이 previous_proof 값과 연산 후 해시 값 계산 시 특정 조건('0000'으로 시작)을 만족하는지 체크합니다. flask를 이용해 api로 제공하기 flask를 이용해 위에서 만든 간단한 블록체인을 API로 제공할 수 있습니다. from flask import Flask, jsonify app = Flask(__name__) app.config['JSONIFY_PRETTYPRINT_REGULAR'] = False blockchain = Blockchain() @app.route('/mine_block', methods = ['GET']) def mine_block(): previous_block = blockchain.get_previoous_block() previous_proof = previous_block['proof'] proof = blockchain.proof_of_work(previous_proof) previous_hash = blockchain.hash(previous_block) block = blockchain.create_block(proof, previous_hash) responses = { 'message': 'Congratulations, you just mined a block!', **block } return jsonify(responses), 200 @app.route('/get_chain', methods = ['GET']) def get_chain(): response = { 'chain': blockchain.chain, 'length': len(blockchain.chain) } return jsonify(response), 200 app.run(host = '0.0.0.0', port = 6000) 이후 Block 클래스와 flask API로 구성된 파일을 실행하고 Postman으로 호출하여 확인해 볼 수 있습니다. GET /mine_block - Image from Author GET /get_chain - Image from Author 최종 코드 [2] #!/usr/bin/env python3 # -*- coding: utf-8 -*- import datetime import hashlib import json from flask import Flask, jsonify class Blockchain: def __init__(self): self.chain = [] self.create_block(proof = 1, previous_hash = '0') def create_block(self, proof, previous_hash): block = { 'index': len(self.chain) + 1, 'timestamp': str(datetime.datetime.now()), 'proof': proof, 'previous_hash': previous_hash } self.chain.append(block) return block def get_previous_block(self): return self.chain[-1] def proof_of_work(self, previous_proof): new_proof = 1 check_proof = False while check_proof is False: hash_operation = hashlib.sha256(str(new_proof**2 - previous_proof**2).encode()).hexdigest() if hash_operation.startswith('0000'): check_proof = True else: new_proof += 1 return new_proof def hash(self, block): encoded_block = json.dumps(block, sort_keys = True).encode() return hashlib.sha256(encoded_block).hexdigest() def is_valid_chain(self, chain): previous_block = chain[0] block_index = 1 while block_index < len(chain): block = chain[block_index] if block['previous_hash'] != self.hash(previous_block): return False previous_proof = previous_block['proof'] proof = block['proof'] hash_operation = hashlib.sha256(str(proof**2 - previous_proof**2).encode()).hexdigest() if not hash_operation.startswith('0000'): return False previous_block = block block_index += 1 return True app = Flask(__name__) app.config['JSONIFY_PRETTYPRINT_REGULAR'] = False blockchain = Blockchain() @app.route('/mine_block', methods = ['GET']) def mine_block(): previous_block = blockchain.get_previous_block() previous_proof = previous_block['proof'] proof = blockchain.proof_of_work(previous_proof) previous_hash = blockchain.hash(previous_block) block = blockchain.create_block(proof, previous_hash) responses = { 'message': 'Congratulations, you just mined a block!', **block } return jsonify(responses), 200 @app.route('/get_chain', methods = ['GET']) def get_chain(): response = { 'chain': blockchain.chain, 'length': len(blockchain.chain) } return jsonify(response), 200 app.run(host = '0.0.0.0', port = 5000) Reference [1] https://en.wikipedia.org/wiki/Blockchain [2] https://www.udemy.com/course/build-your-blockchain-az/ 반응형
파이썬(python)으로 만드는 간단한 블록 체인(block chain)
반응형
제 블로그에서 가장 인기 있는 글이 해시더군요.
해시가 나온 김에 간단한 블록체인을 만들어 보겠습니다.
‘블록체인의 의미’,
‘블록체인이 어떻게 데이터의 보안을 유지하나’
까지만 이해할 수 있게 아주 가볍게 만들어 보겠습니다.
(네트워킹 쪽은 pass)
블록체인이 암호화폐에서만 쓰이는 게 아니라
유통 과정을 기록하는 등에도 사용되니까
위 두 개념만 알아도 꽤 써먹을 데가 많습니다.
선수학습:
파이썬 해시 라이브러리
import hashlib h = hashlib.sha256() h.update(b’Genesis’) print(h.hexdigest())
81ddc8d248b2dccdd3fdd5e84f0cad62b08f2d10b57f9a831c13451e5c5c80a5
파이썬 해시 라이브러리의 사용법을 알아야겠습니다.
직관적이라 어렵지 않습니다만, 다음에 주의하세요.
update()에 문자열을 넣을 수 없다. bytes 만 가능. m.update(b”abc”)와 m.update(b” def”)를 하면, m.update(b”abc def”)와 같다.
genesis는 기원이라는 뜻입니다.
블록체인의 기초
해시를 해시하자
블록체인은 해시를 해시하는 것부터 이해하면 될 것 같습니다.
from hashlib import sha256 prev_hash = b’Genesis’ for _ in range(3): print(prev_hash.hex()) prev_hash = sha256(prev_hash).digest() print(prev_hash.hex())
update를 쓰지 않고 줄였습니다. 깔끔하군요.
동적 타입 언어에 익숙해져 있다가…
bytes를 다루는 건 좀 헷갈리는 일입니다.
type()로 확인해가면서 처리합시다.
47656e65736973 81ddc8d248b2dccdd3fdd5e84f0cad62b08f2d10b57f9a831c13451e5c5c80a5 408ebd7408dda81b20d6d0c3d3664d15536bb3ea17d0e8baa0022011c3c590da dfa6ca742b4a970b543ad95f6a743e7dee8381eda9e29ceb08c91d45e06c4b79
이런 식으로 해시를 나열하면
해시의 특성 때문에
중간의 해시값을 하나라도 조작하면
그 뒤로는 해시값들이 줄줄이 산으로 갑니다.
이 원리를 보안에 이용하는 것이 블록체인입니다.
블록을 만들자.
단순히 해시값을 해시해서는 별 의미가 없습니다.
여기에 데이터를 넣어야 의미가 있겠죠?
데이터와 이전 해시값을 합친 값을
해시함수에 넣어서 새 해시를 만듭시다.
연결 리스트(Linked List)와 자료구조가 유사합니다.
이 경우에도 ‘해시를 해시하자’의 결론과 같이
중간의 ‘데이터’나 ‘해시값’을 조작하면
그 뒤의 해시값들은
줄줄이 산으로 간다는 것을 알 수 있습니다.
데이터와, 이전 해시값, 새 해시값을 합친 것을
‘블록’이라고 합시다.
* 일반적으론 다수의 거래내역을 묶어서 블록을 구성합니다.
* 블록의 index나 시간 기록 등은 간략히 코딩하기 위해 생략했습니다.
특수한 블록 제네시스
블록체인의 처음에는 이전 해시값이 없는
특수한 블록이 있습니다.
보통 genesis 블록 등으로 이름 짓습니다.
블록체인이란…
이 블록들을 체인처럼 모은 것을
‘블록체인’이라고 합시다.
일반적으로 블록체인이란
체인처럼 연결한 뒤,
네트워크 상의 노드들에 ‘분산 저장’하는 것까지를 의미합니다만,
간단한 코딩을 위하여… 네트워크는 pass
블록을 검증하자.
마지막으로 검증이 있습니다.
검증은
0. ‘현 블록의 이전 해시값’과 ‘이전 블록의 현 해시값’ 비교
1. 이전 블록의 해시값 재확인
2. 현 블록의 해시값 재확인
으로 이루어집니다.
from hashlib import sha256 blockchain = [] def make_genesis_block(): “””첫 블록을 만듭니다””” data = ‘Genesis’ prev_hash = b” current_hash = make_hash(data, prev_hash) blockchain.append((data, prev_hash, current_hash)) def make_hash(data: str, prev_hash: bytes) -> bytes: “””해시를 만듭니다.””” # 코드 한 줄이지만, 여기 저기 쓰이니 함수로 분리하는 게 좋습니다. # bytes형은 str형이랑 왔다 갔다 헷갈리는 경우가 있어서. # 파라미터 뒤에 타입을 기록해 두면 편하더군요. return sha256(data.encode() + prev_hash).digest() def add_block(data: str): “””블록을 블록 체인에 추가합니다.””” _, _, prev_hash = blockchain[-1] current_hash = make_hash(data, prev_hash) blockchain.append((data, prev_hash, current_hash)) def show_blockchain(): “””블록 체인을 보여줍니다.””” # 해시값을 bytes형으로 저장했기 때문에 # hex()로 16진수 str로 변환해야 print 시 읽기 좋습니다. for i, (data, prev_hash, current_hash) in enumerate(blockchain): print(f’블록 {i}
{data}
{prev_hash.hex()}
{current_hash.hex()}’) def verify_blockchain(): “””블록 체인을 검증합니다.””” for i in range(1, len(blockchain)): data, prev_hash, current_hash = blockchain[i] last_data, last_prev_hash, last_current_hash = blockchain[i – 1] # 변수명이 뭐 같습니다. 코딩보다 작명이 더 어려운 것 같습니다. if prev_hash != last_current_hash: # 1. 현 블록의 이전 해시 값과 # 이전 블록의 현재 해시 값이 일치하는 지 확인합니다. print(f”블록 {i} 이전 해시 != 블록 {i – 1} 현 해시.
” f”{prev_hash.hex()} !=
{last_current_hash.hex()}”) return False if last_current_hash != (temp := make_hash(last_data, last_prev_hash)): # 2. 이전 블록을 해시 함수로 검증합니다. # 이 부분이 없으면 genesis 블록의 검증이 안됩니다. print(f”블록 {i – 1} 검증 실패.
” f”{last_current_hash.hex()} !=
{temp.hex()}”) return False if current_hash != (temp := make_hash(data, prev_hash)): # 3. 현 블록을 해시 함수로 검증합니다. print(f”블록 {i}, 검증 실패.
” f”{current_hash.hex()} !=
{temp.hex()}”) return False # print(f'[Block {i}: {blockchain[i][0]}] has been verified.’) return True make_genesis_block() add_block(‘나는미남이다’) add_block(‘진짜미남이다’) add_block(‘아님말고’) show_blockchain() print() print(verify_blockchain())
블록 0 Genesis 81ddc8d248b2dccdd3fdd5e84f0cad62b08f2d10b57f9a831c13451e5c5c80a5 블록 1 나는미남이다 81ddc8d248b2dccdd3fdd5e84f0cad62b08f2d10b57f9a831c13451e5c5c80a5 40405b3990f4fa49832a9b268aaf7001ac0c389e099958bba121c44eb5deeabd 블록 2 진짜미남이다 40405b3990f4fa49832a9b268aaf7001ac0c389e099958bba121c44eb5deeabd 33901bb3c92fed28f2e08d4872caf30b48f60b518c6603834931eea560178498 블록 3 아님말고 33901bb3c92fed28f2e08d4872caf30b48f60b518c6603834931eea560178498 7bb2fca9e4724c28cf9ddc42efc72240009239bcb66a7c0d67b04c5679a356cf True
블록 1을 조작합시다.
# Block 1번을 조작합시다. blockchain[1] = (‘너는미남이아니다’, blockchain[0][2], make_hash(‘너는미남이아니다’, blockchain[0][2])) show_blockchain() print() print(verify_blockchain())
블록 0 Genesis 81ddc8d248b2dccdd3fdd5e84f0cad62b08f2d10b57f9a831c13451e5c5c80a5 블록 1 너는미남이아니다 81ddc8d248b2dccdd3fdd5e84f0cad62b08f2d10b57f9a831c13451e5c5c80a5 2dd22979b6a370836be47cab599c021452d499af99b71e6d5ab2eac0747a2403 블록 2 진짜미남이다 40405b3990f4fa49832a9b268aaf7001ac0c389e099958bba121c44eb5deeabd 33901bb3c92fed28f2e08d4872caf30b48f60b518c6603834931eea560178498 블록 3 아님말고 33901bb3c92fed28f2e08d4872caf30b48f60b518c6603834931eea560178498 7bb2fca9e4724c28cf9ddc42efc72240009239bcb66a7c0d67b04c5679a356cf 블록 2 이전 해시 != 블록 1 현 해시. 40405b3990f4fa49832a9b268aaf7001ac0c389e099958bba121c44eb5deeabd != 2dd22979b6a370836be47cab599c021452d499af99b71e6d5ab2eac0747a2403 False
지금까지 코딩한 것을 보면,
블록체인은 유통 과정 등을 기록하는데 적당한 구조라는 걸 알 수 있습니다.
유통과정, 시간 등을 블록체인에 기록하면 중간 과정을 고칠 수가 없습니다.
하지만 전체나, 특정 단계 이후를 모두 조작하는 식의 조작은 가능하고,
따라서 추가적인 장치가 필요함을 알 수 있습니다.
PoW (Proof of Works, 작업 증명)
이제 그 추가적인 장치 중 핵심인 POW (Proof Of Works)를 살펴봅시다.
POW란 우리가 블록을 만들 때 마지막으로 해싱을 하는데요.
이때 해싱이 어렵도록 하는 장치입니다.
어떻게(how) 어렵게 만들까요?
how와 why를 중심으로 생각하면 좋습니다.
특정 조건의 해시값을 찾습니다.
00으로 시작하는 해시값을 찾아라….
0의 개수가 늘어날수록
해시 값 찾기가 어렵겠죠?
난이도(0의 개수)도 블록에 추가됩니다.
검증을 위해 다시 해시를 검산할 때 0의 개수가 필요합니다.
블록에만 난이도를 기록하는 건 ‘해킹해주세요’라는 것 과 같습니다.
쉬운 난이도로 긴 위조 체인을 만들어서 뿌릴 수 있기 때문입니다.
하지만 간단히 코딩하기 위해.. 여기까지만..
그런데 이런 의문이 생깁니다.
데이터와 이전 해시값이 고정되어 묶여있고,
이 고정된 값에 대한 해시값은 역시 하나로 고정되어 있는데..
어떻게(how) 특정 조건의 해시값을 찾으란 말이지?
(하나의 데이터에 대한 해시값은 오직 하나입니다.)
그래서 블록에 nonce라는 항목이 추가됩니다.
nonce 값을 바꿔가면서 엄청나게 해싱을 반복해서
00…으로 시작하는 해시값을 찾는 거죠.
찾으면 나 찾았다. (심봤다)
데이터에 nonce값 xxxxxxxx을 추가해서 해싱을 하니까..
00…으로 시작하는 해시 값이 나왔다..
너네들 확인해봐..
(네트워킹 쪽은 코딩하지 않습니다만…)
라고 주위 노드에게 뿌립니다.
주위 노드들은 데이터에 nonce 값을 추가한 뒤 해싱해서
00으로 시작되는 지 확인합니다.
검증은 한 번에 끝납니다.
nonce와 hash를 비교할 때 편하도록
hash의 자료형을 bytes에서 str로 바꿨습니다.
digest()에서 hexdigest()로…
add_block함수명을 add_normal_block으로 바꾸고 교통정리도 했습니다.
전역 변수도 생기고 코드가 조금 지저분해졌네요.
클래스의 필요가 느껴집니다.
from hashlib import sha256 blockchain = [] difficulty = 4 def add_genesis_block(): “””첫 블록을 만들고, 블록 체인에 추가합니다””” data = ‘Genesis’ prev_hash = ” nonce, current_hash = make_hash(data, prev_hash, difficulty) add_block(data, prev_hash, difficulty, nonce, current_hash) def make_hash(data: str, prev_hash: str, difficulty_: int) -> (int, str): “””해시를 만듭니다. PoW””” new_hash = ‘ ‘ * difficulty_ checker = ‘0’ * difficulty_ nonce = 0 while new_hash[:difficulty_] != checker: new_hash = sha256((data + str(nonce) + prev_hash).encode()).hexdigest() nonce += 1 return nonce, new_hash def add_block(data, prev_hash, difficulty_, nonce, current_hash): “””실제로 블록을 추가합니다.””” # 한 줄이라고 두 함수의 공통 부분을 방치했더니 # 기능 추가시 양쪽을 다 수정해야만 했습니다. # 단순한 복붙에도 실수를 할 수 있습니다. # 공통 부분은 최대한 모아야 합니다. blockchain.append((data, prev_hash, difficulty_, nonce, current_hash)) def add_normal_block(data: str): “””일반 블록을 만들고, 블록 체인에 추가합니다.””” _, _, _, _, prev_hash = blockchain[-1] nonce, current_hash = make_hash(data, prev_hash, difficulty) add_block(data, prev_hash, difficulty, nonce, current_hash) def show_blockchain(): “””블록 체인을 보여줍니다.””” for i, (data, prev_hash, difficulty_, nonce, current_hash) in enumerate(blockchain): print(f’블록 {i}
‘ f'{data}, {difficulty_}, {nonce}
‘ f'{prev_hash}
‘ f'{current_hash}’) def verify_blockchain(): “””블록 체인을 검증합니다.””” for i in range(1, len(blockchain)): data, prev_hash, difficulty_, nonce, current_hash = blockchain[i] last_data, last_prev_hash, last_difficulty, last_nonce, last_current_hash \ = blockchain[i – 1] if prev_hash != last_current_hash: print(f”[블록 {i}] 이전 해시 != [블록 {i – 1}] 현 해시.
” f”{prev_hash} !=
{last_current_hash}”) return False if (last_nonce, last_current_hash) != \ (temp := make_hash(last_data, last_prev_hash, last_difficulty)): show_verify_failed(i – 1, last_nonce, last_current_hash, temp[0], temp[1]) return False if (nonce, current_hash) != (temp := make_hash(data, prev_hash, difficulty_)): show_verify_failed(i, nonce, current_hash, temp[0], temp[1]) return False return True def show_verify_failed(block_num, ori_nonce, ori_hash, new_nonce, new_hash): print(f”블록 {block_num} 검증 실패.
” f”{ori_nonce} != {new_nonce}
” f”{ori_hash} !=
{new_hash}”) add_genesis_block() add_normal_block(‘나는미남이다’) add_normal_block(‘진짜미남이다’) add_normal_block(‘아님말고’) show_blockchain() print() print(verify_blockchain())
블록 0 Genesis, 4, 100816 00000551fb3e39f4f36d2121a6043c71999059f733ab13561539ebfe57f85961 블록 1 나는미남이다, 4, 21340 00000551fb3e39f4f36d2121a6043c71999059f733ab13561539ebfe57f85961 0000f818c1e5d987dbced40a9e40f1095248635e90cac77eba0e7332d8e85a44 블록 2 진짜미남이다, 4, 25151 0000f818c1e5d987dbced40a9e40f1095248635e90cac77eba0e7332d8e85a44 00002cfa10b49be7eb01dfe8623b4a1566284c4fb8835d62b1f7bcbf05f2be60 블록 3 아님말고, 4, 5344 00002cfa10b49be7eb01dfe8623b4a1566284c4fb8835d62b1f7bcbf05f2be60 0000093cfe16f29477622e7621b4cc18f38a46d43f0d0300a8f0b7effa6e5259 True
blockchain[1] = (‘너는미남이아니다’, blockchain[0][4], blockchain[0][2], *make_hash(‘너는미남이아니다’, blockchain[0][4], blockchain[0][2])) show_blockchain() print() print(verify_blockchain())
블록 0 Genesis, 4, 100816 00000551fb3e39f4f36d2121a6043c71999059f733ab13561539ebfe57f85961 블록 1 너는미남이아니다, 4, 11661 00000551fb3e39f4f36d2121a6043c71999059f733ab13561539ebfe57f85961 00003bfc5c576c53bc0d753912967ac737304bd60cf05d9be82c2a4d0d354e1f 블록 2 진짜미남이다, 4, 25151 0000f818c1e5d987dbced40a9e40f1095248635e90cac77eba0e7332d8e85a44 00002cfa10b49be7eb01dfe8623b4a1566284c4fb8835d62b1f7bcbf05f2be60 블록 3 아님말고, 4, 5344 00002cfa10b49be7eb01dfe8623b4a1566284c4fb8835d62b1f7bcbf05f2be60 0000093cfe16f29477622e7621b4cc18f38a46d43f0d0300a8f0b7effa6e5259 [블록 2] 이전 해시 != [블록 1] 현 해시. 0000f818c1e5d987dbced40a9e40f1095248635e90cac77eba0e7332d8e85a44 != 00003bfc5c576c53bc0d753912967ac737304bd60cf05d9be82c2a4d0d354e1f False
PoW의 Why
PoW(작업증명)의 how는 필요한 만큼은 알려드린 것 같습니다.
그런데 why를 알려드리진 않은 것 같네요.
코딩도 끝나고 머리도 가벼워지셨을 테니 다시 채워보겠습니다.
PoW의 역사부터..
1992년 (~1993년) 심시아 더크(Cynthia Dwork)와 모니 나노어(Moni Naor)이 작업 증명의 기본 개념을 고안했다.
http://www.wisdom.weizmann.ac.il/~naor/PAPERS/pvp.pdf
1997년 최초로 아담 백(Adam Back)이 해시캐시에 적용했다.
해시캐시(hashcash)는 대량 스팸메일을 막기 위해 개발한 암호화폐이다.
http://hashcash.org
1999년 마커스 제이콥슨(Markus_Jakobsson)과 아리 쥬엘스(Ari Juels)에 의해 Proof of Work라는 명칭이 붙었다.
2009년 사토시 나카모토 비트코인(bitcoin)에 적용
http://wiki.hash.kr/index.php/%EC%9E%91%EC%97%85%EC%A6%9D%EB%AA%85
가끔 Bitcoin 창시자인 Satoshi Nakamoto가 PoW의 창시자라는 말을 하시는 분들도 계신데, 그건 좀…..
해시캐시의 원리
해시캐시가 어떤 원리로 작동되는지는 다음 링크에 자세히 나와 있습니다.
https://www.joinc.co.kr/w/man/12/blockChain/hashcash
메일을 보내기 위해서는 아주 많은 연산을 해야 하고,
메일을 확인하기 위해서는 약간의 연산이 필요할 뿐이다.
즉 보내는 쪽이 대부분의 비용(=연산)을 책임진다.
스팸 메일을 보내기 위해 스팸으로 벌 수 있는 돈보다
큰 비용을 들여 연산을 하지 않을 것이다.
3자가 개입하지 않는 검증 시스템이라는 데 큰 의미가 있다.
생각보다 간단한 원리네요….
PoW의 단점
단점이 먼저 나오는 게 순서상 이상합니다만…
절반 이상의 해시 파워 를 가지게 된다면 블록 내용의 조작이 가능합니다.
를 가지게 된다면 블록 내용의 조작이 가능합니다. 긴 체인이 올바른 것으로 판단 합니다. 체인이 버려지는 경우 트랜잭션이 무효가 될 수 있습니다.
(이를 방지하기 위한 장치도 존재합니다만…)
합니다. 체인이 버려지는 경우 트랜잭션이 무효가 될 수 있습니다. (이를 방지하기 위한 장치도 존재합니다만…) 합의를 통해 신뢰성을 확인 하기 때문에, 정보의 확산 및 합의에 걸리는 시간이 필요 합니다.
필요 이상의 많은 자원(전력)을 소모 합니다.
블록의 생성 과정
블록은 거래내역과 이전 해시값을 합쳐서 거래 기록들을 전달받는다.
특정 숫자를 찾아서 블록을 생성한다.
생성한 블록을 블록체인에 추가하고 전달하여 새롭게 채굴된 비트코인을 보상으로 받는다.
https://brunch.co.kr/@ashhan/16
https://steemit.com/kr/@feyee95/4-1 http://wiki.hash.kr/index.php/%EB%B8%94%EB%A1%9D%EC%83%9D%EC%84%B1%EC%9E%90
블록을 위조하려면…
위에서 가장 긴 블록체인이 진짜라고 말씀드렸습니다.
짧은 걸 진짜라고는 할 수는 없으니…
빡센 연산은 위조 시에도 똑같이 적용이 됩니다.
본인을 제외한 전 세계 비트코인 노드들의 해시파워의 총합보다
더 큰 해시 파워(보통 초당 해시 생성수 =연산력)를 가지고 있다면,
더 긴 가짜 블록체인을 만들어 공격을 할 수 있습니다.
비트코인의 위조가능성
현실적으로 불가능합니다.
16년에 100경 해시였었는데요..
m.blog.naver.com/softmate1/220609722117
19년 8월에 비트코인 네트워크의 총 해시는 초당 7143경이었다고 합니다.
https://www.coindeskkorea.com/news/articleView.html?idxno=53404
점점 늘어나죠..
18년 기준으로 4조 정도의 금액이 들어간다고 하네요.
medium.com/@woohyuk.jung88
알트코인의 51% 공격 사례
하지만 해시 파워가 약한 알트 코인계에서는 꽤 많은 공격 성공사례가 있습니다.
버지, 모나코인, 비트코인골드, 젠캐시, 이더리움 클래식
wiki.hash.kr/index.php/51%25_%EA%B3%B5%EA%B2%A9#51.25_.EA.B3.B5.EA.B2.A9_.EC.82.AC.EB.A1.80
‘초대형’ 코인에서 하드포크를 한 알트코인 ‘신생’이 있다고 합시다.
‘신생’ 코인은 ‘초대형’ 코인에서 하드포크를 했으니까 ‘초대형’코인과 똑같은 방식으로 작동합니다.
그렇다면 ‘초대형’ 코인 채굴기의 설정을 조금만 바꾸면 새로운 ‘신생’ 코인을 채굴할 수 있겠죠?
그런데 ‘초대형’ 코인의 해시파워에 비해서 ‘신생’ 코인의 해시파워는 아주 약할겁니다.
이 때 ‘초대형’ 코인 채굴기의 소유자가
본인의 해시파워가 ‘신생’ 코인의 절반보다 크고
‘신생’ 코인을 해킹했을 때의 이익이
‘초대형’ 코인의 빡빡한 채굴 환경에서의 이익보다 큰 상황이 되면………
기타
비잔티움(비잔틴) 장군 문제도 같이 봐주면 좋습니다.
이런 영상도 좋습니다. youtu.be/bBC-nXj3Ng4
반응형
파이썬으로 배우는 블록체인 구조와 이론 – 교보문고
상품상세정보 ISBN 9791158391515 ( 115839151X ) 쪽수 324쪽 크기 188 * 241 * 24 mm /737g 판형알림
책소개
이 책이 속한 분야
이 책의 설명
파이썬을 통해서 블록체인의 기반기술을 깊게 이해하고 싶은 독자분들에게 추천합니다!
이 책은 블록체인의 기능에 대한 문제점과 보완 방법 등에 관해 활발히 토론이 이뤄지고 있는 개발자 커뮤니티와 개발 제안 문서(Bitcoin Improvement Proposals, BIP)의 내용을 중심으로 집필이 됐다. 따라서 블록체인의 원천 기술인 비트코인 네트워크의 구조와 원리를 자세히 밝히는 것은 물론 블록체인의 구조를 기능별로 세분화해서 각 기능의 동작 원리와 상호 작용을 분석하고 있다.
이 책을 통해 블록체인의 동작 원리를 설명하고 파이썬 프로그래밍을 통해 이론을 구체화했으므로 블록체인 기술을 더욱 깊이 이해하고 싶은 독자에게 도움이 될 것이다.
상세이미지
목차
▣ 1장: 비트코인 네트워크의 개요
1.1. 비트코인의 탄생
1.2. 암호화폐의 역사
__암호화폐의 주요 이슈
__비트코인은 기존 암호화폐 아이디어의 종합체
1.3. 블록체인 기술의 의의
__중재자 없는 자유로운 거래 실현
__화폐, 계약서, 증명서 등 디지털 대상의 다양화
__사용자 증가에 따른 새로운 가치 창출
1.4. 블록체인이 가지고 올 비즈니스 혁신
__블록체인의 비즈니스 활용
__스마트 컨트랙트와 비즈니스의 결합
1.5. P2P 네트워크
__서버-클라이언트 네트워크
__P2P 네트워크
1.6. 비트코인 네트워크의 구성원
1.7. 각 노드의 기능
__풀 블록체인 노드(풀 노드)
__Lightweight 노드(SPV 노드)
__채굴자 노드
__서드파티 API 클라이언트
1.8. 참여자 노드 현황 관찰
1.9. 블록체인의 구조
1.10. 블록체인 데이터 확인
1.11. 블록의 크기 제한과 비트코인의 확장성
__비트코인의 확장성 문제
__세그윗과 비트코인 캐시의 탄생
1.12. 비트코인 지갑과 지갑 주소
__일반 사용자의 지갑
__개발자, 전문가 측면의 지갑
1.13. 트랜잭션(Transaction) 생성
__트랜잭션 생성
__블록체인과 트랜잭션 체인
1.14. 트랜잭션 전송
__나영이가 풀 노드일 때
__나영이가 SPV 노드일 때
__나영이가 서드파티 API 클라이언트일 때
__실제 트랜잭션 사례
1.15. 채굴
__블록 데이터 구조
__채굴 과정
▣ 2장: 암호 기술
2.1. 암호의 역사
__고대 암호
__근대 암호
2.2. 암호문의 요건
__혼돈(Confusion) 과정
__확산(Diffusion) 과정
2.3. 대칭키 기반 암호기술
__동작 방식
__블록 암호 방식(Block Cipher)
__스트림 암호 방식(Stream Cipher)
__Data Encryption Standard(DES) 알고리즘
__Advanced Encryption Standard(AES) 알고리즘
2.4. 대칭키 암호 절차 실습(AES)
__대칭키 기반 암호 방식의 문제점
2.5. 공개키 기반 암호기술
__동작 방식
__RSA 알고리즘
__Diffie-Hellman Key 교환 알고리즘(DHKE)
__Elgamal 알고리즘
__Square-and-Multiply 알고리즘(공개키 계산)
__타원곡선암호 알고리즘(Elliptic Curve Cryptography: ECC)
__덧셈 연산자(Addition operator)
__덧셈 연산자 연습
__개인키, 공개키 생성
__Double-and-Add 알고리즘
2.6. 해시(Hash) 알고리즘
__해시 함수의 조건
__해시 알고리즘의 종류
__비트코인에 적용된 해시 함수
2.7. 전자서명(Digital Signature)
__타원곡선 전자서명 알고리즘(ECDSA)
▣ 3장: 지갑(Wallet)
3.1. 비트코인 지갑 주소
__키와 지갑 주소
3.2. 개인키(Private Key)
__타원곡선암호의 표준 문서
__랜덤 넘버 생성기(Random Number Generator: RNG)
__Base58Check 인코딩
__Wallet Import Format(WIF)
3.3. 공개키(Public Key)
__공개키 생성
__공개키 유형
__공개키 포맷 변환
3.4. 지갑 주소(Address)
__지갑 주소 생성과정
__메인넷(Mainnet)과 테스트넷(Testnet)
__버전 프리픽스(Version prefix)
3.5. 지갑 주소 관리
3.6. 지갑의 백업 관리
__백업 방식
__개인키 유실
__브레인 월렛(Brain Wallet)
__베니티 월렛(Vanity Wallet)
3.7. 지갑의 유형과 키 관리
__비결정적 방식의 지갑(Non-deterministic Wallet)
__결정적 방식의 지갑(Deterministic Wallet)
3.8. 계층 구조의 결정적 방식(Hierarchical Deterministic Wallets: HD Wallets, BIP-32)
__HD 지갑의 구조
__활용 케이스
3.9. 니모닉 코드(Mnemonic Code: BIP-39)
▣ 4장: 트랜잭션(Transaction)
4.1. 트랜잭션의 구조
__이중 지급 문제
__트랜잭션 데이터 구조
__필드 크기(Bytes)
__입력부의 Script Sig 구조
__바이트 오더(Byte order)
__직렬화(Serialization)
__트랜잭션 ID
4.2. 전자서명 생성
__전자서명 생성 절차
__해시타입(Hash Type)
__크라우드 펀딩
__백지수표
__더스트 콜렉터(Dust collector)
4.3. 전자서명 검증
__검증 스크립트 생성
__스크립트 검증 절차
__원시 데이터와 검증 스크립트
4.4. UTXO 조회 실습
4.5. 트랜잭션 생성 및 송금
__테스트용 지갑 주소 생성
__초기 잔액 확보
__코드 실행
__송금 결과 확인
4.6. 적정 거래 수수료
4.7. 트랜잭션 가변성(Transaction Malleability)
__트랜잭션 가변성 사례 분석
__가능한 공격 시나리오
4.8. 다중 서명(MultiSig)
__스크립트 구조
__스크립트 검증
4.9. Pay-to-Script Hash(P2SH)
4.10. P2SH 지갑 주소 생성
__다중 서명용 지갑 주소 생성 절차
__P2SH와 P2PKH의 거래 예시
__리딤 스크립트 디코딩
__스크립트 검증
4.11. P2SH 지갑 생성 및 트랜잭션 생성 실습
__코드 실행
__송금 결과 확인
4.12. 세그윗(Segregated Witness: SegWit)
__세그윗 개요
__세그윗 트랜잭션 사용량
4.13. 세그윗과 위트니스 머클 트리
__위트니스용 머클 트리
__코인베이스 트랜잭션의 출력부
4.14. 세그윗 트랜잭션
__세그윗 트랜잭션의 구조
__서명 검증
4.15. Bech32 주소
__트랜잭션 사례
__오류 검출
__Bech32 주소 형식
▣ 5장: 채굴(Mining)
5.1. 블록 헤더의 구조
5.2. 버전(version)
5.3. 해시 난이도
__타깃 비츠(Target Bits)
__채굴 난이도 지표(Difficulty)
__블록 해시 확인
5.4. 해시 난이도 조절(Retarget)
__타깃 값 설정 규칙
5.5. 머클 트리(Merkle Tree)와 머클 루트(Merkle Root)
5.6. 엑스트라 논스(Extra Nonce)
5.7. 채굴 절차 흐름도
5.8. 해시 파워(Hash power)
__해시 파워와 채굴 난이도
5.9. 비트코인 발행량
__디플레이션 화폐
__미국 달러 발행량과 비트코인 발행량 비교
5.10. 수수료와 최적 블록 사이즈
__채굴자 입장
__일반 사용자 입장
__시장의 균형
5.11. 솔로 마이닝(Solo Mining)과 풀 마이닝(Pool Mining)
__솔로 마이닝
__풀 마이닝
__보상 분배 방식
5.12. 블록체인의 분기
__블록체인의 일시적 분기
__트랜잭션의 최종 승인(Confirmation)
__하드포크(Hard Fork)와 소프트포크(Soft Fork)
__네트워크 분리와 새로운 코인의 탄생
▣ 6장: 비트코인 P2P 프로토콜
6.1. 패킷 분석기 소개 – 와이어샤크(WireShark)
6.2. 노드 관리 메시지
__version, verack 메시지
__getaddr, addr 메시지
__ping, pong 메시지
6.3. 블록 데이터 동기화
__블록 우선(Block-first) 동기화 방식
__블록 우선 방식의 문제점
__헤더 우선(Headers-first) 동기화 방식
6.4. 신규 블록 데이터 릴레이
__이전 방식의 블록 전송
__현재 방식의 블록 전송
__저대역폭 릴레이(Low Bandwidth Relaying)
__고대역폭 릴레이(High Bandwidth Relaying)
6.5. 트랜잭션 릴레이
6.6. 기타 메시지
__Reject 메시지
__Feefilter 메시지
__Mempool 메시지
__Notfound 메시지
__패널티 부여 및 노드 차단
6.7. SPV 노드 – Simplified Payment Verification
__블룸 필터(Bloom Filter)
__비주얼 스튜디오 내려받기
__SPV와 블룸 필터
__필터로드(filterload) 메시지
__머클 블록과 트랜잭션 검증
▣ 7장: 비트코인 코어(Bitcoin Core)
7.1. 비트코인 코어 설치
__프로그램 내려받기 및 설치
__환경 설정
7.2. 비트코인 코어 실행
7.3. 블록체인 데이터 파일 구성
__블록체인 데이터
__UTXO set 데이터
__지갑 데이터
7.4. 키와 주소 확인
7.5. 비트코인 코어 클라이언트
__비트코인 코어 클라이언트
__블록 데이터 조회
__트랜잭션 데이터 조회
7.6. 비트코인 코어 원격 프로시저 호출(RPC)
__블록 데이터 조회
7.7. RPC 기능을 활용한 블록체인 분석 예시
__분석 예시-1: 블록 생성 시간의 분포 분석
__분석 예시-2: 블록당 트랜잭션 개수의 분포 분석
__분석 예시-3: 기간에 따른 난이도의 변화 관찰
__분석 예시-4: 메모리 풀(MemPool)에 저장된 트랜잭션 조회
__분석 예시-5: 인근 피어(peer) 정보 확인
__분석 예시-6: 채굴자의 트랜잭션 선택 전략 확인
7.8 RPC 메서드 목록
__블록체인 관련 RPCs
__컨트롤 RPCs
__마이닝 RPCs
__네트워크 RPCs
__트랜잭션 RPCs
__유틸리티 RPCs
__지갑 RPCs
출판사 서평
So you have finished reading the 파이썬 블록 체인 topic article, if you find this article useful, please share it. Thank you very much. See more: 파이썬 블록체인 만들기, 파이썬으로 배우는 블록체인 구조와 이론 pdf, 파이썬 블록체인 예제, 블록체인 가상화폐 만들기, 블록체인 언어, 파이썬 코인 만들기, 블록체인 지갑 구현, 블록체인 네트워크 구현