Quel est le coût de construire une blockchain ?

Toute l'histoire de l'humanité est une lutte constante contre les chaînes et la création de nouvelles chaînes, encore plus solides. (Auteur anonyme)

En analysant de nombreux projets blockchain (Bitshares, Hyperledger, Exonum, Ethereum, Bitcoin, etc.), je comprends que, d'un point de vue technique, ils sont tous construits sur les mêmes principes. Les blockchains ressemblent à des maisons qui, malgré la diversité de leurs constructions, décorations et fonctions, ont des fondations, des murs, un toit, des fenêtres et des portes, qui sont reliés entre eux d'une manière définie. Et si l'on comprend les principes de base de la conception des bâtiments, connaissant les propriétés des matériaux utilisés, on peut déterminer la fonction spécifique de chaque maison. Actuellement, il existe une situation où tout le monde a entendu parler de la blockchain, mais peu de gens comprennent son architecture et ses principes de fonctionnement. C'est pourquoi il y a une incompréhension sur pourquoi et comment utiliser les technologies blockchain.

Dans cet article, nous allons examiner les propriétés et les principes communs à toutes les blockchains. Ensuite, nous verrons les problèmes que l'on peut résoudre à l'aide de la blockchain et, pour consolider le matériel, nous construirons une petite, mais véritable blockchain sur notre propre terrain virtuel !

Alors, rappelons-nous quels problèmes la blockchain a initialement résolus.

Je suis sûr que beaucoup diront qu'il s'agit d'une base de données distribuée, décentralisée, publique et immuable. Mais pourquoi tout cela était-il nécessaire ?

Je préfère commencer l'apprentissage de toute technologie par la lecture des normes, car c'est sur elles que reposent tous les articles et livres sur le sujet de recherche. Mais les normes de la blockchain n'existent pas actuellement, des comités ont été créés pour leur développement. À l'heure actuelle, chaque projet blockchain public a son propre document White paper, qui est en fait un cahier des charges technique. Le premier projet blockchain connu du grand public est le réseau Bitcoin. Allons sur le site officiel du réseau et voyons comment tout a commencé.

La tâche de la blockchain

Ainsi, la tâche que la blockchain a résolue dans le réseau pionnier Bitcoin est de permettre la transmission de propriété d'actifs numériques dans un environnement non fiable sans intermédiaires. Par exemple, dans le réseau Bitcoin, un actif numérique est une pièce de monnaie bitcoin. Toutes les solutions techniques de Bitcoin et d'autres blockchains se résument à la résolution de cette tâche.

Les problèmes que la blockchain résout

Imaginons qu'une organisation financière affirme avoir construit un réseau mondial permettant de transférer de l'argent à n'importe qui. Y croiriez-vous ? Si cette organisation est Visa ou MasterCard, vous y croiriez probablement, mais si c'est, disons, AnonymousWorldMoney, ce ne serait probablement pas le cas. Pourquoi cela ? Parce que nous savons très bien comment les systèmes distribués sont réalisés par des entreprises privées, dans quel but, et quelles en sont les conséquences. Examinons plus en détail les problèmes de tels systèmes et comment ils peuvent être résolus grâce aux technologies de blockchain.

Supposons qu'AnonymousWorldMoney dispose de serveurs avec des bases de données, et heureusement, s'il y en a plusieurs dans différents centres de données. Lorsque l'expéditeur transfère de l'argent, une transaction est enregistrée, qui est répliquée sur tous les serveurs, et l'argent parvient au destinataire.

Quel est le coût de construire une blockchain ?

Dans un monde idéal, un tel système fonctionne parfaitement, mais dans notre cas, nous rencontrons les problèmes suivants :

  1. Le problème de l'identification des participants d'une part et la nécessité d'anonymiser les transactions d'autre part. Autrement dit, il faut transférer de l'argent à un destinataire précis tout en veillant à ce que personne, sauf les participants à la transaction, ne soit au courant. Les banques disposent de numéros de compte et de cartes bancaires associés à une personne physique ou morale, et le secret bancaire protège les informations concernant les transactions. Mais qui garantit qu'AnonymousWorldMoney n'utilise pas les données personnelles et les informations sur les transactions à ses propres fins ?
  2. Comment s'assurer que le destinataire a bien reçu le montant qui lui a été transféré ? Disons que l'expéditeur a transféré 100 $ et que le destinataire n'a reçu que 10 $. L'expéditeur se rend au bureau d'AnonymousWorldMoney avec son reçu, mais le clerc montre sa version où il est écrit que l'expéditeur n'a transféré que 10 $.
  3. Le problème d'un environnement non fiable, par exemple, la fraude appelée double-dépense. Un participant malveillant peut dépenser son solde plusieurs fois avant que le paiement ne soit répliqué sur tous les serveurs. La théorème CAP, bien sûr, n'est pas annulé, et la cohérence sera finalement atteinte, mais quelqu'un ne percevra pas l'argent pour les services ou les biens fournis. Par conséquent, si la confiance totale dans l'organisation de paiement ou dans les participants aux transactions n'est pas présente, il est nécessaire de construire un réseau basé non pas sur la confiance, mais sur la cryptographie.
  4. La monnaie conditionnelle AnonymousWorldMoney a un nombre limité de serveurs, qui peuvent devenir indisponibles soit par inadvertance, soit intentionnellement.
  5. AnonymousWorldMoney prendra une commission tangible.
  6. La possibilité de gestion. Au cours de l'utilisation de Bitcoin, il est devenu clair que les gens souhaitent non seulement transférer des pièces entre eux, mais aussi vérifier différentes conditions de passage des transactions, programmer des scénarios de fonctionnement, exécuter automatiquement des actions en fonction des conditions, etc.

