portaldacalheta.pt
  • Κύριος
  • Σχεδιασμός Ux
  • Κερδοφορία & Αποδοτικότητα
  • Κύκλος Ζωής Προϊόντος
  • Ευκίνητος
Πίσω Μέρος

Ethereum Oracle Συμβόλαια: Ρύθμιση και προσανατολισμός



Τα Έξυπνα Συμβόλαια Ethereum είναι κάτι περισσότερο από το «νέο καυτό». Πιστεύω ότι αυτοί (ή κάτι σχετικό) είναι έτοιμοι να αλλάξουν τον τρόπο με τον οποίο οι άνθρωποι συνεργάζονται μεταξύ τους στην προσεχή νέα εποχή του Διαδικτύου. Ο χρόνος θα πει εάν συμβαίνει αυτό.

Αυτό είναι το πρώτο άρθρο με τρία μέρη Ανάπτυξη έξυπνων συμβάσεων Ethereum με το Solidity, εξερευνώντας πιο συγκεκριμένα τη χρήση συμβολαίων με τα λεγόμενα 'oracles' - που είναι βασικά συμβόλαια που αντλούν δεδομένα στο blockchain για χρήση από άλλα έξυπνα συμβόλαια.



  • Μέρος 1: Εισαγωγή στην ανάπτυξη με το Truffle και εγκατάσταση έργου για περαιτέρω πειραματισμό
  • Μέρος 2: Εξετάζοντας τον κώδικα για βαθύτερη εξέταση
  • Μέρος 3: Μια εννοιολογική συζήτηση για oracle με έξυπνα συμβόλαια

Ο στόχος αυτού, μέρος 1 της σειράς, δεν είναι να μπει πολύ στην έννοια των συμβάσεων της oracle, της φιλοσοφίας πίσω από αυτά, ή ακόμη και πολύ βαθιά σε αυτό που είναι. ο στόχος αυτού του μέρους του σεμιναρίου Ethereum oracle είναι απλώς να:



  • Ετοιμαστείτε να δημιουργήσετε έξυπνα συμβόλαια με την Truffle.
  • Δημιουργήστε ένα έξυπνο έργο συμβολαίου που θα μας εξυπηρετήσει στα μέρη 2 και 3.
  • Εισαγάγετε μερικές έννοιες που σχετίζονται με τα έξυπνα συμβόλαια Ethereum και την κωδικοποίηση έξυπνων συμβάσεων.
  • Παρουσιάστε τον κύκλο μεταγλώττισης / εκτέλεσης / εντοπισμού σφαλμάτων με Truffle και έξυπνα συμβόλαια.

Ορισμός: Oracle. Ένα μέσο για έξυπνες συμβάσεις για πρόσβαση σε δεδομένα από τον κόσμο εκτός του blockchain. Ένας τύπος έξυπνου συμβολαίου οι ίδιοι, τα oracle παίρνουν δεδομένα από τον έξω κόσμο και τα βάζουν στο blockchain για να καταναλώσουν άλλα έξυπνα συμβόλαια.



Το πρώτο μέρος αυτού του άρθρου θα περιλαμβάνει την προετοιμασία με όλες τις προϋποθέσεις. Στη συνέχεια, θα δημιουργήσουμε ένα ενιαίο συμβόλαιο Ethereum και θα το δοκιμάσουμε με το Truffle. Τέλος, θα διαχωρίσουμε το μαντείο από τον πελάτη και θα το δοκιμάσουμε από κοινού.

Απαιτήσεις λογισμικού

  • Οποιοδήποτε σημαντικό λειτουργικό σύστημα θα λειτουργήσει, αν και μέρος της εγκατάστασης και της εγκατάστασης φυσικά θα είναι διαφορετικό σε διαφορετικά συστήματα. Έχω κάνει όλα αυτά στο Ubuntu Linux (16.04). Δεν είχα επίσης προβλήματα με τη ρύθμιση του περιβάλλοντος στα Windows. Δεν έχω δοκιμάσει το Mac, αν και γνωρίζω ότι είναι συνηθισμένο να το κάνω και σε Mac.
  • Δεν είναι απαραίτητο να εκτελέσετε έναν πλήρη κόμβο eth. θα χρησιμοποιήσουμε το Truffle, το οποίο συνοδεύεται από το δικό του testnet. Εάν γνωρίζετε λίγα πράγματα για το τι κάνετε, μπορείτε να χρησιμοποιήσετε οποιοδήποτε άλλο testnet της επιλογής σας. Το τοπικό dev testnet της Truffle είναι απλώς το πιο εύκολο και πιο προσβάσιμο για τους σκοπούς αυτού του σεμιναρίου.

Απαιτήσεις γνώσης

  • Βασικές γνώσεις για το πώς λειτουργεί το blockchain
  • Κατανόηση του τι είναι ένα έξυπνο συμβόλαιο βασισμένο σε blockchain
  • Κάποια βασική γεια-κοσμική εμπειρία με την ανάπτυξη έξυπνων συμβολαίων θα είναι χρήσιμη, αλλά δεν είναι απαραίτητη εάν είστε έξυπνοι και φιλόδοξοι. (Και ξέρω ότι είσαι!)

Αυτή η σειρά άρθρου μπορώ χρησιμεύει ως μια πρώτη εισαγωγή στα έξυπνα συμβόλαια, αλλά αυξάνεται πολύ γρήγορα σε πιο προηγμένες ιδέες. Αν είναι ο πρώτος σας οδηγός έξυπνου συμβολαίου eth, ετοιμαστείτε να ανεβείτε γρήγορα στο υψόμετρο. Εάν αισθάνεστε σίγουροι, υπέροχοι. αν όχι, μη διστάσετε να πάρετε έναν απλούστερο τύπο «γειά σου κόσμου» ή πρώτα δύο στη ζώνη σας. Ολοκλήρωση αγοράς ένα από τα προηγούμενα άρθρα του Ethereum και Cryptozombies , για αρχαριους.



