Immersion en développement sur Ethereum. Partie 5: Oraclize

L'accĂšs Ă  des fichiers volumineux et Ă  diverses donnĂ©es dynamiques externes est souvent une partie trĂšs importante d'une application dĂ©centralisĂ©e. Dans le mĂȘme temps, Ethereum lui-mĂȘme ne fournit pas de mĂ©canisme pour se tourner vers l'extĂ©rieur - les contrats intelligents ne peuvent ĂȘtre lus et Ă©crits que dans la blockchain elle-mĂȘme. Dans cet article, nous considĂ©rerons Oraclize, qui permet simplement d'interagir avec le monde extĂ©rieur en interrogeant presque toutes les ressources Internet. Un sujet connexe est IPFS, et mentionnez-le briĂšvement.



IPFS


IPFS est un systĂšme de fichiers distribuĂ© avec adressage de contenu. Cela signifie que pour le contenu de tout fichier qui y est ajoutĂ©, un hachage unique est pris en compte. Le mĂȘme hachage est ensuite utilisĂ© pour rechercher et rĂ©cupĂ©rer ce contenu Ă  partir du rĂ©seau.
Les informations de base ont déjà été décrites dans cet article et dans plusieurs autres, nous ne voyons donc aucune raison de répéter.

Pourquoi utiliser IPFS en conjonction avec Ethereum?


Sauvegarder tout contenu de volume sur la blockchain est trop cher et dangereux pour le réseau. Par conséquent, la meilleure option consiste à enregistrer une sorte de lien vers le fichier situé dans le stockage hors chaßne, pas nécessairement IPFS. Mais IPFS présente un certain nombre d'avantages:

  • Un lien de fichier est un hachage qui est unique au contenu spĂ©cifique du fichier, donc si nous mettons ce hachage sur la blockchain, nous pouvons ĂȘtre sĂ»rs que le fichier reçu est celui qui a Ă©tĂ© ajoutĂ© Ă  l'origine, le fichier ne peut pas ĂȘtre remplacĂ©
  • Le systĂšme distribuĂ© assure contre l'indisponibilitĂ© d'un serveur spĂ©cifique (en raison d'un blocage ou pour d'autres raisons)
  • Le lien vers le fichier et la confirmation de hachage sont combinĂ©s sur une seule ligne, ce qui signifie que vous pouvez Ă©crire moins sur la blockchain et Ă©conomiser du gaz

Parmi les lacunes, on peut mentionner que puisqu'il n'y a pas de serveur central, alors pour l'accessibilité des fichiers il faut qu'au moins un fichier soit «distribué». Mais si vous avez un fichier spécifique, la connexion aux distributeurs est facile - démarrez votre démon ipfs et ajoutez le fichier via ipfs add .

La technologie est trÚs adaptée à l'idéologie de la décentralisation, par conséquent, en considérant Oraclize maintenant, nous rencontrerons souvent l'utilisation d'IPFS dans différents mécanismes oracle.

Oraclize


Pour effectuer presque tous les travaux utiles, un contrat intelligent doit recevoir de nouvelles donnĂ©es. Cependant, il n'y a pas de capacitĂ© intĂ©grĂ©e pour rĂ©pondre Ă  une demande de la blockchain au monde extĂ©rieur. Bien sĂ»r, vous pouvez ajouter manuellement tout ce qui est requis par les transactions, mais il est impossible de vĂ©rifier d'oĂč proviennent ces donnĂ©es et leur fiabilitĂ©. De plus, vous devrez peut-ĂȘtre organiser une infrastructure supplĂ©mentaire pour mettre Ă  jour rapidement les donnĂ©es dynamiques, telles que les taux de change. Et les mises Ă  jour Ă  intervalle fixe entraĂźneront des dĂ©passements de gaz.

Par consĂ©quent, le service fourni par Oraclize est pratique: dans un contrat intelligent, vous pouvez envoyer une demande Ă  presque n'importe quelle API ou ressource sur Internet, assurez-vous que les donnĂ©es reçues de la ressource spĂ©cifiĂ©e sont inchangĂ©es et utilisez le rĂ©sultat dans le mĂȘme contrat intelligent.