Comment la blockchain résout ces problèmes

  1. L'identification des participants est effectuée à l'aide d'une paire de clés : privée et publique, et l'algorithme de signature numérique identifie de manière unique l'expéditeur et le destinataire, gardant leur identité anonyme.
  2. Les transactions sont regroupées en blocs, le hachage du bloc est calculé et enregistré dans le bloc suivant. Cette séquence d'enregistrement des hachages dans les blocs a donné son nom à la technologie blockchain, et elle rend impossible toute modification ou suppression discrète de blocs ou de transactions individuelles à partir des blocs. Ainsi, si une transaction a été enregistrée dans la blockchain, on peut être assuré que ses données resteront inchangées.
  3. La fraude par double dépense est évitée par l'atteinte d'un consensus dans le réseau sur quelles données considérer comme valides et lesquelles rejeter. Dans le réseau Bitcoin, le consensus est atteint par la preuve de travail PoW (Proof-of-Work).
  4. La fiabilité du fonctionnement du réseau est assurée par le fait que la blockchain est publique, où chaque participant peut exécuter son nœud, obtenir une copie complète de la blockchain et, de plus, commencer à vérifier les transactions de manière indépendante. Il convient de noter que les blockchains modernes permettent de construire non seulement des blockchains publiques (ouvertes), mais aussi des blockchains privées (fermées), ainsi que d'utiliser des schémas combinés.
  5. On ne peut pas se débarrasser complètement des commissions dans la blockchain, car il faut payer les personnes qui maintiennent le réseau, mais dans la blockchain, le besoin de commissions est prouvé de manière si convaincante qu'il ne reste aucun doute sur sa nécessité.
  6. Les blockchains modernes ont la capacité de mettre en œuvre une logique commerciale, qui dans la blockchain s'appelle Smart Contracts. La logique des smart contracts est réalisée dans divers langages de haut niveau.

Examinons ces solutions plus en détail.

L'architecture de la blockchain

Les composants de la blockchain

Chaque participant peut lancer son propre nœud avec une copie complète de la blockchain (nœud complet). Les nœuds complets capables d'enregistrer des transactions dans la blockchain sont appelés nœuds de consensus (témoin) ou mineurs (miner). Les nœuds complets qui vérifient uniquement la validité des transactions sont appelés nœuds d'audit (audit). Les clients légers (clients légers) ne stockent pas de copies complètes de la blockchain, mais interagissent avec le réseau en utilisant des nœuds complets.
La plupart des utilisateurs effectuent leurs transactions en utilisant des clients légers ou des portefeuilles web. Tous les nœuds sont connectés les uns aux autres. Avec cet ensemble d'éléments, l'architecture du réseau devient plus résiliente :

Quel est le coût de construire une blockchain ?

Cycle de vie d'une transaction

Examinons le cycle de vie d'une transaction et analysons-le en parties :

Quel est le coût de construire une blockchain ?

Technologies blockchain

Nous allons nous pencher plus en détail sur les solutions techniques et leurs liens entre elles.

Identification

Chaque transaction blockchain doit être signée par une signature numérique. Ainsi, pour effectuer une transaction, chaque participant doit avoir une paire de clés : privée / publique. Parfois, la paire de clés est appelée portefeuille (wallet), car les clés sont étroitement liées à une adresse numérique unique et au solde du participant. En réalité, les clés et adresses ne sont que des chaînes de chiffres dans différents systèmes de numération. Exemples de clés et d'adresse de portefeuille :

Clé privée : 0a78194a8a893b8baac7c09b6a4a4b4b161b2f80a126cbb79bde231a4567420f
Clé publique : 0579b478952214d7cddac32ac9dc522c821a4489bc10aac3a81b9d1cd7a92e57ba
Adresse : 0x3814JnJpGnt5tB2GD1qfKP709W3KbRdfb27V

Pour créer une signature numérique dans les blockchains, un algorithme basé sur des courbes elliptiques est utilisé : Elliptic Curve Digital Signature Algorithm (ECDSA). Pour cela, la clé privée (un nombre de 256 bits) est généralement choisie au hasard. Le nombre d'options de clés est de 2 puissance 256, d'où l'on peut parler de la pratiquement impossibilité de coïncidences de valeurs de clés privées.

Ensuite, la clé publique est dérivée de la clé privée en multipliant sa valeur par les coordonnées d'un point sur la courbe elliptique, ce qui donne les coordonnées d'un nouveau point sur cette même courbe. Cette opération garantit l'obtention d'une paire de clés adaptée pour les signatures numériques des transactions. Enfin, l'adresse du portefeuille est calculée de manière unique à partir de la clé publique.

