[PYTHON] Implementieren Sie eine Blockchain mit ca. 60 Zeilen

Einführung

Ich habe den Inhalt der Blockchain im Kurs Udemy grob verstanden und ihn implementiert. Wir implementieren es selbst basierend auf dem Inhalt des Kurses. Jun Sakai, ein aktiver Ingenieur im Silicon Valley, unterrichtet diesen Kurs. Wenn Sie diesen Kurs belegen, können Sie die folgenden Programme erstellen, ohne auf etwas zu achten. Wallet und Proof_of_work, die in diesem Beitrag nicht implementiert sind, sind ebenfalls implementiert. Wenn Sie also interessiert sind, nehmen Sie bitte an diesem Kurs teil. Ich empfehle auch Jun Sakais Python-Grundkurs.

Blockchain-Elemente

Die Elemente in jedem Block sind wie folgt.

--Block --previous_hash: Hash-Wert des vorherigen Blocks --nonce: Wert, der durch Bergbau gefunden wurde --transaction: Transaktion, die im Block verarbeitet wird --Timelink: Zeitpunkt, zu dem der Block erstellt wurde

Blockchain.PNG

Alle Blöcke in der Kette sind durch previous_hash verbunden. Wenn Sie also einen Block in der Mitte der Kette manipulieren möchten, müssen Sie alle nachfolgenden Hash-Werte neu berechnen, um Manipulationen zu verhindern.

Betrieb, bis der Kette ein Block hinzugefügt wird

Die Operation, bis ein neuer Block zur Kette hinzugefügt wird, ist wie folgt.

  1. Erstellen Sie eine Transaktion basierend auf Absender, Empfänger und Betrag
  2. Registrieren (Poolen) Sie die erstellte Transaktion vorübergehend
  3. Mining gepoolter Transaktionen (Finden von Nonce-Werten)
  4. Erstellen Sie einen Block basierend auf dem Hashwert, der Nonce, der Transaktion und dem Zeitstempel des vorherigen Blocks
  5. Fügen Sie den erstellten Block zur Kette hinzu

Ich werde es tatsächlich schaffen

class BlockChain(object):

    #Erstellen Sie den ersten Block
    def __init__(self):
        self.chain = []
        self.transaction_pool = []
        self.create_block(previous_hash='Initialize')

    #Gibt einen Hashwert zurück
    def hash(self, block):
        json_block = json.dumps(block)
        return hashlib.sha256(json_block.encode()).hexdigest()
    
    #Erstellen Sie einen Block basierend auf dem empfangenen Wert
    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)
    
    #Fügen Sie der Kette Blöcke hinzu
    def add_block_to_chain(self, block):
        self.chain.append(block)

    #Finden Sie den Nonce-Wert
    def mining(self):
        previous_hash = self.hash(self.chain[-1])
        nonce = 0
        transaction = self.transaction_pool
        self.transaction_pool = []
        timestamp = time.time()
        self.create_block(previous_hash, nonce, transaction, timestamp)

    #Pool-Transaktionen
    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)

    #Geben Sie die Kette in einem einfach zu lesenden Format aus
    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}')


if __name__ == '__main__':
    print('='*30 + 'Start' + '='*30)
    #Erstellen Sie eine BlockChain-Instanz
    blockchain = BlockChain()
    #Registrieren Sie eine Transaktion
    blockchain.add_transaction(sender_name='Alice', reciever_name='Bob', value=100)
    #Registrieren Sie eine Transaktion
    blockchain.add_transaction(sender_name='Alice', reciever_name='Chris', value=1)
    #Mining durchführen (nach Nonce suchen)
    blockchain.mining()
    #Fügen Sie eine Transaktion hinzu
    blockchain.add_transaction(sender_name='Bob', reciever_name='Dave', value=100)
    #Mining durchführen (nach Nonce suchen)
    blockchain.mining()
    #Zeigen Sie die erstellte Blockchain an
    blockchain.print_chain()

Ausführungsergebnis

========================================Block   0
Initialize
========================================Block   1
previous_hash  :54c72dc7390c09a6d2c00037c381057a7bd069e8d9c427585ce31bed16dfd0d8
nonce          :0
transaction    :
        Sender_name    :Alice
        Reciever_name  :Bob
        Value          :100
transaction    :
        Sender_name    :Alice
        Reciever_name  :Chris
        Value          :1
timestamp      :1578989130.9111161
========================================Block   2
previous_hash  :d4bb210d2e3ad304db53756e87a7513b2fca8672c6e757bef6db3fff8ff26bb1
nonce          :0
transaction    :
        Sender_name    :Bob
        Reciever_name  :Dave
        Value          :100
timestamp      :1578989132.9128711

Schließlich

Es ist eine Blockchain, die seit ihrer Popularität vor einiger Zeit nicht mehr viel gehört hat, aber es gibt immer noch weitere Anwendungsfälle wie Sony, das sie für die Verwaltung des Urheberrechts verwendet, und Microsoft, das sie für die persönliche Identifizierung verwendet. Studieren Sie sie also. Ich denke, es gibt keinen Verlust. In Zukunft planen wir die Implementierung der mit Flask verknüpften.

Recommended Posts

Implementieren Sie eine Blockchain mit ca. 60 Zeilen
Ich habe versucht, eine Blockchain zu implementieren, die tatsächlich mit ungefähr 170 Zeilen funktioniert
Anmerkungen zu mit
Implementieren Sie FReLU mit tf.keras
Erleben Sie Blockchain mit BigchainDB
Implementieren Sie die Anmeldefunktion mit django-allauth
Implementieren Sie Unterbefehle mit Pythons Argparse
Über das Lernen mit Google Colab
Implementieren Sie UnionFind (gleichwertig) in 10 Zeilen
Implementieren Sie PyTorch + GPU mit Docker
[Python3] Dikstra-Methode mit 14 Zeilen
[Qt Designer] Implementieren Sie WebView mit PyQt5
Erkennung von Blockchain-Manipulationen mit Python
Denken Sie an Aussetzer mit MNIST
Implementieren Sie einfach Unterbefehle mit Python-Klick
Kommentieren Sie mehrere Zeilen mit csh aus
Implementieren Sie "Data Visualization Design # 2" mit matplotlib