Maison développement back-end Tutoriel Python Introduction aux bases de Python – Blockchain

Introduction aux bases de Python – Blockchain

Aug 13, 2017 pm 02:55 PM
python 区块 基础

Le concept de base de la blockchain est simple : une base de données distribuée qui stocke une liste croissante contenant de nombreux enregistrements ordonnés. L'article suivant vous présente principalement les informations pertinentes sur la blockchain pour apprendre Python. L'article le présente en détail à travers un exemple de code. Les amis qui en ont besoin peuvent y jeter un œil ci-dessous.

Avant-propos

Cet article vous donnera une brève introduction aux connaissances pertinentes sur la blockchain (BlockChain), et utilisera Python pour créer un simple mise en œuvre. Sans plus tarder, jetons un œil à l'introduction détaillée :

Qu'est-ce que la blockchain

En bref, la blockchain C'est une solution permanente et irréversible enregistrement modifié généré par superposition (chaînage) de données cryptées (blocs) dans l'ordre chronologique. Plus précisément, la blockchain est composée d'une série de blocs de données générés à l'aide de méthodes cryptographiques. Chaque bloc contient la valeur de hachage du bloc précédent, à partir du bloc de genèse. Commencez à vous connecter au bloc actuel pour former une chaîne de blocs. Chaque bloc est garanti d'être généré après le bloc précédent dans l'ordre chronologique, sinon la valeur de hachage du bloc précédent est inconnue. C’est un concept important dans Bitcoin.

Caractéristiques

La blockchain présente les fonctionnalités suivantes :

  • Décentralisation : La blockchain ne s'appuie pas sur un nœud central, mais sur des nœuds distribués.

  • Aucun système de confiance requis : la blockchain est basée sur des algorithmes cryptographiques et les données doivent être approuvées par d'autres utilisateurs du réseau, il n'est donc pas nécessaire de recourir à une structure intermédiaire tierce. ou l'approbation d'un organisme de fiducie.

  • Sécurité inviolable et cryptée : la blockchain adopte un algorithme de hachage unidirectionnel, et chaque bloc nouvellement généré est strictement avancé dans un ordre linéaire en fonction du temps. L'irréversibilité du temps provoque toute tentative. l'intrusion et la falsification des informations sur les données dans la blockchain peuvent être facilement retracées, conduisant à un rejet par d'autres nœuds, ce qui peut limiter les activités illégales associées.

Les caractéristiques ci-dessus font que la blockchain a de plus en plus d'applications dans de nombreux domaines tels que la banque, le marché des valeurs mobilières et la finance.

Comment fonctionne la blockchain

La blockchain est une série de blocs de données cryptés. Ces blocs sont constitués d'un en-tête de bloc contenant des métadonnées, suivi d'une longue liste de transactions qui constituent le corps du bloc. La structure des blocs dans Bitcoin est la suivante :

En-tête du bloc

L'en-tête du bloc contient des informations relatives à d'autres domaines de la blockchain Les informations de connexion, l'horodatage, le nom occasionnel et d'autres informations dans le bloc sont les suivantes :

Identifiant du bloc

Le bloc a deux identifiants, l’un est la valeur de hachage de l’en-tête du bloc et l’autre est la hauteur du bloc. La valeur de hachage de l'en-tête de bloc est un nombre obtenu en effectuant un calcul de hachage secondaire sur l'en-tête de bloc à l'aide de l'algorithme SHA256. La valeur de hachage du bloc identifie un bloc de manière unique et sans ambiguïté, et n'importe quel nœud peut obtenir indépendamment la valeur de hachage du bloc en hachant simplement l'en-tête du bloc. La hauteur du bloc fait référence à la position du bloc dans la blockchain. La hauteur du bloc n'est pas un identifiant unique. Alors qu'un seul bloc aura toujours une hauteur de bloc claire et fixe, l'inverse n'est pas vrai et une hauteur de bloc n'identifie pas toujours un seul bloc. Deux blocs ou plus peuvent avoir la même hauteur de bloc et se disputer la même position dans la blockchain.