Il existe de nombreux articles détaillant la cryptographie utilisée dans la blockchain, par exemple : Bitcoin en un clin d'œil — Cryptographie

La clé privée doit rester strictement secrète et être conservée en toute sécurité. La clé publique est connue de tous. En cas de perte de la clé privée, il est impossible de récupérer l'accès à l'actif (monnaie) et l'argent sera perdu à jamais. Par conséquent, la tâche de stocker les clés privées de manière fiable est d'une importance cruciale, car ce n'est pas une banque où l'on peut toujours se rendre avec une pièce d'identité pour récupérer un compte. Il existe toute une industrie de production de ce qu'on appelle des portefeuilles cryptographiques froids, ressemblant à des clés USB :

Quel est le coût de construire une blockchain ?

ou on peut utiliser des méthodes plus sûres, comme par exemple graver la valeur de la clé privée sur des jetons :

Quel est le coût de construire une blockchain ?

Transactions

Pour en savoir plus sur la structure d'une transaction, vous pouvez consulter l'article Bitcoin en résumé — Transaction. Ce qui est important pour nous, c'est que chaque transaction contient au moins les informations suivantes :

De : 0x48C89c341C5960Ca2Bf3732D6D8a0F4f89Cc4368 - adresse numérique de l'expéditeur
À : 0x367adb7894334678b90aFE7882a5b06f7fbc783a - adresse numérique du destinataire
Valeur : 0.0001 - montant de la transaction
Hash de la transaction : 0x617ede331e8a99f46a363b32b239542bb4006e4fa9a2727a6636ffe3eb095cef - hash de la transaction

Ensuite, la transaction est signée avec la clé privée et envoyée (voir détails sur le fonctionnement du protocole Bitcoin en résumé - Protocole) à tous les nœuds de la blockchain, qui vérifient la validité des transactions. L'algorithme de vérification de la transaction n'est pas trivial et comprend une vingtaine d'étapes.

Blocs de transactions

Après avoir vérifié la validité des transactions, les nœuds les regroupent en blocs. En plus des transactions, un hash du bloc précédent, un nombre (compteur Nonce), et le hash du bloc actuel sont calculés selon l'algorithme SHA-256. Le hash doit satisfaire des conditions de difficulté fixées. Par exemple, dans le réseau Bitcoin, la difficulté est ajustée automatiquement toutes les deux semaines en fonction de la puissance du réseau, de sorte qu'un bloc soit généré environ toutes les 10 minutes. La difficulté est déterminée par la condition suivante : le hash trouvé doit être inférieur à un nombre prédéfini. Si cette condition n'est pas respectée, 1 est ajouté à Nonce, et le processus de calcul du hash est répété. Le champ Nonce est utilisé pour ajuster le hash, car ce sont les seules données dans le bloc qui peuvent être modifiées, les autres devant rester inchangées. Un hash correct doit avoir un certain nombre de zéros au début, par exemple, l'un des hashes réels :

000000000000000000000bf03212e7dd1176f52f816fa395fc9b93c44bc11f91

La réussite de la recherche d'un hachage est la preuve du travail accompli (Proof-of-Work, PoW) pour les réseaux Bitcoin ou Ethereum. Le processus de hachage est appelé minage (mining), par analogie avec l'extraction de l'or. Le nom décrit assez précisément la nature du processus, car il s'agit simplement d'une exploration de différentes options, et si quelqu'un trouve un hachage approprié, c'est véritablement de la chance. C'est comme trouver un véritable nugget d'or dans des tonnes de roche stérile. La récompense par bloc est actuellement de 12,5 BTC et si l'on multiplie par le taux actuel du bitcoin de 3900 $, cela équivaut à plus d'un kilogramme d'or pur. Il y a de quoi se battre !

Après la recherche réussie du hachage, le bloc et le hachage trouvé sont enregistrés dans la blockchain en tant que bloc suivant. Pour plus de détails sur la structure des blocs, vous pouvez consulter l'article Bitcoin en un mot - Blockchain, et ci-dessous je fournirai un schéma simplifié :

Quel est le coût de construire une blockchain ?

La blockchain commence avec un bloc qui n'a pas encore de hachage pour le bloc précédent. Ce bloc dans la blockchain est unique et porte le nom de Genesis block. Les autres blocs ont une structure identique et se distinguent uniquement par le nombre de transactions. Les transactions réelles et les blocs créés actuellement dans Bitcoin ou Ethereum peuvent être consultés sur Block Explorer.

La taille des blocs dans Bitcoin est limitée à 1 Mo et avec un volume d'informations minimal dans une transaction d'environ 200 octets, il peut y avoir environ 6000 transactions dans un bloc. C'est d'ailleurs de là que provient la performance de Bitcoin, dont tout le monde se moque : un bloc est généré environ toutes les 10 min * 60 sec = 600 sec, ce qui donne une performance formelle d'environ 10 TPS. Cependant, en réalité, ce n'est pas une performance, mais un algorithme de fonctionnement délibérément mis en œuvre. Dans Ethereum, pour rivaliser, ils ont simplement réduit le temps de génération de bloc à 15 secondes, et la performance a donc officiellement grimpé. Par conséquent, dans les blockchains utilisant PoW comme consensus, il est totalement absurde de comparer les performances, car elles dépendent directement de la difficulté du calcul du hachage, qui peut être attribuée à n'importe quel niveau.

