Block Chain (Part 1)

Block Chain

Objectif simple cette semaine : découvrir la Block Chain. Donc sûrement beaucoup de lecture, écoute etc…

Liens

Block Chain

Smart Contracts

Autres


Block Chain : Prise de notes

Présentation

En tapant “Block Chain”, je suis d’abord tombé sur des vidéos (plus que des articles) et essentiellement tournés vers BitCoin ce qui est assez naturel car c’est actuellement la plus connu. Donc les différentes prises de notes ci-dessous sont très liées à BitCoin et sa Block Chain sous-jacente

Proof of work

Le principe est de montrer qu’effectivement vous avez bien travaillé. Il s’agit d’une recherche d’un nombre spéciale qui une fois hashé (SHA256) commence en binaire par 30 zéros. Vu le mode de fonctionnement de SHA256, le seul moyen de trouver une solution est de tester différents nombres. Ici, il faut sans doute prêt quelques tentatives pour trouver un tel nombre (surtout qu’en fait c’est plus complexe :)). Par contre la vérification du nombre, elle est simple ==> il suffit de hasher le nombre candidat et vérifier. Bilan : la vérification du travail ne nécessite pas de refaire le travail soit même.

Recherche de la Proof of Work

La recherche du nombre magique se fait en association avec un certains nombres d’éléments que le système veut valider. Dans le cas de la Block Chain BitCoin, l’idée est de valider que les transactions sont bonnes. Donc la recherche n’est pas simplement d’un nombre qui une fois hashé commence par 30 zéros en binaire mais la recherche d’un nombre qui combiné avec d’autres informations (ici des transactions) commence par 30 zéros en binaire (je l’avais dit : plus complexe). En plus de la preuve de travail, cela permet de signer le bloc d’informations car selon le principe du hash, une modification même infime du bloc, change le résultat et donc le numéro résultat.

Chaînage

Pour assurer encore plus la sécurité et la complexité du travail derrière, les blocs sont chaînés entre eux. Le hash du bloc précédent est intégré dans le nouveau bloc. L’image suivante est tirée de la vidéo présente ici que j’ai trouvé très pédagogique : Avec ce chaînage et le temps passant, la modification d’un bloc de données validé devient extrêmement complexe.

Ici, la taille compte

Au final, la confiance vient avec le temps. Un dernier bloc reçut ne doit pas être considéré comme valide tant que d’autres blocs ne sont pas venus après après ce nouveau bloc. Rien n’empêche une personne de falsifier une donnée et diffuser un bloc corrompu sur le réseau. Mais en parallèle d’autres vont également calculer le hash du bloc légitime et obtenir un résultat différent (pour le coup valide). Comme la règle est qu’on fait confiance à la chaîne de bloc la plus longue, les calculs sur le chaîne valide vont être plus rapide que celle sur la invalide. En effet, il n’y a que la personne qui a falsifié le bloc qui va continuer à calculer avec ce mauvais bloc. Les autres vont calculer avec le bloc légitime. En toute logique et à moins que le truand possède une force de calcul énorme, il ne pourra pas gagner la course et son bloc sera rejeté …

Minez mes petits

Dans le cas de BitCoin, le principe de “Miner” revient pour certains à créer de la valeur et gagner des bitcoins. Mais en fait, ce n’est qu’une vision de l’iceberg et surtout une conséquence, du travail réalisé. En fait, celui ou celle qui trouve en premier le nombre validant la transaction obtient une récompense qui lui est crédité et qui en plus vient augmenter le nombre de bitcoins possibles

Gestion de votre compte

Avec tout cela, comment je fais pour savoir combien j’ai sur la chaîne ? Le principe n’est pas d’avoir une balance de comptes. Le principe est plutôt que pour pouvoir dépenser il faut prouver deux choses :

  • Que l’on a bien des entrants (Input) permettant la dépense,
  • Que l’on a pas déjà dépensé les entrants.

Dans un système comme celui-là où il ne faut faire confiance à personne, pour réaliser ce genre de choses, il faut passer en revue toutes les transactions … Pour accélérer les choses, un index des inputs non utilisés est conservée … Mais sur le principe, pour savoir le montant que vous avez sur votre “compte”, il faut balayer toutes les transactions depuis le début …

Smart Contracts

Présentation

