- Ambiance-sticker Sticker effet 3D livres 2ème partieDes stickers 3D pour votre déco ! Avec ce stickers 3D représenant livres , vous allez pouvoir décorer l'intérieur de votre chez vous de manière simple et originale ! Plongez-vous dans une toute autre atmosphère ! Où coller cet autocollant déco ? Cet autocollant déco sera parfait pour décorer l'inté
- Kermi pièces de montage 2534949 Entrée d'angle, 2 parties, porte pliante battante avec panneau fixe, droite DI 2FR, blancKermi pièces d'assemblage 2534949 composé de Schrauben Chevilles et housses diverses
- Kermi pièces de montage 2534952 Entrée d'angle, 2 parties, porte pliante battante avec panneau fixe, gauche, DI 2FLc, blancKermi pièces d'assemblage 2534952 composé de Schrauben Chevilles et housses diverses

Ethereum a été construit autour de l’objectif principal de créer un protocole pour la construction d’une variété d’applications décentralisées avec de nombreux cas d’utilisation.
Ils fournissent un langage de programmation complet Turing où le temps de développement, la sécurité et l’interaction entre les applications (applications décentralisées) sont importants. Une blockchain programmable complète Turing permet de développer une variété de contrats intelligents beaucoup plus sophistiqués que ceux proposés par Bitcoin.
Ethereum est conçu selon les cinq principes suivants.
Simplicité
Ethereum est conçu comme un protocole simple et a la vision d’être ouvert à tous, même
coût de stockage des données et gain de temps. Tout programmeur moyen devrait pouvoir choisir
flux de travail et mettre en œuvre des projets en toute simplicité. Cela vous aidera à réaliser pleinement ce que vous n’avez jamais vu auparavant
Potentiel de blockchain et de crypto-monnaie.
Universalité
La complétude turing d’Ethereum aide à créer tous les contrats intelligents qui peuvent être
défini mathématiquement. Devise, dérivés financiers ou votre propre Skynet, tout peut être construit. Mais si vous envisagez de construire Skynet, vous devrez peut-être disposer d’une multitude de contrats interconnectés et leur fournir suffisamment de gaz pour que le contrat intelligent fonctionne.
modularité
Ethereum est conçu pour que toutes les parties du protocole puissent être séparées en unités individuelles. Même si quelqu’un fait une petite modification de protocole à un endroit, d’autres parties du bundle d’application semblent affectées et continuent de fonctionner sans autre modification.
Des innovations telles qu’Ethash, les arbres Patricia modifiés et RLP (qui seront discutés dans les prochains articles) sont implémentées en tant que bibliothèques complètes et distinctes. Le développement éthéré est fait pour bénéficier à l’ensemble du système de crypto-monnaie plutôt qu’à lui-même.
Mobilité
Les structures du protocole Ethereum ne sont pas figées, bien que les modifications apportées aux structures de haut niveau ne se feront que correctement.
Véritablement ouvert à tous les protocoles, tous les types d’applications peuvent être développés avec Ethereum. Les mécanismes de régulation utilisés dans Ethereum sont utilisés pour limiter et minimiser les dommages à l’écosystème plutôt que de limiter une catégorie spécifique d’applications.
Par exemple, vous pouvez exécuter un script de boucle sans fin tant que vous payez les frais nécessaires et pertinents aux mineurs pour exécuter votre code.
Dans Ethereum, l’état se compose d’éléments appelés «comptes» où chaque compte a une adresse publique de 20 octets. Les transferts d’État sont des transferts de valeur et d’informations entre deux ou plusieurs comptes. Un compte Ethereum contient les quatre champs suivants.
- nonce; il s’agit d’un compteur qui garantit que chaque transaction ne peut être traitée qu’une seule fois
- Solde Ether actuel du compte
- Code de contrat de compte (le cas échéant, applicable aux contrats intelligents)
- Stockage du compte (vide par défaut)
L’éther est le principal combustible utilisé dans Ethereum et est utilisé pour les frais de transaction également connus sous le nom de Gwei.
Il existe deux types de comptes, à savoir:
- Comptes détenus en externe; est contrôlé par des clés privées : N’a pas de code inhérent. Les messages sont envoyés en créant et en signant une transaction.
- Comptes de contrat; contrôlé par code d’accord : Le code est activé en fonction du contenu du message reçu et un processus supplémentaire tel que la lecture et l’écriture dans la mémoire interne, l’envoi d’autres messages ou la création de contrats peut être activé.
Le deuxième type de compte est utilisé par un échange de crypto-monnaie: Blockchain Board of Derivatives dans son système de portefeuille intelligent de contrats non dépositaires.
Les contrats intelligents sont donc des agents autonomes qui vivent dans l’environnement Ethereum et exécutent du code lorsqu’ils sont transmis via une transaction ou un message. Ces contrats ont un contrôle direct sur leur équilibre éther et leur propre magasin de clés.
La transaction dans Ethereum est essentiellement un paquet de données signé et chiffré qui stocke un message à envoyer à partir d’un compte externe.
Les transactions typiques sont les suivantes:
- Destinataire du message (clé publique du destinataire)
- Signature identifiant l’expéditeur (clé privée de l’expéditeur)
- La quantité d’éther à transférer de l’expéditeur au récepteur
- Un champ de données facultatif
- Une valeur START GAS, qui représente le nombre maximal d’étapes de calcul que l’exécution de la transaction peut prendre
- Une valeur GASPRICE, qui représente les frais que l’expéditeur paie par étape de calcul
Divisons ces points individuels. Les trois premiers sont des champs standard trouvés dans chaque crypto-monnaie. Le champ de données n’a pas de fonction standard mais peut être utilisé par un contrat pour accéder aux données. Par exemple, si un contrat agit comme un service d’enregistrement de domaine, il peut vouloir interpréter les informations qui lui sont envoyées comme contenant deux « champs », le premier champ étant un domaine à enregistrer et le second champ étant l’adresse IP d’enregistrement du domaine à. Le contrat lirait ces valeurs à partir des données de message et les placerait de manière appropriée dans le stockage.
Les champs START GAS et GAS PRICE sont essentiels au modèle de déni de service d’Ethereum. Afin d’éviter des boucles sans fin ou d’autres déchets de calcul, chaque transaction est nécessaire pour définir une limite sur le nombre d’étapes de calcul qu’elle peut utiliser. L’unité de calcul de base est le « gaz ». Habituellement, une étape de calcul 1 coûte du gaz, mais certaines opérations coûtent des quantités de gaz plus élevées car elles sont plus calculables ou augmentent la quantité de données qui doivent être stockées dans le cadre de l’État.
Il y a une charge de 5 gaz pour chaque changement dans les données de transaction. Le système de frais oblige un attaquant à payer proportionnellement pour chaque ressource qu’il consomme, y compris le calcul, la bande passante et le stockage. Par conséquent, chaque transaction qui entraîne une consommation élevée du réseau entraîne naturellement une charge de gaz plus élevée.
En termes simples, le gaz payé est directement proportionnel au nombre et à la complexité des calculs effectués sur la blockchain.
Les contrats peuvent envoyer des messages à d’autres contrats.
Les messages typiques incluent:
- Le message de l’expéditeur
- Le destinataire du message
- La quantité d’éther à transmettre avec le message
- Un champ de données facultatif
- Une valeur START GAS
Un message est similaire à une transaction, sauf que les messages sont créés par un contrat et non par un compte externe. Un message est généré lorsqu’un contrat qui exécute du code exécute du code CALL externe, produit et exécute un message.
Le message est reçu par le compte destinataire qui exécute ensuite son code. De cette façon, les contrats peuvent être adoptés en relation avec d’autres contrats d’une manière similaire aux comptes détenus en externe.
L’allocation de gaz accordée par un contrat s’applique à la fois au gaz consommé par la transaction et à tous les sous-contrats.
Comprenons la même chose avec un exemple.
@A est un compte externe
@B est un contrat
@A envoie @B une transaction avec 1000 gaz.
@B consomme 600 gaz et envoie un message à @C.
L’exécution interne de @C consomme 300 gaz.
1000-600-300 = 100
Cela signifie que le contrat @B ne peut dépenser que 100 gaz supplémentaires en calcul / message / transaction avant de manquer de gaz.
Comme mentionné dans la partie 1 de la série, vous vous souvenez peut-être de la fonction de transition de statut
UTILISATION (S, TX) -> S ‘
D’autres étapes sont tirées du Livre blanc et sont assez explicites:
- La transaction doit avoir le nombre correct de valeurs, la signature doit être valide et nonce doit correspondre à nonce dans le compte de l’expéditeur. S’il ne correspond pas, lancez un bug.
- Les frais de transaction sont calculés comme STARTGAS * GASPRICE, l’adresse d’envoi peut être déterminée à partir de la signature. Soustrayez les frais du solde de l’expéditeur et augmentez la pénurie de l’expéditeur. S’il n’y a pas assez d’équilibre à dépenser, vous lancez une erreur.
- Initier GAS = STARTING GAS, et une certaine quantité de gaz par échange est retirée pour payer les échanges dans la transaction.
- Transférez la valeur de la transaction du compte de l’expéditeur vers le compte de réception. Si le compte destinataire n’existe pas encore, créez-le. Si le compte destinataire est un contrat, vous pouvez exécuter le code de contrat jusqu’à la fin ou jusqu’à ce que l’exécution soit vide.
- Si le transfert de valeur a échoué parce que l’expéditeur n’avait pas assez d’argent, ou si l’exécution du code s’est arrêtée sur l’essence, vous devez restaurer tous les changements d’état sauf le paiement des frais et ajouter les frais au compte du mineur. Le paiement des frais ne peut être récupéré car le mineur utilise de l’énergie pour faciliter la transaction.
- Sinon, rembourser les frais pour tout le gaz restant à l’expéditeur et envoyer les frais payés pour le gaz consommé au mineur.
Supposons que le code de contrat soit le suivant:
si! self.storage[calldataload(0)]:
self.storage[calldataload(0)] = chargement des données d’appel (32)
Le contrat est en fait écrit avec du code EVM de bas niveau mais l’exemple ci-dessus est écrit en Serpent.
Prenons maintenant un exemple:
Le stockage du contrat est initialement vide et une transaction est envoyée avec 10 valeurs d’éther, 2000 gaz, 0,001 prix du gaz éther et 64 octets de données, les octets 0–31 représentant le numéro 2 et les octets 32–63 portant la chaîne CHARLIE.
Le processus de la fonction de transition d’état dans ce scénario est le suivant. Ces étapes sont similaires à celles mentionnées dans l’exemple générique ci-dessus.
- Assurez-vous que la transaction est valide et bien formée.
- Vérifiez que l’émetteur de transaction a au moins 2000 * 0,001 = 2 éther. Si c’est le cas, soustrayez 2 éther du compte de l’expéditeur. (Parce que nous devons utiliser STARTGAS * GAS PRICE comme formule)
- Initier le gaz = 2000; À condition que la transaction soit de 170 octets et que les frais d’échange soient de 5, soustrayez 850 (170 * 5) pour qu’il reste 1150 (2000-850) de gaz.
- Soustrayez 10 autres éthers du compte de l’expéditeur et ajoutez-le au compte du contrat.
- Exécutez le code. Dans ce cas, c’est simple: il vérifie si le stockage du contrat dans l’index 2 est utilisé, le remarque, puis il définit le stockage sur l’index 2 à la valeur CHARLIE. Supposons que cela prenne 187 gaz, donc la quantité restante de gaz est de 1150–187 = 963
- Ajoutez 963 * 0,001 = 0,963 éther au compte de l’expéditeur et renvoyez l’état résultant.
Cela met fin aux étapes suivies tout au long du processus.
S’il n’y avait pas de contrat à la fin de la transaction, le montant total des frais de transaction serait simplement égal au PRIX DU GAZ fourni multiplié par la durée de la transaction en échange, et les données envoyées le long de la transaction ne seraient pas pertinentes.
Dans ce cas, tout le gaz serait utilisé par un mineur pour ne produire aucun résultat car aucun contrat n’existe.
Les messages et les transactions fonctionnent dans des termes similaires en ce qui concerne les retours: si un cycle de messages manque de gaz, le cycle de messages et toutes les autres exécutions déclenchées par cette exécution sont réinitialisés, mais les fils parentaux n’ont pas besoin de revenir.
Cela signifie qu’il est «sûr» pour un contrat d’appeler un autre contrat comme si A appelle B avec du gaz G, alors l’exécutif de A est garanti au maximum pour le gaz G. Cependant, les exécutions de parents non contractuels ne reviennent pas.
Il existe également un opcode, CREATE, qui crée un contrat. Sa mécanique d’exécution est généralement similaire à CALL, sauf que la sortie de l’exécution détermine le code d’un contrat nouvellement créé.
Nous étudierons plus en détail l’opcode dans nos futurs articles de blog technique approfondis.
Le code du contrat Ethereum est écrit dans un code d’échange de bas niveau, appelé « code Ethereum Virtual Machine » ou « code EVM ». Le code EVM est essentiellement une série d’octets et chaque octet est une opération.
« L’exécution du code est une boucle sans fin qui consiste à exécuter à plusieurs reprises l’opération au niveau du compteur de programme actuel (en commençant à zéro) puis à augmenter le compteur de programme de un, jusqu’à ce que le code soit terminé ou qu’une erreur ou une instruction STOP ou RETURN soit détectée. «
Les mesures ont accès à trois types d’espace de stockage de données:
- Stack, un conteneur de chargement-premier sorti dans lequel les valeurs peuvent être poussées et sautées comme une pile typique.
- Mémoire, un tableau d’octets infiniment extensible.
- Le stockage, une entreprise clé / valeur. Contrairement à la pile et à la mémoire, qui sont restaurées une fois le calcul terminé, le stockage à long terme reste.
Le code a également accès à la valeur, à l’expéditeur, aux données du message entrant et à l’en-tête de bloc. Le code peut également renvoyer un octet de données en sortie.
Le modèle d’exécution avec le code EVM est assez simple. Nous allons l’explorer plus en détail dans les étapes ci-dessous.
Pendant que la machine virtuelle Ethereum fonctionne, son état de calcul complet peut être défini par le tuple. Un tuple se compose de block_state, transaction, message, code, memory, stack, pc and gas.
Ici, block_state est l’état global qui contient tous les comptes et inclut les soldes et le stockage.
Au début de chaque cycle d’exécution, l’instruction en cours est trouvée en prenant le changement de code informatique (ou 0 si pc> = len (code)), ce qui signifie que pc est considéré comme nul lorsqu’il est supérieur ou égal à la longueur du code.
Chaque instruction a sa propre définition de la façon dont elle affecterait le tuple.
ADD libère deux objets du bundle, pousse sa somme, réduit le gaz de 1 et augmente l’ordinateur de 1 (généralement un bundle fonctionne)
SSTORE affiche les deux meilleurs éléments de la pile et insère le deuxième élément dans le stockage du contrat à l’index spécifié par le premier élément.
Il existe de nombreuses façons d’optimiser l’exécution d’EVM via une compilation juste à temps, une implémentation de base d’Ethereum peut être effectuée en quelques centaines de lignes de code.
Blockchain et exploitation minière
La blockchain Ethereum est plus ou moins similaire à la blockchain Bitcoin avec quelques différences subtiles.
La principale différence entre Ethereum et Bitcoin en termes d’architecture blockchain est que, contrairement à Bitcoin (qui ne contient qu’une seule copie de la liste des transactions), les blocs Ethereum contiennent une copie de la liste des transactions, le dernier état, le numéro de bloc et la difficulté.
L’algorithme de validation de bloc de base dans Ethereum peut être expliqué dans les étapes suivantes:
- Vérifiez si le bloc précédemment référencé existe et est valide.
- Vérifiez que l’horodatage du bloc est plus grand que celui du bloc précédemment référencé et moins de 15 minutes à l’avance.
- Assurez-vous que le numéro de bloc, la difficulté, la racine de la transaction, la racine de l’oncle et la limite de gaz (divers concepts spécifiques à l’étherus de bas niveau qui seront abordés plus tard) sont valides.
- Vérifiez que la preuve de travail sur le bloc est valide.
- Soit S[0] être l’état à la fin du bloc précédent. (rappelez-vous que cela a été discuté et expliqué dans le billet de blog précédent)
- Soit TX la liste des transactions du bloc, avec n transactions. Pour tout i dans 0… n-1, définissez S[i+1] = UTILISATION (S[i], TX[i]). Si un programme renvoie une erreur ou si le gaz total consommé dans le bloc jusqu’à ce que ce point dépasse la LIMITE DE GAZ, vous renvoyez une erreur.
- Soit S_FINAL S[n], mais ajoute la récompense de bloc versée au mineur (S_FINAL = S[n]+ Récompense de blocage). La récompense est attribuée lorsqu’un mineur termine avec succès l’extraction d’un bloc.
- Vérifiez si la racine de l’arbre Merkle de l’état S_FINAL est égale à la racine d’état finale trouvée dans l’en-tête du bloc. Si c’est le cas, le bloc est valide; sinon, il n’est pas valide. (La validation de l’arbre Merkle et de la tête de bloc est expliquée avec des images pertinentes dans les articles de blog précédents)
La procédure de stockage de l’état entier dans chaque bloc peut sembler inefficace au premier abord, mais elle est comparable à Bitcoin.
L’état est stocké dans la structure arborescente et après chaque bloc, seule une petite partie de l’arborescence doit être modifiée. Cela signifie qu’entre deux blocs adjacents, la grande majorité de l’arbre doit être la même. Les informations peuvent être stockées une fois et référencées deux fois à l’aide de pointeurs (arbre de hachage).
Un type d’arbre spécial appelé « arbre Patricia » est utilisé pour y parvenir, y compris une modification du concept d’arbre Merkle qui permet aux nœuds d’être insérés et supprimés efficacement.
De plus, comme toutes les informations d’état font partie du dernier bloc, il n’est pas nécessaire de stocker l’historique complet de la blockchain.
Une question fréquemment posée est « où«Le code du contrat est exécuté en ce qui concerne le matériel physique.
Le processus d’exécution du code de contrat est défini dans la fonction de transition d’état elle-même, qui fait partie de l’algorithme de validation de bloc. Si une transaction est ajoutée au bloc B, l’exécution de code créée par cette transaction sera exécutée par tous les nœuds qui téléchargent et valident le bloc B, maintenant ou à l’avenir.
Cela marque la fin de Partie 2 par Ethereum White Paper. Dans la section suivante, nous discutons des applications en temps réel du protocole Ethereum et de l’écosystème.