Exercice 3 - Programmation orientée objet · Bac Numérique et Sciences Informatiques Amérique du Nord 2024 (jour 2)
Thème : Programmation orientée objet : classes, attributs, méthodes · Tiré du sujet Jour 2 (2024)
Énoncé
Cet exercice porte sur la programmation objet, les structures de données, les réseaux et l'architecture matérielle.
On considère un réseau local constitué des trois machines de Alice, Bob et Charlie dont les adresses IP sont les suivantes:
la machine d'Alice a pour adresse 192.168.1.1;
la machine de Bob a pour adresse 192.168.1.2.
On rappelle que l'adresse 192.168.1.255 est l'adresse de diffusion qui sert à communiquer avec toutes les machines du réseau local et le masque de ce réseau local est 255.255.255.0. Cette adresse de diffusion est réservée et ne peut être attribuée à une machine.
Partie A
Ce réseau est utilisé pour effectuer des transactions financières en monnaie numérique nsicoin entre les trois utilisateurs. Pour cela, on crée la classe Transaction ci-dessous:
class Transaction:
def __init__(self, expediteur, destinataire, montant):
self.expediteur = expediteur
self.destinataire = destinataire
self.montant = montant Pour garder une trace de toutes les transactions effectuées, on utilise une liste chaînée de blocs (ou blockchain) dont le code Python est fourni ci-dessous. Toutes les dix minutes un nouveau bloc contenant les nouvelles transactions est créé et ajouté à la blockchain.
class Bloc:
def __init__(self, liste_transactions, bloc_precedent):
self.liste_transactions = liste_transactions
self.bloc_precedent = bloc_precedent # de type Bloc
class Blockchain:
def __init__(self):
self.tete = self.creer_bloc_0()
def creer_bloc_0(self):
"""
Crée le premier bloc qui distribue 100 nsicoin à tous les utilisateurs
(un pseudo-utilisateur Genesis est utilisé comme expéditeur)
"""
liste_transactions = [
Transaction("Genesis", "Alice", 100),
Transaction("Genesis", "Bob", 100),
Transaction("Genesis", "Charlie", 100)
]
return Bloc(liste_transactions, None)
Partie B
Dans cette partie, on va améliorer la sécurité de la blockchain. Pour cela on enrichit la classe Bloc comme indiqué ci-dessous:
class Bloc:
def __init__(self, liste_transactions, bloc_precedent):
self.liste_transactions = liste_transactions
self.bloc_precedent = bloc_precedent
# Définition de trois nouveaux attributs
self.hash_bloc_precedent = self.donner_hash_precedent()
self.nonce = 0 # Fixé arbitrairement et temporairement à 0 avant le minage du bloc
self.hash = self.calculer_hash()
# Définition de trois nouvelles méthodes
def donner_hash_precedent(self):
if self.bloc_precedent is not None:
return self.bloc_precedent.hash
else:
return "0"
def calculer_hash(self):
"""calcule et renvoie le hash du bloc courant"""
# Le code python n'est pas étudié dans cet exercice
def minage_bloc(self):
"""modifie le nonce d'un bloc pour que son hash commence par '00'"""
# A compléter La fonction calculer_hash produit une chaîne de caractères appelée hash qui possède les propriétés suivantes:
Le hash d'un bloc dépend de toutes les données contenues dans le bloc et uniquement de ces données;
Le calcul du hash d'un bloc est rapide et facile à calculer par une machine;
La moindre modification dans le bloc produit un hash complètement différent;
Il est impossible de déduire le bloc à partir de son hash.
Si deux blocs ont le même hash, c'est qu'ils sont parfaitement identiques.
2.
Toutes les dix minutes, les transactions réalisées pendant cet intervalle de temps sont regroupées par ordre d'apparition dans une liste Python. Dans un intervalle de dix minutes, Alice envoie dix nsicoin à Charlie puis Bob envoie cinq nsicoin à Alice. Écrire la liste Python correspondante à ces transactions.
3.
La figure 1 représente les trois premiers blocs d'une Blockchain. Expliquer pourquoi la valeur de l'attribut bloc_precedent du bloc0 est None.
4.
Donner la valeur de l'attribut bloc_precedent du bloc1 afin que celui-ci soit lié au bloc0.
5.
À l'aide des classes Bloc et Blockchain, écrire le code Python permettant de créer un objet ma_blockchain de type Blockchain représenté par la figure 1.
6.
Donner le solde en nsicoin de Bob à l'issue du bloc2.
7.
On souhaite doter la classe Blockchain d'une méthode ajouter_bloc qui prend en paramètre la liste des transactions des dix dernières minutes et l'ajoute dans un nouveau bloc. Écrire le code Python de cette méthode ci-dessous.
def ajouter_bloc(self, liste_transactions):
11.
L'attribut nonce est de type entier. Miner un bloc signifie trouver une valeur de nonce de telle façon que l'attribut hash du bloc commence par les deux caractères "00". Compte tenu des propriétés précédentes, la seule façon de trouver cette valeur est de procéder à une recherche exhaustive. Expliquer en quoi consiste le fait de trouver une valeur par recherche exhaustive.
12.
En justifiant votre réponse, donner la valeur de l'attribut hash_bloc_precedent du bloc0.
14.
Recopier et compléter le code python de la méthode minage_bloc.
def minage_bloc(self):
"""modifie le nonce d'un bloc pour que son hash commence par
'00' en énumérant tous les entiers naturels en partant de 0."""
self.nonce = 0
self.hash = self.calculer_hash()
while...:
self.nonce =...
self.hash =...

Corrigé
Corrigé proposé par AprenAI (non officiel)
2. Écrire la liste Python correspondante à ces transactions.
Réponse : ```python [Transaction("Alice", "Charlie", 10), Transaction("Bob", "Alice", 5)] ```
3. Expliquer pourquoi la valeur de l'attribut bloc_precedent du bloc0 est None.
Réponse : Le `bloc0` est le premier bloc de la chaîne (le bloc Genesis). Comme aucun bloc n'a été créé avant lui, il n'a pas de bloc précédent, ce que l'on modélise par la valeur `None`.
4. Donner la valeur de l'attribut bloc_precedent du bloc1 afin que celui-ci soit lié au bloc0.
Réponse : bloc0
5. À l'aide des classes Bloc et Blockchain, écrire le code Python permettant de créer un objet ma_blockchain de type Blockchain représenté par la figure 1.
Réponse : ```python ma_blockchain = Blockchain() bloc0 = ma_blockchain.tete liste1 = [ Transaction('Alice', 'Charlie', 50), Transaction('Charlie', 'Bob', 30) ] bloc1 = Bloc(liste1, bloc0) liste2 = [ Transaction('Bob', 'Charlie', 20), Transaction('Bob', 'Charlie', 20), Transaction('Charlie', 'Alice', 30) ] bloc2 = Bloc(liste2, bloc1) ma_blockchain.tete = bloc2 ```
6. Donner le solde en nsicoin de Bob à l'issue du bloc2.
Réponse : 90
Les réponses des 5 questions restantes et l’explication pas à pas sont réservées aux membres Premium. Premium
Résous-le ici : correction automatique, indices et corrigé détaillé.
‹ Exercice 2 - Programmation orientée objet · Amérique du Nord 2025 (jour 2) · Exercice 3 - Programmation orientée objet · Amérique du Nord 2023 (jour 1) ›
Plus d’exercices de Programmation orientée objet : classes, attributs, méthodes
- Exercice 1 - Partie A · Amérique du Nord 2026 (jour 1)
- Exercice 2 - Questions 9 à 11 · Amérique du Nord 2026 (jour 1)
- Exercice 2 - Programmation orientée objet · Amérique du Nord 2026 (jour 2)
- Exercice 2 - Programmation orientée objet · Amérique du Nord 2025 (jour 1)
- Exercice 2 - Programmation orientée objet · Amérique du Nord 2025 (jour 2)
- Exercice 3 - Programmation orientée objet · Amérique du Nord 2023 (jour 1)
- Exercice 1 - Programmation orientée objet · Amérique du Nord 2022 (jour 2)