Caveat: Ο έξυπνος χώρος σύμβασης, που είναι τόσο νέος, αλλάζει γρήγορα. Οι δυνατότητες σύνταξης σταθερότητας που ήταν νέες κατά τη σύνταξη αυτού του άρθρου ενδέχεται να έχουν καταργηθεί ή να είναι παρωχημένες τη στιγμή που το διαβάζετε. Οι εκδόσεις Geth μπορεί να έχουν έρθει και να φύγει. Το Solidity προσθέτει πάντα νέες λειτουργίες γλώσσας και καταργεί τα παλιά. Πολλές νέες δυνατότητες βρίσκονται σε εξέλιξη. Επομένως, να είστε προετοιμασμένοι εάν είναι απαραίτητο για να προσαρμόσετε τις πληροφορίες σε αυτό το άρθρο στο νέο τοπίο του μέλλοντος. αν είστε σοβαροί για να μάθετε έξυπνη ανάπτυξη συμβολαίων, τότε έχω πίστη σε εσάς.

Περιγραφή του παραδείγματος εφαρμογής

Περίπτωση χρήσης: Οι χρήστες στοιχηματίζουν σε αγώνες πυγμαχίας.



  • Ο χρήστης μπορεί να τραβήξει μια λίστα με στοιχήματα αγώνων πυγμαχίας.
  • Ο χρήστης μπορεί να επιλέξει έναν αγώνα και να ποντάρει στον νικητή.
  • Ο χρήστης μπορεί να ποντάρει οποιοδήποτε ποσό πάνω από ένα καθορισμένο ελάχιστο.
  • Εάν η επιλογή του χρήστη χάσει, ο χρήστης χάνει ολόκληρο το ποσό του στοιχήματος.
  • Εάν η επιλογή του χρήστη κερδίσει, ο χρήστης παίρνει ένα μέρος του ποτ με βάση το μέγεθος του στοιχήματός του και το συνολικό ποσό στοιχήματος στον ηττημένο του αγώνα, αφού το σπίτι (ο ιδιοκτήτης του συμβολαίου) πάρει ένα μικρό ποσοστό των κερδών .

Τι είναι το Ethereum Oracle;

Οι έξυπνες συμβάσεις εξακολουθούν να είναι κάτι νέο. δεν έχουν ακόμη υιοθετήσει το mainstream, και τόσες πολλές πτυχές του τρόπου λειτουργίας τους δεν έχουν ακόμη σφυρηλατηθεί και τυποποιηθεί. Θα εξηγήσω εν συντομία την ώθηση πίσω από την ιδέα του «μαντείου» - και να είστε υπομονετικοί. θα το εξετάσουμε σε βάθος σε μεταγενέστερα μέρη.

Μηχανική σύμβαση blockchain δεν είναι σαν τον προγραμματισμό μιας εφαρμογής πελάτη-διακομιστή. Μια σημαντική διαφορά είναι ότι τα δεδομένα με τα οποία αλληλεπιδρά η σύμβαση, πρέπει να βρίσκονται ήδη στο blockchain. Δεν υπάρχει καμία κλήση έξω του blockchain. Δεν υποστηρίζεται μόνο από τη γλώσσα, αλλά δεν υποστηρίζεται από το πρότυπο blockchain. Το συμβόλαιο μπορεί να λάβει στοιχήματα με τη μορφή νομίσματος με βάση το Ethereum, να τα αποθηκεύσει στη σύμβαση και να τα αποδεσμεύσει στις σωστές διευθύνσεις πορτοφολιού σύμφωνα με έναν τύπο, όταν δηλωθεί ο νικητής ενός αγώνα. Αλλά πώς γνωρίζει το συμβόλαιο τον νικητή; Δεν μπορεί να ζητήσει ένα REST API ή κάτι παρόμοιο. Μπορεί να χρησιμοποιήσει μόνο δεδομένα που βρίσκονται ήδη στο blockchain! Πολλές περιπτώσεις χρήσης έξυπνων συμβολαίων αντιμετωπίζουν παρόμοιο πρόβλημα - είναι σοβαρά περιορισμένες, εκτός εάν μπορούν να αλληλεπιδράσουν με τον κόσμο εκτός του blockchain.



Εάν το συμβόλαιο μπορεί να αλληλεπιδράσει μόνο με δεδομένα στο blockchain, μια προφανής λύση είναι να εισάγετε τα απαραίτητα δεδομένα στο blockchain. Και αυτό είναι ένα μαντείο. Το oracle είναι ένα άλλο συμβόλαιο, το οποίο εισάγει δεδομένα στο blockchain, επιτρέποντας σε άλλα συμβόλαια να το καταναλώνουν. Αν και αυτό μπορεί να εγείρει ερωτήσεις σχετικά με την εμπιστοσύνη και την εμπιστοσύνη, απλώς αποδεχτείτε για τώρα ότι αυτό είναι ένα μαντείο. Στο μέρος 3 αυτής της σειράς, θα συζητήσουμε αυτές τις αποχρώσεις. Στην περίπτωση χρήσης του παραδείγματος, το μαντείο θα είναι το συμβόλαιο που εισάγει δεδομένα στο blockchain, σχετικά με (α) ποιοι αγώνες είναι διαθέσιμοι και (β) ποιος κέρδισε αυτούς τους αγώνες, μόλις αποφασίσει.

Ρύθμιση του περιβάλλοντος ανάπτυξης Ethereum

Για βασική ρύθμιση, θα εγκαταστήσουμε:



  • Geth (προαιρετικό για τώρα)
  • Υτανο
  • Ganache CLI (προαιρετικό)
  • Ένα περιβάλλον ανάπτυξης (προαιρετικό)

Αυτό το άρθρο δεν έχει το χώρο να είναι ένας πλήρης οδηγός για τη ρύθμιση του περιβάλλοντος, αλλά λειτουργεί ως απλός οδηγός. Εντάξει, ωστόσο, επειδή υπάρχουν ήδη πολλοί πιο πλήρεις οδηγοί εγκατάστασης για το συγκεκριμένο λειτουργικό σας σύστημα και το Διαδίκτυο δεν χρειάζεται πραγματικά νέο. Έτσι θα σας οδηγήσω γρήγορα στο δρόμο και θα σας δείξω κάποιους πόρους για να λάβω περισσότερες λεπτομέρειες όπως απαιτείται. Να είστε προετοιμασμένοι να εγκαταστήσετε απαιτήσεις και προαπαιτήσεις όπως απαιτεί το σύστημά σας και όπως σας καθοδηγεί η Google.

Η διαδικασία επεξεργασίας συμβάσεων της Oracle



Εγκατάσταση Geth (προαιρετικό)