Oraclize n'est pas seulement un service Ethereum, des fonctionnalités similaires sont fournies à d'autres blockchains, mais nous ne décrirons le bundle qu'avec Ethereum.

Pour commencer


Tout ce qui est nécessaire pour commencer est d'ajouter l'un des fichiers oraclizeAPI du référentiel au projet. Il vous suffit de choisir celui qui convient à votre version du compilateur (solc): oraclizeAPI_0.5.sol pour les versions à partir de 0.4.18, oraclizeAPI_0.4.sol pour les versions à partir de 0.4.1, oraclizeAPI_pre0.4.sol pour tout ce qui est plus ancien, support Cette version a déjà été abandonnée. Si vous utilisez la truffe, n'oubliez pas de renommer le fichier à l'aide d'Oraclize - cela nécessite que le nom du fichier et le contrat correspondent.

En incluant le fichier approprié dans votre projet, vous usingOraclize le contrat de l' usingOraclize d' usingOraclize . Et vous pouvez commencer à utiliser Oracle, ce qui se résume à deux choses principales: envoyer une demande à l'aide de l'assistant oraclize_query , puis traiter le résultat dans la fonction __callback . Le contrat intelligent le plus simple (pour obtenir le prix actuel du temps d'antenne en dollars) pourrait ressembler à ceci:

 pragma solidity 0.4.23; import "./usingOraclize.sol"; contract ExampleContract is usingOraclize { string public ETHUSD; event updatedPrice(string price); event newOraclizeQuery(string description); function ExampleContract() payable { updatePrice(); } function __callback(bytes32 myid, string result) { require (msg.sender == oraclize_cbAddress()); ETHUSD = result; updatedPrice(result); } function updatePrice() payable { if (oraclize_getPrice("URL") > this.balance) { newOraclizeQuery("Oraclize query was NOT sent, please add some ETH to cover for the query fee"); } else { newOraclizeQuery("Oraclize query was sent, standing by for the answer.."); oraclize_query("URL", "json(https://api.coinmarketcap.com/v1/ticker/ethereum/?convert=USD).0.price_usd"); } } } 

La fonction qui envoie la demande est updatePrice . Vous pouvez voir qu'en premier lieu, il est vĂ©rifiĂ© que oraclize_getPrice(“URL”) supĂ©rieur au solde actuel du contrat. En effet, l'appel oraclize_query doit ĂȘtre payĂ©, le prix est calculĂ© comme la somme de la commission fixe et du paiement de gaz pour appeler le rappel. “URL” est une dĂ©signation d'un des types de sources de donnĂ©es, dans ce cas, il s'agit d'une simple demande via https, puis nous considĂ©rerons d'autres options. Les rĂ©ponses sur demande peuvent ĂȘtre analysĂ©es Ă  l'avance en json (comme dans l'exemple) et de plusieurs autres maniĂšres (nous examinerons plus loin). Une ligne de __callback est retournĂ©e dans __callback . Au tout dĂ©but, il est vĂ©rifiĂ© que l'appel passĂ© depuis l'adresse de confiance oraclize

Toutes les options pour utiliser oraclize sont construites selon un schéma, seules les sources de données et la possibilité d'ajouter une authentification à __callback . Par conséquent, dans les exemples futurs, nous ne citerons que des différences importantes.

Utiliser le prix


Comme dĂ©jĂ  mentionnĂ©, de l'Ă©ther supplĂ©mentaire est payĂ© pour les demandes oraclize, et il est retirĂ© du solde du contrat, et non de l'adresse d'appel. Une exception est seulement la premiĂšre demande de chaque nouveau contrat, elle est fournie gratuitement. Il est Ă©galement intĂ©ressant de noter que les mĂȘmes mĂ©canismes sont conservĂ©s dans les rĂ©seaux de test, mais le paiement est effectuĂ© en diffusant le rĂ©seau correspondant, c'est-Ă -dire que dans les demandes de testnet sont pratiquement gratuites.

Il a déjà été mentionné que le prix demandé se compose de deux valeurs: une commission fixe et le paiement d'un rappel de gaz. Une commission fixe est définie en dollars et le montant de l'éther est calculé à partir du taux actuel. La commission dépend de la source des données et des mécanismes de soutien supplémentaires, sur lesquels nous nous attarderons. Le tableau des prix actuel ressemble à ceci:


Comme vous pouvez le voir, le prix par demande d'URL est de plusieurs cents. Est-ce beaucoup ou peu? Pour ce faire, considérons combien coûte la deuxiÚme partie - les frais de gaz de rappel.
Cela fonctionne selon le schĂ©ma suivant: la quantitĂ© d'Ă©ther nĂ©cessaire pour payer une quantitĂ© fixe de gaz Ă  un prix fixe est transfĂ©rĂ©e Ă  l'avance avec la demande du contrat. Ce montant devrait ĂȘtre suffisant pour effectuer un rappel, et le prix devrait ĂȘtre adaptĂ© au marchĂ©, sinon la transaction ne se fera pas ou se bloquera trĂšs longtemps. Dans le mĂȘme temps, il est clair qu'il n'est pas toujours possible de connaĂźtre la quantitĂ© de gaz Ă  l'avance, par consĂ©quent, la planche doit Ă©galement ĂȘtre en rĂ©serve (la rĂ©serve n'est pas restituĂ©e). Les valeurs par dĂ©faut sont une limite de 200 000 gaz au prix de 20 gwei. Cela suffit pour un rappel moyen avec plusieurs entrĂ©es et une sorte de logique. Et le prix de 20 gwei, bien qu'il puisse sembler trop Ă©levĂ© pour le moment (au moment de la rĂ©daction, la moyenne est de 4 gwei), mais au moment de l'afflux de transactions, le prix du marchĂ© peut soudainement sauter et ĂȘtre encore plus Ă©levĂ©, donc en gĂ©nĂ©ral, ces valeurs sont proches de celles rĂ©ellement utilisĂ©es. Ainsi, avec de telles valeurs et le prix de l'air dans la rĂ©gion de 500 $, les paiements de gaz approcheront 2 $, nous pouvons donc dire qu'une commission fixe prend une petite partie.

Si vous savez ce que vous faites, il existe une option pour modifier la limite et le prix du gaz, économisant ainsi considérablement sur les demandes.

Le prix du gaz peut ĂȘtre dĂ©fini par une fonction distincte - oraclize_setCustomGasPrice(< wei>) . AprĂšs l'appel, le prix est enregistrĂ© et utilisĂ© dans toutes les demandes suivantes.
La limite peut ĂȘtre dĂ©finie dans la requĂȘte oraclize_query - oraclize_query , en la spĂ©cifiant avec le dernier argument, par exemple comme ceci:

 oraclize_query("URL", "<>", 50000); 

Si vous avez une logique complexe dans __callback et que le gaz est consommé plus de 200k, alors vous devrez certainement définir une limite qui couvre le pire des cas de consommation de gaz. Sinon, si la limite est dépassée, __callback simplement __callback .

Soit dit en passant, oraclize a récemment obtenu des informations que vous pouvez payer pour des demandes en dehors de la blockchain, ce qui vous permettra de ne pas dépenser la totalité de la limite ou de retourner le solde (et le paiement ne provient pas du contrat). Nous n'avons pas encore eu à l'utiliser, mais oraclize propose de les contacter à info@oraclize.it, si cette option est intéressante. Par conséquent, gardez à l'esprit.

Comment ça marche


Pourquoi, ayant hĂ©ritĂ© d'un contrat intelligent rĂ©gulier, obtenons-nous des fonctionnalitĂ©s qui n'Ă©taient pas initialement prises en charge par les mĂ©canismes de la chaĂźne de blocs? En fait, le service Oracle ne consiste pas seulement en contrats avec des fonctions d'assistance. Le principal travail d'obtention des donnĂ©es est effectuĂ© par un service externe. Les contrats intelligents forment des applications pour accĂ©der aux donnĂ©es externes et les mettent sur la blockchain. Service externe - surveille les nouveaux blocs de la blockchain et s'il dĂ©tecte une application - l'exĂ©cute. SchĂ©matiquement, cela peut ĂȘtre reprĂ©sentĂ© comme suit:


Sources de données


En plus de l' URL considérée, oraclize propose 4 autres options (que vous avez vues dans la section sur les prix): WolframAlpha , IPFS , random et computation . Examinons chacun d'eux.

1. URL


L'exemple dĂ©jĂ  discutĂ© utilise cette source de donnĂ©es. Il s'agit de la source des requĂȘtes HTTP vers diverses API. L'exemple Ă©tait le suivant:

 oraclize_query("URL", "json(https://api.coinmarketcap.com/v1/ticker/ethereum/?convert=USD).0.price_usd"); 

C'est le prix de l'Ă©ther, et comme api fournit une chaĂźne json avec un ensemble de donnĂ©es, la demande est enveloppĂ©e dans un analyseur json et retourne uniquement le champ dont nous avons besoin. Dans ce cas, il s'agit de GET, mais l'URL source prend Ă©galement en charge les requĂȘtes POST. Le type de demande est automatiquement dĂ©terminĂ© par un argument supplĂ©mentaire. S'il y a un json valide comme dans cet exemple:

 oraclize_query("URL", "json(https://shapeshift.io/sendamount).success.deposit", '{"pair":"eth_btc","amount":"1","withdrawal":"1AAcCo21EUc1jbocjssSQDzLna9Vem2UN5"}') 

puis la demande est traitĂ©e comme POST (l'api utilisĂ©e est dĂ©crite ici , si vous ĂȘtes intĂ©ressĂ©)

2. WolframAlpha


Cette source de données vous permet d'accéder au service WolframAlpha , qui peut fournir des réponses à diverses demandes de faits ou de calculs, par exemple

 oraclize_query(“WolframAlpha”, “president of Russia”) 

retournera Vladimir Putin , et demander

 oraclize_query(“WolframAlpha”, “solve x^2-4”) 

renverra x = 2 .
Comme vous pouvez le voir, le rĂ©sultat a Ă©tĂ© incomplet car le symbole ± a Ă©tĂ© perdu. Par consĂ©quent, avant d'utiliser cette source, vous devez vĂ©rifier que la valeur d'une demande spĂ©cifique peut ĂȘtre utilisĂ©e dans un contrat intelligent. De plus, l'authentification n'est pas prise en charge pour les rĂ©ponses. Par consĂ©quent, oraclize lui-mĂȘme recommande que cette source soit utilisĂ©e uniquement pour les tests.

3. IPFS


Comme vous pouvez le deviner, il vous permet de récupérer le contenu d'un fichier dans IPFS à l'aide d'un multi-hachage. Le délai de réception du contenu est de 20 secondes.

 oraclize_query(“IPFS”, “QmTL5xNq9PPmwvM1RhxuhiYqoTJcmnaztMz6PQpGxmALkP”) 

reviendra Hello, Habr! (si le fichier avec ce contenu est toujours disponible)

4. aléatoire


La gĂ©nĂ©ration de nombres alĂ©atoires fonctionne de la mĂȘme maniĂšre que les autres sources, mais si vous utilisez oraclize_query , la prĂ©paration des arguments prend du temps. Pour Ă©viter cela, vous pouvez utiliser la oraclize_newRandomDSQuery(delay, nbytes, customGasLimit) assistance oraclize_newRandomDSQuery(delay, nbytes, customGasLimit) , en dĂ©finissant uniquement le dĂ©lai d'exĂ©cution (en secondes), le nombre d'octets gĂ©nĂ©rĂ©s et la limite de gaz pour appeler __callback .
L'utilisation de random a quelques éléments à garder à l'esprit:

  • Pour confirmer que le nombre est rĂ©ellement alĂ©atoire, un type spĂ©cial de vĂ©rification est utilisĂ© - Ledger, qui peut ĂȘtre effectuĂ© sur la blockchain (contrairement Ă  tout le monde, mais plus Ă  ce sujet plus tard). Cela signifie que dans le constructeur du contrat intelligent, vous devez dĂ©finir cette mĂ©thode de vĂ©rification par la fonction:

     oraclize_setProof(proofType_Ledger); 

    Et au dĂ©but du rappel, il devrait y avoir un contrĂŽle lui-mĂȘme:

      function __callback(bytes32 _queryId, string _result, bytes _proof) { require (oraclize_randomDS_proofVerify__returnCode(_queryId, _result, _proof) == 0) ); <...> 

    Cette vérification nécessite un vrai réseau et ne fonctionnera pas sur la ganache, donc pour les tests locaux, vous pouvez supprimer temporairement cette ligne. Soit dit en passant, le troisiÚme argument de __callback est le paramÚtre _proof facultatif. Il est toujours requis lorsque l'un des types de confirmation est utilisé.
  • Si vous utilisez un nombre alĂ©atoire pour les moments critiques, par exemple, pour dĂ©terminer le gagnant de la loterie, capturez les entrĂ©es des utilisateurs avant d'envoyer newRandomDSQuery. Sinon, cette situation peut se produire: oraclize appelle _callback et la transaction est visible par tous dans la liste en attente. ParallĂšlement Ă  cela, le nombre alĂ©atoire lui-mĂȘme est visible. Si les utilisateurs peuvent continuer, grosso modo, Ă  faire des paris, ils pourront alors spĂ©cifier un prix du gaz plus Ă©levĂ© et pousser leur taux avant que _callback ne soit exĂ©cutĂ©, sachant Ă  l'avance qu'il gagnera.


5. calcul


C'est la plus flexible des sources. Il vous permet d'Ă©crire vos propres scripts et de les utiliser comme source de donnĂ©es. L'informatique a lieu sur AWS. Pour l'exĂ©cution, vous devez dĂ©crire le Dockerfile et le mettre ensemble avec des fichiers supplĂ©mentaires arbitraires dans une archive zip, et tĂ©lĂ©charger l'archive dans IPFS. La mise en Ɠuvre doit remplir les conditions suivantes:

  • Écrivez la rĂ©ponse que vous souhaitez retourner avec la derniĂšre ligne dans stdout
  • La rĂ©ponse ne doit pas dĂ©passer 2500 caractĂšres
  • L'initialisation et l'exĂ©cution ne devraient pas prendre plus de 5 minutes au total

Pour un exemple de la façon dont cela est fait, nous verrons comment effectuer l'union la plus simple des lignes transmises et renvoyer le résultat.

Dockerfile:

 FROM ubuntu:16.04 MAINTAINER "info@rubyruby.ru" CMD echo "$ARG0 $ARG1 $ARG2 $ARG3" 

Variables d'environnement ARG0 , ARG1 , etc. - Ce sont les paramĂštres transmis avec la demande.
Ajoutez le dockerfile à l'archive, démarrez le serveur ipfs et ajoutez cette archive là

 $ zip concatenation.zip Dockerfile $ ipfs daemon & $ ipfs add concatenation.zip QmWbnw4BBFDsh7yTXhZaTGQnPVCNY9ZDuPBoSwB9A4JNJD 

Nous utilisons le hachage résultant pour envoyer la demande via oraclize_query dans le contrat intelligent:

 oraclize_query("computation", ["QmVAS9TNKGqV49WTEWv55aMCTNyfd4qcGFFfgyz7BYHLdD", "s1", "s2", "s3", "s4"]); 

Un tableau est utilisé comme argument, dans lequel le premier élément est l'archive multihash, et tous les autres sont les paramÚtres qui tombent dans les variables d'environnement.

Si vous attendez la fin de la demande, __callback résultat s1 s2 s3 s4 .

Assistants et sous-requĂȘtes de l'analyseur


À partir de la rĂ©ponse retournĂ©e par n'importe quelle source, vous pouvez prĂ©sĂ©lectionner uniquement les informations requises Ă  l'aide d'un certain nombre d'aides, telles que:

1. Analyseur JSON


Vous avez vu cette mĂ©thode dans le tout premier exemple, oĂč seul le prix a Ă©tĂ© retournĂ© Ă  partir du rĂ©sultat renvoyĂ© par coinmarketcap:

 json(https://api.coinmarketcap.com/v1/ticker/ethereum/?convert=USD).0.price_usd 

Le cas d'utilisation est assez évident, renvoyant par exemple:

 [ { "id": "ethereum", "name": "Ethereum", "symbol": "ETH", "rank": "2", "price_usd": "462.857", "price_btc": "0.0621573", "24h_volume_usd": "1993200000.0", "market_cap_usd": "46656433775.0", "available_supply": "100800968.0", "total_supply": "100800968.0", "max_supply": null, "percent_change_1h": "-0.5", "percent_change_24h": "-3.02", "percent_change_7d": "5.93", "last_updated": "1532064934" } ] 

Puisqu'il s'agit d'un tableau, nous prenons l'élément 0 , et de lui - le champ price_usd

2. XML


L'utilisation est similaire Ă  JSON, par exemple:

 xml(https://informer.kovalut.ru/webmaster/getxml.php?kod=7701).Exchange_Rates.Central_Bank_RF.USD.New.Exch_Rate 

3. HTML


Vous pouvez analyser XHTML Ă  l'aide de XPath. Par exemple, obtenez une capitalisation boursiĂšre avec etherscan:

 html(https://etherscan.io/).xpath(string(//*[contains(@href, '/stat/supply')]/font)) 

MARKET CAP OF $46.148 BillionB

4. Aide binaire


Vous permet de couper des piÚces à partir de données brutes à l'aide de la fonction tranche (décalage, longueur). Autrement dit, nous avons un fichier avec le contenu de "abc":

 echo "abc" > example.bin 

Mettez-le sur IPFS:

 $ ipfs add example.bin added Qme4u9HfFqYUhH4i34ZFBKi1ZsW7z4MYHtLxScQGndhgKE 

Coupez maintenant 1 caractĂšre du milieu:

 binary(Qme4u9HfFqYUhH4i34ZFBKi1ZsW7z4MYHtLxScQGndhgKE).slice(1, 1) 

Dans la réponse, nous obtenons b

Comme vous l'avez peut-ĂȘtre remarquĂ©, dans le cas de l'assistant binaire, ce n'est pas la source IP qui a Ă©tĂ© utilisĂ©e, mais IPFS. En fait, les analyseurs peuvent ĂȘtre appliquĂ©s Ă  toutes les sources, disons qu'il n'est pas nĂ©cessaire d'appliquer JSON Ă  ce qui renvoie l'URL, vous pouvez ajouter un tel contenu au fichier:

 { "one":"1", "two":"2" } 

Ajoutez-le Ă  IPFS:

 $ ipfs add test.json added QmZinLwAq5fy4imz8ZNgupWeNFTneUqHjPiTPX9tuR7Vxp 

Et puis démontez comme ceci:

 json(QmZinLwAq5fy4imz8ZNgupWeNFTneUqHjPiTPX9tuR7Vxp).one 

Nous obtenons 1

Et un cas d'utilisation particuliĂšrement intĂ©ressant consiste Ă  combiner toutes les sources de donnĂ©es et tous les analyseurs en une seule demande. Cela est possible Ă  l'aide d'une source de donnĂ©es nested distincte. Nous utilisons le fichier que nous venons de crĂ©er dans une requĂȘte plus complexe (ajout de valeurs dans deux champs):

 [WolframAlpha] add ${[IPFS] json(QmZinLwAq5fy4imz8ZNgupWeNFTneUqHjPiTPX9tuR7Vxp).one} to ${[IPFS] json(QmZinLwAq5fy4imz8ZNgupWeNFTneUqHjPiTPX9tuR7Vxp).two} 

Nous obtenons 3
La demande est formĂ©e comme suit: spĂ©cifiez la source de donnĂ©es nested , puis pour chaque demande, ajoutez le nom de la source devant elle entre crochets et encadrez en outre toutes les sous-requĂȘtes dans ${..} .

Test


Oraclize fournit un service de validation de requĂȘte utile sans avoir besoin de contrats intelligents. Entrez simplement, choisissez une source de donnĂ©es, une mĂ©thode de vĂ©rification et vous pouvez voir qu'elle reviendra Ă  __callback si vous envoyez les demandes correspondantes

Pour une vérification locale en conjonction avec un contrat intelligent, vous pouvez utiliser une version spéciale de l'EDI Remix qui prend en charge les demandes oraclize.

Et pour vérifier localement avec la ganache, vous aurez besoin du pont ethereum , qui déploiera ou activera les contrats intelligents sur votre testnet. Pour les tests, ajoutez d'abord la ligne suivante au constructeur de votre contrat:

 OAR = OraclizeAddrResolverI(0x6f485C8BF6fc43eA212E93BBF8ce046C7f1cb475); 

courir

 ganache-cli 

Alors

 node bridge --dev 

Attendez que les contrats soient morts et vous pourrez tester. Dans la sortie du node bridge de node bridge vous pouvez voir les demandes envoyées et les réponses reçues.

Une autre aide non seulement lors des tests, mais Ă©galement lors de l'utilisation rĂ©elle est la possibilitĂ© de surveiller les demandes ici . Si vous faites une demande sur un rĂ©seau public, vous pouvez utiliser le hachage de la transaction dans laquelle la demande est exĂ©cutĂ©e. Si vous utilisez l'authentification, gardez Ă  l'esprit qu'ils sont garantis pour ĂȘtre envoyĂ©s uniquement au rĂ©seau principal, pour les autres rĂ©seaux, il peut retourner 0. Si la demande Ă©tait sur le rĂ©seau local, vous pouvez utiliser l'ID de la demande, qui renvoie oraclize_query . Soit dit en passant, il est recommandĂ© de toujours conserver cet identifiant, par exemple, dans un mappage similaire:

 mapping(bytes32=>bool) validIds; 

Au moment de la demande, marquez l'ID envoyé comme true :

 bytes32 queryId = oraclize_query(<...>); validIds[queryId] = true; 

Et puis dans __callback vérifiez que la demande avec cet identifiant n'a pas encore été traitée:

 function __callback(bytes32 myid, string result) { require(validIds[myid] != bytes32(0)); require(msg.sender == oraclize_cbAddress()); validIds[myid] = bytes32(0); <...> 

Cela est nĂ©cessaire car __callback sur une demande peut ĂȘtre appelĂ©e plus d'une fois en raison des particularitĂ©s des mĂ©canismes Oraclize.

Authentification


Dans le tableau avec les sources, vous pouvez voir que diffĂ©rentes sources peuvent prendre en charge diffĂ©rents types de confirmations et que des frais diffĂ©rents peuvent ĂȘtre facturĂ©s. C'est une partie trĂšs importante d'Oraclize, mais une description dĂ©taillĂ©e de ces mĂ©canismes est un sujet distinct.

Le mĂ©canisme le plus couramment utilisĂ©, au moins par nous, est TLSNotary avec stockage dans IPFS. Le stockage dans IPFS est plus efficace car __callback ne __callback pas la preuve elle-mĂȘme (peut-ĂȘtre de l'ordre de 4 Ă  5 kilo-octets), mais un multi-hachage beaucoup plus petit. Pour spĂ©cifier ce type, ajoutez une ligne dans le constructeur:

 oraclize_setProof(proofType_TLSNotary | proofStorage_IPFS); 

Nous pouvons seulement dire que ce type, en gros, nous protÚge de l'inexactitude des données reçues d'Oraclize. Mais Oraclize utilise des serveurs Amazon, qui agissent en tant qu'auditeur, ils n'ont donc qu'à faire confiance.

Lisez plus ici .

Conclusion


Oraclize fournit des outils qui augmentent considĂ©rablement le nombre de cas d'utilisation pour les contrats intelligents, ainsi que IPFS, qui peuvent ĂȘtre vus dans plusieurs versions des requĂȘtes Oracle. Le principal problĂšme est que nous utilisons Ă  nouveau des donnĂ©es externes soumises aux menaces que la blockchain aurait dĂ» protĂ©ger: centralisation, capacitĂ©s de blocage, changements de code, usurpation de contenu. Mais bien que cela soit inĂ©vitable et que l'option d'obtenir des donnĂ©es soit trĂšs utile et viable, il vous suffit de savoir pourquoi l'utilisation de la blockchain a Ă©tĂ© introduite dans le projet et si l'utilisation de sources externes non fiables rĂ©duit les avantages Ă  zĂ©ro.

Si vous ĂȘtes intĂ©ressĂ© par certains sujets de dĂ©veloppement sur Ethereum qui n'ont pas encore Ă©tĂ© divulguĂ©s dans ces articles - Ă©crivez dans les commentaires, nous les couvrirons peut-ĂȘtre ci-dessous.

Immersion en développement sur Ethereum:
Partie 1: Introduction
Partie 2: Web3.js et le gaz
Partie 3: application utilisateur
Partie 4: déployer et déboguer dans la truffe, la ganache, l'infura

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


All Articles