Erkennung von Blockchain-Manipulationen mit Python

Einführung

Ich habe dem Python-Blockchain-Programm, das ich zuvor in [diesem Artikel] geschrieben habe, einen Manipulationserkennungstest hinzugefügt (https://qiita.com/sssssssiiiiinnn/items/e1022667026b942b2d7d).

Manipulationserkennungsmechanismus

In der Blockchain enthält jeder Block den Hash-Wert des vorherigen Blocks. Wenn er manipuliert wird, wird der Hash-Wert inkonsistent. Ich werde es sofort umsetzen. Das Verhalten ist einfach. Vergleichen Sie einfach den Hash-Wert des Blocks, den Sie wissen möchten, wenn er mit dem previous_hash des nächsten Blocks manipuliert wurde. Ich wollte eine Funktion wie is_same () in der if-Anweisung verwenden, konnte mir aber keinen guten Variablennamen vorstellen und stoppte. Führen Sie am Ende des Programms die folgende Funktion aus.

    def check_falsification(self):
      print('=' * 30 + 'Check falsification')
      for chain_index, block in enumerate(self.chain):
        if chain_index == 0:
          continue
        else:
          if block['previous_hash'] != self.make_hash(self.chain[chain_index-1]):
            print(f'[Block {chain_index-1}]Falsification is detected!!')
            return
      print('There is no falsification')

Quellcode

Die obige Funktion wird wie folgt implementiert.

import hashlib
import time
import json


class BlockChain(object):

    def __init__(self):
        self.chain = []
        self.transaction_pool = []
        self.create_block(previous_hash='Initialize')

    def make_hash(self, block):
        json_block = json.dumps(block)
        return hashlib.sha256(json_block.encode()).hexdigest()
    
    def create_block(self, previous_hash=None, nonce=0, transaction=None, timestamp=time.time()):
        block = {
            'previous_hash': previous_hash,
            'nonce': nonce,
            'transaction': transaction,
            'timestamp': timestamp
          }
        self.add_block_to_chain(block)
    
    def add_block_to_chain(self, block):
        self.chain.append(block)

    def mining(self):
        previous_hash = self.make_hash(self.chain[-1])
        nonce = 0
        transaction = self.transaction_pool
        self.transaction_pool = []
        while True:
            if self.proof_of_work(previous_hash, nonce, transaction):
                break
            else:
                nonce += 1
        timestamp = time.time()
        self.create_block(previous_hash, nonce, transaction, timestamp)

    def proof_of_work(self, previous_hash, nonce, transaction):
        guess_block = {
          'previous_hash': previous_hash,
          'nonce': nonce,
          'transaction': transaction
        }
        guess_hash = self.make_hash(guess_block)
        return guess_hash.startswith('0'*2)

    def add_transaction(self, sender_name, reciever_name, value):
        transaction = {
            'sender_name': sender_name,
            'reciever_name': reciever_name,
            'value': value
        }
        self.transaction_pool.append(transaction)

    def print_chain(self):
        for chain_index, block in enumerate(self.chain):
            print(f'{"="*40}Block {chain_index:3}')
            if block['transaction'] is None:
                print('Initialize')
                continue
            else:
                for key, value in block.items():
                    if key == 'transaction':
                        for transaction in value:
                            print(f'{"transaction":15}:')
                            for kk, vv in transaction.items():
                                print(f'\t{kk:15}:{vv}')
                    else:
                        print(f'{key:15}:{value}')

    def check_falsification(self):
      print('=' * 30 + 'Check falsification')
      for chain_index, block in enumerate(self.chain):
        if chain_index == 0:
          continue
        else:
          if block['previous_hash'] != self.make_hash(self.chain[chain_index-1]):
            print(f'[Block {chain_index-1}]Falsification is detected!!')
            return
      print('There is no falsification')


if __name__ == '__main__':
    # print('='*30 + 'Start' + '='*30)
    blockchain = BlockChain()
    blockchain.add_transaction(sender_name='Alice', reciever_name='Bob', value=100)
    blockchain.add_transaction(sender_name='Alice', reciever_name='Chris', value=1)
    blockchain.mining()
    blockchain.add_transaction(sender_name='Bob', reciever_name='Dave', value=100)
    blockchain.mining()
    blockchain.add_transaction(sender_name='Chris', reciever_name='Dave', value=100)
    blockchain.mining()
    blockchain.print_chain()
    blockchain.check_falsification()

Ausführungsergebnis

========================================Block   0
Initialize
========================================Block   1
previous_hash  :f904f9ea034f3e38ca26d52b5274b1d1159472ac12063194ee5c8b7f692e2adc
nonce          :33
transaction    :
        sender_name    :Alice
        reciever_name  :Bob
        value          :100
transaction    :
        sender_name    :Alice
        reciever_name  :Chris
        value          :1
timestamp      :1579064814.8078277
========================================Block   2
previous_hash  :75fd5621af68c8f2d8700f4585c6a05bf4f0ff781a9bef0924ad31c7ac3066b0
nonce          :220
transaction    :
        sender_name    :Bob
        reciever_name  :Dave
        value          :100
timestamp      :1579064814.815833
========================================Block   3
previous_hash  :5aa74c98450873ce6485a92a932cecbd72f542d961cb1cc3c2fd9129f15eebf2
nonce          :243
transaction    :
        sender_name    :Chris
        reciever_name  :Dave
        value          :100
timestamp      :1579064814.8278437
==============================Check falsification
Es gibt keine Fälschung ← Keine Manipulation

Manipulation und Erkennung

Als nächstes manipulieren wir es. Angenommen, Dave manipuliert den Wert einer Block 2-Transaktion, um sein Vermögen zu erhöhen. Fügen Sie kurz vor blockchain.print_chain Folgendes hinzu.

    blockchain.chain[2]['transaction'][0]['value'] = 10000

Was passiert, wenn Sie check_falsification in diesem Zustand ausführen?

Ausführungsergebnis

==============================Make falsification
========================================Block   0
Initialize
========================================Block   1
previous_hash  :3697444272d45bb529d559f0ac13cd287a310303cae0db0e27c644d32d371c27
nonce          :105
transaction    :
        sender_name    :Alice
        reciever_name  :Bob
        value          :100
transaction    :
        sender_name    :Alice
        reciever_name  :Chris
        value          :1
timestamp      :1579064861.3724322
========================================Block   2
previous_hash  :e6cdee32c283131e191a97113887172fba2f61c49eae031d271162545c345bec
nonce          :146
transaction    :
        sender_name    :Bob
        reciever_name  :Dave
        value          :10000 ← Manipulationen
timestamp      :1579064861.3824363
========================================Block   3
previous_hash  :7810a72e38652124bff69c1436669e873a01d7d4b392107d210e33c3c841ca0c
nonce          :162
transaction    :
        sender_name    :Chris
        reciever_name  :Dave
        value          :100
timestamp      :1579064861.391444
==============================Check falsification
[Block 2]Falsification is detected!!← Manipulationserkennung

Manipulationen wurden in [Block 2] festgestellt.

Zusammenfassung

Diesmal habe ich versucht, von Manipulation bis Erkennung zu implementieren. Normalerweise sollten die Variablen in der Blockchain gekapselt und nicht funktionsfähig sein.

Recommended Posts

Erkennung von Blockchain-Manipulationen mit Python
Gesichtserkennung mit Python + dlib
Gesichtserkennung mit Python + OpenCV
Gesichtserkennung mit YOLO Face (Windows10, Python3.6)
Gesichtserkennung mit Lambda (Python) + Erkennung
[Python] Verwenden von OpenCV mit Python (Kantenerkennung)
Gesichtserkennung mit Python + OpenCV (invariante Rotation)
FizzBuzz in Python3
Scraping mit Python
Statistik mit Python
Scraping mit Python
Python mit Go
Twilio mit Python
In Python integrieren
Spielen Sie mit 2016-Python
AES256 mit Python
Getestet mit Python
Python beginnt mit ()
mit Syntax (Python)
Zundokokiyoshi mit Python
Excel mit Python
Mikrocomputer mit Python
Mit Python besetzen
Hallo Welt- und Gesichtserkennung mit OpenCV 4.3 + Python
Serielle Kommunikation mit Python
Zip, entpacken mit Python
Django 1.11 wurde mit Python3.6 gestartet
Primzahlbeurteilung mit Python
Python mit Eclipse + PyDev.
Socket-Kommunikation mit Python
Datenanalyse mit Python 2
Scraping in Python (Vorbereitung)
Python lernen mit ChemTHEATER 03
Sequentielle Suche mit Python
Führen Sie Python mit VBA aus
Umgang mit Yaml mit Python
Löse AtCoder 167 mit Python
Serielle Kommunikation mit Python
[Python] Verwenden Sie JSON mit Python
Python lernen mit ChemTHEATER 05-1
Lerne Python mit ChemTHEATER
Führen Sie prepDE.py mit python3 aus
1.1 Erste Schritte mit Python
Tweets mit Python sammeln
Binarisierung mit OpenCV / Python
3. 3. KI-Programmierung mit Python
Kernel-Methode mit Python
Nicht blockierend mit Python + uWSGI
Scraping mit Python + PhantomJS
Tweets mit Python posten
Verwenden Sie Mecab mit Python 3
[Python] Mit CGIHTTPServer umleiten
Kinesis mit Python betreiben
Erste Schritte mit Python
Verwenden Sie DynamoDB mit Python
Zundko Getter mit Python
Behandle Excel mit Python
Ohmsches Gesetz mit Python
Primzahlbeurteilung mit Python