Après avoir compris les bases ci-dessus, commençons à utiliser Python pour implémenter une blockchain simple.

Implémentation Python de la blockchain

1 Définir la structure du bloc

Dans [ 16] :


# block.py

import hashlib
import uuid


class Block(object):
 def __init__(self, data=None, previous_hash=None):
  self.identifier = uuid.uuid4().hex # 产生唯一标示
  self.nonce = None     # nonce值
  self.data = data      # 区块内容
  self.previous_hash = previous_hash # 父节点哈希值
  
 def hash(self, nonce=None):
  '''
  计算区块的哈希值
  '''
  message = hashlib.sha256()
  message.update(self.identifier.encode('utf-8'))
  message.update(str(nonce).encode('utf-8'))
  message.update(str(self.data).encode('utf-8'))
  message.update(str(self.previous_hash).encode('utf-8'))

  return message.hexdigest()

 def hash_is_valid(self, the_hash):
  '''
  校验区块哈希值有否有效
  '''
  return the_hash.startswith('0000')

 def __repr__(self):
  return &#39;Block<Hash: {}, Nonce: {}>&#39;.format(self.hash(), self.nonce)
Copier après la connexion

Ce qui précède est une structure de blocs. Ce qui est implémenté ici est une version simplifiée, qui ne correspond pas entièrement aux blocs de Bitcoin. Le bloc contient ici un identifiant unique, la valeur de hachage du nœud parent, la valeur occasionnelle et le champ de contenu du bloc. Vous pouvez voir que la valeur de hachage d'un bloc doit remplir certaines conditions pour être valide, comme commencer par 0000. Ensuite, initialisez cette structure de bloc.

Dans [37] :


# 创建一个内容为hello world的内容块