Forks

Que se passe-t-il si, par exemple, plusieurs nœuds trouvent des hashs répondant aux conditions de difficulté, mais différents en valeur (autrement dit, arrivent à différents consensus) et enregistrent des blocs dans la blockchain ? Voyons comment la blockchain se protège contre cette situation. Dans ce cas, il se produit ce qu'on appelle un fork, et la blockchain a deux versions de la chaîne :

Quel est le coût de construire une blockchain ?

Que se passe-t-il ensuite ? Ensuite, une partie du réseau commence à travailler sur le bloc N+2 d'une chaîne, tandis qu'une autre partie travaille sur l'autre :

Quel est le coût de construire une blockchain ?

L'un de ces blocs sera trouvé plus rapidement et envoyé dans la blockchain, et alors, selon les règles, la blockchain devra basculer vers la chaîne la plus longue et annuler toutes les transactions de l'autre bloc :

Quel est le coût de construire une blockchain ?

Dans ce cas, il peut se produire une situation où la transaction d'un participant ne se trouvait que dans l'un des blocs du fork, qui a été annulé. Par conséquent, pour être sûr que la transaction souhaitée est enregistrée dans la blockchain, il y a une recommandation générale — avant de faire confiance à une transaction, attendez que plusieurs blocs suivants soient ajoutés à la blockchain. Les recommandations sur le nombre de blocs à attendre varient pour différentes blockchains. Par exemple, pour le réseau Bitcoin, le minimum est de 2 blocs, le maximum de 6.

Le même schéma avec le fork des blocs sera observé lors de ce qu'on appelle une attaque à 51% — c'est lorsque un groupe de mineurs tente de créer une chaîne de blocs alternative, cherchant à annuler la chaîne avec leurs transactions frauduleuses. Bien qu'à l'heure actuelle, il soit plus rentable d'utiliser sa puissance pour un minage honnête plutôt que pour la fraude.

Consensus

Pour qu'un bloc soit enregistré dans la blockchain, le réseau doit parvenir à un consensus. Remémorons-nous de la tâche d'atteindre le consensus dans les réseaux de communication informatique. Le problème se formule comme le problème des généraux byzantins (BFT,Byzantine fault tolerance). En omettant la description pittoresque des problèmes de l'armée byzantine, le problème peut être formulé ainsi : comment les nœuds du réseau peuvent parvenir à un résultat commun si une partie des nœuds du réseau peut consciemment les déformer. Les algorithmes existants pour résoudre le problème BFT montrent que le réseau peut fonctionner correctement si les fraudeurs sont moins d'un tiers. Pourquoi le consensus BFT n'a-t-il pas été appliqué dans le réseau Bitcoin ? Pourquoi a-t-on besoin d'utiliser PoW ? Il y a plusieurs raisons :

  • BFT fonctionne bien avec un petit ensemble fixe de nœuds, alors que dans une blockchain publique, le nombre de nœuds est imprévisible et, de plus, les nœuds peuvent s'allumer et s'éteindre à volonté.
  • Il est nécessaire de motiver les gens à exécuter des nœuds de blockchain. Pour cela, les gens doivent recevoir des récompenses. Dans BFT, il n'y a formellement rien pour recevoir une récompense, tandis que dans PoW, chacun comprend intuitivement pourquoi une récompense est donnée : pour l'électricité consommée par le processeur lors de la recherche du hash du bloc.

En plus de PoW, il existe plusieurs autres consensus utilisés dans les blockchains modernes, par exemple :

  • PoS (Preuve de Participation) — dans la blockchain Hyperledger
  • DPoS (Preuve de Participation Déléguée) — dans la blockchain BitShares
  • Modifications de BFT : SBFT (BFT Simplifié) et PBFT (BFT Pratique), par exemple dans la blockchain Exonum

Arrêtons-nous un moment sur le consensus PoS, car c'est le PoS et ses variantes qui ont été les plus largement adoptés dans les blockchains privées. Pourquoi précisément dans les privées ? D'une part, les caractéristiques de PoS sont meilleures par rapport à PoW, car pour atteindre un consensus, moins de ressources informatiques sont nécessaires, ce qui augmente la vitesse d'enregistrement des données dans la blockchain. Mais d'autre part, PoS offre plus de possibilités de fraude, donc pour neutraliser cela, tous les participants de la blockchain doivent être connus.

