6
Suivre
792
Abonnés

Introduction à la Blockchain et à Ethereum

Créé le: 2016-05-05 17:31:57, Mis à jour le: 2016-05-05 17:32:31
comments   3
hits   2492

Il a été publié dans la revue de l’université d’Angleterre.

Cet article est une compilation d’un partage technique que j’ai fait sur LeanCloud à la fin du mois de mars, et suppose que le lecteur possède une connaissance de base de la cryptographie et une compréhension préliminaire de la mise en œuvre de Bitcoin.

La blockchain, aussi appelée chaîne de blocs, peut être considérée comme une sorte de HashTree, et par conséquent, elle possède des propriétés similaires à HashTree:

blockchain-hash-tree

Photo fournie par<http://happypeter.github.io/bitcoin_basics/book/017_merkle_tree.html

Dans une structure arborescente, chaque nœud terminal possède une valeur de dispersion, tandis que la valeur de dispersion d’un nœud non terminal provient de la dispersion de toutes ses sous-nœuds directs, de sorte que chaque nœud contient directement ou indirectement l’information de tous ses sous-nœuds. Par conséquent, chaque fois que la dispersion d’un nœud terminal change, la dispersion de tous ses nœuds parents change, et les nœuds racines doivent également changer.

Je peux citer une application sur HashTree: “ 100% de preuve de réserve “, qui appartient à la catégorie des ” preuves de connaissance zéro “ (Zero-knowledge proofs). On peut envisager un scénario dans lequel les détenteurs de Bitcion, pour effectuer une transaction, doivent déposer des bitcoins sur une plateforme d’échange, et la plateforme peut théoriquement utiliser cet argent (le solde de tous les comptes déposés par les utilisateurs) pour les utiliser, ce que les utilisateurs ne veulent pas voir, mais l’échange veut aussi s’assurer de son innocence: l’échange publie d’abord une adresse Bitcoin qu’il détient, et tout le monde confirme qu’il détient effectivement autant de bitcoins en réserve, mais comment prouver que cet argent est vraiment plus grand que le total des soldes de tous les utilisateurs ?

blockchain-proof-of-reserves

Photo fournie par<http://blog.bifubao.com/2014/03/16/proof-of-reserves

Nous pouvons construire un HashTree où tous les nœuds de l’extrémité représentent un utilisateur et contiennent le solde de l’utilisateur.Σ) et un fragment d’identifiant de l’utilisateur (comme une adresse postale)hLe nœud parent contient la somme de tous les nœuds de son enfant.sum) et le hash de toutes les informations de sous-nœudshashPour chaque utilisateur, il suffit de lui montrer son propre nœud terminal et son nœud frère, ainsi que tous ses nœuds parents et tous les nœuds frères de son nœud père, car il peut confirmer que son propre solde est inclus dans le nœud père et, finalement, dans le nœud racine, en remontant progressivement vers le nœud père.

De cette façon, chaque utilisateur ne peut voir que ses propres informations et certaines informations agrégées, et chaque utilisateur peut confirmer que ses propres soldes sont inclus dans le nœud racine sans que d’autres utilisateurs en soient informés. Il y a une petite erreur dans le graphique ci-dessus.hPourquoi ?e4df9d12Le nœud de l’utilisateur ne doit pas être un nœud de l’utilisateur, mais un nœud d’information agrégé (qui peut contenir un utilisateur avec un solde de 3333 et un utilisateur virtuel avec un solde de 0) pour éviter de divulguer les informations personnelles d’un utilisateur.

Nous allons maintenant jeter un coup d’œil à Git, qui est en fait une application de blockchain très typique:

blockchain-git-objects-example

Photo fournie parhttp://gitbook.liuhui998.com/1_2.html (GPL v2)

Dans Git, que ce soit un fichier (Blob), un index (Tree) ou une soumission (Commit), il y a un Hash déterminé par son contenu, et si deux objets ont le même contenu, il y a le même Hash. Dans Git, l’histoire de l’ensemble du dépôt est une Blockchain, chaque Commit est équivalent à un bloc, le Commit contient le Hash du Commit précédent et le Hash de l’objet concerné par cette modification, le Hash du Commit lui-même est déterminé par son contenu et ces éléments.

Git utilise la Blockchain pour définir un historique unique pour le référentiel Si un Commit est modifié, tous les Commits qui le suivent seront modifiés. Bien sûr, puisque Git n’est qu’un outil de contrôle de version, cela ne vous empêche pas de modifier l’historique.push --forceLes modifications seront perçues par tous les coauteurs.

