Livre blanc d’Ethereum, expliqué. Partie 2 – Ethereum avis

  • Soutien-gorge dentelle avec armatures Cerignola - lot de 2 - 100D - Blanc/noir - Confidence LingerieCe soutien-gorge avec armatures Confidence Lingerie® vous offrira un maintien infaillible grâce à ses bas bonnets en 3 parties. On craque pour sa dentelle
    Ce soutien-gorge avec armatures Confidence Lingerie® vous offrira un maintien infaillible grâce à ses bas bonnets en 3 parties. On craque pour sa dentelle fleurie très féminine, emplie de douceur et de délicatesse !
  • Soutien-gorge brodé microfibre sans armatures Sienne - lot de 2 - 110D - Blanc/taupe - Confidence LingerieUltra féminin, le soutien-gorge Sienne est aussi un champion du maintien grâce à ses bonnets en 2 parties qui galbent la poitrine ! A combiner à la c
    Ultra féminin, le soutien-gorge Sienne est aussi un champion du maintien grâce à ses bonnets en 2 parties qui galbent la poitrine ! A combiner à la culotte coordonnée pour profiter pleinement de ses jolies broderies...
  • Soutien-gorge brodé microfibre sans armatures Sienne - lot de 2 - 105D - Blanc/taupe - Confidence LingerieUltra féminin, le soutien-gorge Sienne est aussi un champion du maintien grâce à ses bonnets en 2 parties qui galbent la poitrine ! A combiner à la c
    Ultra féminin, le soutien-gorge Sienne est aussi un champion du maintien grâce à ses bonnets en 2 parties qui galbent la poitrine ! A combiner à la culotte coordonnée pour profiter pleinement de ses jolies broderies...
?>

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:

  1. 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.
  2. 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.
  3. Initier GAS = STARTING GAS, et une certaine quantité de gaz par échange est retirée pour payer les échanges dans la transaction.
  4. 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.
  5. 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.
  6. 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.

  1. Assurez-vous que la transaction est valide et bien formée.
  2. 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)
  3. 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.
  4. Soustrayez 10 autres éthers du compte de l’expéditeur et ajoutez-le au compte du contrat.
  5. 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
  6. 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.

exécution de code

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:

  1. Stack, un conteneur de chargement-premier sorti dans lequel les valeurs peuvent être poussées et sautées comme une pile typique.
  2. Mémoire, un tableau d’octets infiniment extensible.
  3. 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.