[PYTHON] Bonjour tout le monde! (Chaîne de blocs viables minimum)

0. Introduction

Concernant la blockchain, je viens de lire les articles sur le net, et bien que j'aie entendu dire que «les blocs sont connectés en chaîne» ou «distribués plutôt que centralisés», je ne le comprends pas bien. Je ne l'avais pas, alors j'ai cherché.

Plutôt que de lire un livre et de comprendre superficiellement le concept, j'ai pensé qu'il serait plus amusant de créer une "blockchain minimale" qui ne pourrait pas être appelée une blockchain si elle était coupée davantage, alors j'ai attrapé le filet. Quand je l'ai essayé, il y avait un article qui me convenait parfaitement.

Exemple de code de la plus petite chaîne de blocs possible (inachevée) (imsut/minimum-viable-block-chain)

En traduisant cela en Python et en regardant les résultats de l'exécution, j'ai pu comprendre ce qui suit avec une image concrète (j'avais envie).

1. Aperçu des classes qui apparaissent

En un mot, je comprends ce qu'est une blockchain, "un registre à écriture unique qui est décentralisé mais difficile à falsifier et qui garantit la fiabilité des données". Ceci est réalisé par l'interaction de cinq classes, utilisateur, transaction, vérificateur, réseau et bloc.

User Une classe qui représente un participant dans un réseau blockchain. Échangez des messages avec d'autres utilisateurs.

(Code source)

Transaction Une classe qui représente l'interaction entre les utilisateurs.

Il existe les trois types de transaction suivants.

--MessageTransaction: Représente l'échange de messages entre les utilisateurs --FeeTransaction: transaction qui authentifie les échanges de messages passés entre les utilisateurs --SignedTransaction: MessageTransaction signé. Il semble qu'il soit généralement chiffré avec PKI, etc., mais il est omis ici.

Dans FeeTransaction, les frais peuvent être obtenus en authentifiant MessageTransaction entre d'autres utilisateurs. (Minning en Bitcoin?)

(Code source)

Verifier

(Code source)

Network

(Code source)

Block

(Code source)

2. Expérience

Par exemple, exécutez Transaction comme indiqué ci-dessous et observez le mouvement global.

from simplest.network import Network
from simplest.user import User

network = Network()

alice = User('Alice', network)
bob = User('Bob', network)
chris = User('Chris', network)
dan = User('Dan', network)

alice.send('Yo!', to=bob, fee=1.0)
bob.send('Ho!', to=chris, fee=2.0)
chris.send('Yo!Ho!', to=alice, fee=3.0)

alice.verify_message_trxs()
dan.verify_message_trxs()
chris.verify_message_trxs()

(Code source)

Résultat d'exécution

~/Python35/bin/python ~/blockchain/simplest/main.py
[User.init] Alice: joining the block chain network
[User.init] Bob: joining the block chain network
[User.init] Chris: joining the block chain network
[User.init] Dan: joining the block chain network
↑
L'utilisateur rejoint le réseau dès sa création

[User.send] Alice: sending a message to Bob. (Yo!:1.0).
[Network.announce_signed_trx] announcing "Transaction signed by Alice (Message Transaction: "Yo!" to Bob with fee 1.0)"
↑
Quand Alice envoie un message à Bob, il est annoncé dans tout le réseau.

[Verifier.receive_signed_trx] Dan: unconfirmed transactions [<simplest.transaction.SignedTransaction object at 0x108f09828>]
[Verifier.receive_signed_trx] Chris: unconfirmed transactions [<simplest.transaction.SignedTransaction object at 0x108f09828>]
↑
Les utilisateurs qui ne sont pas impliqués dans la transaction reçoivent la transaction signée et la conservent comme une transaction non confirmée.

[Verifier.receive_signed_trx] Alice: not going to verify this transaction as I'm involved
[Verifier.receive_signed_trx] Bob: not going to verify this transaction as I'm involved
↑
Parties de transaction(Alice et Bob)Ne fait rien.

[User.send] Bob: sending a message to Chris. (Ho!:2.0).
[Network.announce_signed_trx] announcing "Transaction signed by Bob (Message Transaction: "Ho!" to Chris with fee 2.0)"
[Verifier.receive_signed_trx] Alice: unconfirmed transactions [<simplest.transaction.SignedTransaction object at 0x108f09c50>]
[Verifier.receive_signed_trx] Dan: unconfirmed transactions [<simplest.transaction.SignedTransaction object at 0x108f09828>, <simplest.transaction.SignedTransaction object at 0x108f09c50>]
[Verifier.receive_signed_trx] Chris: not going to verify this transaction as I'm involved
[Verifier.receive_signed_trx] Bob: not going to verify this transaction as I'm involved
↑
De même, lorsque Bob envoie un message à Chris, la transaction est annoncée sur tout le réseau et les utilisateurs qui ne sont pas impliqués dans la transaction la conservent comme une transaction non identifiée.

[User.send] Chris: sending a message to Alice. (Yo!Ho!:3.0).
[Network.announce_signed_trx] announcing "Transaction signed by Chris (Message Transaction: "Yo!Ho!" to Alice with fee 3.0)"
[Verifier.receive_signed_trx] Alice: not going to verify this transaction as I'm involved
[Verifier.receive_signed_trx] Dan: unconfirmed transactions [<simplest.transaction.SignedTransaction object at 0x108f09828>, <simplest.transaction.SignedTransaction object at 0x108f09c50>, <simplest.transaction.SignedTransaction object at 0x108f09cc0>]
[Verifier.receive_signed_trx] Chris: not going to verify this transaction as I'm involved
[Verifier.receive_signed_trx] Bob: unconfirmed transactions [<simplest.transaction.SignedTransaction object at 0x108f09cc0>]
↑
De même

[Verifier.verify_message_trxs] Alice: created Transaction signed by Alice (Fee Transaction: Alice gets confirmation fee 2.0)
↑
Alice authentifie la transaction précédente(Exploitation minière en Bitcoin?)Faire.

[Block.init] trxs: [<simplest.transaction.SignedTransaction object at 0x108f09c50>, <simplest.transaction.SignedTransaction object at 0x108f09d30>], prev_block: None
↑
Un bloc qui collecte plusieurs transactions est généré. Transactions n'impliquant pas Alice(Bob-Transactions entre Chris)Vous ne pouvez vous authentifier, vous obtenez donc 2 frais.0。

[Network.announce_block] announcing "Block of 2 transactions (Block Id: 0003430f7a84c5973edf31e42e9c25c0eed725af7e818adba62b0efe4d966188, Previous Block Id: None, secret: 27)"
↑
Deux transactions(1 MessageTransaction et 1 FeeTransaction)Il est annoncé qu'un bloc contenant est généré.

[Verifier.receive_block] Alice: validated Block of 2 transactions (Block Id: 0003430f7a84c5973edf31e42e9c25c0eed725af7e818adba62b0efe4d966188, Previous Block Id: None, secret: 27) is valid
[Verifier.receive_block] Alice: my trx "Fee Transaction: Alice gets confirmation fee 2.0" is validated by network!
[Verifier.receive_block] Dan: validated Block of 2 transactions (Block Id: 0003430f7a84c5973edf31e42e9c25c0eed725af7e818adba62b0efe4d966188, Previous Block Id: None, secret: 27) is valid
[Verifier.receive_block] Chris: validated Block of 2 transactions (Block Id: 0003430f7a84c5973edf31e42e9c25c0eed725af7e818adba62b0efe4d966188, Previous Block Id: None, secret: 27) is valid
[Verifier.receive_block] Bob: validated Block of 2 transactions (Block Id: 0003430f7a84c5973edf31e42e9c25c0eed725af7e818adba62b0efe4d966188, Previous Block Id: None, secret: 27) is valid
[Verifier.receive_block] Bob: my trx "Message Transaction: "Ho!" to Chris with fee 2.0" is validated by network!

[Verifier.verify_message_trxs] Dan: created Transaction signed by Dan (Fee Transaction: Dan gets confirmation fee 4.0)
↑
Dan authentifie ensuite le reste de la transaction. Dan n'est impliqué dans aucune transaction de message, il devrait donc être en mesure d'authentifier toutes les transactions de message restantes.

[Block.init] trxs: [<simplest.transaction.SignedTransaction object at 0x108f09828>, <simplest.transaction.SignedTransaction object at 0x108f09cc0>, <simplest.transaction.SignedTransaction object at 0x108f09da0>], prev_block: Block of 2 transactions (Block Id: 0003430f7a84c5973edf31e42e9c25c0eed725af7e818adba62b0efe4d966188, Previous Block Id: None, secret: 27)
↑
Un bloc contenant des transactions non approuvées par Alice a été généré. prev_Il a un bloc généré par Alice en tant que bloc. (Les blocs sont dans une chaîne!)

[Network.announce_block] announcing "Block of 3 transactions (Block Id: 000302fdb2b0a45e99e40675cce0299de96d227289d200210a0d774653a80b9a, Previous Block Id: 0003430f7a84c5973edf31e42e9c25c0eed725af7e818adba62b0efe4d966188, secret: 1545)"
[Verifier.receive_block] Alice: validated Block of 3 transactions (Block Id: 000302fdb2b0a45e99e40675cce0299de96d227289d200210a0d774653a80b9a, Previous Block Id: 0003430f7a84c5973edf31e42e9c25c0eed725af7e818adba62b0efe4d966188, secret: 1545) is valid
[Verifier.receive_block] Alice: my trx "Message Transaction: "Yo!" to Bob with fee 1.0" is validated by network!
[Verifier.receive_block] Dan: validated Block of 3 transactions (Block Id: 000302fdb2b0a45e99e40675cce0299de96d227289d200210a0d774653a80b9a, Previous Block Id: 0003430f7a84c5973edf31e42e9c25c0eed725af7e818adba62b0efe4d966188, secret: 1545) is valid
[Verifier.receive_block] Dan: my trx "Fee Transaction: Dan gets confirmation fee 4.0" is validated by network!
[Verifier.receive_block] Chris: validated Block of 3 transactions (Block Id: 000302fdb2b0a45e99e40675cce0299de96d227289d200210a0d774653a80b9a, Previous Block Id: 0003430f7a84c5973edf31e42e9c25c0eed725af7e818adba62b0efe4d966188, secret: 1545) is valid
[Verifier.receive_block] Chris: my trx "Message Transaction: "Yo!Ho!" to Alice with fee 3.0" is validated by network!
[Verifier.receive_block] Bob: validated Block of 3 transactions (Block Id: 000302fdb2b0a45e99e40675cce0299de96d227289d200210a0d774653a80b9a, Previous Block Id: 0003430f7a84c5973edf31e42e9c25c0eed725af7e818adba62b0efe4d966188, secret: 1545) is valid

[Verifier.verify_message_trxs] Chris: created Transaction signed by Chris (Fee Transaction: Chris gets confirmation fee 0)
↑
Chris essaie ensuite de s'authentifier, mais il n'obtient pas de frais parce que Dan a tout authentifié.

[Block.init] trxs: [<simplest.transaction.SignedTransaction object at 0x108f2e0f0>], prev_block: Block of 3 transactions (Block Id: 000302fdb2b0a45e99e40675cce0299de96d227289d200210a0d774653a80b9a, Previous Block Id: 0003430f7a84c5973edf31e42e9c25c0eed725af7e818adba62b0efe4d966188, secret: 1545)
[Network.announce_block] announcing "Block of 1 transactions (Block Id: 0006a4dc569ff1a61c6c371980635341d39be3b0c23363030511501e76ac6536, Previous Block Id: 000302fdb2b0a45e99e40675cce0299de96d227289d200210a0d774653a80b9a, secret: 1062)"
[Verifier.receive_block] Alice: validated Block of 1 transactions (Block Id: 0006a4dc569ff1a61c6c371980635341d39be3b0c23363030511501e76ac6536, Previous Block Id: 000302fdb2b0a45e99e40675cce0299de96d227289d200210a0d774653a80b9a, secret: 1062) is valid
[Verifier.receive_block] Dan: validated Block of 1 transactions (Block Id: 0006a4dc569ff1a61c6c371980635341d39be3b0c23363030511501e76ac6536, Previous Block Id: 000302fdb2b0a45e99e40675cce0299de96d227289d200210a0d774653a80b9a, secret: 1062) is valid
[Verifier.receive_block] Chris: validated Block of 1 transactions (Block Id: 0006a4dc569ff1a61c6c371980635341d39be3b0c23363030511501e76ac6536, Previous Block Id: 000302fdb2b0a45e99e40675cce0299de96d227289d200210a0d774653a80b9a, secret: 1062) is valid
[Verifier.receive_block] Chris: my trx "Fee Transaction: Chris gets confirmation fee 0" is validated by network!
[Verifier.receive_block] Bob: validated Block of 1 transactions (Block Id: 0006a4dc569ff1a61c6c371980635341d39be3b0c23363030511501e76ac6536, Previous Block Id: 000302fdb2b0a45e99e40675cce0299de96d227289d200210a0d774653a80b9a, secret: 1062) is valid

Process finished with exit code 0

3. Résumé

J'ai pu comprendre (j'ai envie) la question simple sur la blockchain, comme mentionné au début, avec non seulement une explication conceptuelle mais aussi une image concrète du code source. Par contre, en ce qui concerne la preuve de travail, j'ai eu une image du mouvement, mais je n'étais pas sûr de la nécessité et de la difficulté de la tâche, je voudrais donc l'examiner à nouveau quand j'aurai le temps.

4. Site référencé

  1. Minimum Viable Block Chain Un article expliquant pourquoi la blockchain fonctionne comme elle le fait actuellement.

  2. Comprendre encore plus la blockchain Explication en japonais de 1.

  3. Exemple de code de la plus petite chaîne de blocs possible (inachevée) (imsut/minimum-viable-block-chain) Implémentation par Scala en 1. L'histoire originale de cet article.

  4. izqui/blockchain 1 Implémentation Golang

  5. Explication de ce qu'est une blockchain facile à comprendre? Qu'est-ce que la blockchain (explication conceptuelle)

  6. Est-il temps de commencer à étudier la blockchain? Qu'est-ce que la blockchain (explication conceptuelle)

  7. TED: How the blockchain will radically transform the economy Qu'est-ce que la blockchain (explication conceptuelle)

Recommended Posts

Bonjour tout le monde! (Chaîne de blocs viables minimum)
Bonjour le monde
Pymacs helloworld
cython helloworld
web2py Remarque: Bonjour le monde
bonjour le monde avec ctypes
Tutoriel RabbitMQ 1 ("Hello World!")
Bonjour le monde avec Docker
Hello World avec Django
Le premier Hello World de Django
Bonjour le monde sur flacon
Dessinez bonjour le monde avec mod_wsgi
Bonjour le monde avec Flask + Hamlish
Jusqu'à bonjour le monde avec zappa
Hello World en langue GO
Hello World (débutant) avec Django
Python commençant par Hello world!