Appels API sur Blockchain; meilleures pratiques pour la collecte de données
La plupart des ingénieurs logiciels, lorsqu’ils cherchent à obtenir des données de l’extérieur de leurs programmes, cherchent à obtenir des données de Appels API ou HTTP GET / POST demandes. De même, sur une blockchain, les gens cherchent également à obtenir des données d’une API externe. Cet article vous apprendra comment faire cela! Commençons, voici la première étape:
Je t’ai eu.
En fait, vous ne pouvez pas obtenir les données d’un appel d’API de la même manière que vous obtenez les données des applications logicielles normales. Cependant, pour que nos contrats intelligents fassent quelque chose d’utile, nous voudrions qu’ils interagissent avec le monde extérieur. Alors qu’est-ce qui donne?
La blockchain Ethereum a été conçue pour être entièrement déterministe. Cela signifie que si je prends toute l’histoire du réseau, puis la rejoue sur mon ordinateur, je dois toujours me retrouver avec le bon état.
Étant donné qu’Internet n’est pas déterministe et change au fil du temps, chaque fois que je rejouais toutes les transactions sur le réseau, je recevais une réponse différente.
Au lieu que le contrat appelle directement l’API, nous devons le faire appeler une application qui peut interagir avec le monde extérieur et lui faire enregistrer ses résultats en chaîne. Ils sont appelés Oracles. Oracles est une application qui interagit avec les données du monde extérieur et les rapporte en chaîne.
Si nous rejouions la chaîne sans oracles et utilisions des appels API réguliers, les appels API pourraient avoir changé et nous obtiendrions des résultats différents.
Merci pour la mise à jour de la définition de la technicité, mais comment puis-je obtenir mes données dans mon application de solidité?
Ok ok, voyons ce pour quoi vous êtes venu ici. Dans notre exemple, nous allons simplement essayer d’obtenir le prix de l’ETH en USD.
Pour les débutants:
Maintenant, si vous êtes un TOTAL NOOB ici avec ce Remix, solidity, Chainlink et que vous voulez un guide étape par étape, n’hésitez pas à consulter mon guide plus approfondi: Rédigez votre premier contrat de solidité ou Documentation de Chainlink. Nous étions tous des imposteurs une fois: D
Pour les utilisateurs légèrement expérimentés ou avancés, y compris le remix:
Vous pouvez suivre tout le code et le déployer avec moi dans Remixez ici (code inclus dans l’hyperlien). Accédez à la section Gists. N’oubliez pas d’envoyer LINK à vos contrats après leur déploiement, sinon vous obtiendrez une erreur d’estimation de gaz. Tu peux recevoir ropsten LINK ici.
Une autre remarque: j’ai tendance à utiliser oracle et node de manière interchangeable, bien que techniquement pas correct, la distinction entre les deux pour cet article est négligeable.
La première approche avec laquelle la plupart des ingénieurs de la blockchain commencent est simplement de trouver une technologie oracle, en lui donnant l’URL de notre appel API, puis de le faire faire son rapport de données en chaîne pour que nous interagissions. Il existe un certain nombre d’oracles que nous pouvons utiliser pour ce faire. Nous utiliserons Maillon de chaîne pour des raisons que vous verrez bientôt.
Pour utiliser Chainlink, nous devons d’abord choisir un oracle / nœud Chainlink. Ce sont des contrats intelligents exploités indépendamment sur la blockchain qui vous permettent d’interagir avec le monde. Pour en trouver un, nous pouvons accéder aux services de liste de nœuds comme Linkpool Market.Linket choisissez simplement un nœud. Nous devons ensuite nous assurer que le nœud a un travail «http Get> uint256». Tous les nœuds ne peuvent pas faire d’appels URL et renvoyer un Uint256 (essentiellement un Int), mais la plupart le font!
Le nœud que nous avons choisi était un nœud Linkpool à l’adresse de la variable ORACLE. Toute la magie se produit dans le requestEthereumPrice
une fonction. Si vous avez déjà suivi les didacticiels de Chainlink, vous savez que c’est le moyen le plus simple d’obtenir des données à l’aide de Chainlink.
C’est bien! Nous pouvons obtenir des données. C’est bien si vous ne faites que tester et que vous souhaitez développer rapidement votre code, mais ne l’utilisez pas pour un contrat intelligent de production. Pourquoi? Il vient avec un problème majeur:
Vous tirez d’un oracle et d’un fournisseur de données. Maintenant, Linkpool est l’un des services de nœuds Chainlink les plus fiables, mais votre application doit être sans confiance. Non seulement cela, mais vous obtenez également vos données d’une seule source, vous avez maintenant DEUX points de défaillance dans votre application. CryptoCompare et LinkPool sont tous deux des responsabilités massives qui peuvent être facilement corrigées. C’est un point digne d’éloge que je vous épargnerai d’ici, mais permettez-moi de l’explorer une fois de plus.
Votre contrat intelligent ne doit jamais avoir un seul point de défaillance, car ce point peut être corrompu, piraté, hors service au moment de l’exécution, ou de nombreuses autres raisons qui laissent votre contrat intelligent sans valeur.
Alors, comment pouvons-nous résoudre ce problème?
Nous avons fait un pas en avant et avons choisi 3 nœuds vers lesquels nous acheminerons nos appels d’API, atténuant considérablement le problème de l’approche naïve. Maintenant, pour obtenir le prix, nous avons ajouté un median
fonction, qui prend la médiane de toutes les réponses fournies. De cette façon, si un ou deux donnent des réponses très différentes, nous sommes plus susceptibles d’obtenir toujours la vraie valeur de l’ETH. Vous pouvez voir comment l’ajout de nœuds supplémentaires augmenterait le peu de confiance que vous devez accorder à chaque nœud.
Idéalement, nous choisirions également différents fournisseurs de données, mais pour simplifier, j’ai conservé les mêmes dans les exemples. Idéalement, continuez, vous aimeriez même plus de 3 nœuds, mais au moins maintenant il n’y a pas de points de défaillance uniques. À l’heure actuelle, 7 ou 21 nœuds semblent être considérés comme «décents». Pourquoi 7 et 21? Aucune idée.
C’est donc bien mieux! Bien qu’il y ait beaucoup de code dans cela, existe-t-il un moyen plus simple de router mes appels d’API vers plusieurs nœuds?
Je suis content que tu aies demandé.
Celui-ci nécessite une étape supplémentaire. Vous remarquerez que dans le lien de remix, il y avait un fichier qui n’était que deux lignes de code.
pragma solidity ^0.5.0;import "github.com/smartcontractkit/chainlink/evm-contracts/src/v0.5/PreCoordinator.sol";
C’est ça.
Ce que cela fait, c’est qu’il crée ce qu’on appelle un contrat de service. Cela prend une liste d’adresses oracle et d’ID de travail que vous lui donnez, et va étendre votre appel API à tous ces oracles, prendre la médiane et tout pour vous, en utilisant la syntaxe de l’approche naïve!
Déployer leprecoordinator.sol
, et dans l’interface graphique, ajoutez vos adresses oracle, jobID
paiements (100000000000000000 = 0,1 LIEN), et _minResponses
. Il s’agit du nombre minimum de réponses nécessaires de chaque oracle.
Supposons que vous ayez 5 oracles et seulement 2 répondent. Si vous définissez les réponses minimales à 3, cela annulerait le reste de votre contrat intelligent. Ce qui est idéal, car si nous n’avons pas assez d’oracles pour répondre, ce sera moins décentralisé.
Une fois que vous lancez un accord de service, vous pouvez utiliser l’adresse de l’accord de service comme adresse Oracle et l’ID de l’accord de service comme adresse jobID
. Vous remarquerez que la syntaxe de cette étape est presque identique à l’approche naïve. C’est ainsi qu’une fois que vous avez fait tous vos tests avec un seul oracle et que vous êtes prêt à passer à la production, vous pouvez simplement lancer un contrat de service et changer l’oracle et jobID
, mais gardez tout le reste de votre code est le même.
Il est alors facile de créer de nouveaux accords de service en utilisant différents oracles si vous décidez que certains des oracles que vous utilisez vous donnent de mauvaises réponses. Vous pouvez le faire sans avoir à réécrire l’un de vos codes existants, il suffit d’échanger les ID pour le nouvel accord de service.
Je ne sais pas pour vous, mais j’aime ça quand je dois faire moins de travail pour en faire plus.
Cette étape est le plus de contrôle que vous pouvez avoir sur un réseau Chainlinked. Vous pouvez choisir vos nœuds, vos fournisseurs de données, les intégrer et les modifier facilement.
Remarque sur les fournisseurs de données: pour le moment, le pré-coordinateur ne peut envoyer le même package de données qu’à chaque fournisseur, ce qui signifie que si la sortie JSON de différentes API de données est différente, vous devez envoyer des chemins de copie différents. La façon d’envoyer les mêmes informations tout en utilisant différents fournisseurs de données consiste à les regrouper adaptateur externe qui formate leurs sorties pour qu’elles soient identiques. Restez à l’affût des mises à jour sur la façon de procéder!
De nombreuses technologies oracles ont également une solution prête à l’emploi. Chainlink n’est pas différent. Ils ont pris du temps pour examiner plusieurs nœuds et fournisseurs de données pour fournir des flux de données sur un certain nombre de flux à prix élevé à toute personne à utiliser.
J’ai déjà écrit à leur sujet dans Construire des contrats intelligents, intelligemment, et ils sont le summum de la simplicité et de la décentralisation.
Vous pouvez trouver une liste des contrats de référence qu’ils ont sur leur page des flux. La SEULE partie qui le rend plus centralisé, c’est que Chainlink a choisi la liste des nœuds, cela signifie que vous devez faire un peu confiance à la capacité de choix de nœud de l’équipe Chainlink. Cependant, si vous voulez une réponse pré-encadrée où la maintenance de la décentralisation est externalisée à l’équipe Chainlink, c’est un énorme avantage.
L’autre meilleure partie de cela est que c’est actuellement gratuit, et est parrainé par des sociétés impressionnantes comme Synthetix. Je suis sûr qu’à l’avenir cela va changer car ce n’est pas un modèle durable.