Que devons-nous construire une blockchain?

Toute l'histoire de l'humanité est une délivrance continue des chaînes et la création de nouvelles, encore plus fortes. (Auteur anonyme)

En analysant de nombreux projets de 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, pour toute leur variété de designs, de décors et de désignations, ont une fondation, des murs, un toit, des fenêtres, des portes, qui sont reliés les uns aux autres de certaines manières. Et si vous comprenez les principes de base de la conception des bâtiments, connaissez les propriétés des matériaux utilisés, vous pouvez déterminer le but d'une maison particulière. À l'heure actuelle, une situation a surgi avec la blockchain dont tout le monde en a entendu parler, mais peu comprennent l'architecture et les principes de travail. Par conséquent, un malentendu se pose quant à quoi et comment il est logique d'utiliser les technologies de la blockchain.

Dans cet article, nous analyserons les propriétés et principes communs à toutes les blockchains. Ensuite, nous examinons les tâches qui peuvent être résolues en utilisant la blockchain et pour consolider le matériel, nous allons construire une petite mais vraie blockchain sur notre site virtuel!

Alors, rappelons-nous quels problèmes la blockchain a résolu à l'origine.

Je suis sûr que beaucoup diront 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 à étudier n'importe quelle technologie en lisant les normes, car tous les articles et livres sur le sujet à l'étude sont basés sur eux. Mais les normes de la blockchain font actuellement défaut; seuls des comités ont été créés à l'ISO pour leur développement. Actuellement, chaque projet public de blockchain a son propre livre blanc, qui est essentiellement une tâche technique. Le premier projet de blockchain bien connu est le réseau Bitcoin. Nous allons sur le site officiel du réseau et voyons comment tout a commencé.

Défi Blockchain


Ainsi, la tâche que la blockchain a résolue dans le réseau pionnier du Bitcoin est de faire un transfert de confiance de la propriété des actifs numériques dans un environnement non fiable sans intermédiaires. Par exemple, sur un réseau Bitcoin, un actif numérique est une pièce numérique bitcoin. Et toutes les solutions techniques de Bitcoin et d'autres blockchains se résument à résoudre ce problème.

Problèmes de blockchain


Supposons qu'une certaine organisation financière dise qu'elle a construit un réseau dans le monde entier avec lequel vous pouvez transférer de l'argent à n'importe qui. La croiriez-vous? Si cette organisation est Visa ou MasterCard, très probablement, croyez-le, mais si, relativement parlant, AnonymousWorldMoney, probablement pas. Pourquoi Mais parce que nous savons très bien comment les systèmes distribués sont fabriqués par des entreprises privées, à quelles fins et à quoi cela peut conduire. Examinons plus en détail les problèmes de tels systèmes et comment ils peuvent être résolus à l'aide des technologies de la chaîne de blocs.

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

image

Dans un monde idéal, un tel système fonctionne très bien, mais dans le nôtre, les problèmes suivants se posent:

  1. Le problème de l'identification des participants d'une part et le besoin d'anonymat des transactions d'autre part. C'est-à-dire il est nécessaire de transférer de l'argent à un destinataire spécifique et pour que personne ne soit au courant de cette transaction, à l'exception des participants à la transaction. Les banques ont des numéros de compte et des cartes bancaires liés à une personne physique ou morale spécifique, et le secret bancaire protège les informations sur les transactions. Et qui garantit que le conditionnel AnonymousWorldMoney n'utilise pas les données personnelles et les informations de transaction à ses propres fins?
  2. Comment s'assurer que le destinataire a reçu exactement le montant qui lui a été transféré? Relativement parlant, l'expéditeur a transféré 100 $ et le destinataire a reçu 10 $. L'expéditeur arrive au bureau de AnonymousWorldMoney avec son reçu, et le greffier montre sa version, qui dit que l'expéditeur n'a transféré que 10 $.
  3. Un problème d'environnement non fiable, comme la fraude appelée double dépense. Un participant sans scrupules peut dépenser son solde plusieurs fois jusqu'à ce que le paiement soit répliqué sur tous les serveurs. Bien sûr, personne n'a annulé le théorème de la PAC , et la cohérence sera finalement atteinte, mais quelqu'un ne recevra pas d'argent pour les services ou les biens rendus. Par conséquent, s'il n'y a pas de confiance totale dans l'organisme de paiement ou les participants aux transactions, il est nécessaire de construire un réseau basé non pas sur la confiance, mais sur la cryptographie.
  4. Le conditionnel AnonymousWorldMoney a un nombre fini de serveurs qui peuvent devenir indisponibles involontairement ou par intention malveillante.
  5. AnonymousWorldMoney prendra sa commission tangible.
  6. La capacité de contrôler. Dans le processus d'exploitation de Bitcoin, il s'est avéré que les gens veulent non seulement se transférer des pièces, mais également vérifier diverses conditions de transaction, programmer des scénarios de travail, effectuer automatiquement des actions en fonction des conditions, etc.

Comment la blockchain résout ces problèmes


  1. Les participants sont identifiés à 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, laissant leur identité anonyme.
  2. Les transactions sont collectées en blocs, le hachage du bloc est calculé, qui est enregistré dans le bloc suivant. Cette séquence d'écriture de hachages dans des blocs a donné le nom de technologie blockchain, et elle rend également impossible de modifier / supprimer discrètement des blocs ou des transactions individuelles à partir de blocs. Ainsi, si une transaction tombe dans la blockchain, vous pouvez être sûr que ses données resteront inchangées.
  3. La fraude aux doubles dépenses est évitée en parvenant à un consensus sur le réseau, quelles données doivent être considérées comme correctes et lesquelles doivent être rejetées. Sur le réseau Bitcoin, un consensus est atteint par la preuve de PoW (Proof-of-Work).
  4. La fiabilité du fonctionnement du réseau est obtenue par le fait que la blockchain est publique, où chaque participant peut lancer son propre nœud, obtenir une copie complète de la blockchain et, en outre, commencer indépendamment à vérifier l'exactitude des transactions. Il convient de noter que les blockchains modernes vous permettent de construire non seulement des blockchains publiques (ouvertes), mais aussi privées (fermées), ainsi que d'utiliser des schémas combinés.
  5. Je ne me débarrasserai pas complètement de la commission dans la blockchain, car vous devez payer les personnes qui soutiennent le réseau, mais dans la blockchain, le besoin de la commission est prouvé de manière si convaincante qu'il n'y a aucun doute sur sa nécessité.
  6. Les blockchains modernes ont la capacité d'implémenter une logique métier, appelée Smart Contracts dans la blockchain. La logique des contrats intelligents est implémentée dans différents langages de haut niveau.

Ensuite, nous considérons ces solutions plus en détail.

Architecture de la blockchain


Composants de la blockchain


Chaque participant peut exécuter son nœud avec une copie complète de la blockchain (nœud complet). Les nœuds complets qui peuvent enregistrer des transactions sur la blockchain sont appelés nœuds de consensus (témoin) ou mineurs. Les nœuds complets qui vérifient uniquement l'exactitude des transactions sont appelés nœuds d'audit . Les clients légers ne stockent pas de copies complètes de la blockchain, mais interagissent avec le réseau à l'aide de nœuds complets.
La plupart des utilisateurs utilisent des clients légers ou des portefeuilles Web pour effectuer des transactions. Tous les nœuds sont connectés les uns aux autres. Avec cet ensemble d'éléments, l'architecture du réseau devient plus stable:

image

Cycle de vie des transactions


Regardons le cycle de vie des transactions et analysons-le en plusieurs parties:

image

Technologie blockchain


Arrêtons-nous plus en détail sur les solutions techniques et leurs relations les unes avec les autres.

Identification


Chaque transaction blockchain doit être signée numériquement. Par conséquent, pour terminer la transaction, chaque participant doit avoir une paire de clés: privée / publique. Parfois, une paire de clés est appelée portefeuille, car les clés sont uniquement associées à l'adresse numérique unique et au solde du participant. En réalité, les clés et les adresses ne sont que des chaînes de nombres dans différents systèmes numériques. Exemples de clés et d'adresses de portefeuille:

Private key: 0a78194a8a893b8baac7c09b6a4a4b4b161b2f80a126cbb79bde231a4567420f Public key: 0579b478952214d7cddac32ac9dc522c821a4489bc10aac3a81b9d1cd7a92e57ba Address: 0x3814JnJpGnt5tB2GD1qfKP709W3KbRdfb27V 