Un SmartContract = du code enregistré sur la Block Chain. Comme il s’agit de code, il est possible d’imaginer que l’on pourrait développer à peu près n’importe quoi. Comme l’indique un article : il est possible de développer un traitement de texte mais cela n’aurait aucun sens … . Comme ce code est enregistré sur la Block Chain, il est enregistré selon les règles associées à la Block Chain. C’est à dire avec les règles de sécurité et de non falsification. Mais également le côté automatique et déterministe : si les règles sont bien implémentées, le résultat sera conforme aux attentes (tout est dans le si !)

Les exemples d’utilisation possibles sont assez nombreux (cf. ici) comme une assurance retard.

Assurance retard

J’aime bien celui-là car il est “facile” à imaginer. Une compagnie propose une assurance retard indiquant que si l’avion a X minutes de retard, la personne sera remboursée de Y à la condition qu’elle est payé Z en entrée. La compagnie propose donc un SmartContract directement sur la chaîne. Lorsque la personne “signe” le contrat, l’information est enregistrée et publique et le montant Z est prélevé. Une première partie du contrat est réalisée.

Le code du SmartContrat doit contenir une fonction de vérification d’atterrissage des avions (au moins ceux qui pour lesquels un contrat a été signé). A l’atterrissage de l’un d’entre eux, si il est en retard de plus d X, le code verse directement Y à la personne.

C’est ici la promesse faite par le SmartContract : le versement est automatique ! Pas besoin pour la personne de lancer une procédure ou à la compagnie de mettre en place une gestion particulière. Parce que le code existe, il sera exécuté.

Un peu de code

Solidity

Sur Ethereum, il existe un langage pour créer les différents contrats : Solidity. Un truc pratique pour essayer le langage, une interface web est fournie qui permet de jouer un peu dans un sandbox : ici.

Hello World !

Comme a chaque fois, on commence par un HelloWorld :

pragma solidity ^0.4.0;

contract HelloWorldContract
{
    string _msg = "Hello World";

    function getHello() constant returns(string) {
        return _msg;
    }

    function setHello(string newMsg) returns(string) {
        _msg = newMsg;
        return _msg;
    }

}

Bon rien de compliqué … La lecture doit permettre de comprendre. Juste deux infos :

  • Première ligne pragma solidity ^0.4.0; : permet d’indiquer le compilateur a utilisé sur la chaîne lors de la création du contrat. Important pour la continuité et la persistance car à priori, ce qui est publié, reste publié,
  • constat : en fait, c’est comme cela qu’on indiqué que la fonction est une fonction “get”. C’est important car si les fonctions get sont “gratuites” à priori, les fonctions “set” sont payantes …

Je ne suis pas encore totalement expert (loin de là) mais dès qu’un contrat modifie un statut cela implique la création d’une transaction. Cette transaction doit ensuite être intégrée dans un bloc et cela coûte du traitement. Donc cela coût du gaz … Cela reste à valider ;).

Un peu d’argent ?

Toujours dans le cas de la sandbox, il est possible de faire semblant de jouer avec un peu de monnaie :

pragma solidity ^0.4.0;


contract HelloPaiementContract
{
    address _sender;

    function HelloPaiementContract() {
        _sender = msg.sender;
    }

    modifier ifSender() {
        if(msg.sender != _sender) {
            throw;
        }
        _;
    }

    function deposeMoney() payable {

    }

    function getMoney(uint amount) ifSender {
        if(_sender.send(amount)) {
            // OK !
        } else {
            // Aie !
        }
    } 

    function getTotal() ifSender constant returns(uint) {
        return this.balance;
    }

}

Quelques compléments :

  • modifier : avoir comme un code qui est appelé AVANT la méthode. Ici, il nous sert pour vérifier que celui qui récupère l’argent ou celui qui demande le montant sur le compte est bien celui qui a enregistré le contrat,
  • payable : grâce à ce simple mot clé, la fonction permet de récupérer de “l’argent” (au sens Ethereum). A noter que la fonction ne contient pas de code mais que la variable interne balance sera directement mise à jour

L’exemple reste très simple et ne gère aucun cas d’erreur mais cela donne une idée de ce qui est possible. On constate également que certaines actions sont directement incluses …

Bilan

Une bonne journée qui compense de la dernière :). Bon par contre, il me reste une bonne zone de flou : comment cela peut se mettre en place en vrai ?. Comment gérer le déploiement, le test, le debug et l’utilisation dans la vraie vie ? Mais pour cela, il faudra essayer de mettre en place ma propre instance pour jouer avec et mieux comprendre SmartContrat et spécialement la partie “finance”. Mais cela : c’est pour un autre demain !