L’autre application classique de la Blockchain est Bitcoin, et c’est Bitcoin qui a diffusé le terme Blockchain (et le concept existe depuis toujours):

blockchain-bitcoin-block-data

Photo fournie parhttps://commons.wikimedia.org/wiki/File:Bitcoin_Block_Data.png(CC-BY-SA-3.0)

Dans Bitcoin, chaque bloc contient une série de transactions et le hash du bloc précédent, tandis que la blockchain constitue un seul compte décentralisé. Comme un nouveau bloc est créé toutes les dix minutes et qu’un bloc est créé et reste sur la blockchain pour toujours, la blockchain fixe l’ordre dans lequel les transactions se produisent, maintient l’ordre dans lequel les transactions se produisent et détermine si un compte a suffisamment de solde pour lancer une transaction.

Bitcoin

La première partie de ce partage est un simple récapitulatif de Bitcoin.

La génération de blocs dans Bitcoin est réalisée par la ” preuve de la quantité de travail “, c’est-à-dire que tous les ” mineurs “ qui participent au ” minage “ doivent effectuer un calcul aléatoire de nature aléatoire lié à la puissance de calcul, jusqu’à ce qu’un nombre aléatoire répondant à des conditions spécifiques soit calculé, avant d’obtenir le droit de publier un bloc.

Par défaut, chaque mineur va toujours faire confiance à la chaîne la plus longue et calculer le prochain bloc en fonction de la chaîne la plus longue connue qui satisfait à la règle, sinon votre puissance de calcul sera gaspillée. Oh, parce que les autres mineurs reconnaissent toujours la chaîne la plus longue, et si vous ne commencez pas à travailler sur la base de la chaîne la plus longue, alors c’est en concurrence avec la puissance de calcul de tous les autres mineurs.

Bitcoin est conçu pour générer un nouveau bloc toutes les 10 minutes, ce temps est réalisé en observant ensemble l’intervalle des blocs précédents, pour ajuster la difficulté des conditions de génération du prochain bloc. Lorsque la vitesse de génération des blocs précédents est plus élevée que prévu, on pense que la génération du prochain bloc devrait avoir une difficulté plus élevée.

Normalement, chaque nœud Bitcoin doit stocker l’intégralité des données de la Blockchain pour confirmer si une transaction est légitime ou non. Cependant, la blockchain complète est maintenant de 66G et augmente d’environ 0.1G par jour. Si la demande de chaque utilisateur de Bitcoin de stocker l’intégralité de la blockchain n’est pas trop exigeante, Bitcoin dispose d’un mécanisme de “vérification simplifiée des paiements (SPV) “, appelé ” client léger” qui peut choisir de ne pas stocker l’intégralité de la blockchain, mais de s’attacher à un ou plusieurs nœuds complets pour stocker uniquement les informations de tous les blocs.

blockchain-bitcoin-state-machine

Photo fournie par<https://github.com/ethereum/wiki/wiki/White-Paper

  • Blockchain Carte de l’état de l’émetteur
  • Transaction Transaction Changement de statut une fois
  • Un “consensus” sur la situation actuelle

En fait, nous pouvons imaginer la Blockchain de Bitcoin comme une “machine d’état”, la Blockchain entière est un “livre” d’état dans lequel chaque transaction est enregistrée, à partir de ces enregistrements de transaction, il est possible de calculer l’“état” de l’ensemble du livre à tout moment. Chaque transaction est un changement d’état, et chaque bloc est un “consensus” sur l’état actuel des mineurs de l’ensemble du réseau Bitcoin, car Bitcoin génère un nouveau bloc toutes les 10 minutes, ce qui équivaut à un consensus sur le solde de tous les comptes toutes les 10 minutes, alors que pendant ces dix minutes, l’état du livre est en fait un “état de chaos”.

Alt Coin

De nombreuses autres monnaies cryptographiques ont été créées à partir de Bitcoin, souvent appelées “Alt Coins” (monnaies de remplacement). Il existe deux types de monnaies:

Le premier est d’utiliser son propre réseau, indépendant de celui de Bitcoin, ce qui permet à la crypto-monnaie de concevoir ses propres protocoles et règles avec beaucoup de souplesse, mais étant donné que le nombre d’utilisateurs est difficile à atteindre à un niveau comparable à celui de Bitcoin, la défense contre les attaques malveillantes sera très faible.