Pour créer une signature numérique sur des chaînes de blocs, un algorithme basé sur des courbes elliptiques est utilisé: l'algorithme de signature numérique à courbe elliptique (ECDSA). Pour son fonctionnement, la clé privée (numéro 256 bits) est généralement prise au hasard. Le nombre d'options de clé est de 2 pour la puissance de 256, nous pouvons donc parler de l'impossibilité pratique de faire correspondre les valeurs de clé privée.

De plus, la clé publique est obtenue à partir de la clé privée en multipliant sa valeur par les coordonnées du point situé sur la courbe elliptique, à la suite de quoi les coordonnées du nouveau point de la même courbe sont obtenues. Cette action garantit que vous recevez une paire de clés adaptée aux transactions de signature numérique. Enfin, l'adresse du portefeuille est calculée uniquement à partir de la clé publique.

Il existe de nombreux articles avec des détails sur la cryptographie utilisée dans la blockchain, par exemple: Bitcoin en bref - Cryptographie

La clé privée doit être gardée secrète et gardée en sécurité. La clé publique est connue de tous. Si la clé privée est perdue, l'accès à l'actif (pièces) ne peut pas être restauré et l'argent sera perdu pour toujours. Par conséquent, la tâche de stockage fiable des clés privées est extrêmement pertinente, car ce n'est pas une banque où vous pouvez toujours venir avec un passeport et restaurer votre compte. Il existe toute une industrie pour la production de ce qu'on appelle les crypto-portefeuilles froids, similaires aux lecteurs flash:

image

ou vous pouvez utiliser des méthodes plus fiables, par exemple, pour éliminer la valeur de la clé privée sur les jetons:

image

Les transactions


Pour plus d'informations sur la structure de la transaction, consultez l'article Bitcoin en bref - Transaction . Il est important pour nous de comprendre que chaque transaction contient au moins les données suivantes:

 From: 0x48C89c341C5960Ca2Bf3732D6D8a0F4f89Cc4368 -    To: 0x367adb7894334678b90fe7882a5b06f7fbc783a -    Value: 0.0001 -   Transaction Hash: 0x617ede331e8a99f46a363b32b239542bb4006e4fa9a2727a6636ffe3eb095cef -   

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

Blocs de transaction


Après avoir vérifié la validité des transactions, les nœuds en forment des blocs. En plus des transactions, le hachage du bloc précédent, un nombre (compteur Nonce) est écrit dans le bloc et le hachage du bloc actuel est calculé à l'aide de l'algorithme SHA-256. Un hachage doit avoir établi des conditions de complexité. Par exemple, sur un réseau Bitcoin, la complexité du hachage change automatiquement toutes les 2 semaines en fonction de la capacité du réseau afin que le bloc soit généré environ toutes les 10 minutes. La complexité est déterminée par la condition suivante: le hachage trouvé doit être inférieur à un nombre prédéterminé. Si cette condition n'est pas remplie, 1 est ajouté à Nonce et le calcul du hachage est répété. Pour sélectionner le hachage, le champ Nonce est utilisé, car ce sont les seules données du bloc qui peuvent être modifiées, le reste doit rester inchangé. Le hachage correct doit avoir un certain nombre de zéros au début, par exemple l'un des vrais hachages:

 000000000000000000000bf03212e7dd1176f52f816fa395fc9b93c44bc11f91 

Trouver un hachage avec succès est la preuve du travail effectué (Proof-of-Work, PoW) pour les réseaux Bitcoin ou Ethereum. Le processus de recherche de hachages est appelé extraction, par analogie avec l'extraction de l'or. Le nom définit avec précision l'essence du processus, il y a une énumération simple des options, et si quelqu'un a trouvé un hachage approprié, alors c'est vraiment de la chance. Voici comment trouver une vraie pépite d'or en tonnes de gangue. La récompense pour le bloc est maintenant de 12,5 BTC et si vous multipliez 3900 $ par le taux de change actuel du bitcoin, vous obtenez plus d'un kilogramme d'or pur. Il y a de quoi se battre!

Après avoir réussi à trouver le hachage, le bloc et le hachage trouvé lui-même sont écrits dans la blockchain par le bloc suivant. Plus de détails sur la structure des blocs peuvent être trouvés dans l'article Bitcoin dans un résumé-Blockchain , et ci-dessous je donnerai un schéma simplifié:

image