block = Block(&#39;Hello World&#39;)
block
Copier après la connexion

Sortie[37] :


Block<Hash: 238a65a101c8829d7fc406eb78a71cfc19ad702b437e2c1be8d9061ddb81e900, Nonce: None>
Copier après la connexion

Bien que le bloc ci-dessus ait été créé, sa valeur de hachage n'est pas valide.

Dans [38] :


block.hash_is_valid(block.hash())
Copier après la connexion

Sortie[38] :


False
Copier après la connexion

Modifiez la valeur du nonce pour obtenir une nouvelle valeur de hachage.

Dans [39] :


block.hash(1)
Copier après la connexion

Sortie[39] :


&#39;a6431938ba10270dfcfdf7a2371312446914fedadf79632c2c0adb3b463f4838&#39;
Copier après la connexion

La valeur de hachage est mise à jour, mais ce n'est pas encore une valeur de hachage valide. Afin d'obtenir une valeur de hachage valide, il s'agit d'un processus de mise à jour constante de la valeur occasionnelle, ou d'un processus d'exploration de données. Ajoutez une fonction mine ci-dessous pour obtenir une valeur occasionnelle appropriée.

In [78]:


# block.py

import hashlib
import uuid


class Block(object):
 def __init__(self, data=None, previous_hash=None):
  self.identifier = uuid.uuid4().hex # 产生唯一标示
  self.nonce = None     # nonce值
  self.data = data      # 区块内容
  self.previous_hash = previous_hash # 父节点哈希值
  
 def hash(self, nonce=None):
  &#39;&#39;&#39;
  计算区块的哈希值
  &#39;&#39;&#39;
  message = hashlib.sha256()
  message.update(self.identifier.encode(&#39;utf-8&#39;))
  message.update(str(nonce).encode(&#39;utf-8&#39;))
  message.update(str(self.data).encode(&#39;utf-8&#39;))
  message.update(str(self.previous_hash).encode(&#39;utf-8&#39;))

  return message.hexdigest()

 def hash_is_valid(self, the_hash):
  &#39;&#39;&#39;
  校验区块哈希值有否有效
  &#39;&#39;&#39;
  return the_hash.startswith(&#39;0000&#39;)

 def __repr__(self):
  return &#39;Block<Hash: {}, Nonce: {}>&#39;.format(self.hash(self.nonce), self.nonce)
 
 
 &#39;&#39;&#39;
  新增挖矿函数
 &#39;&#39;&#39;
 def mine(self):
  # 初始化nonce为0
  cur_nonce = self.nonce or 0

  # 循环直到生成一个有效的哈希值
  while True:
   the_hash = self.hash(nonce=cur_nonce)
   if self.hash_is_valid(the_hash): # 如果生成的哈希值有效
    self.nonce = cur_nonce   # 保持当前nonce值
    break       # 并退出
   else:
    cur_nonce += 1 # 若当前哈希值无效,更新nonce值,进行加1操作
Copier après la connexion

In [75]:


block = Block(&#39;Hello World&#39;)

# 挖矿,循环直至找到合适的nonce
block.mine()

# 打印
block
Copier après la connexion

Out[75]:


Block<Hash: 000087359d5264153d624556f0a0c6f25cba06e453975c1c02587862e823911b, Nonce: 64751>
Copier après la connexion

至此,第一个有效的区块生成完成,下面开始定义区块链。

二、定义区块链结构

In [81]:


class BlockChain(object):
 def __init__(self):
  self.head = None # 指向最新的一个区块
  self.blocks = {} # 包含所有区块的一个字典

 &#39;&#39;&#39;
  添加区块函数
 &#39;&#39;&#39;
 def add_block(self, new_block):
  previous_hash = self.head.hash() if self.head else None
  new_block.previous_hash = previous_hash

  self.blocks[new_block.identifier] = {
   &#39;block&#39;: new_block,
   &#39;previous_hash&#39;: previous_hash,
   &#39;previous&#39;: self.head,
  }
  self.head = new_block

 def __repr__(self):
  num_existing_blocks = len(self.blocks)
  return &#39;Blockchain<{} Blocks, Head: {}>&#39;.format(
   num_existing_blocks,
   self.head.identifier if self.head else None
  )
Copier après la connexion

定义好区块链结构后,下面就开始初始化一条区块链。

In [82]:


# 初始化
chain = BlockChain()

# 打印
chain
Copier après la connexion

Out[82]:


Blockchain<0 Blocks, Head: None>
Copier après la connexion

In [83]:


# 添加区块
chain.add_block(block)

# 打印
chain
Copier après la connexion

Out[83]:


Blockchain<1 Blocks, Head: 364c0cf963384ca28a2763499a140405>
Copier après la connexion

In [84]:


# 添加更多的区块

for i in range(6):
 new_block = Block(i)
 new_block.mine()
 chain.add_block(new_block)
 
# 打印
chain
Copier après la connexion

Out[84]:


Blockchain<7 Blocks, Head: e7cb24ec7acd42a4aaebe7faee9e0713>
Copier après la connexion

以上就是一个简单区块链,后面还会涉及到区块链的有效性。当区块链中一个区块被改变后,这个区块的哈希就会改变,从而影响到这块区块之后的区块,致使这个区块链不再有效。这些将在后续继续深入。

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Le plan Python de 2 heures: une approche réaliste Le plan Python de 2 heures: une approche réaliste Apr 11, 2025 am 12:04 AM

Vous pouvez apprendre les concepts de programmation de base et les compétences de Python dans les 2 heures. 1. Apprenez les variables et les types de données, 2. Flux de contrôle maître (instructions et boucles conditionnelles), 3. Comprenez la définition et l'utilisation des fonctions, 4. Démarrez rapidement avec la programmation Python via des exemples simples et des extraits de code.

Python: Explorer ses applications principales Python: Explorer ses applications principales Apr 10, 2025 am 09:41 AM

Python est largement utilisé dans les domaines du développement Web, de la science des données, de l'apprentissage automatique, de l'automatisation et des scripts. 1) Dans le développement Web, les cadres Django et Flask simplifient le processus de développement. 2) Dans les domaines de la science des données et de l'apprentissage automatique, les bibliothèques Numpy, Pandas, Scikit-Learn et Tensorflow fournissent un fort soutien. 3) En termes d'automatisation et de script, Python convient aux tâches telles que les tests automatisés et la gestion du système.

Méthode de Navicat pour afficher le mot de passe de la base de données MongoDB Méthode de Navicat pour afficher le mot de passe de la base de données MongoDB Apr 08, 2025 pm 09:39 PM

Il est impossible de visualiser le mot de passe MongoDB directement via NAVICAT car il est stocké sous forme de valeurs de hachage. Comment récupérer les mots de passe perdus: 1. Réinitialiser les mots de passe; 2. Vérifiez les fichiers de configuration (peut contenir des valeurs de hachage); 3. Vérifiez les codes (May Code Hardcode).

Comment utiliser Aws Glue Crawler avec Amazon Athena Comment utiliser Aws Glue Crawler avec Amazon Athena Apr 09, 2025 pm 03:09 PM

En tant que professionnel des données, vous devez traiter de grandes quantités de données provenant de diverses sources. Cela peut poser des défis à la gestion et à l'analyse des données. Heureusement, deux services AWS peuvent aider: AWS Glue et Amazon Athena.

Comment lire la file d'attente redis Comment lire la file d'attente redis Apr 10, 2025 pm 10:12 PM

Pour lire une file d'attente à partir de Redis, vous devez obtenir le nom de la file d'attente, lire les éléments à l'aide de la commande LPOP et traiter la file d'attente vide. Les étapes spécifiques sont les suivantes: Obtenez le nom de la file d'attente: Nommez-le avec le préfixe de "Fitre:" tel que "Fitre: My-Quyue". Utilisez la commande LPOP: éjectez l'élément de la tête de la file d'attente et renvoyez sa valeur, telle que la file d'attente LPOP: My-Queue. Traitement des files d'attente vides: si la file d'attente est vide, LPOP renvoie NIL et vous pouvez vérifier si la file d'attente existe avant de lire l'élément.

Comment afficher la version serveur de redis Comment afficher la version serveur de redis Apr 10, 2025 pm 01:27 PM

Question: Comment afficher la version Redis Server? Utilisez l'outil de ligne de commande redis-Cli --version pour afficher la version du serveur connecté. Utilisez la commande Info Server pour afficher la version interne du serveur et devez analyser et retourner des informations. Dans un environnement de cluster, vérifiez la cohérence de la version de chaque nœud et peut être vérifiée automatiquement à l'aide de scripts. Utilisez des scripts pour automatiser les versions de visualisation, telles que la connexion avec les scripts Python et les informations d'impression.

Comment démarrer le serveur avec redis Comment démarrer le serveur avec redis Apr 10, 2025 pm 08:12 PM

Les étapes pour démarrer un serveur Redis incluent: Installez Redis en fonction du système d'exploitation. Démarrez le service Redis via Redis-Server (Linux / MacOS) ou Redis-Server.exe (Windows). Utilisez la commande redis-Cli Ping (Linux / MacOS) ou redis-Cli.exe Ping (Windows) pour vérifier l'état du service. Utilisez un client redis, tel que redis-cli, python ou node.js pour accéder au serveur.

Dans quelle mesure le mot de passe de Navicat est-il sécurisé? Dans quelle mesure le mot de passe de Navicat est-il sécurisé? Apr 08, 2025 pm 09:24 PM

La sécurité du mot de passe de Navicat repose sur la combinaison de cryptage symétrique, de force de mot de passe et de mesures de sécurité. Des mesures spécifiques incluent: l'utilisation de connexions SSL (à condition que le serveur de base de données prenne en charge et configure correctement le certificat), à la mise à jour régulièrement de NAVICAT, en utilisant des méthodes plus sécurisées (telles que les tunnels SSH), en restreignant les droits d'accès et, surtout, à ne jamais enregistrer de mots de passe.

See all articles