La deuxième est d’utiliser le réseau Bitcoin pour mettre en œuvre le “méta-protocole” et d’ajouter des informations personnalisées au-dessus de la transaction de Bitocin pour exécuter sa propre logique. L’avantage est que l’on peut utiliser l’échelle de puissance de calcul de Bitcoin pour se défendre contre les attaques, mais en même temps, car dépendant du réseau Bitcoin, tous les mineurs ne respectent pas les règles de la monnaie de substitution.

Pour ces copies, Bitcoin peut fournir une Blockchain avec un grand nombre de mineurs et une résistance à des attaques malveillantes à grande échelle, et les transactions Bitcoin peuvent également être équipées de données personnalisées, laissant une certaine marge de manœuvre à la mise en œuvre d’une pièce de contrefaçon.

Bitocin a également fourni unBitcoin ScriptMais comme ce n’est pas une fonctionnalité centrale de Bitcoin, il est possible de faire des opérations relativement simples, de lire très peu de données sur la Blockchain, et il est difficile de rédiger une logique universelle et complète de Turing en raison de l’absence de mécanisme de cycle.

Ethereum

blockchain-ethereum

Photo fournie parhttps://www.ethereum.org/assets (CC 3.0)

Ethereum est une plate-forme d’applications décentralisées basée sur la chaîne de blocs qui construit l’infrastructure de Bitcoin sur la technologie de la chaîne de blocs basée sur la cryptographie en une plate-forme universelle et complète certaines fonctionnalités manquantes du réseau Bitcoin afin que les développeurs puissent exécuter leurs propres applications décentralisées sur la Blockchain.

Avant d’entrer dans le détail d’Ethereum, j’aimerais d’abord vous présenter ce que je considère comme les deux fondements d’un réseau décentralisé: la cryptographie et le jeu. Le cryptographie n’est rien d’autre que le cryptage à clé publique, la signature numérique, le hashing et les algorithmes d’abstraction pour garantir la sécurité mathématique. Le jeu, c’est que dans un réseau décentralisé, n’importe qui, y compris ceux qui souhaitent mal intentionnément attaquer ce réseau, peut participer.

Cependant, dans le monde numérique, la publication d’un morceau de données n’a pas de coût, il n’y a pas de “bénéfice” et de “perte”, il faut donc établir un certain lien avec le monde physique pour définir le “bénéfice”. Par exemple, dans le réseau Bitocin, si un attaquant souhaite modifier artificiellement la direction de Blcokchain, il faut disposer d’une puissance de calcul supérieure à celle de tous les autres mineurs, alors que dans le monde physique, la puissance de calcul est fournie par un appareil de calcul, qui doit être acheté dans le monde physique.

Donc, dans un réseau décentralisé, tous les problèmes ne sont pas résolus par la “technologie”, et la partie que la technologie ne peut pas atteindre doit être résolue par des bénéfices, par des incitations économiques. Également en raison de la nécessité d’une “incitation économique”, Ethereum a également un système de portefeuille (l’unité monétaire est appelée “Ether”), chaque utilisateur a une adresse de portefeuille comme son seul identifiant, sur ce point, il est similaire à Bitcion.

Contract est le concept le plus important introduit par Ethereum. Dans Bitcoin, toutes les adresses appartiennent à un seul utilisateur. Quand nous disons “utilisateur”, nous parlons en fait d’une paire de clés publiques et privées. Mais dans Ethereum, en plus de l’adresse possédée par une paire de clés, il y a aussi une adresse possédée par le “code”, le Contract.

  • Le résultat du calcul n’a pas besoin d’être stocké dans la blockchain, car il peut être recalculé à tout moment.
  • Les fonctions d’autres contrats peuvent être appelées ((le code et les données d’autres contrats existent également sur la blockchain))
  • L’exécution peut créer de nouvelles transactions (manipulations de leur propre solde de portefeuille) qui peuvent être utilisées pour exécuter d’autres contrats.

Pour commencer par un exemple de “portefeuille partagé multi-utilisateurs”, le client officiel d’Ethereum propose une fonctionnalité permettant de créer des portefeuilles multi-utilisateurs:

blockchain-ethereum-multi-sig-wallet

Comme illustré ci-dessous, il est possible de créer une adresse de portefeuille partagée avec 2 autres personnes, et chaque personne peut utiliser jusqu’à 100 éthers par jour, si elle dépasse cette limite, elle doit être utilisée avec l’accord d’une autre personne.