La blockchain commence par un bloc qui n'a pas encore de hachage du bloc précédent. Il n'y a qu'un seul de ces blocs dans la blockchain et a son propre nom Genesis block. Les blocs restants ont la même structure et ne diffèrent que par le nombre de transactions. Les transactions réelles et les blocs en cours de création dans Bitcoin ou Ethereum peuvent être consultés dans Block Explorer .

La taille des blocs dans Bitcoin est limitée à 1 Mo et avec une quantité minimale d'informations dans une transaction d'environ 200 octets, le maximum dans un bloc peut être d'environ 6 000 transactions. D'ici, d'ailleurs, les performances du Bitcoin, dont tout le monde rit: un bloc est généré environ toutes les 10 minutes * 60 secondes = 600 secondes, ce qui donne une performance formelle d'environ 10 TPS. Bien qu'en réalité - ce n'est pas une performance, mais un algorithme de travail consciemment mis en œuvre. Ethereum vient de faire le temps de génération de bloc de 15 secondes pour la compétition. et la productivité a officiellement décollé. Par conséquent, dans les blockchains utilisant PoW comme consensus, il est généralement inutile de comparer les performances, car cela dépend directement de la complexité du calcul du cache, qui peut être attribué à n'importe lequel.

Fourches


Et que se passe-t-il si, par exemple, plusieurs nœuds trouvent des hachages qui répondent à des conditions de complexité, mais ont des significations différentes (en d'autres termes, parviennent à un consensus différent) et écrivent des blocs dans la blockchain? Voyons comment la blockchain se protège de cette situation. Dans ce cas, la soi-disant fourchette ('fork') se produit, et la blockchain a deux versions de la chaîne:

image

Que se passe-t-il ensuite? De plus, une partie du réseau commence à fonctionner sur le bloc N + 2 d'une chaîne et une partie d'une autre:

image

Certains de ces blocs seront trouvés plus tôt et envoyés à la blockchain, puis, selon les règles, la blockchain devra passer à une chaîne plus longue et annuler toutes les transactions du bloc alternatif:

image

Dans le même temps, une situation peut se produire lorsque la transaction du participant a été effectuée dans un seul des blocs de la fourche, qui a été annulée. Par conséquent, afin d'être sûr que la transaction souhaitée est enregistrée sur la blockchain, il existe une recommandation générale - avant de faire confiance à la transaction, vous devez attendre que les prochains blocs soient ajoutés à la blockchain. Les recommandations sur le nombre de blocs à attendre pour différentes chaînes de blocs varient. Par exemple, pour un réseau Bitcoin, le minimum est de 2 blocs, le maximum est 6.

La même image avec une fourchette de blocs sera observée lors de la soi-disant attaque à 51% - c'est quand un groupe de mineurs tentera de développer une chaîne de blocs alternative, cherchant à annuler la chaîne avec leurs transactions frauduleuses. Bien qu'à l'heure actuelle, au lieu de la fraude, il soit plus rentable de consacrer votre pouvoir à une exploitation minière honnête.

Consensus


Pour écrire un bloc dans la blockchain, le réseau doit parvenir à un consensus. Rappelons la tâche de parvenir à un consensus dans les réseaux de communication informatique. Le problème est formulé comme la tâche des généraux byzantins BFT ( tolérance aux pannes byzantine ). En omettant une description imagée des problèmes de l'armée byzantine, le problème peut être formulé comme suit: comment les nœuds de réseau peuvent-ils arriver à un résultat commun si certains nœuds de réseau peuvent les déformer consciemment. Les algorithmes existants pour résoudre le problème BFT montrent que le réseau peut fonctionner correctement si les fraudeurs sont inférieurs à 1/3. Pourquoi le consensus BFT n'a-t-il pas été appliqué sur le réseau Bitcoin? Pourquoi utiliser PoW? Il y a plusieurs raisons:

  • Le BFT fonctionne bien avec un petit ensemble fixe de nœuds, et dans la blockchain publique, le nombre de nœuds est imprévisible et, de plus, les nœuds peuvent être activés et désactivés arbitrairement.
  • Il est nécessaire de motiver les gens à lancer des nœuds de chaîne de blocs. Pour ce faire, les gens doivent recevoir des récompenses. Dans BFT, il n'y a formellement rien pour recevoir une récompense, mais ce qu'est une récompense dans PoW est compréhensible pour tout le monde à un niveau intuitif: pour l'électricité consommée par le processeur dans le processus de recherche du hachage de bloc.

En plus de PoW, il existe plusieurs autres problèmes de consensus qui sont utilisés dans les chaînes de blocs modernes, par exemple:

  • PoS (Proof-of-Stake) - dans la blockchain Hyperledger
  • DPoS (Delegated Proof-of-Stake) - sur la blockchain BitShares
  • Modifications du BFT: SBFT (BFT simplifié) et PBFT (BFT pratique), par exemple, dans la blockchain Exonum

Arrêtons-nous sur le consensus du PoS, car ce sont les PoS et leurs variantes qui sont les plus utilisés dans les blockchains privées. Pourquoi en privé? D'une part, les caractéristiques du PoS sont meilleures que celles du PoW, car Pour parvenir à un consensus, moins de ressources informatiques sont nécessaires, ce qui signifie que la vitesse d'écriture des données dans la blockchain augmente. Mais d'un autre côté, le PoS a plus d'opportunités de fraude, donc pour neutraliser cela, tous les participants à la blockchain doivent être connus.

Le consensus du PoS est basé sur le choix d'un nœud qui peut enregistrer un bloc avec des transactions sur la blockchain en fonction du montant des fonds sur le compte, ou plutôt, pas sur le compte, mais dans un gage, c'est-à-dire plus vous avez d'argent dans la promesse, plus le réseau choisira probablement votre nœud pour enregistrer le bloc. La caution ne sera pas restituée si l'unité n'est pas valide. Ainsi, une protection contre la fraude est mise en place. Les variantes PoS suivantes sont disponibles:

  • Le Consensus Délégué PoS (DPoS) divise les participants en «vote» et «validation». Les détenteurs de pièces (participants votants) délèguent leur droit de vérifier et d'enregistrer les transactions sur la blockchain à d'autres participants. Ainsi, les validateurs effectuent tout le travail informatique et sont récompensés pour cela, et la présence des participants votants garantit l'honnêteté des validateurs, car ils peuvent être modifiés à tout moment.
  • Le consensus LPoS (Leased Proof-of-Stake) vous permet de louer vos fonds à d'autres nœuds afin qu'ils aient une meilleure chance de vérifier les blocs. T.O. vous pouvez obtenir une commission pour les transactions, sans participer à la vérification des transactions elle-même et bloquer l'extraction.

Il existe encore un certain nombre de consensus qui ne sont pas encore généralisés, je vais simplement les énumérer ici pour information, et un examen des algorithmes de consensus eux-mêmes peut être trouvé, par exemple, dans l'article: Algorithmes de consensus dans la blockchain .

  • PoET (Proof-of-Elapsed Time)
  • PoC (preuve de capacité)
  • PoB (Proof-of-Burn)
  • PoWeight (preuve de poids)
  • PoA (Proof-of-Activity) - PoW + PoS
  • PoI (Proof-of-Importans)

Modèles de déploiement de fiabilité et de blockchain


Blockchain publique

La stabilité de Public ou d'un autre nom pour la blockchain sans autorisation est obtenue par le fait que tout le monde peut se connecter et afficher des informations ou même connecter son propre nœud, et la confiance repose sur le consensus PoW.

Blockchain privée

Chaîne de blocs privée ou privée autorisée . Dans ces blockchains, seul un certain groupe de participants (organisations ou personnes) a accès aux informations. Ces chaînes de blocs sont construites par des organisations afin d'augmenter le profit ou l'efficacité globale. Leur fiabilité est assurée par les objectifs communs des participants et les algorithmes de consensus du PoS et du BFT.

Consortium Blockchain

Il existe des chaînes de blocs Consortium ou Public Permissioned . Ce sont de telles chaînes de blocs que tout le monde peut se connecter pour voir, mais un participant peut ajouter des informations ou connecter son site uniquement avec la permission des autres participants. Ces chaînes de blocs sont construites par des organisations afin d'accroître la confiance des clients ou des consommateurs de produits ou de la société dans son ensemble. Ici, la fiabilité est également obtenue par la présence de confiance entre les participants et les mêmes algorithmes de consensus PoS et BFT.

Contrats intelligents


Les chaînes de blocs mises en œuvre après Bitcoin ont, à un degré ou à un autre, ajouté la possibilité d'exécuter des contrats intelligents. En substance, un contrat intelligent est une transaction dans laquelle le code de programme est placé pour exécution. Les contrats intelligents sur le réseau Ethereum sont exécutés dans EVM (Ethereum Virtual Machine). Pour démarrer l'exécution d'un contrat intelligent, il doit être explicitement lancé par une autre transaction, ou les conditions préalables à l'exécution doivent être remplies. Les résultats de la mise en œuvre du contrat intelligent sont également enregistrés sur la blockchain. L'obtention de données de l'extérieur de la blockchain est possible, mais extrêmement limitée.

Quelle logique métier peut être mise en œuvre à l'aide d'un contrat intelligent? En fait, il n'y en a pas beaucoup, par exemple, vérifier les conditions en fonction des données de la blockchain, changer les propriétaires des actifs numériques en fonction de ces conditions, écrire des données dans le stockage permanent à l'intérieur de la blockchain. La logique est implémentée dans un langage spécial de haut niveau, Solidity.

Un exemple classique de fonctionnalité implémentée à l'aide de contrats intelligents est la question des jetons pour les ICO. Par exemple, j'ai mis en place un contrat intelligent pour la sortie d'un modeste 500 millions d'AlexToken. Le lien dans Etherscan est

Code source du contrat intelligent 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 (ie 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 représentation binaire de la façon dont le réseau le voit
60806040526000600355600060045533600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560146101000a81548160ff021916908360028111156200006f57fe5b0217905550620001036b019d971e4fe8401e74000000600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546200024a6401000000000262000b1d179091906401000000009004565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550620001986b019d971e4fe8401e740000006001546200024a6401000000000262000b1d179091906401000000009004565b6001819055506b033b2e3c9fd0803ce8000000600481905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6b019d971e4fe8401e740000006040518082815260200191505060405180910390a362000267565b600081830190508281101515156200025e57fe5b80905092915050565b611cb880620002776000396000f300608060405260043610610112576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146104c7578063095ea7b31461055757806318160ddd146105bc57806323b872dd146105e7578063313ce5671461066c578063355274ea146106a3578063518ab2a8146106ce57806366188463146106f957806370a082311461075e57806389311e6f146107b55780638da5cb5b146107cc578063903a3ef61461082357806395d89b411461083a578063a9059cbb146108ca578063bf5839031461092f578063c7876ea41461095a578063cbcb317114610985578063d73dd623146109b0578063dd62ed3e14610a15578063f2fde38b14610a8c575b60008060008060006001600281111561012757fe5b600560149054906101000a900460ff16600281111561014257fe5b14151561014e57600080fd5b60003411151561015d57600080fd5b600060045411151561016e57600080fd5b3494506101a7670de0b6b3a764000061019968056bc75e2d6310000088610acf90919063ffffffff16565b610b0790919063ffffffff16565b9350600092506b033b2e3c9fd0803ce80000006101cf85600354610b1d90919063ffffffff16565b111561024c576101f66003546b033b2e3c9fd0803ce8000000610b3990919063ffffffff16565b915061022e670de0b6b3a764000061022068056bc75e2d6310000085610b0790919063ffffffff16565b610acf90919063ffffffff16565b90506102438186610b3990919063ffffffff16565b92508094508193505b61026184600354610b1d90919063ffffffff16565b6003819055506102886003546b033b2e3c9fd0803ce8000000610b3990919063ffffffff16565b6004819055506000831115610344573373ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f193505050501580156102dd573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a35b610395846000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040518082815260200191505060405180910390a361045184600154610b1d90919063ffffffff16565b600181905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc869081150290604051600060405180830381858888f193505050501580156104bf573d6000803e3d6000fd5b505050505050005b3480156104d357600080fd5b506104dc610b52565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561051c578082015181840152602081019050610501565b50505050905090810190601f1680156105495780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561056357600080fd5b506105a2600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610b8b565b604051808215151515815260200191505060405180910390f35b3480156105c857600080fd5b506105d1610c7d565b6040518082815260200191505060405180910390f35b3480156105f357600080fd5b50610652600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610c87565b604051808215151515815260200191505060405180910390f35b34801561067857600080fd5b50610681611041565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b3480156106af57600080fd5b506106b8611046565b6040518082815260200191505060405180910390f35b3480156106da57600080fd5b506106e3611056565b6040518082815260200191505060405180910390f35b34801561070557600080fd5b50610744600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061105c565b604051808215151515815260200191505060405180910390f35b34801561076a57600080fd5b5061079f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506112ed565b6040518082815260200191505060405180910390f35b3480156107c157600080fd5b506107ca611335565b005b3480156107d857600080fd5b506107e16113eb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561082f57600080fd5b50610838611411565b005b34801561084657600080fd5b5061084f6114ab565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561088f578082015181840152602081019050610874565b50505050905090810190601f1680156108bc5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108d657600080fd5b50610915600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506114e4565b604051808215151515815260200191505060405180910390f35b34801561093b57600080fd5b50610944611703565b6040518082815260200191505060405180910390f35b34801561096657600080fd5b5061096f611709565b6040518082815260200191505060405180910390f35b34801561099157600080fd5b5061099a611716565b6040518082815260200191505060405180910390f35b3480156109bc57600080fd5b506109fb600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611726565b604051808215151515815260200191505060405180910390f35b348015610a2157600080fd5b50610a76600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611922565b6040518082815260200191505060405180910390f35b348015610a9857600080fd5b50610acd600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506119a9565b005b600080831415610ae25760009050610b01565b8183029050818382811515610af357fe5b04141515610afd57fe5b8090505b92915050565b60008183811515610b1457fe5b04905092915050565b60008183019050828110151515610b3057fe5b80905092915050565b6000828211151515610b4757fe5b818303905092915050565b6040805190810160405280600981526020017f416c6578546f6b656e000000000000000000000000000000000000000000000081525081565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000600154905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515610cc457600080fd5b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515610d1157600080fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515610d9c57600080fd5b610ded826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610e80826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610f5182600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b601281565b6b033b2e3c9fd0803ce800000081565b60035481565b600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508083111561116d576000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611201565b6111808382610b3990919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a3600191505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561139157600080fd5b60028081111561139d57fe5b600560149054906101000a900460ff1660028111156113b857fe5b141515156113c557600080fd5b6001600560146101000a81548160ff021916908360028111156113e457fe5b0217905550565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561146d57600080fd5b60028081111561147957fe5b600560149054906101000a900460ff16600281111561149457fe5b141515156114a157600080fd5b6114a9611b01565b565b6040805190810160405280600381526020017f414c54000000000000000000000000000000000000000000000000000000000081525081565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561152157600080fd5b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115151561156e57600080fd5b6115bf826000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611652826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b60045481565b68056bc75e2d6310000081565b6b019d971e4fe8401e7400000081565b60006117b782600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611a0557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611a4157600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6002600560146101000a81548160ff02191690836002811115611b2057fe5b021790555060006004541115611c0a57611ba5600454600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050158015611c89573d6000803e3d6000fd5b505600a165627a7a723058205bbef016cc7699572f944871cb6f05e69915ada3a92a1d9f03a3fb434aac0c2b0029


Plus de détails sur les contrats intelligents peuvent être trouvés dans l'article: Que sont les contrats intelligents dans Ethereum .

Conclusion


Nous avons répertorié les technologies sur lesquelles les chaînes de blocs modernes sont construites et comment elles sont liées les unes aux autres. Formulons maintenant quelles tâches peuvent être résolues à l'aide de la blockchain et quelles solutions seront, dans le meilleur des cas, inefficaces. Ainsi, l'utilisation d'une blockchain n'est pas nécessaire si:

  • Les transactions sont effectuées dans un environnement de confiance;
  • La présence d'une commission d'intermédiaires n'aggrave pas la vie des participants;
  • Les participants ne possèdent pas de biens pouvant être représentés comme des actifs numériques;
  • Il n'y a pas de distribution dans les actifs numériques, c'est-à-dire un seul membre possède ou fournit la valeur.

Quel est l'avenir de la blockchain? Maintenant, nous ne pouvons que spéculer sur les moyens possibles de développer des technologies de blockchain:

  • La blockchain deviendra la même technologie de base de données conventionnelle que, par exemple, SQL ou NoSQL pour résoudre sa gamme spécifique de tâches;
  • La blockchain deviendra un protocole répandu comme HTTP pour Internet;
  • La blockchain deviendra la base du nouveau système financier et politique de la planète!

Dans la partie suivante, nous verrons quelles chaînes de blocs existent actuellement et pourquoi elles sont utilisées dans diverses industries.

Ce n'est qu'un début!

Les trois articles:


Que devons-nous construire une blockchain?
Blockchain: que devons-nous construire un boîtier?
Blockchain: que devons-nous construire PoC?

Source: https://habr.com/ru/post/fr443282/


All Articles