Le consensus PoS est basé sur le choix d'un nœud qui peut enregistrer un bloc de transactions dans la blockchain en fonction du montant des fonds en garantie sur le compte. Plus il y a de fonds en garantie, plus il est probable que le réseau choisisse votre nœud pour l'enregistrement du bloc. La garantie ne sera pas retournée si le bloc est invalide. Ainsi, une protection contre la fraude est mise en œuvre. Voici les variations de PoS :

  • Le consensus DPoS (Preuve de Participation Déléguée) divise les participants en « votants » et « validateurs ». Les détenteurs de pièces (participants votants) délèguent leur droit de vérifier et d'enregistrer des transactions dans la blockchain à d'autres participants. Ainsi, les validateurs effectuent tout le travail de calcul et reçoivent une récompense pour cela, tandis que la présence de participants votants garantit l'honnêteté des validateurs, car ils peuvent être remplacés à tout moment.
  • Le consensus LPoS (Leased Proof-of-Stake) permet de louer ses fonds à d'autres nœuds, afin qu'ils aient plus de chances de vérifier les blocs. Ainsi, il est possible de recevoir des commissions sur les transactions sans participer à la vérification des transactions et au minage des blocs.

Il existe également d'autres consensus qui n'ont pas encore gagné en popularité ; je les énumérerai simplement à titre d'information. Un aperçu des algorithmes de consensus peut être consulté, par exemple, dans l'article : Algorithmes de Consensus dans la Blockchain.

  • PoET (Proof-of-Elapsed Time)
  • PoC (Proof-of-Capacity)
  • PoB (Proof-of-Burn)
  • PoWeight (Proof-of-Weight)
  • PoA (Proof-of-Activity) — PoW + PoS
  • PoI (Proof-of-Importans)

Fiabilité et modèles de déploiement des blockchains

Blockchain publique

Résilience Public ou autre nom Blockchain sans autorisation s'atteint parce que chacun peut se connecter et consulter les informations ou même connecter son nœud, et la confiance est construite sur le consensus PoW.

Blockchain privée

Privée ou Blockchain privée permise. Dans ces blockchains, seule un groupe spécifique de participants (organisations ou individus) a accès aux informations. Ces blockchains sont créées par des organisations pour augmenter les bénéfices globaux ou l'efficacité. Leur fiabilité est assurée par des objectifs communs des participants et les algorithmes de consensus PoS et BFT.

Consortium blockchain

Il existe Consortium ou Blockchain publique permise. Ce sont des blockchains auxquelles chacun peut se connecter pour consulter, mais l'ajout d'informations ou la connexion de son nœud ne peuvent se faire qu'avec l'autorisation des autres participants. Ces blockchains sont établies par des organisations dans le but d'accroître la confiance des clients ou des consommateurs de produits, ou de la société en général. Ici, la fiabilité est également atteinte grâce à la présence de confiance entre les participants et aux mêmes algorithmes de consensus PoS et BFT.

Contrats intelligents

Dans les blockchains mises en œuvre après Bitcoin, la possibilité d'exécuter des contrats intelligents a été ajoutée à divers degrés. En essence, un contrat intelligent est une transaction dans laquelle du code informatique est inclus pour l'exécution. Les contrats intelligents sur le réseau Ethereum sont exécutés dans la EVM (Ethereum Virtual Machine). Pour commencer l'exécution d'un contrat intelligent, il faut le lancer explicitement par une autre transaction ou des préconditions doivent être remplies. Les résultats de l'exécution du contrat intelligent seront également enregistrés dans la blockchain. L'obtention de données provenant de l'extérieur de la blockchain est possible, mais extrêmement limitée.

Quelle logique commerciale peut être mise en œuvre à l'aide d'un contrat intelligent ? En réalité, il n'y a pas beaucoup de possibilités, par exemple, vérifier des conditions à partir de données de la blockchain, changer les propriétaires d'actifs numériques en fonction de ces conditions, enregistrer des données dans un stockage permanent au sein de la blockchain. La logique est implémentée dans un langage de haut niveau, Solidity.

Un exemple classique de fonctionnalité réalisée avec des contrats intelligents est l'émission de jetons pour une ICO. Par exemple, j'ai mis en œuvre un contrat intelligent pour émettre modestement 500 000 000 AlexToken. Par le lien vers Etherscan un groupe de brevets, qui contient certaines des premières mentions des technologies de création de contenu web dynamique, qui ont précédé l'émergence de systèmes tels que ASP de Microsoft, JSP de Sun/Oracle et PHP. Une autre contribution significative est

le code source du contrat intelligent en langage Solidity

pragma solidity ^0.4.23;

library SafeMath {
    /**
     * @dev Multiplies two numbers, throws on overflow.
     **/
    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
        if (a == 0) {
            return 0;
        }
        c = a * b;
        assert(c / a == b);
        return c;
    }
    
    /**
     * @dev Integer division of two numbers, truncating the quotient.
     **/
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // assert(b > 0); // Solidity automatically throws when dividing by 0
/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 */
        // uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold
        return a / b;
    }
    
    /**
     * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
     **/
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        assert(b <= a);
        return a - b;
    }
    
    /**
     * @dev Adds two numbers, throws on overflow.
     **/
    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
        c = a + b;
        assert(c >= a);
        return c;
    }
}

/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 **/
 
contract Ownable {
    address public owner;
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev The Ownable constructor sets the original `owner` of the contract to the sender account.
     **/
   constructor() public {
      owner = msg.sender;
    }
    
    /**
     * @dev Throws if called by any account other than the owner.
     **/
    modifier onlyOwner() {
      require(msg.sender == owner);
      _;
    }
    
    /**
     * @dev Allows the current owner to transfer control of the contract to a newOwner.
     * @param newOwner The address to transfer ownership to.
     **/
    function transferOwnership(address newOwner) public onlyOwner {
      require(newOwner != address(0));
      emit OwnershipTransferred(owner, newOwner);
      owner = newOwner;
    }
}

/**
 * @title ERC20Basic interface
 * @dev Basic ERC20 interface
 **/
contract ERC20Basic {
    function totalSupply() public view returns (uint256);
    function balanceOf(address who) public view returns (uint256);
    function transfer(address to, uint256 value) public returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
}

/**
 * @title ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 **/
contract ERC20 is ERC20Basic {
    function allowance(address owner, address spender) public view returns (uint256);
    function transferFrom(address from, address to, uint256 value) public returns (bool);
    function approve(address spender, uint256 value) public returns (bool);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

/**
 * @title Basic token
 * @dev Basic version of StandardToken, with no allowances.
 **/
contract BasicToken is ERC20Basic {
    using SafeMath for uint256;
    mapping(address => uint256) balances;
    uint256 totalSupply_;
    
    /**
     * @dev total number of tokens in existence
     **/
    function totalSupply() public view returns (uint256) {
        return totalSupply_;
    }
    
    /**
     * @dev transfer token for a specified address
     * @param _to The address to transfer to.
     * @param _value The amount to be transferred.
     **/
    function transfer(address _to, uint256 _value) public returns (bool) {
        require(_to != address(0));
        require(_value <= balances[msg.sender]);
        
        balances[msg.sender] = balances[msg.sender].sub(_value);
        balances[_to] = balances[_to].add(_value);
        emit Transfer(msg.sender, _to, _value);
        return true;
    }
    
    /**
     * @dev Gets the balance of the specified address.
     * @param _owner The address to query the the balance of.
     * @return An uint256 representing the amount owned by the passed address.
     **/
    function balanceOf(address _owner) public view returns (uint256) {
        return balances[_owner];
    }
}

contract StandardToken is ERC20, BasicToken {
    mapping (address => mapping (address => uint256)) internal allowed;
    /**
     * @dev Transfer tokens from one address to another
     * @param _from address The address which you want to send tokens from
     * @param _to address The address which you want to transfer to
     * @param _value uint256 the amount of tokens to be transferred
     **/
    function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
        require(_to != address(0));
        require(_value <= balances[_from]);
        require(_value <= allowed[_from][msg.sender]);
    
        balances[_from] = balances[_from].sub(_value);
        balances[_to] = balances[_to].add(_value);
        allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
        
        emit Transfer(_from, _to, _value);
        return true;
    }
    
    /**
     * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
     *
     * Beware that changing an allowance with this method brings the risk that someone may use both the old
     * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this
     * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     * @param _spender The address which will spend the funds.
     * @param _value The amount of tokens to be spent.
     **/
    function approve(address _spender, uint256 _value) public returns (bool) {
        allowed[msg.sender][_spender] = _value;
        emit Approval(msg.sender, _spender, _value);
        return true;
    }
    
    /**
     * @dev Function to check the amount of tokens that an owner allowed to a spender.
     * @param _owner address The address which owns the funds.
     * @param _spender address The address which will spend the funds.
     * @return A uint256 specifying the amount of tokens still available for the spender.
     **/
    function allowance(address _owner, address _spender) public view returns (uint256) {
        return allowed[_owner][_spender];
    }
    
    /**
     * @dev Increase the amount of tokens that an owner allowed to a spender.
     *
     * approve should be called when allowed[_spender] == 0. To increment
     * allowed value is better to use this function to avoid 2 calls (and wait until
     * the first transaction is mined)
     * From MonolithDAO Token.sol
     * @param _spender The address which will spend the funds.
     * @param _addedValue The amount of tokens to increase the allowance by.
     **/
    function increaseApproval(address _spender, uint _addedValue) public returns (bool) {
        allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue);
        emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
        return true;
    }
    
    /**
     * @dev Decrease the amount of tokens that an owner allowed to a spender.
     *
     * approve should be called when allowed[_spender] == 0. To decrement
     * allowed value is better to use this function to avoid 2 calls (and wait until
     * the first transaction is mined)
     * From MonolithDAO Token.sol
     * @param _spender The address which will spend the funds.
     * @param _subtractedValue The amount of tokens to decrease the allowance by.
     **/
    function decreaseApproval(address _spender, uint _subtractedValue) public returns (bool) {
        uint oldValue = allowed[msg.sender][_spender];
        if (_subtractedValue > oldValue) {
            allowed[msg.sender][_spender] = 0;
        } else {
            allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);
        }
        emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
        return true;
    }
}

/**
 * @title Configurable
 * @dev Configurable varriables of the contract
 **/
contract Configurable {
    uint256 public constant cap = 1000000000*10**18;
    uint256 public constant basePrice = 100*10**18; // tokens per 1 ether
    uint256 public tokensSold = 0;
    
    uint256 public constant tokenReserve = 500000000*10**18;
    uint256 public remainingTokens = 0;
}

/**
 * @title CrowdsaleToken 
 * @dev Contract to preform crowd sale with token
 **/