Στιγμιότυπο οθόνης της εγκατάστασης Geth Κάντε κλικ για να δείτε εικόνα πλήρους μεγέθους.

Το Geth είναι το Go-ethereum, το βασικό λογισμικό Ethereum. Αν και δεν είναι καθόλου απαραίτητο για αυτήν την άσκηση, θα συμπεριφερόταν σε κάθε πιθανό προγραμματιστή Ethereum να το έχει και να είναι εξοικειωμένο με αυτό. Θα είναι απαραίτητο εάν πρόκειται ποτέ να αναπτύξετε το έξυπνο συμβόλαιό σας στο ζωντανό δίκτυο Ethereum.

  • http://www.talkcrypto.org/blog/2018/01/23/what-is-geth/
  • https://github.com/ethereum/go-ethereum/wiki/Installation-Instructions-for-Ubuntu
  • https://github.com/ethereum/go-ethereum/wiki/Installation-instructions-for-Windows

Εγκαταστήστε το Truffle

Στιγμιότυπο οθόνης της εγκατάστασης Truffle Κάντε κλικ για να δείτε εικόνα πλήρους μεγέθους.

Το Truffle είναι το κύριο πράγμα που πρόκειται να χρησιμοποιήσουμε για ανάπτυξη και είναι απολύτως απαίτηση για αυτόν τον οδηγό. Βρείτε και ακολουθήστε τις συγκεκριμένες οδηγίες για το λειτουργικό σας σύστημα για την εγκατάσταση του Truffle. Ακολουθούν ορισμένοι σύνδεσμοι που θα σας βοηθήσουν.

  • https://truffleframework.com/docs/truffle/getting-started/installation
  • https://github.com/trufflesuite/truffle
  • https://truffleframework.com/tutorials/how-to-install-truffle-and-testrpc-on-windows-for-blockchain-development

Εγκατάσταση Ganache CLI (προαιρετικό)

Στιγμιότυπο οθόνης της εγκατάστασης Ganache CLI Κάντε κλικ για να δείτε εικόνα πλήρους μεγέθους.

Συνιστώ να εγκαταστήσετε το Ganache CLI για να το χρησιμοποιήσετε ως άλλο εργαλείο δοκιμής, αν και δεν θα το χρησιμοποιήσουμε πραγματικά για το σεμινάριό μας. Είναι προαιρετικό.

https://github.com/trufflesuite/ganache-cli

Περιβάλλον ανάπτυξης Ethereum

Θα ήταν περισσότερο από το δυνατόν να κάνετε ολόκληρο το σεμινάριο με οποιοδήποτε απλό πρόγραμμα επεξεργασίας κειμένου, όπως το Notepad ++, gedit, vi ή οποιοδήποτε πρόγραμμα επεξεργασίας κειμένου ή IDE της επιλογής σας. Προσωπικά χρησιμοποιώ το Visual Studio Code με τις ακόλουθες επεκτάσεις:

  • Στερεότητα
  • Η σταθερότητα επεκτάθηκε
  • Θέμα εικονιδίων υλικού

Σημείωση: Οι επεκτάσεις δεν απαιτούνται - δημιουργούν απλώς ένα καλύτερο περιβάλλον κωδικοποίησης.

Ρύθμιση του κώδικα

Ρύθμιση έργου

Το Truffle είναι ένα πολύ βολικό εργαλείο για τη σύνταξη έξυπνων συμβολαίων, τη μετεγκατάστασή τους σε ένα blockchain και παρέχει επίσης βοηθητικά προγράμματα ανάπτυξης και εντοπισμού σφαλμάτων. Ορισμένες ρυθμίσεις έργου θα είναι απαραίτητες για να ενσωματωθούν στο Truffle. Τώρα θα δημιουργήσουμε το κέλυφος για το έργο μας, τόσο στο Truffle όσο και στη δομή του καταλόγου. Απλά καθίστε, ακολουθήστε τα βήματα ρομποτικά προς το παρόν και απολαύστε.

ορισμός της τέχνης και του σχεδίου

Δημιουργήστε έναν κατάλογο για να φιλοξενήσετε όλο τον κώδικα. κάλεσε το oracle-παράδειγμα .

Μέσα στον ριζικό κατάλογο, δημιουργήστε δύο υποκαταλόγους, γιατί τελικά, το έργο θα αποτελείται από δύο δευτερεύοντα έργα. Δημιουργήστε τους καταλόγους:

  • / oracle-example / πελάτης
  • / oracle-example / oracle

Πηγαίνετε στο φάκελο πελάτη, γιατί αυτό είναι το πρώτο έργο που πρόκειται να αναπτύξουμε. Ανοίξτε ένα παράθυρο τερματικού (γραμμή εντολών) στο / oracle-example / πελάτης ντοσιέ.

Εκτελέστε την εντολή truffle init.

Σημειώστε ότι ανάμεσα σε πολλά αρχεία που δημιουργήθηκαν είναι truffle-config.js και truffle.js . Δεν χρειαζόμαστε και τα δύο, οπότε διαγράψτε truffle-config.js (απλώς για την αποφυγή σύγχυσης και ακαταστασίας).

Πρέπει να επεξεργαστούμε truffle.js , για να δείξετε το Truffle στη σωστή κατεύθυνση για δοκιμή. Αντικαταστήστε το περιεχόμενο του truffle.js με τα ακόλουθα:

module.exports = { networks: { development: { host: 'localhost', port: 8545, network_id: '*' // Match any network id } } };

https://github.com/jrkosinski/oracle-example/tree/part1-step1/client/truffle.js

Σημειώστε ότι το Truffle init δημιούργησε έναν κατάλογο που ονομάζεται μεταναστεύσεις ( oracle-example / client / migrations ). Μέσα σε αυτόν τον φάκελο θα πρέπει να υπάρχει ένα όνομα 1_initial_migration.js .

Προσθέστε ένα άλλο αρχείο στον κατάλογο μετεγκαταστάσεων και ονομάστε το 2_deploy_contracts.js , με το ακόλουθο περιεχόμενο:

var BoxingBets = artifacts.require('BoxingBets'); module.exports = function(deployer) { deployer.deploy(BoxingBets); };

https://github.com/jrkosinski/oracle-example/tree/part1-step1/client/migrations/2deploycontracts.js

Προσθήκη του κώδικα

Τώρα που η απλή ρύθμιση είναι εκτός δρόμου, είμαστε έτοιμοι να ξεκινήσουμε την κωδικοποίηση. Θυμηθείτε, αυτό το μέρος του άρθρου είναι ακόμα εισαγωγή και ρύθμιση, οπότε θα προχωρήσουμε αρκετά γρήγορα στον κώδικα. Θα βρούμε πιο εμπεριστατωμένες εξηγήσεις για τον κώδικα στο μέρος 2, και πιο εμπεριστατωμένη συζήτηση για την αρχιτεκτονική και την ιδέα στο μέρος 3. Ωστόσο, θα αγγίξουμε γρήγορα κάποιες βασικές έννοιες που είναι εμφανείς στον κώδικα. Ακολουθήστε προσεκτικά για να συνεχίσετε.

Ο πλήρης κωδικός για αυτό το βήμα της διαδικασίας είναι διαθέσιμος στο GitHub: https://github.com/jrkosinski/oracle-example/tree/part1-step1

Συμβάσεις Στερεότητας

Ένα «συμβόλαιο» στο Solidity είναι περίπου ανάλογο με ένα μάθημα σε άλλες αντικειμενοστρεφείς γλώσσες. Η ίδια η γλώσσα έχει συγκριθεί με το Golang και το JavaScript, μεταξύ άλλων. Ορισμένες άλλες γλωσσικές κατασκευές στο Solidity - τις οποίες θα έχουμε παραδείγματα αργότερα - είναι τροποποιητές, βιβλιοθήκες και διεπαφές. Η κληρονομικότητα (συμπεριλαμβανομένης της πολλαπλής κληρονομιάς) υποστηρίζεται για συμβάσεις. Τα αρχεία συμβολαίου στερεότητας έχουν επέκταση .sol.

Διεπαφή Oracle

Προσθέστε αυτό το αρχείο στο έργο σας: /oracle-example/client/contracts/OracleInterface.sol

https://github.com/jrkosinski/oracle-example/tree/part1-step1/client/contracts/OracleInterface.sol

Στιγμιότυπο οθόνης της διεπαφής oracle Κάντε κλικ για να δείτε εικόνα πλήρους μεγέθους.

Κανονικά, η διασύνδεση oracle θα ήταν ακριβώς αυτό - μια διεπαφή. Για αυτήν την πρώτη επανάληψη, είναι απλώς μια απλή κατηγορία που περιλαμβάνεται στο έργο Solidity, ακριβώς ως placeholder για τώρα. Θα το προχωρήσουμε στο επόμενο βήμα, αφού καταρτίσουμε και εκτελέσουμε με επιτυχία το συμβόλαιο στο Truffle. Αφού το μετατρέψουμε σε πραγματική διεπαφή αργότερα, οι υλοποιήσεις της συνάρτησης θα είναι κενές.

φυσικής βιντεοπαιχνιδιών με λίγα λόγια

Σύμβαση πελάτη

Προσθέστε αυτό το αρχείο στο έργο σας: /oracle-example/client/contracts/BoxingBets.sol

https://github.com/jrkosinski/oracle-example/tree/part1-step1/client/contracts/BoxingBets.sol

Αυτό είναι το συμβόλαιο που καταναλώνει τα δεδομένα αγώνων πυγμαχίας, επιτρέπει στους χρήστες να αναζητούν τους διαθέσιμους αγώνες και να τοποθετούν στοιχήματα σε αυτούς. Σε μεταγενέστερες επαναλήψεις, θα υπολογίσει και θα πληρώσει τα κέρδη.

Σύνταξη και εκτέλεση

Τώρα είναι που θα δούμε αν έχουμε τα πάντα σωστά την πρώτη φορά!

Μεταγλώττιση και μετεγκατάσταση της σύμβασης

Ανοίξτε ένα τερματικό στο / oracle-παράδειγμα / πελάτης / ντοσιέ

Μεταγλώττιση του κώδικα με αυτήν την εντολή:

truffle compile Δεύτερο στιγμιότυπο οθόνης σύνταξης και μετεγκατάστασης του συμβολαίου Κάντε κλικ για να δείτε εικόνα πλήρους μεγέθους. Διάγραμμα διαδικασιών σύμβασης με αιθέριο oracle Κάντε κλικ για να δείτε εικόνα πλήρους μεγέθους.

Εναλλακτικό: Χρησιμοποιήστε το σενάριο recompile.sh shell ( https://github.com/jrkosinski/oracle-example/tree/part1-step1/client/recompile.sh ).

Λάβετε υπόψη ότι θα δείτε πολλές προειδοποιήσεις, επειδή ο κώδικας μας δεν είναι ακόμη στην τελική του μορφή!

Ανοίξτε την κονσόλα ανάπτυξης Truffle:

truffle develop

Τώρα, στην κονσόλα προγραμματιστή Truffle, μεταβείτε στο δοκιμαστικό δίκτυο:

truffle(develop)> migrate

Εκτελέστε το συμβόλαιο

Στην προτροπή της κονσόλας ανάπτυξης, εισαγάγετε την ακόλουθη γραμμή κώδικα:

truffle(develop)> BoxingBets.deployed().then(inst => { instance = inst })

Τώρα, η «παρουσία» είναι η μεταβλητή που αναφέρεται στο συμβόλαιο BoxingBets και μπορεί να χρησιμοποιηθεί για να καλέσει τις δημόσιες μεθόδους του.

Δοκιμάστε το χρησιμοποιώντας την ακόλουθη εντολή:

truffle(develop)> instance.test(3, 4)

Λάβετε υπόψη ότι έχουμε συμπεριλάβει μια δημόσια λειτουργία 'δοκιμής' στο BoxingBets.sol . Προσθέτει μαζί τους οποιουσδήποτε δύο αριθμούς μεταβιβάζετε σε αυτό, απλώς για να δείξετε ότι το συμβόλαιο εκτελεί κώδικα και ότι μπορούμε να το καλέσουμε από την κονσόλα ανάπτυξης Truffle. Εάν λάβουμε μια λογική απάντηση (δείτε παρακάτω) τότε η δουλειά μας εδώ έχει τελειώσει (τουλάχιστον τώρα).

Διαχωρίστε το Oracle Ethereum

Εάν τα πάντα έχουν πετύχει μέχρι τώρα, τότε έχουμε ξεπεράσει το χάσμα. Το επόμενο πράγμα που θα κάνουμε είναι να διαχωρίσουμε τη σύμβαση oracle από τη σύμβαση BoxingBets. Στην πραγματική χρήση, το συμβόλαιο της oracle θα υπάρχει ξεχωριστά από το συμβόλαιο πελάτη στο blockchain, οπότε θα πρέπει να είμαστε σε θέση:

  • Δημιουργήστε το με διεύθυνση blockchain.
  • Αλλάξτε δυναμικά τη διεύθυνση oracle που χρησιμοποιεί η σύμβαση πελάτη για αναφορά στο oracle.

Εν ολίγοις, αυτό που πρόκειται να κάνουμε τώρα είναι να χωρίσουμε το oracle και τον πελάτη σε δύο ξεχωριστές οντότητες συμβολαίων blockchain και να τους κάνουμε να μιλήσουν μεταξύ τους. Ο πελάτης θα δημιουργήσει το oracle από τη διεύθυνση και θα το καλέσει.

πώς να λάβετε δεδομένα στο twitter

Σύμβαση πελάτη

Πρώτον, πρόκειται να αλλάξουμε τη σύμβαση πελάτη (πελάτης) έτσι ώστε να αναφέρεται σε μια δυναμική διεπαφή σε ένα oracle και όχι σε συγκεκριμένη κατηγορία. Στη συνέχεια, θα διασφαλίσουμε ότι δημιουργεί το μαντείο από εξωτερικό συμβόλαιο.

Μπαίνω /oracle-example/client/contracts/OracleInterface.sol . Όπως σημειώσαμε προηγουμένως, αυτή τη στιγμή δεν είναι μια διεπαφή, αλλά πρόκειται να το κάνουμε ένα. Αντικαταστήστε ό, τι υπάρχει εκεί με τα περιεχόμενα:

https://github.com/jrkosinski/oracle-example/tree/part1-step2/client/contracts/OracleInterface.sol

pragma solidity ^0.4.17; contract OracleInterface { enum MatchOutcome { Pending, //match has not been fought to decision Underway, //match has started & is underway Draw, //anything other than a clear winner (e.g. cancelled) Decided //index of participant who is the winner } function getPendingMatches() public view returns (bytes32[]); function getAllMatches() public view returns (bytes32[]); function matchExists(bytes32 _matchId) public view returns (bool); function getMatch(bytes32 _matchId) public view returns ( bytes32 id, string name, string participants, uint8 participantCount, uint date, MatchOutcome outcome, int8 winner); function getMostRecentMatch(bool _pending) public view returns ( bytes32 id, string name, string participants, uint participantCount, uint date, MatchOutcome outcome, int8 winner); function testConnection() public pure returns (bool); function addTestData() public; }

Σε BoxingBets.sol , θα αντικαταστήσουμε αυτήν τη γραμμή:

OracleInterface internal boxingOracle = new OracleInterface();

Με αυτές τις δύο γραμμές:

address internal boxingOracleAddr = 0; OracleInterface internal boxingOracle = OracleInterface(boxingOracleAddr);

Τώρα αυτό που θέλουμε είναι ένας τρόπος να ορίσετε τη διεύθυνση του μαντείου, δυναμικά, και μια λειτουργία που μπορούμε να καλέσουμε για να μάθουμε την τρέχουσα διεύθυνση oracle. Προσθέστε αυτές τις δύο λειτουργίες στο BoxingBets.sol :

/// @notice sets the address of the boxing oracle contract to use /// @dev setting a wrong address may result in false return value, or error /// @param _oracleAddress the address of the boxing oracle /// @return true if connection to the new oracle address was successful function setOracleAddress(address _oracleAddress) external onlyOwner returns (bool) { boxingOracleAddr = _oracleAddress; boxingOracle = OracleInterface(boxingOracleAddr); return boxingOracle.testConnection(); } /// @notice gets the address of the boxing oracle being used /// @return the address of the currently set oracle function getOracleAddress() external view returns (address) { return boxingOracleAddr; }

Και τέλος, για τον έλεγχο της σύνδεσης μεταξύ του πελάτη και του μαντείου, μπορούμε να αντικαταστήσουμε το δοκιμή λειτουργία στο BoxingBets με λειτουργία δοκιμής της σύνδεσης oracle:

/// @notice for testing; tests that the boxing oracle is callable /// @return true if connection successful function testOracleConnection() public view returns (bool) { return boxingOracle.testConnection(); }

Ιδιοκτήτης

Παρατηρήστε ότι ο ορισμός για setOracleAddress έχει ένα onlyOwner τροποποιητής που ακολουθεί. Αυτό περιορίζει την κλήση αυτής της λειτουργίας από οποιονδήποτε άλλο εκτός από τον κάτοχο της σύμβασης, παρόλο που η λειτουργία είναι δημόσια. Αυτό δεν είναι χαρακτηριστικό της γλώσσας. Αυτό μας παρέχεται από το συμβόλαιο Ownable, το οποίο αφαιρείται από τη βιβλιοθήκη OpenZeppelin των συμβάσεων Solidity γενικής χρησιμότητας. Θα αναφερθούμε στις λεπτομέρειες αυτού στο Μέρος 2, αλλά για να διευκολύνουμε τη χρήση αυτού onlyOwner τροποποιητής, πρέπει να κάνουμε μερικές αλλαγές:

αντίγραφο Ownable.sol από https://github.com/jrkosinski/oracle-example/tree/part1-step2/client/contracts/Ownable.sol σε / oracle-παράδειγμα / πελάτης / συμβόλαια / .

Προσθέστε μια αναφορά σε αυτό στην κορυφή του BoxingBets.sol , έτσι:

import './Ownable.sol';

(Μπορείτε να το προσθέσετε ακριβώς κάτω από τη γραμμή που εισάγει OracleInterface.sol .)

Τροποποιήστε τη δήλωση σύμβασης του BoxingBets για να το κληρονομήσετε από το Ownable, από αυτό:

contract BoxingBets {

Σ 'αυτό:

contract BoxingBets is Ownable {

Και πρέπει να είμαστε όλοι έτοιμοι. Ο πλήρης κωδικός είναι εδώ σε περίπτωση που χαθείτε: https://github.com/jrkosinski/oracle-example/tree/part1-step2/client/contracts

Συμβάσεις της Oracle

Ρύθμιση

Τώρα που το συμβόλαιο BoxingBets προσπαθεί να αναφέρεται σε ένα εντελώς ξεχωριστό συμβόλαιο (δηλαδή το μαντείο) κατά διεύθυνση, η επόμενη δουλειά μας είναι να δημιουργήσουμε αυτό το συμβόλαιο oracle. Τώρα λοιπόν πρόκειται να δημιουργήσουμε ένα ολόκληρο ξεχωριστό έργο που θα περιέχει τη σύμβαση oracle. Είναι ουσιαστικά η ίδια ρύθμιση που έχουμε ήδη κάνει για το έργο σύμβασης πελάτη. Δηλαδή, τη δημιουργία του Truffle για μεταγλώττιση και ανάπτυξη.

Πρέπει να έχετε ήδη έναν φάκελο / oracle-παράδειγμα / oracle / που δημιουργήσαμε σε ένα προηγούμενο βήμα (ή αν όχι, προχωρήστε και δημιουργήστε αυτόν τον κενό κατάλογο τώρα). Ανοίξτε ένα τερματικό σε αυτόν τον κατάλογο.

  • Εκτελέστε την εντολή truffle init.
  • Διαγράφω /oracle-example/oracle/truffle-config.js .
  • Επεξεργασία /oracle-example/oracle/truffle.js έτσι:
module.exports = { networks: { development: { host: 'localhost', port: 8545, network_id: '*' // Match any network id } } };

Δείτε το παράδειγμα εδώ: https://github.com/jrkosinski/oracle-example/tree/part1-step2/oracle/truffle.js

Μέσα / oracle-example / oracle / μετεγκαταστάσεις / , δημιουργήστε ένα αρχείο που ονομάζεται 2_deploy_contracts.js , με το ακόλουθο περιεχόμενο:

var BoxingOracle = artifacts.require('BoxingOracle'); module.exports = function(deployer) { deployer.deploy(BoxingOracle); };

Δείτε το παράδειγμα εδώ: https://github.com/jrkosinski/oracle-example/tree/part1-step2/oracle/migrations/2_deploy_contracts.js

Κώδικας Oracle

Για αυτό το βήμα, απλώς αντιγράψτε τα ακόλουθα τρία αρχεία από https://github.com/jrkosinski/oracle-example/tree/part1-step2/oracle/contracts/ στο /oracle-example/oracle/contracts/ ντοσιέ:

πώς κερδίζουν χρήματα οι εφαρμογές γνωριμιών
  • BoxingOracle.sol: Το κύριο συμβόλαιο της μαντείας.
  • Ownable.sol: Για λειτουργίες μόνο για ιδιοκτήτες, όπως χρησιμοποιήσαμε ήδη στη σύμβαση πελάτη.
  • DateLib.sol: Μια βιβλιοθήκη ημερομηνιών. Θα το εξετάσουμε πιο αναλυτικά στο Μέρος 2 αυτής της σειράς.

Δοκιμάζοντας το Oracle

Τώρα, στην τρέχουσα επανάληψη του έργου, πρέπει πραγματικά να δοκιμάσουμε διεξοδικά το έξυπνο συμβόλαιο μας, καθώς αυτή θα είναι η βάση μας στην οποία θα οικοδομήσουμε το υπόλοιπο έργο. Έτσι, τώρα που έχουμε ρυθμίσει το έργο oracle και αντιγράψαμε τον κώδικα, θα θέλαμε:

  • Συντάξτε το μαντείο.
  • Βεβαιωθείτε ότι το μαντείο λειτουργεί.
  • Εκτελέστε μερικές λειτουργίες στην κονσόλα Truffle για να βεβαιωθείτε ότι το oracle λειτουργεί όπως αναμένεται.

Μεταγλώττιση και μετεγκατάσταση του Oracle

Ακόμα σε τερματικό ανοιχτό στο /oracle-example/oracle/, εκτελέστε τις ακόλουθες εντολές. Και πάλι, αυτά τα βήματα είναι ίδια με αυτά που έχουμε ήδη κάνει για τη μεταγλώττιση και τη μετεγκατάσταση της σύμβασης πελάτη.

truffle compile

Εναλλακτικό: Χρησιμοποιήστε το σενάριο recompile.sh shell ( https://github.com/jrkosinski/oracle-example/tree/part1-step2/oracle/recompile.sh ).

Ανοίξτε την κονσόλα ανάπτυξης Truffle:

truffle develop

Μετεγκατάσταση στο δοκιμαστικό δίκτυο:

truffle(develop)> migrate

Εκτελέστε και δοκιμάστε το Oracle

Ακόμα στην κονσόλα ανάπτυξης Truffle, εισαγάγετε αυτό για να καταγράψετε έναν χρησιμοποιήσιμο δείκτη στη σύμβαση oracle:

truffle(develop)> BoxingOracle.deployed().then(inst => { instance = inst })

Τώρα μπορούμε (και πρέπει) να εκτελέσουμε μια σειρά δοκιμών στο συμβόλαιο της Oracle για να το δοκιμάσουμε. Δοκιμάστε να εκτελέσετε τις ακόλουθες εντολές, καθεμιά με τη σειρά, και εξετάστε τα αποτελέσματα.

truffle(develop)> instance.testConnection() ... truffle(develop)> instance.getAllMatches() ... truffle(develop)> instance.addTestData() ... truffle(develop)> instance.getAllMatches() ...

Σας ενθαρρύνουμε σε αυτό το σημείο να ρίξετε μια ματιά στον κώδικα oracle, να δείτε ποιες δημόσιες μεθόδους είναι διαθέσιμες, να διαβάσετε τα σχόλια στον κώδικα και να βρείτε μερικές από τις δικές σας δοκιμές για να εκτελέσετε (και να τις εκτελέσετε εδώ στην κονσόλα, όπως όπως φαίνεται παραπάνω).

Δοκιμή και εντοπισμός σφαλμάτων

Τώρα είμαστε έτοιμοι για την τελική δοκιμή: για να ελέγξουμε ότι το συμβόλαιο πελάτη μπορεί να καλέσει το συμβόλαιο oracle που υπάρχει ήδη στο blockchain και να τραβήξει και να χρησιμοποιήσει τα δεδομένα του. Εάν όλα αυτά λειτουργούν, τότε έχουμε ένα ζεύγος πελάτη-μαντείου που μπορούμε να χρησιμοποιήσουμε για περαιτέρω πειραματισμό. Τα βήματά μας για την εκτέλεση της δοκιμής από άκρο σε άκρο:

  • Μεταγλώττιση και εκτέλεση του συμβολαίου της oracle
  • Μεταγλώττιση και εκτέλεση της σύμβασης πελάτη
  • Λάβετε τη διεύθυνση του συμβολαίου της oracle
  • Ορίστε τη διεύθυνση oracle στη σύμβαση πελάτη
  • Προσθέστε δεδομένα δοκιμής στη σύμβαση oracle
  • Ελέγξτε ότι μπορούμε να ανακτήσουμε αυτά τα δεδομένα στη σύμβαση πελάτη

Ανοίξτε δύο παράθυρα τερματικού:

  • Ένα σε / oracle-παράδειγμα / πελάτης /
  • Και το άλλο μέσα / oracle-παράδειγμα / oracle /

Προτείνω να διατηρήσετε το / oracle-παράδειγμα / πελάτης / ένα ανοιχτό στα αριστερά και το / oracle-παράδειγμα / oracle / ένα ανοιχτό στα δεξιά και ακολουθήστε προσεκτικά για να αποφύγετε τη σύγχυση.

Μεταγλώττιση και εκτέλεση του συμβολαίου της Oracle

Εκτελέστε τις ακόλουθες εντολές στο / oracle-παράδειγμα / oracle / τερματικό:

bash recompile.sh truffle develop truffle(develop)> migrate truffle(develop)> BoxingOracle.deployed().then(inst => { instance = inst })

Μεταγλώττιση και εκτέλεση του συμβολαίου πελάτη

Εκτελέστε τις ακόλουθες εντολές στο / oracle-παράδειγμα / πελάτης / τερματικό:

πώς να εξαγάγετε δεδομένα από το twitter
bash recompile.sh truffle develop truffle(develop)> migrate truffle(develop)> BoxingBets.deployed().then(inst => { instance = inst })

Λάβετε τη διεύθυνση του συμβολαίου της Oracle

Εκτελέστε την ακόλουθη εντολή για Truffle στο / oracle-παράδειγμα / oracle / τερματικό:

truffle(develop)> instance.getAddress()

Αντιγράψτε τη διεύθυνση που είναι η έξοδος από αυτήν την κλήση. και χρησιμοποιήστε το στο επόμενο βήμα.

Ορίστε τη διεύθυνση Oracle στη σύμβαση πελάτη

Εκτελέστε την ακόλουθη εντολή για τρούφα στο / oracle-παράδειγμα / πελάτης / τερματικό:

truffle(develop)> instance.setOracleAddress('')

Και δοκιμάστε το:

truffle(develop)> instance.testOracleConnection()

Εάν η έξοδος είναι true, τότε είμαστε καλοί να συνεχίσουμε.

Δοκιμάστε ότι μπορούμε να ανακτήσουμε αυτά τα δεδομένα στη σύμβαση πελάτη

Εκτελέστε την ακόλουθη εντολή για τρούφα στο / oracle-παράδειγμα / πελάτης / τερματικό:

truffle(develop)> instance.getBettableMatches()

Θα πρέπει να επιστρέψει έναν κενό πίνακα, επειδή δεν έχουν προστεθεί ακόμη δεδομένα δοκιμής στην πλευρά του oracle.

Εκτελέστε την ακόλουθη εντολή για τρούφα στο / oracle-παράδειγμα / oracle / τερματικό για προσθήκη δεδομένων δοκιμής:

truffle(develop)> instance.addTestData()

Εκτελέστε την ακόλουθη εντολή για τρούφα στο / oracle-παράδειγμα / πελάτης / τερματικό, για να δούμε αν μπορούμε να παραλάβουμε τα δεδομένα δοκιμής που προστέθηκαν πρόσφατα από τον πελάτη:

truffle(develop)> instance.getBettableMatches()

Τώρα, εάν λάβετε μεμονωμένες διευθύνσεις από τον πίνακα που επιστράφηκε από getBettableMatches() και συνδέστε τις σε getMatch().

Σας ενθαρρύνουμε σε αυτό το σημείο να ρίξετε μια ματιά στον κώδικα πελάτη, να δείτε ποιες δημόσιες μεθόδους είναι διαθέσιμες, να διαβάσετε τα σχόλια στον κώδικα και να βρείτε μερικές από τις δικές σας δοκιμές για να εκτελέσετε (και να τις εκτελέσετε εδώ στην κονσόλα, όπως πάνω από).

Συμπέρασμα του πρώτου μέρους

Τα αποτελέσματά μας από αυτήν την άσκηση είναι περιορισμένα, αλλά τότε ήταν και οι στόχοι μας, προκειμένου να διατηρήσουμε έναν ρεαλιστικό ρυθμό. Ο πελάτης μας δεν έχει ακόμη τη δυνατότητα να στοιχηματίζει, να διαχειρίζεται χρήματα, να διανέμει τα κέρδη κ.λπ. Αυτό που έχουμε - εκτός από τις γνώσεις και την εμπειρία που αποκτήθηκε - είναι:

  • Ένα κυρίως λειτουργικό έξυπνο συμβόλαιο
  • Ένας πελάτης που μπορεί να συνδεθεί και να αλληλεπιδράσει με το oracle
  • Ένα πλαίσιο για περαιτέρω ανάπτυξη και μάθηση

Και αυτό δεν είναι πολύ κακό για ένα σύντομο άρθρο.

Σε δεύτερο μέρος αυτής της σειράς , θα ερευνήσουμε βαθύτερα τον κώδικα και θα εξετάσουμε μερικά από τα χαρακτηριστικά που είναι μοναδικά για την έξυπνη ανάπτυξη συμβολαίων, καθώς και μερικά από τα χαρακτηριστικά γλώσσας που είναι ειδικά για τη Στερεότητα. Πολλά από τα πράγματα που μόλις ξεκαθαρίστηκαν σε αυτό το μέρος θα εξηγηθούν στο επόμενο.

Σε τρίτο μέρος αυτής της σειράς , θα συζητήσουμε λίγο για τη φιλοσοφία και το σχεδιασμό έξυπνων συμβάσεων, ειδικά σε σχέση με τη χρήση τους με oracle.

Περαιτέρω προαιρετικά βήματα

Ο ατομικός πειραματισμός είναι ένας καλός τρόπος για να μάθετε. Ακολουθούν μερικές απλές προτάσεις εάν σκέφτεστε τρόπους για να επεκτείνετε αυτό το σεμινάριο για μεγαλύτερη γνώση (κανένα από τα παρακάτω δεν θα καλυφθεί στα Μέρη 2 και 3):

  • Αναπτύξτε τα συμβόλαια στο Ganache (πρώην testrpc) και εκτελέστε τις ίδιες δοκιμές για να επαληθεύσετε τη λειτουργία.
  • Αναπτύξτε τα συμβόλαια σε ropsten ή rinkeby testnets και εκτελέστε τις ίδιες δοκιμές για να επαληθεύσετε τη λειτουργία.
  • Δημιουργήστε μια διεπαφή web3js είτε για το oracle, είτε για τον πελάτη (ή και τα δύο).

Καλή τύχη και μη διστάσετε να επικοινωνήσετε μαζί μου για τυχόν απορίες. Δεν μπορώ να εγγυηθώ απαραίτητα μια γρήγορη απάντηση, αλλά θα κάνω το καλύτερο δυνατό.

Κατανόηση των βασικών

Ποια γλώσσα προγραμματισμού χρησιμοποιεί το Ethereum;

Η γλώσσα προγραμματισμού που χρησιμοποιείται στην ανάπτυξη του Ethereum είναι το Solidity. Είναι μια γλώσσα προγραμματισμού προσανατολισμένη στη σύμβαση εμπνευσμένη από JavaScript, Python και C ++.

Τι είναι το μαντείο στο blockchain;

Το λεγόμενο * blockchain oracle * είναι μια αξιόπιστη πηγή δεδομένων που παρέχει πληροφορίες σχετικά με διάφορες καταστάσεις και συμβάντα που χρησιμοποιούνται από έξυπνες συμβάσεις.

Σε τι χρησιμοποιείται ένα έξυπνο συμβόλαιο oracle;

Τα έξυπνα συμβόλαια χρηστών χρησιμοποιούνται για να παρέχουν σύνδεση μεταξύ πραγματικών γεγονότων και ψηφιακών συμβάσεων. Αυτά τα εξωτερικά δεδομένα που παρέχονται από την oracle ενδέχεται (ή όχι) να προκαλέσουν έξυπνες εκτελέσεις συμβολαίων.

Init.js: Ένας οδηγός για το Whys and Hows της σουίτας τεχνολογιών JavaScript

Διεπαφή Ιστού

Init.js: Ένας οδηγός για το Whys and Hows της σουίτας τεχνολογιών JavaScript
Ανάπτυξη για το Cloud στο Cloud: Ανάπτυξη BigData με το Docker στο AWS

Ανάπτυξη για το Cloud στο Cloud: Ανάπτυξη BigData με το Docker στο AWS

Πίσω Μέρος

Δημοφιλείς Αναρτήσεις
Αισθητική και αντίληψη - Τρόπος προσέγγισης εικόνων εμπειρίας χρήστη
Αισθητική και αντίληψη - Τρόπος προσέγγισης εικόνων εμπειρίας χρήστη
Βέλτιστες πρακτικές διάταξης ιστού: Αναλύθηκαν 12 διαχρονικά μοτίβα διεπαφής χρήστη
Βέλτιστες πρακτικές διάταξης ιστού: Αναλύθηκαν 12 διαχρονικά μοτίβα διεπαφής χρήστη
Εξοικείωση με το Πρόγραμμα ανάπτυξης Sketch
Εξοικείωση με το Πρόγραμμα ανάπτυξης Sketch
Mini Tutorial - Ένας οδηγός για συνδυασμούς γραμματοσειρών
Mini Tutorial - Ένας οδηγός για συνδυασμούς γραμματοσειρών
Για Σχεδιαστές με Αγάπη (Ένα Γράμμα από έναν Προγραμματιστή Front-end)
Για Σχεδιαστές με Αγάπη (Ένα Γράμμα από έναν Προγραμματιστή Front-end)
 
Σχεδιασμός βάσει δεδομένων και γενετικός σχεδιασμός - Μια επισκόπηση
Σχεδιασμός βάσει δεδομένων και γενετικός σχεδιασμός - Μια επισκόπηση
Διακομιστές ARM: Κινητή αρχιτεκτονική CPU για κέντρα δεδομένων;
Διακομιστές ARM: Κινητή αρχιτεκτονική CPU για κέντρα δεδομένων;
Ξεκινήστε με μικροσυσκευές: Ένα εκπαιδευτικό πρόγραμμα Dropwizard
Ξεκινήστε με μικροσυσκευές: Ένα εκπαιδευτικό πρόγραμμα Dropwizard
Μείνετε Sharp - Πώς να ενισχύσετε τη δημιουργικότητα όταν υποχωρεί η εργασία
Μείνετε Sharp - Πώς να ενισχύσετε τη δημιουργικότητα όταν υποχωρεί η εργασία
Ditch MVP, Υιοθετήστε Ελάχιστα Βιώσιμα Πρωτότυπα (MVPr)
Ditch MVP, Υιοθετήστε Ελάχιστα Βιώσιμα Πρωτότυπα (MVPr)
Δημοφιλείς Αναρτήσεις
  • μετάβαση έναντι απόδοσης κόμβου js
  • c++ εκπαιδευτικοί πόροι
  • πώς μοιάζει ο γραπτός κώδικας σε έναν διακομιστή
  • το api "undefined" δεν υπάρχει ή δεν έχετε άδεια πρόσβασης σε αυτό
  • ποιο από τα παρακάτω είναι το κέντρο του μοντέλου των πέντε δυνάμεων του πορτιέρη που συζητήθηκε στη διάλεξη;
Κατηγορίες
  • Σχεδιασμός Ux
  • Κερδοφορία & Αποδοτικότητα
  • Κύκλος Ζωής Προϊόντος
  • Ευκίνητος
  • © 2022 | Ολα Τα Δικαιώματα Διατηρούνται

    portaldacalheta.pt