Contrairement à la blockchain du bitcoin, Ethereum intègre un langage de programmation Turing-complet qui permet d’exposer des méthodes qui sont appelées dynamiquement par d’autres contrats ou par des agents externes. Ethereum est donc un protocole conçu pour construire des applications décentralisées (Dapp) dans des situations où la sécurité doit être au rendez-vous, on veut pouvoir développer rapidement et on souhaite (éventuellement) de l’interaction entre applications différentes.
Le coeur du moteur blockchain est sa capacité à vérifier une transaction numérique via le consensus d’une communauté d’utilisateurs distribuée, sans avoir à gérer la confiance via une autorité centrale.
Borner l’utilisation de la blockchain à la seule vérification les transactions de crypto-monnaies (ce qui arrive dans le cas du bitcoin) est très limitatif: une blockchain peut être utilisée dans le même esprit pour confirmer n’importe quel contenu numérique pour n’importe quel service.
Cette notion de confiance distribuée et décentralisée constitue le cœur d’Ethereum, c’est pourquoi on dit qu’avec une blockchian la confiance s’intègre dans et voyage sur les noeuds TCP/IP.
Avec l’arrivée du web nous avons tous envisagé des nouvelles formes de libertés personnelles pour enfin réaliser que nous sommes tous traques et fichés par les gros géants du web (facebook, google, amazon … ) aussi bien que par les plus petits.
Le modèle décentralisé d’Ethereum évite la concentration hiérarchique des grands acteurs qui privent Internet d’une grande partie de sa liberté, ce qui permet l’émergence de nouveaux modèles de business qui tirent partie du fait que la barrière d’entrée est considérablement réduite sur ces technologies qui restent de pointe et aux fortes potentialités. L’objectif est clairement décentraliser le Web dans des domaines très variés comme la médecine, les votations, le notariat, la finance … en redéfinissant dans le web les notions de confiance, sécurité, réputation et transparence.
Le langage est très puissant, une version réduite à l’essentiel de Namecoin peut être écrite en deux lignes de code tandis que d’autres applications, comme des monnaies ou des systèmes de réputation, peuvent tenir sous vingt lignes.
Mais surtout la plateforme Ethereum, à cause de sa puissance bien supérieure à celle offerte par les scripts rigides du bitcoin, permet une panoplie de possibiltés:
- les digital assets (actifs numériques) pour représenter des monnaies personnalisées et des instruments financiers (colored coins)
- la gestion de propriété de biens (smart properties)
- les non-fungible assets (actifs non-fongibles) qui vont des plus simples comme les noms de domaine (Namecoin) au plus complexes contrôlés par du code qui définit et exécute des règles (smart-contracts)
- les cryptographic-box: boites numériques contienant de la valeur qui s’ouvrent seulement si certaines conditions sont remplies
- les secure-wallets (et les secure storages)
- les dérivés financières
- et surtout les DAO: organisations autonomes décentralisées.
Les comptes
Un état dans le monde de Ethereum est constitué d’une série d’objets qu’on appelle « accounts » (comptes) qui sont de deux types:
- les comptes détenus de l’extérieur contrôlés par des clés privées
- les comptes-contrat contrôlés par le code source du contrat lui même.
Un compte détenus de l’extérieur n’a pas de code à exécuter mais il peut envoyer des messages en créant et signant une transaction.
Un contrat peut être vu comme un bout de programme informatique qui s’exécute sur la blockchain. Il contient le code source, un fichier de stockage (vide par défaut) et le solde du compte. Le code d’un contrat est figée à la création ne peut pas être changé par la suite. On crée un contrat en postant une transaction dans la blockchain.
Chaque compte a toujours un adresse unique à 20-bytes, des infos sur son état et un solde de son équilibre en ether. L’ether est la crypto-monnaie interne à Ethereum utilisée comme carburant pour payer les honoraires des transactions.
Le système garde trace de la propriété des ether en associant à chaque unité monétaire une adresse. Il y a deux sortes d’adresses : un pour les utilisateurs et un pour les contrats.
On disait tout à l’heure que les comptes-contrat son contrôlés par le code source qu’ils contiennent. En effet, chaque fois qu’un compte-contrat reçoit un message il exécute son code ce qui déclenche des actions comme lire et écrire dans le stockage interne, envoyer des messages, recevoir ou envoyer de l’argent, créer des nouveaux contrats à son tour…
Les contrats dans Ethereum ne sont pas des contrats comme dans la loi c’est à dire quelque chose qui devrait être accompli ou respecté. Ils sont plutôt des agents autonomes qui vivent à l’intérieur de la plateforme, exécutant du code spécifique lorsque ils reçoivent un message ou une transaction (d’un utilisateur ou d’un autre contrat). Ils ont le contrôle direct de leur propre solde en ether et connaissent leur état interne grâce aux variables persistantes qui se trouvent dans le storage.
La différence entre messages et transactions
Essentiellement, un message est comme une transaction, sauf qu’il produit par un contrat et non pas un acteur externe.
Les messages
Ils sont un peu comme les fonctions dans les langages de programmation ordinaires : il reçoivent un input en paramètre (un autre message), il effectuent un traitement (il exécutent leur code) et peuvent passer une valeur de retour à l’appelant.
Les messages sont des objets virtuels qui ne sont jamais sérialisés et qui existent seulement dans l’environnement d’exécution de Ethereum.
Les contrats peuvent envoyer des messages à d’autres contrats.
Un message contient :
- L’expéditeur du message (implicitement)
- Le destinataire du message
- Le montant en ether à transférer avec le message
- Un champ de données facultatif
- Une valeur STARTGAS
Comment produire un message? Un message est produit lorsque un contrat qui tourne exécute le opcode CALL. Cela produit et exécute un message. Les contrats peuvent avoir des relations avec d’autres contrats de la même manière que les acteurs externes.
Les transactions
Le terme « transaction » se réfère au paquet de données signé qui stocke un message à envoyer provenant d’un compte détenu de l’extérieur.
Les transactions peuvent être déclenchées par les deux types de comptes, mais les comptes-contrats déclenchent une transaction seulement en réponse à une autre transaction reçue. Par conséquent, toute action dans la blockchain Ethereum est toujours mise en marche par des transactions envoyées par des comptes détenus de l’extérieur.
Une transaction contient:
- le destinataire du message (ça peut être un contrat)
- une signature identifiant l’expéditeur
- le montant en ether à transférer de l’expéditeur au destinataire
- un champ données (optionnels)
- STARTGAS: le nombre maximal de pas informatiques que la transaction est autorisée à dépenser
- GASPRICE: la commission en ether que l’expéditeur doit payer par pas informatique
Si le gaz vient à manquer avant que la fin d’une transaction n’atteigne un point d’arrêt ordinaire, le programme lance une exception : l’état revient à celui avant la transaction et le montant en éther dépensé n’est pas remboursé.
Avoir des commissions sur l’utilisation des ressources est aussi un moyen de prévenir les attaques vers la plateforme vu qu’un éventuel pirate paye proportionnellement aux actions qu’ils mène contre le système, qu’il s’agit de calcul, de bande passante, de stockage…
Une transaction commence toujours avec un message qui vient d’un utilisateur et qui va à un adresse destinataire (qui est soit un autre utilisateur soit un contrat). Ce message doit être signé par l’utilisateur.
Si le destinataire est un contrat le code de ce contrat est exécuté. Il est à noter que si le code contient une instruction pour envoyer un message à un autre contrat, alors le code de ce contrat est exécuté après l’envoi. Ainsi, une transaction doit contenir au moins un message, mais peut déclencher plusieurs messages avant qu’il ne complète le code qui lui est associé.
Les transactions les plus simples sont les transactions de transfert d’éther.
eth.sendTransaction({from: '0x0jh568fvz57eS5269fdsSD62cnk14CD14063cdSW', to: '0xaVbg74sDfvbnof4H3201nbxDs4Fb41GjlqA1609a', value: web3.toWei(1, "ether")})
La partie (2) c’est par ici.
2 réflexions au sujet de « Comprendre Ethereum (1) »