Cette fonctionnalité crée en fait un Contract, et la logique ci-dessus est décrite par le code dans le Contract. Lorsque vous souhaitez effectuer un paiement à partir de ce portefeuille partagé, vous devez envoyer un message à ce portefeuille partagé ((la transaction est un message, le montant de la transaction peut être égal à zéro, ne portant que des données), puis le code du portefeuille partagé est exécuté, et si cette demande de dépense correspond à la logique ci-dessus, une transaction de dépense réelle est lancée, sinon cette demande de dépense est rejetée ((aucune dépense réelle n’est effectuée)).

Un autre exemple est le “contrat de couverture”, qui a toujours été mentionné comme une monnaie numérique dont la valeur monétaire (et le taux de change des monnaies légales) est instable, il y a souvent des doublons ou des doublons de la valeur monétaire en une journée, mais cela peut être résolu dans une certaine mesure si un contrat de couverture est mis en œuvre avec Contract.

Nous appellerons “éviteurs de risque” les personnes qui souhaitent que la valeur de la monnaie reste la même, et nous appellerons “prenants de risque” les autres personnes qui sont prêtes à prendre le risque de fluctuation de la valeur de la monnaie et à en tirer profit, afin qu’elles puissent convenir d’un montant (par exemple, 1000 CNY) et d’une fenêtre de temps (par exemple, un mois) et créer un contrat qui exécute la logique suivante:

  • Le parieur envoie de l’éther d’une valeur de 1000 CNY à l’adresse du portefeuille du Contract, et le parieur envoie de l’éther d’une valeur de 1000 CNY (ou plus) au Contract pour s’y conformer (le parieur peut récupérer son éther s’il n’y a personne pour le faire).
  • Un mois plus tard, l’éviteur de risque peut récupérer de la Contract l’éther qui valait alors 1000 CNY, et le reste de l’éther est récupéré par le preneur de risque, quel que soit le taux de change entre l’éther et le CNY.

Si la valeur de l’éther augmente, le preneur de risque gagne, si la valeur de l’éther diminue, le preneur de risque perd, mais l’éviteur de risque ne perd jamais. Bien sûr, l’éviteur de risque et le preneur de risque peuvent convenir à l’avance d’une “assurance” que l’éviteur de risque devra payer, et il peut également être convenu que le preneur de risque devra fournir une garantie de plusieurs fois plus de 1000 CNY (plus le taux est élevé, plus le risque peut être pris).

Dans l’exemple ci-dessus, il y a un problème qui n’est pas très bien résolu, à savoir comment déterminer le taux de change entre l’éther et la monnaie virtuelle. Comme nous l’avons mentionné précédemment, le contrat n’a accès qu’aux données de la blockchain, et la monnaie virtuelle est une donnée qui existe dans le monde physique et non dans le monde cryptographique.

Nous pourrions concevoir un autre contrat pour spécifier une logique qui nous permettrait de saisir le taux de change entre l’éther et la monnaie virtuelle dans le monde réel, pour chaque fenêtre de temps (par exemple, une heure):

  • Chaque propriétaire peut verser une caution à Contract et fournir un taux de change.
  • À la fin de la fenêtre de temps, Contract calcule la moyenne des taux de change offerts par les propriétaires (avec une pondération de la garantie) et les publie.
  • Le montant de la caution sera distribué aux personnes qui se rapprochent le plus de 25% de la valeur moyenne.

Pour n’importe quel participant, il y a plus de chances de recevoir une récompense en soumettant un taux de change réel parce qu’il ne connaît pas les offres des autres, et de perdre la caution en soumettant un taux de change très étrange.

Bien sûr, il y a quelques failles dans cette règle, par exemple, si une personne a beaucoup de garantie, elle peut tirer la moyenne à un prix plus élevé ou plus bas que le taux de change réel et obtenir une récompense, et faire perdre la garantie à d’autres personnes qui fournissent un taux de change exact. Mais c’est la même chose dans le monde réel, si vous avez beaucoup d’argent, vous pouvez également augmenter ou réduire le prix d’une marchandise, mais par rapport au monde réel, la masse de la monnaie électronique est très petite et ne nécessite pas beaucoup d’argent.

Une autre faille est que “ tout le monde peut payer la garantie au contrat et fournir un taux de change ” Cette étape est réalisée en créant des transactions, et toutes les transactions sont écrites sur la blockchain, de sorte que le taux de change que vous soumettez est en fait visible par d’autres personnes, ce qui crée des opportunités supplémentaires pour les attaquants malveillants, et je vais vous montrer comment contourner ce problème avec un exemple de “ génération de nombres aléatoires “.

Nous avons mentionné précédemment que Contract peut lire des données sur la blockchain, mais les données sur la blockchain sont définitives, et si nous voulons réaliser une application similaire au jeu d’argent, d’où devrions-nous obtenir un nombre aléatoire ?

Une source de nombres aléatoires qui peut être envisagée est le hash du bloc suivant, et dans la plupart des cas, ce degré de hasard est suffisant. Mais en fait, le mineur peut manipuler ce nombre aléatoire dans une certaine mesure, en supposant qu’un mineur participe à un jeu et que le gain du jeu est supérieur à celui d’une pièce.

Nous avons donc besoin d’introduire un mécanisme similaire à celui de la sollicitation des taux de change pour solliciter des nombres aléatoires de graines, puis utiliser ces graines pour calculer un nombre aléatoire à la fin de chaque fenêtre de temps et. Mais comme pour la sollicitation des taux de change, parce que les participants ont créé des transactions pour réaliser la soumission des taux de change, donc entre une fenêtre de temps, les nombres aléatoires soumis par chaque personne sont visibles pour les autres, donc une personne qui a déjà participé à un jeu peut choisir soigneusement un nombre aléatoire de graines pour que le nombre aléatoire produit par les graines déjà soumises par les autres et les nouvelles graines correspondent exactement à ses attentes.

Il est donc nécessaire de diviser la fenêtre de collecte en deux pour obtenir un nombre aléatoire que personne ne peut prédire et intervenir:

  • Phase 1: Tout le monde peut verser une caution à Contract et fournir “la valeur de la somme d’une graine sélectionnée au hasard”.
  • Phase II: Les participants de la phase I fournissent des graines non semées à Contract.
  • Fin de la phase II: Contract sépare toutes les semences légitimes, génère un groupe de nombres aléatoires et publie; retour à la phase II avec la caution de la personne qui a fourni la bonne semence.

Dans la première étape, vous ne connaissez que les valeurs de la séquence des semences soumises par les autres, et ne connaissez pas les semences réelles, donc il n’est pas possible de construire une graine pour interférer avec les résultats; et dans la deuxième étape, tout le monde confirme seulement les semences soumises dans la première étape, et ne peut pas soumettre de nouvelles, ni empêcher les autres de soumettre des semences.

Nous avons mentionné précédemment que Bitcoin Script n’offre pas de fonctionnalités de cycle, de récurrence, de saut, etc. Peut-être que Bitcoin a pour but de contrôler le temps d’exécution d’un script Bitcoin, car selon le “théorème de l’arrêt” de Turing, les programmes écrits par un langage de programmation complété par Turing ne peuvent pas toujours être déterminés uniquement à partir de l’analyse statique pour déterminer s’ils se termineront après des étapes limitées, de sorte que les attaquants malveillants peuvent créer une transaction qui provoque un cycle mort pour perturber le travail normal des mineurs.

L’EVM est une machine virtuelle qui est dotée d’une “ facturation ” propre, dans la norme EVM, chaque type de gaz consommé par l’opcode est défini en fonction de la mémoire et du temps de processeur nécessaires à l’opération, une ressource de calcul achetée par Ether. Lorsque la transaction est destinée à un contrat, le code du contrat est exécuté, l’initiateur de la transaction doit payer pour le gaz consommé lors de l’exécution du contrat, tout en déclarant qu’il est “ disposé à payer la plus grande quantité de gaz possible “. Si le gaz est épuisé en cours de route, l’exécution du contrat sera interrompue.

Puis nous reviendrons sur le problème de l’intervalle de consensus, qui est mentionné précédemment dans Bitcoin, où un nouveau bloc apparaît toutes les 10 minutes, c’est-à-dire que le réseau entier atteint un “consensus” toutes les 10 minutes, de sorte que les transactions Bitcoin normales doivent attendre une dizaine de minutes avant d’être confirmées, et dans les premiers temps où la puissance de calcul n’est pas très élevée, il peut être nécessaire d’attendre une heure (six blocs) avant que la transaction soit considérée comme fiable.

Il est évident qu’un temps de consensus plus court est une meilleure expérience pour les utilisateurs, mais pourquoi Bitcoin ne raccourcit-il pas le temps de blocage? C’est parce qu’un intervalle de consensus plus rapide augmente dans une certaine mesure les avantages du “miner central”.

Quand un mineur A trouve un nouveau bloc, il diffuse ce bloc, et les autres commencent à travailler sur ce nouveau bloc dès qu’ils en reçoivent l’information. Pour les autres, le calcul entre le moment où “A trouve un nouveau bloc” et celui où “il reçoit l’information diffusée par A” est effectivement gaspillé, ce qui n’est pas le cas pour les autres mineurs dans le bassin de minage centralisé, car ils peuvent obtenir plus rapidement l’information sur le nouveau bloc et commencer à travailler sur ce nouveau bloc.

blockchain-ethereum-without-uncles

Cette diffusion peut prendre une dizaine de secondes, ce qui n’est pas très important pour 10 minutes, mais si l’on réduit l’intervalle de consensus, les avantages du pool de minage centralisé deviendront de plus en plus évidents. Cependant, Ethereum a résolu ce problème en introduisant le concept de “Uncle Block”, réduisant l’intervalle de consensus à 15 secondes, ce qui a permis à Bitcoin d’améliorer considérablement la vitesse de confirmation des paiements.

Dans la blockchain de Bitcoin, un bloc ne peut avoir qu’un seul bloc père et un seul bloc fils. Mais dans Ethereum, un bloc nouvellement créé peut avoir un bloc père et plusieurs blocs oncles. Pour revenir à l’exemple ci-dessus, si quelqu’un creuse un nouveau bloc dans A mais que d’autres n’ont pas encore reçu la diffusion, si quelqu’un creuse un nouveau bloc, mais que la diffusion est plus tardive et n’est pas acceptée par tout le monde, alors ce bloc est susceptible de devenir le “oncle” du bloc suivant.

blockchain-ethereum-uncles

Photo fournie par<https://blog.ethereum.org/2014/07/11/toward-a-12-second-block-time

Problèmes non résolus

La prochaine partie de ce billet est consacrée à quelques problèmes que Ethereum n’a pas encore résolus.

Le problème avec la preuve de travail est qu’elle gaspille énormément de puissance de calcul pour assurer la sécurité du réseau, bien que cela soit basé sur l’idée d’une “incitation économique” que nous avons mentionnée précédemment. Ehtereum pense qu’il est préférable de remplacer la preuve de travail par une preuve de possession, ce qui améliorera considérablement l’efficacité du réseau.

Puisque l’éther en lui-même est précieux, pourquoi ne pas l’utiliser pour l’incitation économique ? Le POS signifie que chaque nœud qui souhaite participer à la production de blocs (minage au sens traditionnel) doit payer une caution au système (ici, le système fait référence au protocole selon lequel tous les nœuds considèrent que la caution est “ gelée “) et ensuite utiliser sa propre caution pour souscrire à un bloc qui pourrait devenir le prochain bloc.

Ce modèle est en fait très similaire à POW, dans POW, les mineurs utilisent leur propre puissance de calcul pour ” parier “ et s’il y a une chaîne plus longue, il est nécessaire de passer à cette chaîne pour continuer à miner. En effet, plus il y a de personnes impliquées dans la chaîne, plus il est probable que ce soit la bonne chaîne, et finalement nous parviendrons à un consensus.

Les points de vente augmenteront certainement le débit de l’ensemble du réseau Il n’y aura plus besoin de consensus par le biais d’un grand nombre de calculs dénués de sens, et le nombre d’opérations par nœud sera proche du nombre de calculs nécessaires pour exécuter le code du contrat et effectuer la vérification des données.

Bien sûr, le POS n’a pas encore été adopté parce qu’il y a encore des problèmes non résolus, l’un d’entre eux est le problème de l’attaque à 51%, comme POW, où la puissance de calcul centralisée sur le réseau à 51% est un peu limitée physiquement, car la puissance de calcul est fournie par un appareil de calcul. En revanche, l’éther collecté sur le réseau à 51% dans le POS est relativement facile à gagner, à condition que vous ayez suffisamment d’argent.

Un autre sujet de discussion est le ” fragmentation “, où Bitcoin et Ethereum confirment toutes les transactions sur la même blockchain, ce qui limite considérablement la capacité de calcul d’un réseau distribué. Chaque nœud doit recevoir, stocker et vérifier chaque transaction, et la capacité de traitement de l’ensemble du réseau est en fait égale à celle d’un nœud.

Ethereum souhaite donc introduire à l’avenir un mécanisme de ” fragmentation “ pour diviser l’ensemble du réseau en plusieurs parties, entre lesquelles des transactions seront vérifiées indépendamment. Cependant, les fragments se référeront à d’autres fragments via la structure des pointeurs et influenceront les autres fragments par des appels asynchrones.

Contract

Contract peut être écrit dans de nombreux langages différents, et finalement ils sont compilés en opcode pour être exécutés sur EVM, et aujourd’hui nous avons choisi d’utiliser le langage JavaScript de la classe Solidity, qui est actuellement le meilleur langage EVM.

contract Test {
  uint storedData; // State variable

  struct Voter { // Struct
    uint weight;
    bool voted;
    address delegate;
    uint vote;
  }

  event HighestBidIncreased(address bidder, uint amount); // Event

  function func() { // Function
    if (msg.sender.balance < 10 finney) {
        msg.sender.send(10 finney);
    }

    sha256("...");

    address nameServer = 0x72ba7d8e73fe8eb666ea66babc8116a41bfb10e2;
    nameServer.delegatecall("isAvailable", "MyName");
    nameServer.call("register", "MyName");
  }
}

Voici quelques exemples de syntaxe de base, dans Solidity, vous pouvez déclarer des variables d’étatuint storedData;Les valeurs de ces variables sont conservées en permanence sur la blockchain.structPour déclarer des structures de données complexes; Il est également possible de définir des fonctions, qui sont exécutées lors de la réception de la transaction, et l’initiateur de la transaction peut choisir les fonctions à exécuter, de sorte qu’un contrat peut fournir plusieurs fonctions, dans lesquelles des jugements logiques, des cycles et des modifications peuvent être effectués.

Le langage est doté de fonctionnalités utiles, telles que les algorithmes de cryptographie courants.sha256Unité de conversion10 finneyIl a écrit à l’adresse suivante:0x72ba7d8e73fe8eb666ea66babc8116a41bfb10e2(voir aussi)msgContract est une variable globale intégrée qui permet de lire des informations relatives à la transaction, telles que l’initiateur, le montant, etc. Contract peut appeler le code d’un autre Contract de deux manières:delegatecallL’équivalent est de placer le code d’un autre Contract dans le contexte d’exécution actuel, comme si on introduisait une fonction de bibliothèque; etcallIl s’agit de lancer une nouvelle transaction pour déclencher une autre logique de Contract.

Cette tâche compliquée est abstraite en tant que “variable d’état” et storedData est une variable d’état. En fait, les modifications apportées aux variables d’état lors de l’exécution d’un contrat ne sont pas enregistrées dans la blockchain, car l’exécution d’un contrat est un calcul déterministe.

Voici un exemple d’un contrat qui fonctionne réellement et qui émet son propre jeton basé sur le réseau Ethereum:

contract Coin {
    // The keyword "public" makes those variables
    // readable from outside.
    address public minter;
    mapping (address => uint) public balances;

    // Events allow light clients to react on
    // changes efficiently.
    event Sent(address from, address to, uint amount);

    // This is the constructor whose code is
    // run only when the contract is created.
    function Coin() {
        minter = msg.sender;
    }
    function mint(address receiver, uint amount) {
        if (msg.sender != minter) return;
        balances[receiver] += amount;
    }
    function send(address receiver, uint amount) {
        if (balances[msg.sender] < amount) return;
        balances[msg.sender] -= amount;
        balances[receiver] += amount;
        Sent(msg.sender, receiver, amount);
    }
}

Le code provient dehttp://solidity.readthedocs.io/en/latest/introduction-to-smart-contracts.html#subcurrency-example (MIT)

Le contrat, appelé Coin, déclare deux variables d’état:minterLe créateur de ce token est en train de construire la fonction ((function Coin()Dans la première transaction utilisée pour créer Contract, l’auteur de la transaction est attribué à cette variable; un tableau de mappage des numéros d’adresse de portefeuille est également déclaré.balances, est utilisé pour indiquer le solde de chaque adresse détenant le jeton.

mintCette fonction détermine si l’initiateur de la transaction est le créateur du jeton, et si c’est le cas, ajoute un certain nombre de jetons à l’adresse indiquée selon les paramètres de la fonction.sendCette fonction peut être appelée par n’importe qui et déduit une certaine quantité de solde de l’adresse de l’initiateur de la transaction (si elle a un solde suffisant), ajoutée à l’adresse de destination, ce qui équivaut à une fonction de transfert.

Nous avons aussi annoncé un nom:SentLes événements, les événements n’ont en fait aucun rôle pratique, mais seulement pour faciliter l’impression des événements critiques lors du débogage, ce qui facilitera la mise en œuvre des clients légers à l’avenir (les clients légers n’acceptent que les événements sans exécuter réellement le contrat).

blockchain-ethereum-mix

Ethereum fournit un IDE appelé Mix pour le démarrage de ce code, sur la droite de Mix, vous pouvez créer des blocs et des comptes pour tester votre contrat, et vous pouvez voir les changements de valeur de chaque variable d’état au cours de l’exécution. Il est à noter que le contrat, une fois publié, ne peut pas être modifié, puis le fonctionnement dépend entièrement de la transaction de quelqu’un d’autre.

Une fois que nous aurons terminé, nous pourrons publier le contrat sur le web avec le portefeuille Ethereum:

blockchain-ethereum-create-contract

Vous pouvez suivre ce contrat en cliquant sur l’interface détaillée du contrat:

blockchain-ethereum-wallet-contract

Vous pouvez voir à gauche les valeurs de deux variables d’état,minterJe ne sais pas si j’ai une adresse, mais j’ai une adresse.balancesParce que c’est une table de cartographie, vous pouvez entrer une adresse pour consulter le solde de ce contrat.sendOu peut-êtremintVous pouvez saisir les paramètres qui seront transmis à Contract. Puisque le but de la transaction est de transmettre un message, et non de transmettre de l’éther, nous n’avons pas besoin de définir le montant de la transaction.

Je vais vous parler d’un autre Contract très intéressant, qui a l’effet d’une “escroquerie ponce”, c’est-à-dire que vous pouvez payer 1 Ether à ce Contract pour rejoindre le jeu, et ensuite, chaque fois que trois personnes se joignent, vous payez 3 Ether à la personne qui a rejoint le jeu en premier:

contract Pyramid {
    struct Participant {
        address etherAddress;
    }

    Participant[] public participants;

    uint public payoutIdx = 0;

    // events make it easier to interface with the contract
    event NewParticipant(uint indexed idx);

    // fallback function - simple transactions trigger this
    function() {
        enter();
    }

    function enter() {
        if (msg.value < 1 ether) {
            msg.sender.send(msg.value);
            return;
        }

        if (msg.value > 1 ether) {
            msg.sender.send(msg.value - 1 ether);
        }

        uint idx = participants.length;
        participants.length += 1;
        participants[idx].etherAddress = msg.sender;

        NewParticipant(idx);

        // for every three new participants we can
        // pay out to an earlier participant
        if (idx != 0 && idx % 3 == 0) {
            // payout is triple, minus 10 % fee
            uint amount = 3 ether;
            participants[payoutIdx].etherAddress.send(amount);
            payoutIdx += 1;
        }
    }

    function getNumberOfParticipants() constant returns (uint n) {
        return participants.length;
    }
}

Code simplifié<https://ethereumpyramid.com/contract.html

Le code est assez simple, le Contract déclare unparticipantsL’array est utilisé pour stocker les adresses de portefeuille de tous les participants dans l’ordre, ou pour déclarer unpayoutIdxIl est utilisé pour enregistrer le nombre de participants ayant déjà reçu 3 Ether.enterLa fonction principale de ce contrat est d’abord de vérifier les paramètres pour s’assurer que chaque participant a payé 1 Ether, puis de placer les nouveaux participants dans le groupe de participants.participantsÀ la fin de l’arrêté, si le numéro de série du participant actuel est un multiple de 3, envoyez 3 éthers au premier participant.payoutIdxUn participant, et il y en aura toujours un.payoutIdxPour le prochain participant:

Liens de référence

HashTree:

  • Il est également connu pour être le créateur de la plate-forme de trading Bitcoin, la plate-forme de négociation Bitcoin, et la plate-forme de trading Bitcoin.
  • La preuve de réserve à 100%
  • Les modèles d’objets Git

Bitcoin:

Halting Problem:

  • Les limites du calcul (II): l’auto-référence et l’indéterminé

Ethereum:

Ethereum Network:

Next of Ethereum:

Contract:

Contract IDE: