[PYTHON] Implémentez la blockchain avec environ 60 lignes

introduction

J'ai grossièrement compris le contenu de la blockchain dans le cours Udemy, alors je l'ai implémenté. Nous l'implémentons nous-mêmes en fonction du contenu du cours. Jun Sakai, ingénieur actif dans la Silicon Valley, enseigne ce cours, et en suivant ce cours, vous serez en mesure de créer les programmes suivants sans rien regarder. Wallet et proof_of_work, qui ne sont pas implémentés dans cet article, sont également implémentés, donc si vous êtes intéressé, veuillez suivre ce cours. Je recommande également le cours de base Python de Jun Sakai.

Éléments de la blockchain

Les éléments de chaque bloc sont les suivants.

--Bloquer --previous_hash: valeur de hachage du bloc précédent --nonce: valeur trouvée par l'extraction --transaction: transaction traitée dans le bloc --Timelink: heure à laquelle le bloc a été créé

Blockchain.PNG

Tous les blocs de la chaîne sont connectés par previous_hash, donc si vous voulez falsifier un bloc au milieu de la chaîne, vous devez recalculer toutes les valeurs de hachage suivantes pour éviter toute falsification.

Opération jusqu'à ce qu'un bloc soit ajouté à la chaîne

L'opération jusqu'à ce qu'un nouveau bloc soit ajouté à la chaîne est la suivante.

  1. Créez une transaction en fonction de l'expéditeur, du destinataire et du montant
  2. Enregistrez (regroupez) temporairement la transaction créée
  3. Exploration des transactions regroupées (recherche de valeurs nonce)
  4. Créez un bloc basé sur la valeur de hachage, le nonce, la transaction et l'horodatage du bloc précédent
  5. Ajoutez le bloc créé à la chaîne

Je vais vraiment le faire

class BlockChain(object):

    #Créer le premier bloc
    def __init__(self):
        self.chain = []
        self.transaction_pool = []
        self.create_block(previous_hash='Initialize')

    #Renvoie une valeur de hachage
    def hash(self, block):
        json_block = json.dumps(block)
        return hashlib.sha256(json_block.encode()).hexdigest()
    
    #Créer un bloc basé sur la valeur reçue
    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)
    
    #Ajouter des blocs à la chaîne
    def add_block_to_chain(self, block):
        self.chain.append(block)

    #Trouvez la valeur nonce
    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)

    #Transactions de pool
    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)

    #Sortie de la chaîne dans un format facile à lire
    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)
    #Créer une instance BlockChain
    blockchain = BlockChain()
    #Enregistrer une transaction
    blockchain.add_transaction(sender_name='Alice', reciever_name='Bob', value=100)
    #Enregistrer une transaction
    blockchain.add_transaction(sender_name='Alice', reciever_name='Chris', value=1)
    #Effectuer du minage (recherche de nonce)
    blockchain.mining()
    #Ajouter une transaction
    blockchain.add_transaction(sender_name='Bob', reciever_name='Dave', value=100)
    #Effectuer du minage (recherche de nonce)
    blockchain.mining()
    #Afficher la blockchain créée
    blockchain.print_chain()

Résultat d'exécution

========================================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

finalement

C'est une blockchain qui n'a pas beaucoup été entendue depuis qu'elle est devenue populaire il y a quelque temps, mais il y a encore plus de cas d'utilisation tels que Sony l'utilisant pour la gestion des droits d'auteur et Microsoft l'utilisant pour l'identification personnelle, alors étudiez-la. Je pense qu'il n'y a pas de perte. À l'avenir, nous prévoyons de mettre en œuvre celui lié à Flask.

Recommended Posts

Implémentez la blockchain avec environ 60 lignes
J'ai essayé de mettre en œuvre une blockchain qui fonctionne réellement avec environ 170 lignes
Remarques sur avec
Implémenter FReLU avec tf.keras
Découvrez la blockchain avec BigchainDB
Implémenter la fonction de connexion avec django-allauth
Implémenter des sous-commandes avec l'argparse de Python
À propos de l'apprentissage avec Google Colab
Implémenter UnionFind (équivalent) en 10 lignes
Implémenter le GPU PyTorch + avec Docker
[Python3] Méthode Dikstra avec 14 lignes
[Qt Designer] Implémenter WebView avec PyQt5
Détection de falsification de la blockchain avec Python
Pensez aux abandons avec MNIST
Implémentez facilement des sous-commandes avec python click
Commentez plusieurs lignes avec csh
Implémentez "Data Visualization Design # 2" avec matplotlib