Τα Έξυπνα Συμβόλαια Ethereum είναι κάτι περισσότερο από το «νέο καυτό». Πιστεύω ότι αυτοί (ή κάτι σχετικό) είναι έτοιμοι να αλλάξουν τον τρόπο με τον οποίο οι άνθρωποι συνεργάζονται μεταξύ τους στην προσεχή νέα εποχή του Διαδικτύου. Ο χρόνος θα πει εάν συμβαίνει αυτό.
Αυτό είναι το πρώτο άρθρο με τρία μέρη Ανάπτυξη έξυπνων συμβάσεων Ethereum με το Solidity, εξερευνώντας πιο συγκεκριμένα τη χρήση συμβολαίων με τα λεγόμενα 'oracles' - που είναι βασικά συμβόλαια που αντλούν δεδομένα στο blockchain για χρήση από άλλα έξυπνα συμβόλαια.
Ο στόχος αυτού, μέρος 1 της σειράς, δεν είναι να μπει πολύ στην έννοια των συμβάσεων της oracle, της φιλοσοφίας πίσω από αυτά, ή ακόμη και πολύ βαθιά σε αυτό που είναι. ο στόχος αυτού του μέρους του σεμιναρίου Ethereum oracle είναι απλώς να:
Ορισμός: Oracle. Ένα μέσο για έξυπνες συμβάσεις για πρόσβαση σε δεδομένα από τον κόσμο εκτός του blockchain. Ένας τύπος έξυπνου συμβολαίου οι ίδιοι, τα oracle παίρνουν δεδομένα από τον έξω κόσμο και τα βάζουν στο blockchain για να καταναλώσουν άλλα έξυπνα συμβόλαια.
Το πρώτο μέρος αυτού του άρθρου θα περιλαμβάνει την προετοιμασία με όλες τις προϋποθέσεις. Στη συνέχεια, θα δημιουργήσουμε ένα ενιαίο συμβόλαιο Ethereum και θα το δοκιμάσουμε με το Truffle. Τέλος, θα διαχωρίσουμε το μαντείο από τον πελάτη και θα το δοκιμάσουμε από κοινού.
Αυτή η σειρά άρθρου μπορώ χρησιμεύει ως μια πρώτη εισαγωγή στα έξυπνα συμβόλαια, αλλά αυξάνεται πολύ γρήγορα σε πιο προηγμένες ιδέες. Αν είναι ο πρώτος σας οδηγός έξυπνου συμβολαίου eth, ετοιμαστείτε να ανεβείτε γρήγορα στο υψόμετρο. Εάν αισθάνεστε σίγουροι, υπέροχοι. αν όχι, μη διστάσετε να πάρετε έναν απλούστερο τύπο «γειά σου κόσμου» ή πρώτα δύο στη ζώνη σας. Ολοκλήρωση αγοράς ένα από τα προηγούμενα άρθρα του Ethereum και Cryptozombies , για αρχαριους.
Caveat: Ο έξυπνος χώρος σύμβασης, που είναι τόσο νέος, αλλάζει γρήγορα. Οι δυνατότητες σύνταξης σταθερότητας που ήταν νέες κατά τη σύνταξη αυτού του άρθρου ενδέχεται να έχουν καταργηθεί ή να είναι παρωχημένες τη στιγμή που το διαβάζετε. Οι εκδόσεις Geth μπορεί να έχουν έρθει και να φύγει. Το Solidity προσθέτει πάντα νέες λειτουργίες γλώσσας και καταργεί τα παλιά. Πολλές νέες δυνατότητες βρίσκονται σε εξέλιξη. Επομένως, να είστε προετοιμασμένοι εάν είναι απαραίτητο για να προσαρμόσετε τις πληροφορίες σε αυτό το άρθρο στο νέο τοπίο του μέλλοντος. αν είστε σοβαροί για να μάθετε έξυπνη ανάπτυξη συμβολαίων, τότε έχω πίστη σε εσάς.
Περίπτωση χρήσης: Οι χρήστες στοιχηματίζουν σε αγώνες πυγμαχίας.
Οι έξυπνες συμβάσεις εξακολουθούν να είναι κάτι νέο. δεν έχουν ακόμη υιοθετήσει το mainstream, και τόσες πολλές πτυχές του τρόπου λειτουργίας τους δεν έχουν ακόμη σφυρηλατηθεί και τυποποιηθεί. Θα εξηγήσω εν συντομία την ώθηση πίσω από την ιδέα του «μαντείου» - και να είστε υπομονετικοί. θα το εξετάσουμε σε βάθος σε μεταγενέστερα μέρη.
Μηχανική σύμβαση blockchain δεν είναι σαν τον προγραμματισμό μιας εφαρμογής πελάτη-διακομιστή. Μια σημαντική διαφορά είναι ότι τα δεδομένα με τα οποία αλληλεπιδρά η σύμβαση, πρέπει να βρίσκονται ήδη στο blockchain. Δεν υπάρχει καμία κλήση έξω του blockchain. Δεν υποστηρίζεται μόνο από τη γλώσσα, αλλά δεν υποστηρίζεται από το πρότυπο blockchain. Το συμβόλαιο μπορεί να λάβει στοιχήματα με τη μορφή νομίσματος με βάση το Ethereum, να τα αποθηκεύσει στη σύμβαση και να τα αποδεσμεύσει στις σωστές διευθύνσεις πορτοφολιού σύμφωνα με έναν τύπο, όταν δηλωθεί ο νικητής ενός αγώνα. Αλλά πώς γνωρίζει το συμβόλαιο τον νικητή; Δεν μπορεί να ζητήσει ένα REST API ή κάτι παρόμοιο. Μπορεί να χρησιμοποιήσει μόνο δεδομένα που βρίσκονται ήδη στο blockchain! Πολλές περιπτώσεις χρήσης έξυπνων συμβολαίων αντιμετωπίζουν παρόμοιο πρόβλημα - είναι σοβαρά περιορισμένες, εκτός εάν μπορούν να αλληλεπιδράσουν με τον κόσμο εκτός του blockchain.
Εάν το συμβόλαιο μπορεί να αλληλεπιδράσει μόνο με δεδομένα στο blockchain, μια προφανής λύση είναι να εισάγετε τα απαραίτητα δεδομένα στο blockchain. Και αυτό είναι ένα μαντείο. Το oracle είναι ένα άλλο συμβόλαιο, το οποίο εισάγει δεδομένα στο blockchain, επιτρέποντας σε άλλα συμβόλαια να το καταναλώνουν. Αν και αυτό μπορεί να εγείρει ερωτήσεις σχετικά με την εμπιστοσύνη και την εμπιστοσύνη, απλώς αποδεχτείτε για τώρα ότι αυτό είναι ένα μαντείο. Στο μέρος 3 αυτής της σειράς, θα συζητήσουμε αυτές τις αποχρώσεις. Στην περίπτωση χρήσης του παραδείγματος, το μαντείο θα είναι το συμβόλαιο που εισάγει δεδομένα στο blockchain, σχετικά με (α) ποιοι αγώνες είναι διαθέσιμοι και (β) ποιος κέρδισε αυτούς τους αγώνες, μόλις αποφασίσει.
Για βασική ρύθμιση, θα εγκαταστήσουμε:
Αυτό το άρθρο δεν έχει το χώρο να είναι ένας πλήρης οδηγός για τη ρύθμιση του περιβάλλοντος, αλλά λειτουργεί ως απλός οδηγός. Εντάξει, ωστόσο, επειδή υπάρχουν ήδη πολλοί πιο πλήρεις οδηγοί εγκατάστασης για το συγκεκριμένο λειτουργικό σας σύστημα και το Διαδίκτυο δεν χρειάζεται πραγματικά νέο. Έτσι θα σας οδηγήσω γρήγορα στο δρόμο και θα σας δείξω κάποιους πόρους για να λάβω περισσότερες λεπτομέρειες όπως απαιτείται. Να είστε προετοιμασμένοι να εγκαταστήσετε απαιτήσεις και προαπαιτήσεις όπως απαιτεί το σύστημά σας και όπως σας καθοδηγεί η Google.
Το Geth είναι το Go-ethereum, το βασικό λογισμικό Ethereum. Αν και δεν είναι καθόλου απαραίτητο για αυτήν την άσκηση, θα συμπεριφερόταν σε κάθε πιθανό προγραμματιστή Ethereum να το έχει και να είναι εξοικειωμένο με αυτό. Θα είναι απαραίτητο εάν πρόκειται ποτέ να αναπτύξετε το έξυπνο συμβόλαιό σας στο ζωντανό δίκτυο Ethereum.
Το Truffle είναι το κύριο πράγμα που πρόκειται να χρησιμοποιήσουμε για ανάπτυξη και είναι απολύτως απαίτηση για αυτόν τον οδηγό. Βρείτε και ακολουθήστε τις συγκεκριμένες οδηγίες για το λειτουργικό σας σύστημα για την εγκατάσταση του Truffle. Ακολουθούν ορισμένοι σύνδεσμοι που θα σας βοηθήσουν.
Συνιστώ να εγκαταστήσετε το Ganache CLI για να το χρησιμοποιήσετε ως άλλο εργαλείο δοκιμής, αν και δεν θα το χρησιμοποιήσουμε πραγματικά για το σεμινάριό μας. Είναι προαιρετικό.
Θα ήταν περισσότερο από το δυνατόν να κάνετε ολόκληρο το σεμινάριο με οποιοδήποτε απλό πρόγραμμα επεξεργασίας κειμένου, όπως το Notepad ++, gedit, vi ή οποιοδήποτε πρόγραμμα επεξεργασίας κειμένου ή IDE της επιλογής σας. Προσωπικά χρησιμοποιώ το Visual Studio Code με τις ακόλουθες επεκτάσεις:
Σημείωση: Οι επεκτάσεις δεν απαιτούνται - δημιουργούν απλώς ένα καλύτερο περιβάλλον κωδικοποίησης.
Το Truffle είναι ένα πολύ βολικό εργαλείο για τη σύνταξη έξυπνων συμβολαίων, τη μετεγκατάστασή τους σε ένα blockchain και παρέχει επίσης βοηθητικά προγράμματα ανάπτυξης και εντοπισμού σφαλμάτων. Ορισμένες ρυθμίσεις έργου θα είναι απαραίτητες για να ενσωματωθούν στο Truffle. Τώρα θα δημιουργήσουμε το κέλυφος για το έργο μας, τόσο στο Truffle όσο και στη δομή του καταλόγου. Απλά καθίστε, ακολουθήστε τα βήματα ρομποτικά προς το παρόν και απολαύστε.
ορισμός της τέχνης και του σχεδίου
Δημιουργήστε έναν κατάλογο για να φιλοξενήσετε όλο τον κώδικα. κάλεσε το 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-example/client/contracts/OracleInterface.sol
https://github.com/jrkosinski/oracle-example/tree/part1-step1/client/contracts/OracleInterface.sol
Κανονικά, η διασύνδεση 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
Εναλλακτικό: Χρησιμοποιήστε το σενάριο 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 από τη σύμβαση BoxingBets. Στην πραγματική χρήση, το συμβόλαιο της oracle θα υπάρχει ξεχωριστά από το συμβόλαιο πελάτη στο blockchain, οπότε θα πρέπει να είμαστε σε θέση:
Εν ολίγοις, αυτό που πρόκειται να κάνουμε τώρα είναι να χωρίσουμε το 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
Τώρα που το συμβόλαιο BoxingBets προσπαθεί να αναφέρεται σε ένα εντελώς ξεχωριστό συμβόλαιο (δηλαδή το μαντείο) κατά διεύθυνση, η επόμενη δουλειά μας είναι να δημιουργήσουμε αυτό το συμβόλαιο oracle. Τώρα λοιπόν πρόκειται να δημιουργήσουμε ένα ολόκληρο ξεχωριστό έργο που θα περιέχει τη σύμβαση oracle. Είναι ουσιαστικά η ίδια ρύθμιση που έχουμε ήδη κάνει για το έργο σύμβασης πελάτη. Δηλαδή, τη δημιουργία του Truffle για μεταγλώττιση και ανάπτυξη.
Πρέπει να έχετε ήδη έναν φάκελο / oracle-παράδειγμα / oracle / που δημιουργήσαμε σε ένα προηγούμενο βήμα (ή αν όχι, προχωρήστε και δημιουργήστε αυτόν τον κενό κατάλογο τώρα). Ανοίξτε ένα τερματικό σε αυτόν τον κατάλογο.
truffle init
. 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
Για αυτό το βήμα, απλώς αντιγράψτε τα ακόλουθα τρία αρχεία από https://github.com/jrkosinski/oracle-example/tree/part1-step2/oracle/contracts/ στο /oracle-example/oracle/contracts/
ντοσιέ:
πώς κερδίζουν χρήματα οι εφαρμογές γνωριμιών
Τώρα, στην τρέχουσα επανάληψη του έργου, πρέπει πραγματικά να δοκιμάσουμε διεξοδικά το έξυπνο συμβόλαιο μας, καθώς αυτή θα είναι η βάση μας στην οποία θα οικοδομήσουμε το υπόλοιπο έργο. Έτσι, τώρα που έχουμε ρυθμίσει το έργο 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
Ακόμα στην κονσόλα ανάπτυξης 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 / τερματικό:
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 })
Εκτελέστε την ακόλουθη εντολή για Truffle στο / oracle-παράδειγμα / oracle / τερματικό:
truffle(develop)> instance.getAddress()
Αντιγράψτε τη διεύθυνση που είναι η έξοδος από αυτήν την κλήση. και χρησιμοποιήστε το στο επόμενο βήμα.
Εκτελέστε την ακόλουθη εντολή για τρούφα στο / 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.
Ο ατομικός πειραματισμός είναι ένας καλός τρόπος για να μάθετε. Ακολουθούν μερικές απλές προτάσεις εάν σκέφτεστε τρόπους για να επεκτείνετε αυτό το σεμινάριο για μεγαλύτερη γνώση (κανένα από τα παρακάτω δεν θα καλυφθεί στα Μέρη 2 και 3):
Καλή τύχη και μη διστάσετε να επικοινωνήσετε μαζί μου για τυχόν απορίες. Δεν μπορώ να εγγυηθώ απαραίτητα μια γρήγορη απάντηση, αλλά θα κάνω το καλύτερο δυνατό.
Η γλώσσα προγραμματισμού που χρησιμοποιείται στην ανάπτυξη του Ethereum είναι το Solidity. Είναι μια γλώσσα προγραμματισμού προσανατολισμένη στη σύμβαση εμπνευσμένη από JavaScript, Python και C ++.
Το λεγόμενο * blockchain oracle * είναι μια αξιόπιστη πηγή δεδομένων που παρέχει πληροφορίες σχετικά με διάφορες καταστάσεις και συμβάντα που χρησιμοποιούνται από έξυπνες συμβάσεις.
Τα έξυπνα συμβόλαια χρηστών χρησιμοποιούνται για να παρέχουν σύνδεση μεταξύ πραγματικών γεγονότων και ψηφιακών συμβάσεων. Αυτά τα εξωτερικά δεδομένα που παρέχονται από την oracle ενδέχεται (ή όχι) να προκαλέσουν έξυπνες εκτελέσεις συμβολαίων.