Comment sont stockées les données des applications Ethereum?

31 August 2017

Ethereum permet de créer des applications décentralisées, des DAPPs. Ces applications fonctionnent via des programmes qui vivent sur la blockchain de l’Ether: les Smart Contracts.

Mais quand j’écris un Smart Contract, où sont stockées les données de l’application?

On veux comprendre comment le stockage de données fonctionne avant de travailler sur cette plateforme. L’exécution du code, les serveurs et les langages de programmation sont rarement critiques dans la conception d’une application. Par contre, les données, leurs structures et leurs sécurité définissent une bonne part de nos contraintes.

Par exemple,

  • Pour un Facebook: où sont stockés les publications et les commentaires?
  • Pour un Dropbox, où sont stockés mes fichiers privés?
  • Ou bien pour un Slack, où sont stockées les canaux de discussions?

La Machine à Comptes

On va oublier la Blockchain pour le moment, c’est une machine à générer du Consensus. On va donc l’oublier et admettre “Ethereum est un gros ordinateur qui traite des opérations de manière fiable”. On s’intéresse à un niveau d’abstraction plus élevé, la partie logicielle.

Ethereum sert à représenter un ensemble de comptes. Chaque compte à un propriétaire et un solde (un nombre d’Ether).

Si je prouve mon identité, je peux transférer des Ethers de mon compte à un autre. La monnaie va se déplacer entre ces comptes sous la forme d’une opération atomique. C’est une transaction.

Le logiciel Ethereum est donc un logiciel de traitement de transactions:

  1. On a un état: l’ensemble des comptes,
  2. On applique des transactions,
  3. On obtient un nouvel état, un ensemble de comptes et de soldes mis à jour.

C’est tout!

Ce qui nous intéresse aujourd’hui, c’est le fait de pouvoir exécuter du code à l’intérieur d’une transaction. Pour ca on utilise des Smart Contracts.

Les Comptes Robots

Tous les comptes ont un propriétaire et un solde. Mais certains sont un peu particulier: Ils sont leur propre propriétaire. Au moment de leur création, on leur attache du code et de la mémoire. Ce sont les Smart Contracts.

Un Smart Contrat c’est un compte en banque intelligent. Ne vous attardez pas sur la partie “Contract”, il faut vraiment les voir comme des Comptes Robots.

C’est un robot, qui exécute du code quand il reçoit des transactions. Cette exécution se déroule au sein de la Blockchain donc elle est publique, répliquée et validée par le réseau. Un Smart Contract ne peux pas planter à cause d’une coupure de courant dans un data-center.

Donc un Smart Contract, possède un solde, du code et un stockage. C’est dans ce stockage qu’on va retrouver les données des DAPPs les plus simples.

La Mémoire des Comptes Robots

Quand un Smart Contract est créé ou lorsqu’il est réveillé par une transaction, son code peut lire et écrire depuis son espace de stockage.

Les spécifications du Storage: C’est un gros dictionnaire (key-value store) qui associe des clés à des valeurs. Les clés sont des byte string de 32 octets. On peut donc avoir 232 x 8 bits = 2256 clés différentes. Pareil pour les valeurs.

Ce système de stockage ressemble à Redis, RocksDB ou LevelDB.

Les DAPPs utiliseraient ce stockage comme une page mémoire dans un programme. Un exemple de structure définis dans le language Solidity:

'' code Solidity (solidity.readthedocs.io)
struct Voter {
 uint weight;
 bool voted;
 uint8 vote;
 address delegate;
}

2256 (clés) x 32 octets (valeurs), c’est aux alentours de 1063 petabytes. Il faudrait plusieurs milliards de fois l’âge de l’univers pour parcourir autant de données avec un SSD. On peut admettre qu’il n’y a pas de limite de stockage pour une DAPP.

Mais il y a un coût:

Le Carburant d’une DAPP

À chaque transaction on ajoute un peu d’Ether, le gas (carburant). C’est une taxe payée par l’émetteur d’une transaction pour motiver les mineurs à traiter sa requête. Les mineurs assurent la fiabilité du réseau et ils sont récompensés par un peu d’Ether. C’est donc ce carburant qui fait rouler la machine Ethereum.

On envoie des transactions et un peu de carburant à cette grosse machine. Si la transaction est destinée à un Smart Contract, la machine Ethereum démarre le Robot du compte. Les actions du robot vont aussi consommer un peu de carburant supplémentaire.

Les actions du robot sont des instructions dans la EVM (Ethereum Virtual Machine). Il y a des instructions pour lire dans la mémoire, des instructions pour écrire, etc. Chaque instruction à un coût en gaz et c’est ce coût qui va contraindre la quantité de stockage que vous allez utiliser.

Le coût du stockage

Le coût des instructions du Smart Contract vont limiter la quantité de stockage qu’il utilise. Ethereum propose un espace potentiellement infini, MAIS le robot doit pouvoir payer, en gas, chaque instruction de lecture et d’écriture en mémoire.

Ce coût change en permanence, en fonction de la congestion du réseau et des nouveaux développements sur Ethereum. Pour se donner un ordre de grandeur, j’ai simulé quelques exemples de Smart Contracts.

J’ai noté trois opérations:

  1. L’écriture d’un uint8 (un octet) dans le stockage,
  2. L’incrémentation d’un uint8 dans le stockage (lecture puis écriture),
  3. Une fonction de vote triviale. Elle vérifie que l’émetteur de la transaction peut voter puis met à jour le résultat du vote. On ne peut voter qu’une fois, la deuxième tentative de vote est court-circuitée.

Le code et les outils sont dans l’Annexe un peu plus bas. Voilà les chiffres:

D’après ce tableau, cet article coûterait aux alentours d’une cinquantaine d’euros à stocker avec un Smart Contract. Sans les images. Poster un tweet, quelques euros et passer une commande sur Amazon une poignée de centimes.

Ce sont des estimations, des ordres de grandeur. Le coût exact dépends des instructions utilisées, de la congestion du réseau, du cours du gas, etc. De nouveaux algorithmes dans Ethereum pour le minage des blocks pourrait aussi faire baisser le cours du gaz (Proof Of Stake).

Deux détails liés à l’architecture de la Blockchain

J’ai expliqué qu’on pouvait se passer de la présence de la Blockchain pour comprendre le stockage de l’Ether. Cependant, la Blockchain implique que notre système possède certaines propriétés:

1. On peut lire depuis la Blockchain sans payer Si vous installer le client ethereum et que vous prenez part au réseau. Même sans miner, le client va synchroniser toutes les données de la blockchain. Les données de toutes les DAPPs de l’Ethereum sont donc accessibles sur votre machine, sans coût en gaz. Évidemment, il n’est pas possible de les modifier.

2. Le coût du Stockage ne dépends pas de la durée Chaque membre du réseau doit pouvoir rejouer et valider l’ensemble des transactions. Par design les données stockées dans Ethereum ne sont donc jamais vraiment supprimées, il n’y a donc pas vraiment de bénéfices à supprimer un mapping clé-valeur maintenant ou demain.

Finalement, où sont stockées mes données?

Et bien probablement pas sur la blockchain de l’Ethereum. Les données stockées par les Smart Contracts sont en sécurité, dans un environment fiable et assez facile d’accès. Cependant, le coût et la structure du key-value store le destine plutôt pour des métadonnées.

Pour reprendre les exemples de l’introduction, les postes Facebook, les fichiers Dropbox et les boites de messageries de vos DAPPs serons très probablement stockés sur une autre plateforme comme IPFS. Les métadonnées comme les clés de chiffrement, les racines vers les fichiers et la gestion des droits seraient eux probablement à l’abris dans le stockage d’un smart contract Ethereum.

Annexe

Les morceaux de code utilisés pour le tableau:

pragma solidity ^0.4.0;

contract Test {
    mapping(uint =\> uint) tests;

    function Test() {
    }

    function one_set() {
        tests[0] = 0;
    }

    function two_increment() {
        tests[0] = tests[0] + 1;
    }
}
/// Give a single vote to proposal $(proposal).
function vote(uint8 proposal) {
    Voter storage sender = voters[msg.sender];
    if (sender.voted || proposal >= proposals.length) return;
        sender.voted = true;
        sender.vote = proposal;
        proposals[proposal].voteCount += sender.weight;
    }
}

Les outils utilisés pour tester le code et évaluer les coûts:


Laurent Senta

I wrote software for large distributed systems, web applications, and even robots. These days I focus on making developers, creators, and humans more productive through IPDX.co.