contract CrowdsaleToken is StandardToken, Configurable, Ownable {
    /**
     * @dev enum of current crowd sale state
     **/
     enum Stages {
        none,
        icoStart, 
        icoEnd
    }
    
    Stages currentStage;
    /**
     * @dev constructor of CrowdsaleToken
     **/
    constructor() public {
        currentStage = Stages.none;
        balances[owner] = balances[owner].add(tokenReserve);
        totalSupply_ = totalSupply_.add(tokenReserve);
        remainingTokens = cap;
        emit Transfer(address(this), owner, tokenReserve);
    }
    
    /**
     * @dev fallback function to send ether to for Crowd sale
     **/
    function () public payable {
        require(currentStage == Stages.icoStart);
        require(msg.value > 0);
        require(remainingTokens > 0);
        
        uint256 weiAmount = msg.value; // Calculate tokens to sell
        uint256 tokens = weiAmount.mul(basePrice).div(1 ether);
        uint256 returnWei = 0;
        
        if(tokensSold.add(tokens) > cap){
            uint256 newTokens = cap.sub(tokensSold);
            uint256 newWei = newTokens.div(basePrice).mul(1 ether);
            returnWei = weiAmount.sub(newWei);
            weiAmount = newWei;
            tokens = newTokens;
        }
        
        tokensSold = tokensSold.add(tokens); // Increment raised amount
        remainingTokens = cap.sub(tokensSold);
        if(returnWei > 0){
            msg.sender.transfer(returnWei);
            emit Transfer(address(this), msg.sender, returnWei);
        }
        
        balances[msg.sender] = balances[msg.sender].add(tokens);
        emit Transfer(address(this), msg.sender, tokens);
        totalSupply_ = totalSupply_.add(tokens);
        owner.transfer(weiAmount);// Send money to owner
    }
    

    /**
     * @dev startIco starts the public ICO
     **/
    function startIco() public onlyOwner {
        require(currentStage != Stages.icoEnd);
        currentStage = Stages.icoStart;
    }
    

    /**
     * @dev endIco closes down the ICO 
     **/
    function endIco() internal {
        currentStage = Stages.icoEnd;
        // Transfer any remaining tokens
        if(remainingTokens > 0)
            balances[owner] = balances[owner].add(remainingTokens);
        // transfer any remaining ETH balance in the contract to the owner
        owner.transfer(address(this).balance); 
    }

    /**
     * @dev finalizeIco closes down the ICO and sets needed varriables
     **/
    function finalizeIco() public onlyOwner {
        require(currentStage != Stages.icoEnd);
        endIco();
    }
    
}
 
/**
 * @title LavevelToken 
 * @dev Contract to create the Lavevel Token
 **/
contract AlexToken is CrowdsaleToken {
    string public constant name = "AlexToken";
    string public constant symbol = "ALT";
    uint32 public constant decimals = 18;
}

et la représentation binaire, telle qu'elle est vue par le réseau

