Comprendre Ethereum (2): the Ethereum State Transition Function

Chaque projet blockchain peut être vu comme une application simple bâtie sur une ressource de calcul décentralisée, et qui agit toutefois toutefois en bloc comme si elle était unitaire. On désigne ce paradigme transactional singleton machine with shared-state.

 

distrubutes states

Le bitcoin a montré qu’il est possible d’utiliser les noeuds Internet pour construire un système de transfert de valeur décentralisé, partagé à travers le monde et libre d’utilisation. D’un point de vue théorique le système bitcoin est une version très spécialisée d’une machine cryptographique sécurisée  à base de transactions d’états.

Ethereum va plus loin.

Ethereum implémente ce paradigme de la manière la plus généralisée possible afin que tous les concepts transactional with shared-state puissent y être construits (d’où son caractère Turing-complet). Ainsi sa plateforme fournit au développeur un système solide pour la construction de  logiciels sur un paradigme jusqu’ici inexploré: une structure de calcul pour l’envoi/réception de messages qui execuopte du code dans sa plateforme et que intègre la confiance de manière native.

 

Ethereum est une blockchain avec un langage de programmation incorporé  Turing-complèt capable de créer des contrats qui renferment et modifient des transition d’état (State Transition Function) arbitraires. Les développeurs peuvent créer n’importe quels systèmes pas encore imaginés en écrivant simplement quelques lignes de code dans un langage de très haut niveaux d’abstraction.

Tout ça passe par la Ethereum State Transition Function

ethertransition.png

qui est du type   APPLY(S,TX) -> S'   et qui fait les choses suivantes:

  • Vérifie si la syntaxe de la transaction est correcte (c’est-à-dire. ses champs sont tous correctement renseignés), si la signature est valable et que le nonce correspond au nonce dans le compte de l’expéditeur. Se ce n’est pas le cas elle renvoie une erreur.
  • Vérifie si le solde sera positif (après transaction). Pour cela elle calcule les honoraires (STARTGAS * GASPRICE) et détermine l’adresse d’envoi à partir de la signature. Soustraye les honoraires du solde de compte de l’expéditeur et incrémente le nonce de l’expéditeur. S’il n’y a pas assez d’argent pour compléter la transaction elle renvoie encore une erreur.
  • Initialise GAZ = STARTGAS et enlève une certaine quantité de gaz (ether) par octet pour payer pour les bytes utilisés dans la transaction.
  • Transfère la valeur de la transaction du compte expéditeur au compte réception. Si le compte réception n’existe pas encore, il le crée. Si l’account réception est un contrat, elle exécuter le code du contrat soit jusqu’à sa fin, soit jusqu’à ce que l’exécution épuises son gaz (tombe en panne d’ether).
  • Si ce transfert de valeur ne se passe pas bien (parce que l’expéditeur n’avait pas assez d’argent, ou le code a fini son gaz avant la fin, la transaction efface tout pour revenir à l’état initiale (comme si la transaction n’avait jamais eu lieu) à l’exception du paiement des honoraires qui sont versés sur le compte du mineur.
  • Si le transfert de valeur se fait correctement, la transaction verse les honoraires au mineur et renvoie les ethers restants, pas dépensés en honoraires, à l’expéditeur .

 

Example   

Supposont que notre contrat soit le suivant :

if !self.storage[calldataload(0)]:
    self.storage[calldataload(0)] = calldataload(32)

Cet exemple est écrit en Serpent, un des quatre langages de programmation qui sont compilés en code exécutable EVM  (Ethereum Virtual Machine) .

Supposons que le stockage du contrat commence vide et qu’une transaction soit envoyée avec

  • une valeur 10 valeur d’éther,
  • 2000 ethers de réserve de gaz
  • un GASPRICE de 0.001
  • 64 octets de données, avec les octets de 0 à 31 pour coder le nombre 2 et les octets de 32 à 63 représentation le mot CHARLIE.

La fonction de transition d’état va s’exécuter:

  1. Vérifie si la syntaxe de la transaction est correcte
  2. Vérifie que l’expéditeur a au moins 2000 * 0.001 = 2 ethers sur son compte. Comme c’est le cas (il en a 2000) enlève 2 ethers de son compte (2000-2 = 1998).
  3. Initialise gas = 2000 .  En supposant que la transaction soit longue 170 bytes et que chaque byte coûte en honoraires 5 ethers, il faut enlever 170*5 = 850 ethers de manière a rester avec 1148 en gas.
  4. Enlève 10 ether supplémentaires du compte expéditeur et ajoute les au compte du contrat.
  5. Execute le code: vérifie si le stockage du contrats à l’adresse [2] is used, ce qui n’est pas le cas, donc on enregistre à la position index  [2]  la valeur CHARLIE. Supposons que cela coûte  187 ethers,  il faut les enlever et on passe ainsi à  1148 – 187 = 961 de réserve en gas.
  6. Rembourser l’expéditeur de 961 * 0.001 = 0.961 ethers et retrourner l’état finale comme resultat.

 

Les transactions représentent ainsi un arc valable entre deux états. Il est important de souligner le mot valable: il existe beaucoup plus de changements d’état incorrects que valables. Par exemple réduire le solde d’un compte sans effectuer une augmentation égale et opposée quelque part ailleurs dans la balance est un changements d’état incorrect.

On définit les transitions d’état valables comme celle qui arrive comme résultat d’une transaction précédente.

Formellement :

 Š (t+1) = Υ  [ Š (t) , T ] 

Υ est la fonction de transition d’état d’Ethereum.

Dans Ethereum l’ensemble Υ  avec  Š est considérablement plus puissant que n’importe quel système comparable existant. Υ  permet aux composants d’effectuer arbitrairement n’importe quel type de calcul, tandis que  Š permet aux composants de stocker arbitrairement n’importe quel type d’état entre deux transactions.

 

6 réflexions au sujet de « Comprendre Ethereum (2): the Ethereum State Transition Function »

  1. Bonjour et merci pour cette présentation d’Ethereum. Une telle application peut-elle s’exécuter depuis un navigateur x par une utilisateur y ne possédant par d’ETH, ou bien a-t-on besoin de télécharger un client et la blockchain ? dit autrement, est-il possible d’écrire une web app avec un language Ethereum comme on le ferait avec un language dont l’exécution est centralisée ?

    1. bonjour.

      l’interface reste la même et vous pouvez l’écrire en HTML5, CSS, JAVASCRIPT… + Angular et les frameworks ce que vous voulez
      le backend par contre est écrit dans un des langages de Ethereum (comme Serpent) avant d’être compilé en bytecode pour la Machine Virtuelle d’Ethereum

      si vous faites abstraction du fait que votre DB est une blockchain distribué, ça ne change rien pour le reste

Répondre à microingens Annuler la réponse