Pythonブロックチェーンの作成

6956 ワード

前言:最近ブロックチェーンに関する資料を見て、pythonを使ってブロックチェーンを作成したのを見て、大体まとめました.ブロックチェーンは、ブロックの記録からなる可変で秩序あるチェーン構造であり、取引、ファイル、または任意のデータを記録することができ、重要なのは、ハヒ値(hashes)によってリンクされていることです.
一、Blockchainの作成
1.まずBlockchainクラスを作成し、コンストラクション関数に2つのリストを作成します.1つは取引を格納し、もう1つはブロックチェーンを格納します.
Blockchainクラス
# Blockchain       ,      ,    
class Blockchain(object):
    def __init__(self):
        self.chain = []
        self.current_transactions = []
        
    def new_block(self):
        #   
        pass
    
    def new_transaction(self):
        #   
        pass
    
    @staticmethod
    def hash(block):
        #    
        pass

    @property
    def last_block(self):
        #           
        pass

2.ブロック構造
#         :  (index),Unix   (timestamp),    (transactions),     (    )        Hash 
block = {
    'index': 1,
    'timestamp': 1506057125.900785,
    'transactions': [
        {
            'sender': "8527147fe1f5426f9dd545de4b27ee00",
            'recipient': "a77f5cdfa2934df3954a5c7c7da5df1f",
            'amount': 5,
        }
    ],
    'proof': 324984774000,
    'previous_hash': "2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824"
}

3.取引に参加する
class Blockchain(object):
    ...
    def new_transaction(self, sender, recipient, amount):
        #        ,               
        self.current_transactions.append({
            'sender': sender,
            'recipient': recipient,
            'amount': amount,
        })

        return self.last_block['index'] + 1

4.新規ブロックの作成
import hashlib
import json
from time import time


class Blockchain(object):
    def __init__(self):
        self.current_transactions = []
        self.chain = []
        self.new_block(previous_hash=1, proof=100)

    def new_block(self, proof, previous_hash=None):
        #     
        block = {
            'index': len(self.chain) + 1,
            'timestamp': time(),
            'transactions': self.current_transactions,
            'proof': proof,
            'previous_hash': previous_hash or self.hash(self.chain[-1]),
        }
        self.current_transactions = []
        self.chain.append(block)
        return block

    def new_transaction(self, sender, recipient, amount):
        #        ,               
        self.current_transactions.append({
            'sender': sender,
            'recipient': recipient,
            'amount': amount,
        })

        return self.last_block['index'] + 1

    @property
    def last_block(self):
        return self.chain[-1]

    @staticmethod
    def hash(block):
        #      SHA-256 hash 
        block_string = json.dumps(block, sort_keys=True).encode()
        return hashlib.sha256(block_string).hexdigest()

5.作業量証明
新しいブロックはワークロード証明アルゴリズムに依存して構築される.PoWの目標は特定の条件を満たす数字を見つけることであり,この数字は計算しにくいが検証しやすい.これが仕事量証明の核心思想である.ビットコインの中で鉱夫たちはブロックを作る権利を争うために計算結果を争っている.通常、計算の難易度は、ターゲット文字列が満たす必要がある特定の文字の数に比例し、鉱山労働者が結果を算出すると、ビットコインの奨励金が得られる.もちろん,この結果はネットワーク上で非常に容易に検証できる.
6.作業量証明の実現
アルゴリズムの複雑さを測定する方法は,ゼロの先頭の個数を修正することである.4つを使用してプレゼンテーションを行うと、複数のゼロが計算に要する時間を大幅に増加させることがわかります.
import hashlib
import json

from time import time
from uuid import uuid4


class Blockchain(object):

    def proof_of_work(self, last_proof):
        '''
                :
         -      p'    hash(pp')  4 0  
         - p         ,  p'       
        '''
        proof = 0
        while self.valid_proof(last_proof, proof) is False:
            proof += 1
        return proof

    @staticmethod
    def valid_proof(last_proof, proof):
        #     :   hash(last_proof, proof) 4 0  ?

        guess = f'{last_proof}{proof}'.encode()
        guess_hash = hashlib.sha256(guess).hexdigest()
        return guess_hash[:4] == "0000"

二、APIインタフェース
1.ノードの作成
# Flask                 
import hashlib
import json
from textwrap import dedent
from time import time
from uuid import uuid4
from flask import Flask


class Blockchain(object):
    ...


app = Flask(__name__)
node_identifier = str(uuid4()).replace('-', '')
blockchain = Blockchain()


@app.route('/mine', methods=['GET'])
def mine():
    return "We'll mine a new Block"
  
@app.route('/transactions/new', methods=['POST'])
def new_transaction():
    return "We'll add a new transaction"

@app.route('/chain', methods=['GET'])
def full_chain():
    response = {
        'chain': blockchain.chain,
        'length': len(blockchain.chain),
    }
    return jsonify(response), 200

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

2.取引の送付
import hashlib
import json
from textwrap import dedent
from time import time
from uuid import uuid4
from flask import Flask, jsonify, request

...

@app.route('/transactions/new', methods=['POST'])
def new_transaction():
    values = request.get_json()

    required = ['sender', 'recipient', 'amount']
    if not all(k in values for k in required):
        return 'Missing values', 400

    index = blockchain.new_transaction(values['sender'], values['recipient'], values['amount'])

    response = {'message': f'Transaction will be added to Block {index}'}
    return jsonify(response), 201

3.掘削
(1)計算ワークロード証明PoW(2)新規取引により鉱夫(自己)に1つの貨幣(3)を付与して新区ブロックを構築しチェーンに追加する
import hashlib
import json
from time import time
from uuid import uuid4
from flask import Flask, jsonify, request

@app.route('/mine', methods=['GET'])
def mine():
    last_block = blockchain.last_block
    last_proof = last_block['proof']
    proof = blockchain.proof_of_work(last_proof)

    #              .
    #      "0"         
    blockchain.new_transaction(
        sender="0",
        recipient=node_identifier,
        amount=1,
    )

    block = blockchain.new_block(proof)

    response = {
        'message': "New Block Forged",
        'index': block['index'],
        'transactions': block['transactions'],
        'proof': block['proof'],
        'previous_hash': block['previous_hash'],
    }
    return jsonify(response), 200

4.ブロックチェーンプロジェクトの実行
(1)プロジェクトの開始(2)postmanを使用してリクエストを送信し、掘削を開始する:http://localhost:5000/mineああ、ここで鉱山を掘ることができます.少し時間がかかります.戻ってきたブロック情報ブロック情報を見ることができます.http://localhost:5000/chain、すべてのブロック情報を得ることができます
ブロックチェーンに関する知識は、まずみんなにここまで話して、後で新しい認識があれば、またみんなに共同で検討させるように書きます!