60806040526000600355600060045533600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560146101000a81548160ff021916908360028111156200006f57fe5b0217905550620001036b019d971e4fe8401e74000000600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546200024a6401000000000262000b1d179091906401000000009004565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550620001986b019d971e4fe8401e740000006001546200024a6401000000000262000b1d179091906401000000009004565b6001819055506b033b2e3c9fd0803ce8000000600481905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6b019d971e4fe8401e740000006040518082815260200191505060405180910390a362000267565b600081830190508281101515156200025e57fe5b80905092915050565b611cb880620002776000396000f300608060405260043610610112576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146104c7578063095ea7b31461055757806318160ddd146105bc57806323b872dd146105e7578063313ce5671461066c578063355274ea146106a3578063518ab2a8146106ce57806366188463146106f957806370a082311461075e57806389311e6f146107b55780638da5cb5b146107cc578063903a3ef61461082357806395d89b411461083a578063a9059cbb146108ca578063bf5839031461092f578063c7876ea41461095a578063cbcb317114610985578063d73dd623146109b0578063dd62ed3e14610a15578063f2fde38b14610a8c575b60008060008060006001600281111561012757fe5b600560149054906101000a900460ff16600281111561014257fe5b14151561014e57600080fd5b60003411151561015d57600080fd5b600060045411151561016e57600080fd5b3494506101a7670de0b6b3a764000061019968056bc75e2d6310000088610acf90919063ffffffff16565b610b0790919063ffffffff16565b9350600092506b033b2e3c9fd0803ce80000006101cf85600354610b1d90919063ffffffff16565b111561024c576101f66003546b033b2e3c9fd0803ce8000000610b3990919063ffffffff16565b915061022e670de0b6b3a764000061022068056bc75e2d6310000085610b0790919063ffffffff16565b610acf90919063ffffffff16565b90506102438186610b3990919063ffffffff16565b92508094508193505b61026184600354610b1d90919063ffffffff16565b6003819055506102886003546b033b2e3c9fd0803ce8000000610b3990919063ffffffff16565b6004819055506000831115610344573373ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f193505050501580156102dd573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a35b610395846000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040518082815260200191505060405180910390a361045184600154610b1d90919063ffffffff16565b600181905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc869081150290604051600060405180830381858888f193505050501580156104bf573d6000803e3d6000fd5b505050505050005b3480156104d357600080fd5b506104dc610b52565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561051c578082015181840152602081019050610501565b50505050905090810190601f1680156105495780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561056357600080fd5b506105a2600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610b8b565b604051808215151515815260200191505060405180910390f35b3480156105c857600080fd5b506105d1610c7d565b6040518082815260200191505060405180910390f35b3480156105f357600080fd5b50610652600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610c87565b604051808215151515815260200191505060405180910390f35b34801561067857600080fd5b50610681611041565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b3480156106af57600080fd5b506106b8611046565b6040518082815260200191505060405180910390f35b3480156106da57600080fd5b506106e3611056565b6040518082815260200191505060405180910390f35b34801561070557600080fd5b50610744600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061105c565b604051808215151515815260200191505060405180910390f35b34801561076a57600080fd5b5061079f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506112ed565b6040518082815260200191505060405180910390f35b3480156107c157600080fd5b506107ca611335565b005b3480156107d857600080fd5b506107e16113eb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561082f57600080fd5b50610838611411565b005b34801561084657600080fd5b5061084f6114ab565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561088f578082015181840152602081019050610874565b50505050905090810190601f1680156108bc5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108d657600080fd5b50610915600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506114e4565b604051808215151515815260200191505060405180910390f35b34801561093b57600080fd5b50610944611703565b6040518082815260200191505060405180910390f35b34801561096657600080fd5b5061096f611709565b6040518082815260200191505060405180910390f35b34801561099157600080fd5b5061099a611716565b6040518082815260200191505060405180910390f35b3480156109bc57600080fd5b506109fb600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611726565b604051808215151515815260200191505060405180910390f35b348015610a2157600080fd5b50610a76600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611922565b6040518082815260200191505060405180910390f35b348015610a9857600080fd5b50610acd600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506119a9565b005b600080831415610ae25760009050610b01565b8183029050818382811515610af357fe5b04141515610afd57fe5b8090505b92915050565b60008183811515610b1457fe5b04905092915050565b60008183019050828110151515610b3057fe5b80905092915050565b6000828211151515610b4757fe5b818303905092915050565b6040805190810160405280600981526020017f416c6578546f6b656e000000000000000000000000000000000000000000000081525081565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000600154905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515610cc457600080fd5b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515610d1157600080fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515610d9c57600080fd5b610ded826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610e80826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610f5182600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b601281565b6b033b2e3c9fd0803ce800000081565b60035481565b600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508083111561116d576000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611201565b6111808382610b3990919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a3600191505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561139157600080fd5b60028081111561139d57fe5b600560149054906101000a900460ff1660028111156113b857fe5b141515156113c557600080fd5b6001600560146101000a81548160ff021916908360028111156113e457fe5b0217905550565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561146d57600080fd5b60028081111561147957fe5b600560149054906101000a900460ff16600281111561149457fe5b141515156114a157600080fd5b6114a9611b01565b565b6040805190810160405280600381526020017f414c54000000000000000000000000000000000000000000000000000000000081525081565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561152157600080fd5b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115151561156e57600080fd5b6115bf826000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611652826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b60045481565b68056bc75e2d6310000081565b6b019d971e4fe8401e7400000081565b60006117b782600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611a0557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611a4157600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6002600560146101000a81548160ff02191690836002811115611b2057fe5b021790555060006004541115611c0a57611ba5600454600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050158015611c89573d6000803e3d6000fd5b505600a165627a7a723058205bbef016cc7699572f944871cb6f05e69915ada3a92a1d9f03a3fb434aac0c2b0029

Vous pouvez en savoir plus sur les contrats intelligents dans l'article : Qu'est-ce que les contrats intelligents dans Ethereum.

Conclusion

Nous avons répertorié les technologies sur lesquelles reposent les blockchains modernes et comment elles sont interconnectées. Formulons maintenant quelles problématiques peuvent être résolues grâce à la blockchain, et pour lesquelles son utilisation serait, au mieux, inefficace. Ainsi, l'utilisation de la blockchain n'est pas nécessaire si :

  • Les transactions se déroulent dans un environnement de confiance ;
  • La présence de frais intermédiaires ne nuit pas à la vie des participants ;
  • Les participants ne possèdent pas de biens pouvant être représentés sous forme d'actifs numériques ;
  • Il n'y a pas de distribution des actifs numériques, c'est-à-dire qu'une seule partie possède ou fournit la valeur.

Quel avenir attend la blockchain ? Pour l'instant, nous pouvons seulement émettre des hypothèses sur les voies possibles de développement des technologies blockchain :

  • La blockchain deviendra une technologie de base de données aussi courante que SQL ou NoSQL pour résoudre un certain ensemble de problématiques ;
  • La blockchain deviendra un protocole largement utilisé, comme HTTP pour Internet ;
  • La blockchain deviendra la base d'un nouveau système financier et politique pour la planète !

Dans la prochaine partie, nous examinerons quels blockchains existent actuellement et comment elles sont appliquées dans différentes industries.

Ce n'est que le début !

Source : habr.com

Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS 🔥 Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster