Ruby  Schmitt

Ruby Schmitt

1662888480

Όλα τα έργα κρυπτονομισμάτων Web 3 για DeFi

Σε αυτό το άρθρο, θα μάθετε τι είναι το Web 3.0 και θα συζητήσετε τα κορυφαία 100 έργα κρυπτογράφησης Web 3 για DeFi

1. Τι είναι το Web3;

Το Web3 είναι επίσης γνωστό ως η τρίτη γενιά του Διαδικτύου. Στόχος του είναι να αφαιρέσει τον έλεγχο από μεγάλες εταιρείες και να λειτουργεί με αποκεντρωμένο τρόπο που ανήκει, κατασκευάζεται και λειτουργεί από τους ίδιους τους χρήστες.

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

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

Τι είναι τα κρυπτονομίσματα Web 3.0;   

Για να κατανοήσουμε τι είναι τα κρυπτονομίσματα Web 3.0, πρέπει πρώτα να κάνουμε ένα βήμα πίσω και να κατανοήσουμε την ανάπτυξη του Διαδικτύου όπως το γνωρίζουμε σήμερα. Πρώτα και κύρια, το Web 1.0 αναφέρεται στην αρχική έκδοση του Διαδικτύου από τη δεκαετία του 1990. Σκεφτείτε τη γραμμή μιας σύγχρονης σύνδεσης 56.000 και εξαιρετικά αργών χρόνων λήψης.

Στη συνέχεια, το Web 2.0 είναι το σημείο που βρισκόμαστε σήμερα, όσον αφορά τις εξαιρετικά γρήγορες συνδέσεις, τα δεδομένα 5g, τα smartphone και τη διαδικτυακή ροή. Η επόμενη γενιά του Διαδικτύου θα έρθει με τη μορφή Web 3.0. Αυτό θα οδηγήσει τα πράγματα στο επόμενο επίπεδο, με ιδιαίτερη έμφαση στις αναδυόμενες τεχνολογίες όπως:

  • Blockchain
  • Έξυπνα Συμβόλαια
  • Κρυπτονομίσματα
  • Αποκέντρωση
  • Τεχνητή νοημοσύνη
  • Μηχανική Μάθηση

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

Είναι τα Web 3.0 Coins μια καλή επένδυση;   

Εάν εξακολουθείτε να μην είστε σίγουροι αν αξίζει να αγοράσετε τα κρυπτονομίσματα Web 3.0, θα χρειαστεί να κάνετε λίγη περισσότερη έρευνα για να λάβετε μια τεκμηριωμένη απόφαση.

Μερικά από τα βασικά επενδυτικά οφέλη που συναντήσαμε κατά την ανάλυση των καλύτερων κρυπτονομισμάτων Web 3.0 συζητούνται παρακάτω.

Αποκέντρωση    

Ένα από τα κύρια οφέλη της επένδυσης σε μια συλλογή από τα καλύτερα κρυπτονομίσματα Web 3.0 είναι ότι θα αποκτήσετε έκθεση στον κόσμο της αποκέντρωσης.

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

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

Ωστόσο, εάν το Web 3.0 μπορεί να διατηρήσει τα πράγματα αποκεντρωμένα, τα δεδομένα του ιστότοπου θα αποθηκευτούν σε πολλούς διακομιστές σε όλο τον κόσμο. Αυτό σημαίνει ότι η πρόσβαση δεν μπορεί να αρνηθεί ή να περιοριστεί.

Χωρίς άδεια και χωρίς λογοκρισία      

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

  • Για παράδειγμα, τα προϊόντα όπως το Google, το YouTube και το Facebook είναι όλα απαγορευμένα στην Κίνα – πράγμα που σημαίνει ότι 1,4 δισεκατομμύρια άνθρωποι δεν μπορούν να έχουν πρόσβαση σε αυτούς τους ιστότοπους χωρίς να περάσουν από VPN.
  • Αυτό το ζήτημα υπάρχει σε πολλές άλλες χώρες – ειδικά όταν πρόκειται για πρόσβαση σε αξιόπιστες ειδήσεις από διεθνείς πηγές μέσων ενημέρωσης.

Ευτυχώς, καθώς το Web 3.0 θα είναι τόσο αποκεντρωμένο όσο και χωρίς άδεια, αυτό θα διασφαλίσει ότι το Διαδίκτυο δεν θα μπορεί πλέον να λογοκρίνεται.

Δυνατότητα ανάπτυξης     

Ένα άλλο πλεονέκτημα της αγοράς των καλύτερων κρυπτονομισμάτων 3.0 για το χαρτοφυλάκιό σας είναι ότι οι ανοδικές δυνατότητες μπορεί να είναι τεράστιες. Ανάλογα με το έργο στο οποίο αποφασίζετε να επενδύσετε, υπάρχει κάθε πιθανότητα ο εκτιμητής του χαρτοφυλακίου σας να αυξηθεί σε σχέση με την ανάπτυξη του οικοσυστήματος Web 3.0.


Εύκολο στη διαφοροποίηση      

Με βάση την παραπάνω ενότητα, ένας από τους καλύτερους τρόπους για να μειώσετε τον κίνδυνο απώλειας είναι η διαφοροποίηση σε πολλά διαφορετικά Web 3.0. κρυπτονομίσματα.

  • Για παράδειγμα, σημειώσαμε νωρίτερα ότι το Ethereum είναι η de-facto Web 3.0 blockchain επιλογής, με μερικά από τα πιο καυτά έργα να επιλέγουν να δημιουργήσουν την πλατφόρμα τους πάνω από το δίκτυό του.
  • Ωστόσο, τότε έχετε το Solana, το οποίο είναι πιο γρήγορο, φθηνότερο και πολύ πιο επεκτάσιμο από το Ethereum.
  • Αυτό συμβαίνει επίσης με τους Cardano και Neo.
  • Ως εκ τούτου, θα μπορούσε να είναι συνετό να διαφοροποιηθεί σε πολλές αλυσίδες μπλοκ Web 3.0.

Αυτό το συναίσθημα συμβαίνει και με την Decentraland, στο βαθμό που το έργο δεν είναι η μόνη πλατφόρμα Metaverse που στοχεύει εικονικά ακίνητα. Σε τελική ανάλυση, όπως το Sandbox, το Axie Infinity και πολλά άλλα προσφέρουν μια παρόμοια ιδέα.

Το Web 3.0 είναι ακόμα στα σπάργανα      

Ένα άλλο πλεονέκτημα από την αγορά των καλύτερων κρυπτονομισμάτων Web 3.0 είναι ότι αυτός ο κλάδος βρίσκεται ακόμα σε αρχικό στάδιο.

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

Συγκριτικά, θα μπορούσε να υποστηριχθεί ότι αυτό προσφέρει την ίδια ευκαιρία να επενδύσετε στην Amazon ή τη Microsoft τη δεκαετία του 1990 (Web 1.0) ή ακόμη και σε μετοχές τεχνολογίας όπως η Apple και το Facebook τη δεκαετία του 2000 (Web 2.0).

Πού να αγοράσετε κρυπτονομίσματα Web 3.0     

Εάν γνωρίζετε ήδη ποια νομίσματα κρυπτογράφησης Web 3.0 ταιριάζουν καλύτερα για το επενδυτικό σας χαρτοφυλάκιο, το επόμενο βήμα είναι να βρείτε ένα κατάλληλο ανταλλακτήριο ή μεσίτη για να ολοκληρώσετε την αγορά σας.

Η επιλεγμένη πλατφόρμα δεν θα πρέπει μόνο να υποστηρίζει τις επιλογές κρυπτονομισμάτων Web 3.0, αλλά να προσφέρει χαμηλές χρεώσεις και ένα ασφαλές μέρος για συναλλαγές. Βρήκαμε ότι συνολικά, το Binance είναι το καλύτερο μέρος για να αγοράσετε νομίσματα Web 3.0, για τους λόγους που περιγράφονται παρακάτω:

  • Το Binance υποστηρίζει δεκάδες κορυφαία κρυπτονομίσματα Web 3.0, ώστε να μπορείτε εύκολα να διαφοροποιήσετε το χαρτοφυλάκιό σας
  • Το Binance ελέγχεται από διάφορους φορείς αδειοδότησης πρώτης βαθμίδας – επομένως η ασφάλεια είναι εξασφαλισμένη
  • Η Binance προσφέρει επίσης υπηρεσίες συναλλαγών αντιγράφων, ώστε να μπορείτε να αγοράζετε και να πουλάτε τα καλύτερα κρυπτονομίσματα Web 3.0 παθητικά

Κορυφαίες ανταλλαγές για συναλλαγές νομισμάτων. 

BinanceFTXPoloniexBitfinexHuobiMXCByBitGate.io


2. Τα κορυφαία 100 έργα κρυπτογράφησης Web 3 για DeFi

Εδώ είναι τα 100 κορυφαία έργα κρυπτογράφησης Web3 που εργάζονται για τη δημιουργία της επόμενης γενιάς του Ιστού (Ταξινόμηση κατά όγκο συναλλαγών)

ΟνομαΠεριγραφήΚέρμα/TokenΑγόρασε πούλαΔικτυακός τόπος
PolkadotΤο Polkadot είναι ένα πρωτόκολλο πολλαπλών αλυσίδων ανοιχτού κώδικα που συνδέει και προστατεύει ένα δίκτυο εξειδικευμένων αλυσίδων μπλοκ, διευκολύνοντας τη διασταυρούμενη μεταφορά οποιωνδήποτε δεδομένων ή τύπων περιουσιακών στοιχείων, όχι μόνο διακριτικών, επιτρέποντας έτσι στις αλυσίδες μπλοκ να είναι διαλειτουργικά μεταξύ τους. Το Polkadot σχεδιάστηκε για να παρέχει τη βάση για ένα αποκεντρωμένο Διαδίκτυο blockchains, γνωστό και ως Web3.

Το Polkadot είναι γνωστό ως μεταπρωτόκολλο στρώματος 0, επειδή αποτελεί τη βάση και περιγράφει μια μορφή για ένα δίκτυο μπλοκ αλυσίδων στρώματος 1 γνωστά ως παρααλυσίδες (παράλληλες αλυσίδες). Ως μεταπρωτόκολλο, το Polkadot είναι επίσης ικανό να ενημερώνει αυτόνομα και αδιάκοπα τη δική του βάση κωδικών μέσω διακυβέρνησης στην αλυσίδα σύμφωνα με τη βούληση της κοινότητας κατόχων διακριτικών του.

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

Το πρωτόκολλο Polkadot μπορεί να συνδέσει δημόσιες και ιδιωτικές αλυσίδες, δίκτυα χωρίς άδεια, μαντεία και μελλοντικές τεχνολογίες, επιτρέποντας σε αυτά τα ανεξάρτητα blockchain να μοιράζονται με αξιοπιστία πληροφορίες και συναλλαγές μέσω της αλυσίδας αναμετάδοσης Polkadot (εξηγείται παρακάτω).
DOTBinancehttps://polkadot.network/
ChainlinkΤο Chainlink είναι ένα στρώμα αφαίρεσης αλυσίδας μπλοκ που επιτρέπει τα έξυπνα συμβόλαια που συνδέονται παγκοσμίως. Μέσω ενός αποκεντρωμένου δικτύου oracle, το Chainlink επιτρέπει στα blockchain να αλληλεπιδρούν με ασφάλεια με εξωτερικές ροές δεδομένων, συμβάντα και μεθόδους πληρωμής, παρέχοντας τις κρίσιμες πληροφορίες εκτός αλυσίδας που απαιτούνται από πολύπλοκα έξυπνα συμβόλαια για να γίνουν η κυρίαρχη μορφή ψηφιακής συμφωνίας.

Το Δίκτυο Chainlink καθοδηγείται από μια μεγάλη κοινότητα ανοιχτού κώδικα παρόχων δεδομένων, χειριστών κόμβων, προγραμματιστών έξυπνων συμβολαίων, ερευνητών, ελεγκτών ασφαλείας και άλλων. Η εταιρεία εστιάζει στη διασφάλιση ότι η αποκεντρωμένη συμμετοχή είναι εγγυημένη για όλους τους χειριστές κόμβων και τους χρήστες που θέλουν να συνεισφέρουν στο δίκτυο.
LINKBinancehttps://chain.link/
TellorΤο Tellor είναι ένα αποκεντρωμένο πρωτόκολλο μαντείου. Το Tellor's Oracle παρέχει δεδομένα που μπορούν να ζητηθούν, να επικυρωθούν και να τεθούν σε αλυσίδα χωρίς άδεια με ανταποκριτές δεδομένων που ανταγωνίζονται για κίνητρα TRB. Οι αναφορές δεδομένων φέρνουν πολύτιμες πληροφορίες στην αλυσίδα για ένα ευρύ φάσμα εφαρμογών DeFi.TRBBinancehttps://tellor.io/
FilecoinΤο Filecoin είναι ένα αποκεντρωμένο σύστημα αποθήκευσης που στοχεύει στην «αποθήκευση των πιο σημαντικών πληροφοριών της ανθρωπότητας».   

Ένα στρώμα κινήτρου για το Διαπλανητικό Σύστημα Αρχείων (IPFS), ένα δίκτυο αποθήκευσης peer-to-peer. Το Filecoin είναι ανοιχτό πρωτόκολλο και υποστηρίζεται από μια αλυσίδα μπλοκ που καταγράφει τις δεσμεύσεις που αναλαμβάνονται από τους συμμετέχοντες του δικτύου, με τις συναλλαγές που πραγματοποιούνται χρησιμοποιώντας το FIL, το εγγενές νόμισμα του blockchain. Το blockchain βασίζεται τόσο στο proof-of-replication όσο και στο proof-of-spacetime.
FILBinancehttps://filecoin.io/
The GraphΤο Graph είναι ένα πρωτόκολλο ευρετηρίασης για την αναζήτηση δεδομένων για δίκτυα όπως το Ethereum και το IPFS, τροφοδοτώντας πολλές εφαρμογές τόσο στο DeFi όσο και στο ευρύτερο οικοσύστημα Web3. Οποιοσδήποτε μπορεί να δημιουργήσει και να δημοσιεύσει ανοιχτά API, που ονομάζονται υπογραφήματα, στα οποία οι εφαρμογές μπορούν να υποβάλουν ερωτήματα χρησιμοποιώντας το GraphQL για την ανάκτηση δεδομένων blockchain. 

Το Graph εργάζεται για να φέρει αξιόπιστη αποκεντρωμένη δημόσια υποδομή στην κύρια αγορά. Για να διασφαλιστεί η οικονομική ασφάλεια του Δικτύου Γραφών και η ακεραιότητα των δεδομένων που ζητούνται, οι συμμετέχοντες χρησιμοποιούν το Διακριτικό Γραφήματος (GRT). Το GRT είναι ένα διακριτικό εργασίας που κλειδώνεται από Ευρετηριωτές, Επιμελητές και Αντιπροσώπους προκειμένου να παρέχουν υπηρεσίες ευρετηρίασης και επιμέλειας στο δίκτυο.
GRTBinancehttps://thegraph.com/en/
Ethereum Name ServiceΗ υπηρεσία ονομάτων Ethereum (ENS) είναι ένα κατανεμημένο, ανοιχτό και επεκτάσιμο σύστημα ονοματοδοσίας που βασίζεται στο blockchain Ethereum. Το ENS μετατρέπει τις αναγνώσιμες από τον άνθρωπο διευθύνσεις Ethereum όπως το john.eth σε αναγνώσιμους από μηχανή αλφαριθμητικούς κωδικούς που γνωρίζετε από πορτοφόλια όπως το Metamask. Η αντίστροφη μετατροπή -- συσχέτιση μεταδεδομένων και διευθύνσεων αναγνώσιμων από μηχανή με διευθύνσεις Ethereum αναγνώσιμες από τον άνθρωπο -- είναι επίσης δυνατή.

Ο στόχος της Υπηρεσίας ονομάτων Ethereum είναι να κάνει τον ιστό που βασίζεται στο Ethereum πιο εύκολο στην πρόσβαση και κατανόηση για τον άνθρωπο - παρόμοιο με τον τρόπο με τον οποίο η Υπηρεσία Ονομάτων Τομέα του Διαδικτύου κάνει το Διαδίκτυο πιο προσιτό. Όπως το DNS, το ENS χρησιμοποιεί επίσης ένα σύστημα ιεραρχικών ονομάτων διαχωρισμένων με τελείες που ονομάζονται τομείς με τους κατόχους τομέων να ελέγχουν πλήρως τους υποτομείς τους.
ENSBinancehttps://ens.domains/
LoopringΤο LRC είναι το διακριτικό κρυπτονομισμάτων που βασίζεται στο Ethereum του Loopring, ένα ανοιχτό πρωτόκολλο σχεδιασμένο για τη δημιουργία αποκεντρωμένων ανταλλακτηρίων κρυπτονομισμάτων.

Ο υποτιθέμενος στόχος του Loopring είναι να συνδυάσει την κεντρική αντιστοίχιση παραγγελιών με την αποκεντρωμένη διευθέτηση παραγγελιών εντός του blockchain σε ένα υβριδοποιημένο προϊόν που θα λάβει τις καλύτερες πτυχές τόσο των κεντρικών όσο και των αποκεντρωμένων ανταλλαγών.
LRCBinancehttps://loopring.org/#/
Theta NetworkΤο Theta (THETA) είναι ένα δίκτυο που υποστηρίζεται από blockchain και έχει δημιουργηθεί ειδικά για ροή βίντεο. Web3 Blockchain Infrastructure for Video, Media & Entertainment

Το Theta mainnet λειτουργεί ως ένα αποκεντρωμένο δίκτυο στο οποίο οι χρήστες μοιράζονται εύρος ζώνης και υπολογιστικούς πόρους σε βάση peer-to-peer (P2P). Το έργο συμβουλεύεται ο Steve Chen, συνιδρυτής του YouTube και ο Justin Kan, συνιδρυτής του Twitch.
THETABinancehttps://www.thetatoken.org/
Basic Attention TokenΤο Basic Attention Token, ή BAT, είναι το διακριτικό που τροφοδοτεί μια νέα πλατφόρμα ψηφιακής διαφήμισης που βασίζεται σε blockchain, σχεδιασμένη να ανταμείβει αρκετά τους χρήστες για την προσοχή τους, παρέχοντας παράλληλα στους διαφημιζόμενους καλύτερη απόδοση στις διαφημιστικές δαπάνες τους.

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

Το ίδιο το Basic Attention Token είναι η μονάδα ανταμοιβής σε αυτό το διαφημιστικό οικοσύστημα και ανταλλάσσεται μεταξύ διαφημιζόμενων, εκδοτών και χρηστών. Οι διαφημιστές πληρώνουν για τις διαφημιστικές τους καμπάνιες σε διακριτικά BAT. Από αυτόν τον προϋπολογισμό, ένα μικρό μέρος διανέμεται στους διαφημιστές, ενώ το 70% διανέμεται στους χρήστες — ενώ οι μεσάζοντες που συνήθως αυξάνουν το κόστος διαφήμισης αποκόπτονται από την εξίσωση για τη βελτίωση της αποδοτικότητας κόστους.
BATBinancehttps://basicattentiontoken.org/
BitTorrentΤο BitTorrent είναι μια δημοφιλής πλατφόρμα κοινής χρήσης αρχείων και torrent peer-to-peer (P2P), η οποία έχει γίνει όλο και πιο αποκεντρωμένη τα τελευταία χρόνια. Το BitTorrent είναι επί του παρόντος το «μεγαλύτερο αποκεντρωμένο πρωτόκολλο επικοινωνίας P2P» στον κόσμο.

Μεταξύ των πρόσθετων χαρακτηριστικών είναι το BitTorrent Speed, το οποίο χρησιμοποιεί το διακριτικό BTT ως μέρος των λειτουργιών του. Το BitTorrent έχει επίσης διακλαδιστεί σε υπηρεσίες επί πληρωμή, προσφέροντας πολλές «premium» εκδόσεις της πλατφόρμας του που περιλαμβάνουν δυνατότητες VPN και περιήγηση χωρίς διαφημίσεις.
BTTBinancehttps://bt.io/
FluxΤο Flux είναι η νέα γενιά κλιμακούμενης αποκεντρωμένης υποδομής cloud. Απλώς αναπτύξτε, διαχειριστείτε και δημιουργήστε τις εφαρμογές σας σε πολλούς διακομιστές ταυτόχρονα. Έτοιμο για Web 3.0, Dapps και άλλα.

Το Flux Ecosystem είναι μια πλήρως λειτουργική σουίτα αποκεντρωμένων υπολογιστικών υπηρεσιών και λύσεων blockchain-as-a-service που προσφέρουν ένα διαλειτουργικό, αποκεντρωμένο περιβάλλον ανάπτυξης που μοιάζει με AWS.
FLUXBinancehttps://runonflux.io/
OntologyΤο Ontology είναι ένα έργο που έχει σχεδιαστεί για να φέρει εμπιστοσύνη, απόρρητο και ασφάλεια στο Web3 μέσω αποκεντρωμένων λύσεων ταυτότητας και δεδομένων. Κατασκευάζει την υποδομή για την παροχή αξιόπιστης πρόσβασης στο Web3, επιτρέποντας σε άτομα και επιχειρήσεις να είναι σίγουροι ότι μέσω λύσεων ψηφιακής ταυτότητας που συμμορφώνονται με τους κανονισμούς, οι χρήστες και το απόρρητό τους προηγούνται.

Μέσω της Εικονικής Μηχανής Ethereum (EVM) της Ontology, η Ontology διασφαλίζει συμβατότητα χωρίς τριβές με το Ethereum, το πρώτο βήμα για τη δημιουργία της Πολλαπλής Εικονικής Μηχανής Ontology και περαιτέρω διαλειτουργικότητα για την αλυσίδα.
ONTBinancehttps://ont.io/
StorjΤο Storj είναι μια πλατφόρμα αποθήκευσης cloud ανοιχτού κώδικα. Βασικά, χρησιμοποιεί ένα αποκεντρωμένο δίκτυο κόμβων για να φιλοξενήσει δεδομένα χρήστη. Η πλατφόρμα προστατεύει επίσης τα φιλοξενούμενα δεδομένα χρησιμοποιώντας προηγμένη κρυπτογράφηση.

Άτομα με χώρο στον σκληρό δίσκο και καλή σύνδεση στο διαδίκτυο μπορούν να συμμετέχουν στο δίκτυο. Γίνονται μια μονάδα στο δίκτυο, που ονομάζεται κόμβος. Οι πάροχοι διαστήματος ανταμείβονται με μάρκες Storj.
STORJBinancehttps://www.storj.io/
KadenaΤο Kadena είναι ένα blockchain απόδειξης εργασίας που συνδυάζει τον μηχανισμό συναίνεσης PoW από το Bitcoin με τις αρχές κατευθυνόμενου ακυκλικού γραφήματος (DAG) για να προσφέρει μια επεκτάσιμη έκδοση του Bitcoin. Η Kadena ισχυρίζεται ότι μπορεί να παρέχει την ασφάλεια του Bitcoin ενώ είναι σε θέση να προσφέρει απαράμιλλη απόδοση που καθιστά το blockchain χρησιμοποιήσιμο τόσο σε επιχειρήσεις όσο και σε επιχειρηματίες. Η μοναδική υποδομή του Kadena είναι αποκεντρωμένη και κατασκευασμένη για μαζική υιοθέτηση λόγω της προσέγγισης πολλαπλών αλυσίδων.

Η Kadena υπόσχεται βιομηχανική επεκτασιμότητα που μπορεί να υποστηρίξει παγκόσμια χρηματοπιστωτικά συστήματα και μπορεί να κλιμακωθεί ανάλογα με τις ανάγκες. Ορκίζεται επίσης να παραμείνει ενεργειακά αποδοτική σε κλίμακα και να προσφέρει περισσότερες συναλλαγές με την ίδια εισροή ενέργειας, μια άλλη διαφορά στο Bitcoin. Επιπλέον, η Kadena προσφέρει βενζινάδικα κρυπτογράφησης, τα οποία επιτρέπουν στις επιχειρήσεις να πληρώνουν για τα τέλη φυσικού αερίου των πελατών τους και να απομακρύνουν ένα τεράστιο σημείο πόνου στην υιοθέτηση blockchains για επιχειρήσεις.
KDABinancehttps://kadena.io/
Mask NetworkΤο Mask Network είναι ένα πρωτόκολλο που επιτρέπει στους χρήστες του να στέλνουν κρυπτογραφημένα μηνύματα μέσω Twitter και Facebook. Λειτουργεί ουσιαστικά ως γέφυρα μεταξύ του Διαδικτύου και ενός αποκεντρωμένου δικτύου που τρέχει από πάνω.

Είναι μια αποκεντρωμένη πύλη που επιτρέπει επίσης στους χρήστες να χρησιμοποιούν DApps όπως πληρωμές κρυπτογράφησης, αποκεντρωμένη χρηματοδότηση, αποκεντρωμένη αποθήκευση, ηλεκτρονικό εμπόριο (ψηφιακά αγαθά/NFT) και αποκεντρωμένους οργανισμούς (DAO) πάνω από τα υπάρχοντα κοινωνικά δίκτυα χωρίς μετεγκατάσταση, δημιουργώντας αναφέρεται ως αποκεντρωμένο οικοσύστημα Applet (DApplet).
MASKBinance

https://mask.io/

 

ReefΤο Reef είναι ένα αξιόπιστο επεκτάσιμο και αποτελεσματικό Fast Layer-1 Blockchain για DeFi, NFT και Gaming. Κατασκευασμένο με χρήση του Substrate Framework, παρέχει υψηλή επεκτασιμότητα, επιτρέποντας σχεδόν άμεσες συναλλαγές χαμηλού κόστους και υποστηρίζει Solidity και EVM, επιτρέποντας στους προγραμματιστές να μεταφέρουν απρόσκοπτα τα DApps τους από το Ethereum χωρίς καμία αλλαγή στη βάση κώδικα.

Το Reef Chain είναι το πιο προηγμένο blockchain συμβατό με EVM. Είναι αυτοαναβαθμίσιμο και διαθέτει διακυβέρνηση on-chain. Η υποδομή του επιτρέπει επίσης επεκτάσεις EVM που επιτρέπουν εγγενή γέφυρα διακριτικών, προγραμματισμένες κλήσεις (δηλ. επαναλαμβανόμενες πληρωμές) και επιτόπιες αναβαθμίσεις κώδικα έξυπνων συμβολαίων. Στο εγγύς μέλλον, θα υποστηρίξει επιπλέον εικονικά μηχανήματα που θα επιτρέπουν στους προγραμματιστές να γράφουν κώδικα σε πολλές γλώσσες προγραμματισμού. Το δίκτυο λειτουργεί με συναινετικό μηχανισμό Nominated Proof-of-Stake (NPoS), ο οποίος προσφέρει επεκτασιμότητα και χαμηλές χρεώσεις.
 
REEFBinance

https://reef.io/

 

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

Αυτό το κάνει παρέχοντας πρόσβαση κατ' απαίτηση σε πόρους υπολογιστικού νέφους. Το IEexec μπορεί να υποστηρίξει εφαρμογές σε τομείς όπως τα μεγάλα δεδομένα, η υγειονομική περίθαλψη, η τεχνητή νοημοσύνη, η απόδοση και το fintech. 
RLCBinance

https://iex.ec/

 

 

HeliumΤο Helium (HNT) είναι ένα αποκεντρωμένο δίκτυο που τροφοδοτείται από blockchain για συσκευές Internet of Things (IoT). Το κεντρικό δίκτυο ηλίου επιτρέπει στις ασύρματες συσκευές χαμηλής κατανάλωσης να επικοινωνούν μεταξύ τους και να στέλνουν δεδομένα μέσω του δικτύου κόμβων του.

Οι κόμβοι έρχονται με τη μορφή των λεγόμενων Hotspots, τα οποία είναι ένας συνδυασμός μιας ασύρματης πύλης και μιας συσκευής εξόρυξης blockchain. Οι χρήστες που λειτουργούν κόμβους εξορύσσουν έτσι και κερδίζουν ανταμοιβές στο εγγενές διακριτικό κρυπτονομισμάτων του Helium, το HNT. Εκτός από το HNT, οι χρήστες πληρώνουν τέλη συναλλαγής σε ένα ξεχωριστό διακριτικό που ονομάζεται Πιστώσεις Δεδομένων, οι οποίες δεν ανταλλάσσονται και συνδέονται με τους ίδιους τους μεμονωμένους χρήστες.
HNTBinancehttps://www.helium.com/
ArweaveΤο Arweave είναι ένα αποκεντρωμένο δίκτυο αποθήκευσης που επιδιώκει να προσφέρει μια πλατφόρμα για την απεριόριστη αποθήκευση δεδομένων. Περιγράφοντας τον εαυτό του ως «έναν συλλογικό σκληρό δίσκο που δεν ξεχνιέται», το δίκτυο φιλοξενεί πρωτίστως το «permaweb» — έναν μόνιμο, αποκεντρωμένο ιστό με μια σειρά από εφαρμογές και πλατφόρμες που βασίζονται στην κοινότητα.ARBinancehttps://www.arweave.org/
Ocean ProtocolΤο Ocean Protocol είναι ένα οικοσύστημα που βασίζεται σε blockchain που επιτρέπει σε άτομα και επιχειρήσεις να ξεκλειδώνουν εύκολα την αξία των δεδομένων τους και να δημιουργούν έσοδα από αυτά μέσω της χρήσης των στοιχείων δεδομένων που βασίζονται στο ERC-20.

Μέσω του Ocean Protocol, οι εκδότες μπορούν να δημιουργούν έσοδα από τα δεδομένα τους διατηρώντας παράλληλα το απόρρητο και τον έλεγχο, ενώ οι καταναλωτές μπορούν πλέον να έχουν πρόσβαση σε σύνολα δεδομένων που προηγουμένως δεν ήταν διαθέσιμα ή ήταν δύσκολο να βρεθούν. Αυτά τα σύνολα δεδομένων μπορούν να ανακαλυφθούν στην Ocean Market, όπου μπορούν να αγοραστούν και αργότερα να καταναλωθούν ή να πωληθούν.

Το Ocean Protocol παρέχει τα εργαλεία που χρειάζονται οι εταιρείες για να δημιουργήσουν και να λανσάρουν τις δικές τους αγορές δεδομένων, είτε απευθείας διαχωρίζοντας το Ocean Protocol είτε χρησιμοποιώντας τα παρεχόμενα άγκιστρα Ocean Protocol React. Παρέχει επίσης εκτενή τεκμηρίωση για να βοηθήσει με αυτή τη διαδικασία.
OCEANBinance

https://oceanprotocol.com/

 

StacksΤο Stacks είναι μια λύση blockchain επιπέδου 1 που έχει σχεδιαστεί για να φέρει έξυπνα συμβόλαια και αποκεντρωμένες εφαρμογές (DApps) στο Bitcoin (BTC). Αυτά τα έξυπνα συμβόλαια φέρονται στο Bitcoin χωρίς να αλλάξουν κανένα από τα χαρακτηριστικά που το καθιστούν τόσο ισχυρό - συμπεριλαμβανομένης της ασφάλειας και της σταθερότητάς του.

Αυτές οι εφαρμογές DA είναι ανοιχτές και αρθρωτές, πράγμα που σημαίνει ότι οι προγραμματιστές μπορούν να δημιουργήσουν ο ένας πάνω από τις εφαρμογές του άλλου για να παράγουν λειτουργίες που απλά δεν είναι δυνατές σε μια κανονική εφαρμογή. Δεδομένου ότι το Stacks χρησιμοποιεί το Bitcoin ως βασικό επίπεδο, όλα όσα συμβαίνουν στο δίκτυο διευθετούνται στο πιο ευρέως χρησιμοποιούμενο αναμφισβήτητα το πιο ασφαλές blockchain σε λειτουργία - το Bitcoin.
STXBinancehttps://www.stacks.co/
GolemΤο Golem Network είναι ένα αποκεντρωμένο υπολογιστικό δίκτυο, ένας νέος τρόπος διανομής πλεονάζουσας υπολογιστικής ισχύος σε όσους το έχουν ανάγκη, κατ' απαίτηση. Δημιουργεί ένα δίκτυο peer-to-peer όπου οι χρήστες συμμετέχουν σε ισότιμη βάση για να αγοράσουν και να πουλήσουν υπολογισμούς, χωρίζοντας πολύπλοκες εργασίες σε μικρότερες δευτερεύουσες εργασίες στο δίκτυο.


Το Golem Network Token είναι απαραίτητο για την πληρωμή των υπολογισμών στο δίκτυο και είναι το νόμισμα που οδηγεί την αγορά μας. Ως αιτών, ορίζετε μια προσφορά για ένα ποσό GNT που είστε διατεθειμένοι να πληρώσετε για να ολοκληρώσετε την εργασία σας. Ως Πάροχος, κερδίζετε GNT υπολογίζοντας εργασίες για αιτούντες. Μπορείτε να ορίσετε το ελάχιστο και μέγιστο όριο τιμής στις ρυθμίσεις σας.
GLMBinancehttps://www.golem.network/
AragonΤο Aragon (ANT) είναι μια αποκεντρωμένη πλατφόρμα που βασίζεται στο δίκτυο Ethereum που προσφέρει έναν αρθρωτό τρόπο δημιουργίας και διαχείρισης dApps, κρυπτοπρωτόκολλων και αποκεντρωμένων αυτόνομων οργανισμών (DAO). Το διακριτικό ANT ERC-20 θα επιτρέψει στους κατόχους του να κυβερνούν το δίκτυο Aragon.
 
ANTBinance

https://aragon.org/

 

RenderΤο RenderToken (RNDR) είναι ένα κατανεμημένο δίκτυο απόδοσης GPU που έχει δημιουργηθεί πάνω από το blockchain Ethereum, με στόχο να συνδέσει καλλιτέχνες και στούντιο που χρειάζονται υπολογιστική ισχύ GPU με συνεργάτες εξόρυξης που είναι πρόθυμοι να νοικιάσουν τις δυνατότητες GPU τους. 

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

https://rendertoken.com/

 

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

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

Η λύση επαλήθευσης ταυτότητας της Civic χρησιμοποιεί τεχνολογία κατανεμημένης λογιστικής για να εξουσιοδοτήσει τη χρήση ταυτότητας σε πραγματικό χρόνο και χρησιμοποιείται για να μοιράζεται με φειδώ πληροφορίες με τους συνεργάτες της Civic μετά από εξουσιοδότηση από τον χρήστη.
CVCBinance

https://www.civic.com/

 

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

Η πλατφόρμα ανοιχτού κώδικα επιτρέπει στους χρήστες και τους προγραμματιστές να συμμετέχουν στη διαχείριση και τη βελτίωση της πλατφόρμας ελεύθερα. Οι αυξανόμενες δυνατότητες των ψηφιακών καμερών για παραγωγή περιεχομένου βίντεο υψηλής ποιότητας οδηγούν την ανάπτυξη του κλάδου των ραδιοτηλεοπτικών εκπομπών και η Livepeer στοχεύει να ενισχύσει περαιτέρω αυτή τη διαδικασία επιτρέποντας στους χρήστες να επωφεληθούν από την αποκεντρωμένη υπολογιστική ισχύ και τα κρυπτοοικονομικά κίνητρα για bootstrapping και συμμετοχή.
LPTBinancehttps://livepeer.org/
iExecΤο iExec είναι ο κορυφαίος πάροχος αποκεντρωμένων υπολογιστών που βασίζεται σε blockchain. Το Blockchain χρησιμοποιείται για την οργάνωση ενός δικτύου αγοράς όπου οι άνθρωποι μπορούν να κερδίζουν χρήματα από την υπολογιστική τους ισχύ, καθώς και από εφαρμογές και ακόμη και σύνολα δεδομένων.

Αυτό το κάνει παρέχοντας πρόσβαση κατ' απαίτηση σε πόρους υπολογιστικού νέφους. Το IEexec μπορεί να υποστηρίξει εφαρμογές σε τομείς όπως τα μεγάλα δεδομένα, η υγειονομική περίθαλψη, η τεχνητή νοημοσύνη, η απόδοση και το fintech.
RLCBinance

https://iex.ec/

 

SiacoinΤο Siacoin (SC) είναι το εγγενές διακριτικό χρησιμότητας της Sia, μιας κατανεμημένης, αποκεντρωμένης πλατφόρμας αποθήκευσης cloud που βασίζεται σε blockchain. Η Sia λειτουργεί ως μια ασφαλής, αξιόπιστη αγορά για αποθήκευση cloud, στην οποία οι χρήστες μπορούν να μισθώσουν πρόσβαση στον αχρησιμοποίητο αποθηκευτικό χώρο τους. 

Οι συμφωνίες και οι συναλλαγές επιβάλλονται με έξυπνα συμβόλαια και το Siacoin είναι το μέσο ανταλλαγής για την πληρωμή για αποθήκευση στο δίκτυο. Ο κύριος στόχος του έργου είναι να γίνει το «στρώμα αποθήκευσης κορμού του διαδικτύου».
SCBinancehttps://sia.tech/
API3Ο δηλωμένος στόχος του API3 είναι να επιτρέψει τη δημιουργία, τη διαχείριση και τη δημιουργία εσόδων σε αποκεντρωμένες εκδόσεις των API σε κλίμακα. Καθώς η τεχνολογία blockchain διαδραματίζει ολοένα μεγαλύτερο ρόλο στην οικονομία - από την αποκεντρωμένη χρηματοδότηση έως τη διαχείριση της εφοδιαστικής αλυσίδας - η ομάδα πίσω από αυτό το έργο λέει ότι ποτέ δεν ήταν πιο σημαντικό τα έξυπνα συμβόλαια να παρέχουν «έγκαιρα, αξιόπιστα δεδομένα από τον πραγματικό κόσμο».API3Binance

https://api3.org/

 

Band ProtocolΤο Band Protocol είναι μια πλατφόρμα μαντείου δεδομένων πολλαπλών αλυσίδων που μπορεί να λαμβάνει δεδομένα πραγματικού κόσμου και να τα παρέχει σε εφαρμογές on-chain, ενώ επίσης συνδέει API με έξυπνα συμβόλαια για να διευκολύνει την ανταλλαγή πληροφοριών μεταξύ εντός και εκτός αλυσίδας πηγές δεδομένων.

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

https://bandprotocol.com/

 

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

Το Litentry περιλαμβάνει ένα δίκτυο που βασίζεται σε ταυτότητα και σχετικά εργαλεία, διαθέτει μηχανισμό αντιστοίχισης ταυτότητας και στοιχηματισμού ταυτότητας, στο σύνολό του αποτελείται από αποκεντρωμένη υποδομή διαχείρισης δεδομένων ταυτότητας και δραστηριότητας χρήστη.
LITBinance

https://litentry.com/

 

HiveΤο Hive είναι ένα αποκεντρωμένο δίκτυο ανταλλαγής πληροφοριών με ένα συνοδευτικό χρηματοοικονομικό καθολικό βασισμένο σε blockchain που βασίζεται στο πρωτόκολλο Delegated Proof of Stake (DPoS). Το Hive υποστηρίζει πολλούς διαφορετικούς τύπους εφαρμογών κοινής χρήσης πληροφοριών. 

Συνδυάζοντας τους αστραπιαίους χρόνους επεξεργασίας και τις συναλλαγές χωρίς χρέωση, το Hive βρίσκεται σε θέση να γίνει μια από τις κορυφαίες τεχνολογίες blockchain που χρησιμοποιούνται από ανθρώπους σε όλο τον κόσμο.
HIVEBinancehttps://hive.io/
AudiusΤο Audius είναι ένα αποκεντρωμένο πρωτόκολλο ροής μουσικής που αρχικά χτίστηκε στο δίκτυο POA, αλλά τώρα ζει στο Solana. Το Audius κυκλοφόρησε για να διορθώσει την αναποτελεσματικότητα της μουσικής βιομηχανίας, η οποία μαστίζεται από την αδιαφανή ιδιοκτησία των μουσικών δικαιωμάτων και τους μεσάζοντες που στέκονται μεταξύ των καλλιτεχνών και του κοινού τους. Οι καλλιτέχνες μπορούν να ανεβάζουν μουσική, αποθηκευμένη και διανεμημένη ανά περιεχόμενο και κόμβους ανακάλυψης, την οποία οι θαυμαστές μπορούν να ακούσουν δωρεάν. AUDIOBinancehttps://audius.co/
CasperΤο Casper είναι το πρώτο blockchain ζωντανής απόδειξης στοιχήματος (PoS) που βασίζεται στην προδιαγραφή Casper CBC. Η πλατφόρμα Casper έχει σχεδιαστεί για να ενισχύσει την υιοθέτηση της τεχνολογίας blockchain, των έξυπνων συμβολαίων και των DApps σε παγκόσμια κλίμακα.

Η αποστολή του Casper είναι να εγκαινιάσει μια νέα εποχή για το Web3, καθώς η ζήτηση για εύχρηστες, διασυνδεδεμένες υπηρεσίες συνεχίζει να αυξάνεται παντού. Ο Casper το κάνει λύνοντας το τρίλημμα της υιοθέτησης: προσφέροντας ασφάλεια, επεκτασιμότητα και αποκέντρωση σε επίπεδο επιχείρησης, όλα μέσα στο ίδιο πρωτόκολλο blockchain.
CSPRBinance

https://casper.network/

 

MarlinΤο Marlin είναι ένα ανοιχτό πρωτόκολλο που παρέχει μια προγραμματιζόμενη υποδομή δικτύου υψηλής απόδοσης για DeFi και Web 3.0. Οι κόμβοι στο δίκτυο Marlin, που ονομάζονται Metanodes, λειτουργούν το MarlinVM, το οποίο παρέχει μια εικονική διεπαφή δρομολογητή στους προγραμματιστές για να αναπτύξουν προσαρμοσμένες επικαλύψεις και να εκτελέσουν υπολογισμούς ακμών.PONDBinance

https://www.marlin.org/

 

XYO networkΤο δίκτυο XYO είναι ένα τεχνολογικό πρωτόκολλο σχεδιασμένο να βελτιώνει την εγκυρότητα, τη βεβαιότητα και την αξία των δεδομένων. Δημιουργία μιας αγοράς δεδομένων που παρέχει στους χρήστες ένα χρυσό πρότυπο για οποιεσδήποτε εφαρμογές, ιστότοπους και τεχνολογίες blockchain που βασίζονται σε αξιόπιστα δεδομένα.XYOΜΕΧ

https://xyo.network/

 

Geek Network

Το GEEK έχει την ίδια φιλοσοφία με το IKIGAI που προέρχεται από τη χώρα των ιαπωνικών ανθισμένων κερασιών. Το GEEK αναπτύσσεται και συνεισφέρει από προγραμματιστές που αγαπούν τις νέες τεχνολογίες, την αποκεντρωμένη οικονομία και το πάθος για αυτό που κάνουν.

Έρχεται η εποχή του Web 3.0, ενός αποκεντρωμένου και δίκαιου Διαδικτύου όπου όλοι έχουν πρόσβαση σε αποκεντρωμένες χρηματοοικονομικές υπηρεσίες, έλεγχο των δικών τους δεδομένων, ταυτότητα και μοίρα. Τα ανοιχτά πρωτόκολλα θα δημιουργήσουν διαφάνεια και ευκαιρίες, επιτρέποντας στους ανθρώπους σε όλο τον κόσμο να συνεισφέρουν τα ταλέντα τους στην παγκόσμια οικονομία.

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

GEEKΑνταλλαγή τηγανιτών

https://geek.gl/

 

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

Το μοντέλο Fetch.AI βασίζεται σε περιπτώσεις χρήσης όπως η βελτιστοποίηση των υπηρεσιών συναλλαγών DeFi, των δικτύων μεταφοράς (στάθμευση, μικροκινητικότητα), των έξυπνων ενεργειακών δικτύων, των ταξιδιών — ουσιαστικά κάθε περίπλοκου ψηφιακού συστήματος που βασίζεται σε σύνολα δεδομένων μεγάλης κλίμακας.
FETBinance

https://fetch-ai.network/

 

NKNΤο NKN, ή το Νέο Είδος Δικτύου, είναι ένα πρωτόκολλο ανοιχτού κώδικα για δημόσια δίκτυα peer-to-peer που βασίζονται σε blockchain για κοινή χρήση εύρους ζώνης δικτύου και σύνδεση στο Διαδίκτυο. 

Το NKN χρησιμοποιεί ένα καθολικό σχήμα διευθύνσεων που βασίζεται σε δημόσια κλειδιά, προκειμένου να επιτρέψει την άμεση επικοινωνία μεταξύ ομοτίμων χωρίς κεντρικούς διακομιστές. Η δρομολόγηση των πακέτων βασίζεται στον κατανεμημένο πίνακα κατακερματισμού χορδών (DHT), ο οποίος αντιστοιχίζει κάθε διεύθυνση NKN σε μια τυχαία και επαληθεύσιμη θέση στο δαχτυλίδι Chord DHT.
NKNBinance

https://nkn.org/

 

GitcoinΤο Gitcoin περιγράφει τον εαυτό του ως μια κοινότητα κατασκευαστών, δημιουργών και πρωτοκόλλων που έχουν συγκεντρωθεί για να αναπτύξουν το μέλλον του ανοιχτού διαδικτύου. Το Gitcoin δημιουργεί μια κοινότητα που υποστηρίζει νέα υποδομή για το Web3 — συμπεριλαμβανομένων εργαλείων, τεχνολογιών και δικτύων — για την προώθηση της ανάπτυξης στη σφαίρα ανοιχτού κώδικα.GTCBinance

https://gitcoin.co/

 

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

Το NuCypher επιτρέπει στους χρήστες να μοιράζονται προσωπικά δεδομένα μεταξύ ορισμένων συμμετεχόντων σε δημόσια δίκτυα συναίνεσης, χρησιμοποιώντας την τεχνολογία εκ νέου κρυπτογράφησης μεσολάβησης (PRE). Αυτή η τεχνολογία αποκρυπτογράφησης καθιστά το NuCypher πολύ πιο ασφαλές και προστατευμένο από τα παραδοσιακά έργα blockchain που βασίζονται σε κρυπτογράφηση δημόσιου κλειδιού, σύμφωνα με το NuCypher.
NUGate.iohttps://www.nucypher.com/
RadicleΤο Radicle (RAD) είναι ένα πρωτόκολλο ανοιχτού κώδικα που επιτρέπει στους προγραμματιστές να συνεργάζονται με ομότιμο και αποκεντρωμένο τρόπο. Παρόμοια με τις πλατφόρμες κεντρικής συνεργασίας κώδικα όπως το GitHub και το GitLab, οι προγραμματιστές μπορούν να συνεργαστούν για να κωδικοποιήσουν και να δημιουργήσουν DApps σε αυτό. Αυτό συμβαίνει μέσω του πρωτοκόλλου peer-to-peer αναπαραγωγής της Radicle που ονομάζεται Radicle Link.RADBinance

https://radicle.xyz/

 

Gari NetworkΤο Chingari είναι η ταχύτερα αναπτυσσόμενη εφαρμογή βίντεο σύντομης μορφής της Ινδίας με εκατομμύρια Καθημερινούς Χρήστες. Η εφαρμογή επιτρέπει στους χρήστες να δημιουργούν και να μοιράζονται βίντεο σύντομης μορφής με τον κόσμο. Κάθε φορά που δημιουργείτε ένα βίντεο στο Chingari, ανταμείβεστε με Gari Tokens. GARIΜΕΧ

https://gari.network/

 

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

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

https://steem.com/

 

OrchidΣτόχος του είναι να ξεπεράσει τους περιορισμούς της ελευθερίας του Διαδικτύου χρησιμοποιώντας πληρωμές σε κρυπτονομίσματα για να επιτρέψει σε οποιονδήποτε να αγοράσει εύρος ζώνης από οποιονδήποτε συμμετέχοντα πάροχο. Αυτό γίνεται χρησιμοποιώντας τις λεγόμενες πιθανολογικές νανοπληρωμές, οι οποίες πραγματοποιούνται χρησιμοποιώντας το OXT, ένα τυπικό διακριτικό ERC-20 στο Ethereum.

Οι τακτικές πληρωμές σε παρόχους πραγματοποιούνται εκτός αλυσίδας, επιτρέποντας στην Orchid να αποφύγει προβλήματα με τη συμφόρηση και τα τέλη αερίου στο δίκτυο Ethereum.

Η υπηρεσία είναι pay-per-use, πράγμα που σημαίνει ότι οι χρήστες πρέπει να συνεισφέρουν χρήματα μόνο όταν συνδέονται πραγματικά, αντί να πληρώνουν μηνιαίες ή ετήσιες χρεώσεις.
OXTBinance

https://www.orchid.com/

 

ConfluxΒιώσιμη Υποδομή για την Παγκόσμια Token-Economy. Το Conflux επιτρέπει στους δημιουργούς, τις κοινότητες και τις αγορές να συνδέονται διασυνοριακά και πρωτόκολλα

Το Conflux είναι μια συναινετική αλυσίδα blockchain πρώτου επιπέδου υψηλής απόδοσης που χρησιμοποιεί έναν μοναδικό συναινετικό αλγόριθμο Tree-Graph, επιτρέποντας την παράλληλη επεξεργασία μπλοκ και συναλλαγών για αυξημένη απόδοση και επεκτασιμότητα.

Ως η μόνη συμβατή με κανονιστικές ρυθμίσεις, δημόσια και χωρίς άδεια blockchain στην Κίνα, η Conflux παρέχει ένα μοναδικό πλεονέκτημα για έργα που αναπτύσσονται και επεκτείνονται στην Ασία, συνδέοντας αποκεντρωμένες οικονομίες για την ενίσχυση του παγκόσμιου οικοσυστήματος DeFi.
CFXBinancehttps://confluxnetwork.org/
StreamrΤο Streamr (DATA) είναι ένα έργο ανοιχτού κώδικα και αποκεντρωμένη πλατφόρμα που βασίζεται στην κρυπτογραφία αντί στην εμπιστοσύνη. Είναι μια P2P, υποδομή δεδομένων σε πραγματικό χρόνο που στεγάζει μια πλατφόρμα και εργαλεία για μια νέα οικονομία δεδομένων. Η πρόθεση της ομάδας Streamr δεν είναι να δημιουργήσει κάποιο ειδικό blockchain, αλλά να επικεντρωθεί στην ανάπτυξη τεχνολογιών βελτιστοποίησης δικτύου.DATABinancehttps://streamr.network/
VIDT DatalinkΤο VIDT Datalink είναι μια πλατφόρμα επαλήθευσης δεδομένων blockchain. Η αποστολή του έργου είναι να διασφαλίσει την αυθεντικότητα των δεδομένων, παρέχοντας επαλήθευση, ασφαλή πιστοποίηση και προστασία των ψηφιακών περιουσιακών στοιχείων. Ένας χρήστης καταχωρεί ένα αρχείο στην πλατφόρμα και το VIDT Datalink δημιουργεί έναν κατακερματισμό και το αποθηκεύει στο blockchain. Έτσι, αλλαγές στο αρχείο και οποιαδήποτε παρέμβαση από έναν χρήστη θα επηρεάσει και το κατακερματισμό του, το οποίο θα εντοπιστεί από το VIDT Datalink.VIDTHuobihttps://vidt-datalink.com/
BraintrustΤο Braintrust είναι το πρώτο αποκεντρωμένο δίκτυο ταλέντων που συνδέει ειδικευμένους, ελεγμένους εργαζόμενους στη γνώση με κορυφαίες εταιρείες στον κόσμο. BTRSTGate.iohttps://www.usebraintrust.com/
AIOZ NetworkΤο AIOZ Network δημιουργεί ένα κατανεμημένο δίκτυο παράδοσης περιεχομένου (dCDN) και αντιπροσωπεύει μια σημαντική αλλαγή στον τρόπο με τον οποίο ο κόσμος μεταδίδει βίντεο. Σε ένα dCDN, ένα βίντεο προέρχεται από έναν από τους πολλούς Κόμβους - ένα κανονικό άτομο που πληρώνει για να αποθηκεύει και να παραδίδει περιεχόμενο από τη συσκευή του με τη βοήθεια μιας εφαρμογής. Η εφαρμογή αξιοποιεί τους αχρησιμοποίητους πόρους της συσκευής, όπως επιπλέον υπολογιστική ισχύ, εύρος ζώνης και αποθηκευτικό χώρο.AIOZGate.iohttps://aioz.network/
DiadataΤο DIA (Decentralised Information Asset) είναι μια πλατφόρμα oracle ανοιχτού κώδικα που επιτρέπει στους παράγοντες της αγοράς να προμηθεύονται, να παρέχουν και να μοιράζονται αξιόπιστα δεδομένα.

Το DIA παρέχει μια αξιόπιστη και επαληθεύσιμη γέφυρα μεταξύ δεδομένων εκτός αλυσίδας από διάφορες πηγές και έξυπνων συμβάσεων εντός αλυσίδας που μπορούν να χρησιμοποιηθούν για τη δημιουργία μιας ποικιλίας οικονομικών DApp.
DIABinancehttps://www.diadata.org/
district0xΤο District0x είναι μια πλατφόρμα που επιτρέπει στους χρήστες να λανσάρουν εύκολα τις δικές τους αποκεντρωμένες πλατφόρμες που διέπονται από μια δομή αποκεντρωμένης αυτόνομης οργάνωσης (DAO). Η πλατφόρμα χρησιμοποιεί έναν συνδυασμό τριών κύριων τεχνολογιών: Ethereum, Aragon και InterPlanetary File Transfer Protocol (IPFS).DNTBinancehttps://district0x.io/
Nervos NetworkΤο Nervos Network περιγράφει τον εαυτό του ως δημόσιο οικοσύστημα blockchain ανοιχτού κώδικα και συλλογή πρωτοκόλλων. Το Nervos CKB (Common Knowledge Base) είναι το επίπεδο 1, απόδειξη εργασίας δημόσιο πρωτόκολλο blockchain του δικτύου Nervos. 

Σύμφωνα με πληροφορίες, επιτρέπει την αποθήκευση οποιουδήποτε στοιχείου κρυπτογράφησης με την ασφάλεια, την αμετάβλητη και χωρίς άδεια φύση του Bitcoin, ενώ παράλληλα επιτρέπει έξυπνα συμβόλαια και κλιμάκωση επιπέδου 2. Στοχεύει να συλλάβει τη συνολική αξία του δικτύου μέσω του κρυπτοοικονομικού σχεδιασμού «αποθήκης αξίας» και του εγγενούς διακριτικού, του CKByte.
CKBBinancehttps://www.nervos.org/
Numbers ProtocolΤο Numbers Protocol δημιουργεί το νέο αποκεντρωμένο δίκτυο φωτογραφιών για το Web 3.0.
 
NUMGate.iohttps://www.numbersprotocol.io/
PolkaBridgeΤο PolkaBridge είναι ένα αποκεντρωμένο πρωτόκολλο cross-chain που έχει σχεδιαστεί για να λειτουργεί ως η κύρια γέφυρα μεταξύ του Polkadot και άλλων blockchains. Θα εισαγάγει επίσης δυνατότητες υποστήριξης DeFi, για να συμπληρώσει τις υπηρεσίες γεφύρωσης. Επί του παρόντος λειτουργεί στο blockchain Ethereum και σχεδιάζει να μεταβεί στο blockchain Polkadot, στο εγγύς μέλλον. Άλλες αλυσίδες υποστήριξης θα προστεθούν στο μέλλον, σύμφωνα με τις απαιτήσεις.PBRGate.iohttps://polkabridge.org/
Crust NetworkΤο Crust Network παρέχει ένα αποκεντρωμένο δίκτυο αποθήκευσης και λύσεις cloud τόσο για το οικοσύστημα Web 3.0 όσο και για το Web 2.0 και βασίζεται στο πλαίσιο Substrate της Polkadot. Παρέχει ένα μοναδικό επίπεδο κινήτρου για το πρωτόκολλο IPFS και χρησιμοποιεί τεχνολογία blockchain για να βελτιώσει την ασφάλεια, το απόρρητο, την απόδοση και την ιδιοκτησία των δεδομένων.
 
CRUGate.iohttps://www.crust.network/
PARSIQΗ PARSIQ περιγράφει τον εαυτό της ως μια πλατφόρμα επόμενης γενιάς για παρακολούθηση και ευφυΐα — προσφέροντας εργαλεία ανάλυσης για την τεχνολογία blockchain σε μια πληθώρα βιομηχανιών. Αυτό επιτρέπει στους χρήστες να παρακολουθούν τη δραστηριότητα του δικτύου σε πραγματικό χρόνο, να ξεκλειδώνουν νέες περιπτώσεις χρήσης για την εφαρμογή τους και να δημιουργούν άμεσες ειδοποιήσεις. Τα Smart Triggers μπορούν να χρησιμοποιηθούν για την αντίδραση σε γεγονότα ενδιαφέροντος σε πολλά δίκτυα. PRQ
 
Gate.iohttps://parsiq.net/
Akash NetworkΗ χρήση του Akash Network επιτρέπει στους προγραμματιστές να εκκινούν εφαρμογές όπως εφαρμογές DeFi, ιστολόγια, παιχνίδια, οπτικοποιήσεις δεδομένων, εξερευνητές μπλοκ, κόμβους blockchain και άλλα στοιχεία δικτύου blockchain σε ένα αποκεντρωμένο σύννεφο.
 
AKTGate.iohttps://akash.network/
EpnsΤο Ethereum Push Notification Service ή EPNS είναι ένα πρωτόκολλο ειδοποιήσεων που μπορεί να επιτρέψει στις διευθύνσεις πορτοφολιού των χρηστών να λαμβάνουν ειδοποιήσεις. Αυτό σημαίνει ότι, μέσω της χρήσης αυτού του πρωτοκόλλου, κάθε DApp ή έξυπνο συμβόλαιο, καθώς και υπηρεσία, μπορεί να στέλνει ειδοποιήσεις στους χρήστες με αγνωστικιστικό τρόπο πλατφόρμας. Το EPNS περιέχει επίσης μια πτυχή DeFi που επιτρέπει στους χρήστες να κερδίζουν κρυπτογράφηση για τη λήψη των πραγματικών ειδοποιήσεων.PUSHGate.iohttps://epns.io/
StratosΤο Stratos είναι η επόμενη γενιά αποκεντρωμένου Data Mesh που παρέχει επεκτάσιμη, αξιόπιστη, ισορροπημένη αποθήκευση, βάση δεδομένων και υπολογιστικό δίκτυο.

Το Stratos γεννήθηκε για την κλιμάκωση της χωρητικότητας διαδικασίας blockchain διατηρώντας παράλληλα τα αποκεντρωμένα πλεονεκτήματα ενός κατανεμημένου πρωτοκόλλου, όπως η αξιοπιστία, η ιχνηλασιμότητα, η επαληθευσιμότητα, η ιδιωτικότητα κ.λπ. Η Stratos προσπαθεί να διευκολύνει την αποκεντρωμένη υιοθέτηση δεδομένων για τη βιομηχανία blockchain και το Web 3.0.
STOSGate.iohttps://www.thestratos.org/
ACENTΤο blockchain Acent έχει δημιουργηθεί για την επεξεργασία μεγάλου φορτίου δεδομένων και την ταχύτητα που απαιτείται για την παροχή μιας εμπειρίας Triple-A gamified web 3.0 βελτιστοποιημένης για ανάπτυξη μετα-εφαρμογών.

Μπορεί να αποδώσει με τόλμη εφαρμογές υψηλής απόδοσης με την εφαρμογή της καινοτόμου διεπαφής και της τεχνολογίας API κρυπτομηχανής που μπορεί να εκμεταλλευτεί πλήρως την υπολογιστική ισχύ του τοπικού μηχανήματος ενώ συγχρονίζεται η επικύρωση δεδομένων blockchain παράλληλα με το blockchain.
ACEGate.iohttps://acent.tech/
ExeedmeΤο Exeedme είναι μια πλατφόρμα τουρνουά που υποστηρίζεται από blockchain που επιτρέπει στους παίκτες όλων των επιπέδων δεξιοτήτων να δημιουργούν έσοδα από τις δεξιότητές τους. Το όραμα της πλατφόρμας είναι να οικοδομήσει μια δίκαιη και αξιόπιστη πλατφόρμα παιχνιδιού-για-κέρδους, όπου οι παίκτες μπορούν να παίξουν τα αγαπημένα τους παιχνίδια, να προκαλέσουν τους αντιπάλους τους και να επωφεληθούν από το ποντάρισμα στη δική τους νίκη. Οι παίκτες μπορούν να κερδίσουν χρήματα από τα στοιχήματά τους, να κερδίσουν XED για αφοσίωση και αποκλειστικά βραβεία NFT για τη νίκη σε τουρνουά και εκδηλώσεις.XEDGate.iohttps://www.exeedme.com/
TorumΤο Torum είναι ένα οικοσύστημα SocialFi Metaverse που έχει σχεδιαστεί ειδικά για χρήστες κρυπτονομισμάτων και έργα.

Το οικοσύστημα Web 3.0 είναι χτισμένο σε μια πλατφόρμα κοινωνικών μέσων στον πυρήνα του, ενσωματωμένη με έναν κόμβο καλλιέργειας απόδοσης για παίκτες DeFi, μια αγορά NFT για καλλιτέχνες κρυπτογράφησης και το Avatar NFT για τους λάτρεις του Metaverse.
XTMHuobihttps://intro.torum.com/
ElastosΜε το Elastos, εκτός από το γεγονός ότι αποκτάτε πλήρη ιδιοκτησία των ψηφιακών σας στοιχείων, δεν χρειάζεται να έχετε πρόσβαση στο διαδίκτυο για να εκτελέσετε DApps. Όλα τα DApps θα εκτελούνται στο Smart Web. 

Η ιδέα πίσω από αυτό το Smart Web είναι να σας προστατεύει από κακόβουλο λογισμικό και άλλες ψηφιακές επιθέσεις που σας εκθέτουν σε κλοπή δεδομένων. Η πλατφόρμα είναι εξαιρετικά βελτιστοποιημένη για κινητά και μπορείτε να εκτελέσετε DApps δικτύου σε κάθε λειτουργικό σύστημα εκεί έξω.
ELAHuobi

https://elastos.info/

 

MAPSΤο Maps.me 2.0 διαθέτει χάρτες τόσο online όσο και εκτός σύνδεσης. Το Powering Maps.me 2.0 είναι το διακριτικό MAPS που μπορεί να παρέχει στους κατόχους διακριτικών το 100% των καθαρών εσόδων της πλατφόρμας.MAPSGate.iohttps://maps.me/token/
TenUpΤο TenUp Nation τροφοδοτείται από την κοινότητα και είναι έτοιμο να βοηθήσει τους επιχειρηματίες να συγκεντρώσουν κεφάλαια για τα σχέδιά τους, ενώ παράλληλα βοηθά τους πρόσφυγες και τους μη τραπεζικούς ανθρώπους παγκοσμίως. TUPUnswaphttps://tenup.io/
SyntropyΤο Syntropy έχει σχεδιαστεί για να επιλύει ζητήματα που επικρατούν στο τρέχον πλαίσιο Διαδικτύου, όπως η ασφάλεια, το απόρρητο, η διακυβέρνηση, η απόδοση, η αξιοπιστία και η αναποτελεσματική χρήση πόρων. NOIAHuobihttps://www.syntropynet.com/
GatherΤο Gather περιγράφεται ως μια πλατφόρμα που επιτρέπει στους εκδότες να δημιουργούν έσοδα χωρίς διαφημίσεις, παρέχει σε επιχειρήσεις και προγραμματιστές πρόσβαση σε φθηνή και αξιόπιστη επεξεργαστική ισχύ. 

Το Gather Online (Επίπεδο 0) επιτρέπει στους προγραμματιστές ιστού και κινητών να δημιουργούν έσοδα από την επεξεργαστική ισχύ των χρηστών τους. 

Το Gather Network (Layer1) είναι το επίπεδο πρωτοκόλλου, μια υβριδική απόδειξη εργασίας και απόδειξη στοιχηματισμού blockchain, όπου οι ενδιαφερόμενοι έχουν κίνητρα να διατηρήσουν τη διαφάνεια και την ασφάλεια. 

Το Gather Cloud (Layer 2) παρέχει προσιτή επεξεργαστική ισχύ σε επιχειρήσεις και προγραμματιστές. Η Gather Enterprise παρέχει συμβουλευτικές υπηρεσίες και εργαλεία για προγραμματιστές, επιχειρήσεις και δίκτυα κρυπτογράφησης.
GTHGate.iohttps://www.gather.network/
ModefiΟ κύριος στόχος του Modefi είναι η ανάπτυξη λύσεων blockchain της Oracle που ενισχύουν την πραγματική αποκέντρωση δεδομένων στην αλυσίδα για ενοποίηση μέσω Έξυπνων Συμβάσεων. Η σουίτα λύσεων Oracle της Modefi θα παρέχει υψηλότερο επίπεδο διαφάνειας, ακριβή δεδομένα και ένα πλήρως αξιόπιστο οικοσύστημα.

Το Oracle Solution Suite της Modefi θα επιτρέψει στα πρωτόκολλα DeFi να μειώσουν τη δυνατότητα να θέσουν σε κίνδυνο το κεφάλαιο των χρηστών τους που κερδίζουν με κόπο λόγω απρόβλεπτων συνθηκών.
MODKucoinhttps://modefi.io/
Lost WorldsΤο Lost Worlds είναι μια πρώτη στο είδος της εμπειρία πλατφόρμας NFT όπου τα NFT συνδέονται γεωγραφικά σε τοποθεσίες του πραγματικού κόσμου για να τα ανακαλύψουν και να τα κόψουν οι συλλέκτες.LOSTΜΕΧhttps://lostworlds.io/
KILT ProtocolΤο KILT είναι ένα αποκεντρωμένο πρωτόκολλο ταυτότητας blockchain για την έκδοση επαληθεύσιμων, ανακλητών και ανώνυμων διαπιστευτηρίων που βασίζονται σε αξιώσεις στο Web 3.0KILTGate.iohttps://www.kilt.io/
Big Data ProtocolΤο BDP είναι το διακριτικό διακυβέρνησης για το Πρωτόκολλο Big Data. Το Πρωτόκολλο Big Data εξουσιοδοτεί μια ρευστή αγορά για εμπορικά πολύτιμα δεδομένα.BDPGate.iohttps://bigdataprotocol.com/
X ProtocolΤο X Protocol είναι ένα πρωτόκολλο cross chain που βασίζεται στο Polkadot και παρέχει αποκεντρωμένες, ασφαλείς και γρήγορες λύσεις γεφύρωσης. Το X Protocol στοχεύει στη δημιουργία ενός Αποκεντρωμένου Metaverse που βασίζεται στο Web3.0, μέσα στο metaverse, μπορούν να κατασκευαστούν διαφορετικά DAPP για την ικανοποίηση των αναγκών των χρηστών, όπως Διαχείριση περιουσιακών στοιχείων Cross-Chain, Predictive Analytics συγκέντρωσης δεδομένων, ανάγκες κοινωνικής δικτύωσης κ.λπ.POTGate.iohttps://x-protocol.com/
HandshakeΤο Handshake στοχεύει να εξαλείψει αυτό το πρόβλημα δημιουργώντας ένα αποκεντρωμένο Διαδίκτυο που βασίζεται σε ένα σύστημα peer-to-peer.HNSGate.iohttps://handshake.org/
Raze NetworkΤο Raze Network είναι ένα πρωτόκολλο απορρήτου που βασίζεται σε υποστρώματα για το οικοσύστημα Polkadot. Κατασκευάζει ένα ενδιάμεσο λογισμικό απορρήτου πολλαπλών αλυσίδων για DeFi και Web3.0. Είναι ένα εγγενές επίπεδο απορρήτου που μπορεί να παρέχει από άκρο σε άκρο ανωνυμία για ολόκληρη τη στοίβα DeFi και Web3.0.

Ο στόχος είναι να ενεργοποιηθούν τα συστήματα πληρωμών και συναλλαγών που διατηρούν το απόρρητο διασταυρούμενων αλυσίδων προστατεύοντας παράλληλα τη διαφάνεια των περιουσιακών στοιχείων και των συμπεριφορών σας από την επιτήρηση. Τελικά, το Raze Network μπορεί να ανωνυμοποιήσει όλα τα κρυπτονομίσματα σε όλες τις αλυσίδες.
RAZEGate.iohttps://www.raze.network/
LaunchblockLaunchblock , η αποκεντρωμένη πλατφόρμα άντλησης κεφαλαίων ψηφιακών περιουσιακών στοιχείων. Παροχή σε όλους τους χρήστες και τα μέλη του DAO ενός οικοσυστήματος για πρόσβαση σε επενδυτικές ευκαιρίες πρώιμου σταδίου, παρέχοντας παράλληλα τις υπηρεσίες και τη χρησιμότητα της αποκεντρωμένης χρηματοδότησης (De-Fi).LBPΜΕΧhttps://launchblock.com/
SuterusuΤο Πρωτόκολλο Suterusu είναι μια ιδιωτική υποδομή πληρωμών δεύτερου επιπέδου για πλατφόρμες έξυπνων συμβολαίων. Το Πρωτόκολλο Suterusu χρησιμοποιεί τον αρχικό και πιο προηγμένο αλγόριθμο ZK-ConSnark που δεν απαιτεί αξιόπιστη εγκατάσταση. SUTERGate.iohttps://suterusu.io/
StackOsΤο StackOS είναι ένα ανοιχτό πρωτόκολλο που επιτρέπει στα άτομα να προσφέρουν συλλογικά ένα αποκεντρωμένο cloud όπου μπορείτε να αναπτύξετε οποιαδήποτε εφαρμογή full-stack, αποκεντρωμένη εφαρμογή, ιδιωτικά δίκτυα blockchain και κόμβους mainnet.
 
STACKΑνταλλαγή τηγανιτώνhttps://www.home.stackos.io/
TrustFi NetworkΤο TrustFi Network είναι μια αποκεντρωμένη λύση BaaS για την αγορά DeFi που βασίζεται σε περιβάλλον πολλαπλών αλυσίδων, με επίκεντρο την πρώιμη έκδοση περιουσιακών στοιχείων κρυπτογράφησης, τη διαχείριση ρευστότητας, τις κοινοτικές δραστηριότητες και τη διακυβέρνηση DAO για να ξεκλειδώσει τις δυνατότητες του DeFi.TFIΜΕΧhttps://www.trustfi.org/
DAOstackΤο DAOstack είναι ένα έργο ανοιχτού κώδικα που προάγει την τεχνολογία και την υιοθέτηση της αποκεντρωμένης διακυβέρνησης.GENHotbithttps://daostack.io/

συμπέρασμα

Συνοπτικά, τα κρυπτονομίσματα Web 3.0 θα μπορούσαν ενδεχομένως να παίξουν σημαντικό ρόλο στο μέλλον του Διαδικτύου. Ωστόσο, στην τρέχουσα μορφή του, το οικοσύστημα Web 3.0 είναι κατακερματισμένο – επομένως ίσως αξίζει να σταματήσουμε μέχρι να έχουμε μια πιο ξεκάθαρη ιδέα για το πώς θα προχωρήσει αυτός ο χώρος τα επόμενα χρόνια.

Ας ελπίσουμε ότι αυτό το άρθρο θα σας βοηθήσει. Μην ξεχάσετε να αφήσετε ένα like, ένα σχόλιο και να το μοιραστείτε με άλλους. Ευχαριστώ!

Διαβάστε περισσότερα: Πώς να κερδίσετε χρήματα με προγράμματα θυγατρικών ανταλλαγών κρυπτο

What is GEEK

Buddha Community

Όλα τα έργα κρυπτονομισμάτων Web 3 για DeFi
Veronica  Roob

Veronica Roob

1653475560

A Pure PHP Implementation Of The MessagePack Serialization Format

msgpack.php

A pure PHP implementation of the MessagePack serialization format.

Features

Installation

The recommended way to install the library is through Composer:

composer require rybakit/msgpack

Usage

Packing

To pack values you can either use an instance of a Packer:

$packer = new Packer();
$packed = $packer->pack($value);

or call a static method on the MessagePack class:

$packed = MessagePack::pack($value);

In the examples above, the method pack automatically packs a value depending on its type. However, not all PHP types can be uniquely translated to MessagePack types. For example, the MessagePack format defines map and array types, which are represented by a single array type in PHP. By default, the packer will pack a PHP array as a MessagePack array if it has sequential numeric keys, starting from 0 and as a MessagePack map otherwise:

$mpArr1 = $packer->pack([1, 2]);               // MP array [1, 2]
$mpArr2 = $packer->pack([0 => 1, 1 => 2]);     // MP array [1, 2]
$mpMap1 = $packer->pack([0 => 1, 2 => 3]);     // MP map {0: 1, 2: 3}
$mpMap2 = $packer->pack([1 => 2, 2 => 3]);     // MP map {1: 2, 2: 3}
$mpMap3 = $packer->pack(['a' => 1, 'b' => 2]); // MP map {a: 1, b: 2}

However, sometimes you need to pack a sequential array as a MessagePack map. To do this, use the packMap method:

$mpMap = $packer->packMap([1, 2]); // {0: 1, 1: 2}

Here is a list of type-specific packing methods:

$packer->packNil();           // MP nil
$packer->packBool(true);      // MP bool
$packer->packInt(42);         // MP int
$packer->packFloat(M_PI);     // MP float (32 or 64)
$packer->packFloat32(M_PI);   // MP float 32
$packer->packFloat64(M_PI);   // MP float 64
$packer->packStr('foo');      // MP str
$packer->packBin("\x80");     // MP bin
$packer->packArray([1, 2]);   // MP array
$packer->packMap(['a' => 1]); // MP map
$packer->packExt(1, "\xaa");  // MP ext

Check the "Custom types" section below on how to pack custom types.

Packing options

The Packer object supports a number of bitmask-based options for fine-tuning the packing process (defaults are in bold):

NameDescription
FORCE_STRForces PHP strings to be packed as MessagePack UTF-8 strings
FORCE_BINForces PHP strings to be packed as MessagePack binary data
DETECT_STR_BINDetects MessagePack str/bin type automatically
  
FORCE_ARRForces PHP arrays to be packed as MessagePack arrays
FORCE_MAPForces PHP arrays to be packed as MessagePack maps
DETECT_ARR_MAPDetects MessagePack array/map type automatically
  
FORCE_FLOAT32Forces PHP floats to be packed as 32-bits MessagePack floats
FORCE_FLOAT64Forces PHP floats to be packed as 64-bits MessagePack floats

The type detection mode (DETECT_STR_BIN/DETECT_ARR_MAP) adds some overhead which can be noticed when you pack large (16- and 32-bit) arrays or strings. However, if you know the value type in advance (for example, you only work with UTF-8 strings or/and associative arrays), you can eliminate this overhead by forcing the packer to use the appropriate type, which will save it from running the auto-detection routine. Another option is to explicitly specify the value type. The library provides 2 auxiliary classes for this, Map and Bin. Check the "Custom types" section below for details.

Examples:

// detect str/bin type and pack PHP 64-bit floats (doubles) to MP 32-bit floats
$packer = new Packer(PackOptions::DETECT_STR_BIN | PackOptions::FORCE_FLOAT32);

// these will throw MessagePack\Exception\InvalidOptionException
$packer = new Packer(PackOptions::FORCE_STR | PackOptions::FORCE_BIN);
$packer = new Packer(PackOptions::FORCE_FLOAT32 | PackOptions::FORCE_FLOAT64);

Unpacking

To unpack data you can either use an instance of a BufferUnpacker:

$unpacker = new BufferUnpacker();

$unpacker->reset($packed);
$value = $unpacker->unpack();

or call a static method on the MessagePack class:

$value = MessagePack::unpack($packed);

If the packed data is received in chunks (e.g. when reading from a stream), use the tryUnpack method, which attempts to unpack data and returns an array of unpacked messages (if any) instead of throwing an InsufficientDataException:

while ($chunk = ...) {
    $unpacker->append($chunk);
    if ($messages = $unpacker->tryUnpack()) {
        return $messages;
    }
}

If you want to unpack from a specific position in a buffer, use seek:

$unpacker->seek(42); // set position equal to 42 bytes
$unpacker->seek(-8); // set position to 8 bytes before the end of the buffer

To skip bytes from the current position, use skip:

$unpacker->skip(10); // set position to 10 bytes ahead of the current position

To get the number of remaining (unread) bytes in the buffer:

$unreadBytesCount = $unpacker->getRemainingCount();

To check whether the buffer has unread data:

$hasUnreadBytes = $unpacker->hasRemaining();

If needed, you can remove already read data from the buffer by calling:

$releasedBytesCount = $unpacker->release();

With the read method you can read raw (packed) data:

$packedData = $unpacker->read(2); // read 2 bytes

Besides the above methods BufferUnpacker provides type-specific unpacking methods, namely:

$unpacker->unpackNil();   // PHP null
$unpacker->unpackBool();  // PHP bool
$unpacker->unpackInt();   // PHP int
$unpacker->unpackFloat(); // PHP float
$unpacker->unpackStr();   // PHP UTF-8 string
$unpacker->unpackBin();   // PHP binary string
$unpacker->unpackArray(); // PHP sequential array
$unpacker->unpackMap();   // PHP associative array
$unpacker->unpackExt();   // PHP MessagePack\Type\Ext object

Unpacking options

The BufferUnpacker object supports a number of bitmask-based options for fine-tuning the unpacking process (defaults are in bold):

NameDescription
BIGINT_AS_STRConverts overflowed integers to strings [1]
BIGINT_AS_GMPConverts overflowed integers to GMP objects [2]
BIGINT_AS_DECConverts overflowed integers to Decimal\Decimal objects [3]

1. The binary MessagePack format has unsigned 64-bit as its largest integer data type, but PHP does not support such integers, which means that an overflow can occur during unpacking.

2. Make sure the GMP extension is enabled.

3. Make sure the Decimal extension is enabled.

Examples:

$packedUint64 = "\xcf"."\xff\xff\xff\xff"."\xff\xff\xff\xff";

$unpacker = new BufferUnpacker($packedUint64);
var_dump($unpacker->unpack()); // string(20) "18446744073709551615"

$unpacker = new BufferUnpacker($packedUint64, UnpackOptions::BIGINT_AS_GMP);
var_dump($unpacker->unpack()); // object(GMP) {...}

$unpacker = new BufferUnpacker($packedUint64, UnpackOptions::BIGINT_AS_DEC);
var_dump($unpacker->unpack()); // object(Decimal\Decimal) {...}

Custom types

In addition to the basic types, the library provides functionality to serialize and deserialize arbitrary types. This can be done in several ways, depending on your use case. Let's take a look at them.

Type objects

If you need to serialize an instance of one of your classes into one of the basic MessagePack types, the best way to do this is to implement the CanBePacked interface in the class. A good example of such a class is the Map type class that comes with the library. This type is useful when you want to explicitly specify that a given PHP array should be packed as a MessagePack map without triggering an automatic type detection routine:

$packer = new Packer();

$packedMap = $packer->pack(new Map([1, 2, 3]));
$packedArray = $packer->pack([1, 2, 3]);

More type examples can be found in the src/Type directory.

Type transformers

As with type objects, type transformers are only responsible for serializing values. They should be used when you need to serialize a value that does not implement the CanBePacked interface. Examples of such values could be instances of built-in or third-party classes that you don't own, or non-objects such as resources.

A transformer class must implement the CanPack interface. To use a transformer, it must first be registered in the packer. Here is an example of how to serialize PHP streams into the MessagePack bin format type using one of the supplied transformers, StreamTransformer:

$packer = new Packer(null, [new StreamTransformer()]);

$packedBin = $packer->pack(fopen('/path/to/file', 'r+'));

More type transformer examples can be found in the src/TypeTransformer directory.

Extensions

In contrast to the cases described above, extensions are intended to handle extension types and are responsible for both serialization and deserialization of values (types).

An extension class must implement the Extension interface. To use an extension, it must first be registered in the packer and the unpacker.

The MessagePack specification divides extension types into two groups: predefined and application-specific. Currently, there is only one predefined type in the specification, Timestamp.

Timestamp

The Timestamp extension type is a predefined type. Support for this type in the library is done through the TimestampExtension class. This class is responsible for handling Timestamp objects, which represent the number of seconds and optional adjustment in nanoseconds:

$timestampExtension = new TimestampExtension();

$packer = new Packer();
$packer = $packer->extendWith($timestampExtension);

$unpacker = new BufferUnpacker();
$unpacker = $unpacker->extendWith($timestampExtension);

$packedTimestamp = $packer->pack(Timestamp::now());
$timestamp = $unpacker->reset($packedTimestamp)->unpack();

$seconds = $timestamp->getSeconds();
$nanoseconds = $timestamp->getNanoseconds();

When using the MessagePack class, the Timestamp extension is already registered:

$packedTimestamp = MessagePack::pack(Timestamp::now());
$timestamp = MessagePack::unpack($packedTimestamp);

Application-specific extensions

In addition, the format can be extended with your own types. For example, to make the built-in PHP DateTime objects first-class citizens in your code, you can create a corresponding extension, as shown in the example. Please note, that custom extensions have to be registered with a unique extension ID (an integer from 0 to 127).

More extension examples can be found in the examples/MessagePack directory.

To learn more about how extension types can be useful, check out this article.

Exceptions

If an error occurs during packing/unpacking, a PackingFailedException or an UnpackingFailedException will be thrown, respectively. In addition, an InsufficientDataException can be thrown during unpacking.

An InvalidOptionException will be thrown in case an invalid option (or a combination of mutually exclusive options) is used.

Tests

Run tests as follows:

vendor/bin/phpunit

Also, if you already have Docker installed, you can run the tests in a docker container. First, create a container:

./dockerfile.sh | docker build -t msgpack -

The command above will create a container named msgpack with PHP 8.1 runtime. You may change the default runtime by defining the PHP_IMAGE environment variable:

PHP_IMAGE='php:8.0-cli' ./dockerfile.sh | docker build -t msgpack -

See a list of various images here.

Then run the unit tests:

docker run --rm -v $PWD:/msgpack -w /msgpack msgpack

Fuzzing

To ensure that the unpacking works correctly with malformed/semi-malformed data, you can use a testing technique called Fuzzing. The library ships with a help file (target) for PHP-Fuzzer and can be used as follows:

php-fuzzer fuzz tests/fuzz_buffer_unpacker.php

Performance

To check performance, run:

php -n -dzend_extension=opcache.so \
-dpcre.jit=1 -dopcache.enable=1 -dopcache.enable_cli=1 \
tests/bench.php

Example output

Filter: MessagePack\Tests\Perf\Filter\ListFilter
Rounds: 3
Iterations: 100000

=============================================
Test/Target            Packer  BufferUnpacker
---------------------------------------------
nil .................. 0.0030 ........ 0.0139
false ................ 0.0037 ........ 0.0144
true ................. 0.0040 ........ 0.0137
7-bit uint #1 ........ 0.0052 ........ 0.0120
7-bit uint #2 ........ 0.0059 ........ 0.0114
7-bit uint #3 ........ 0.0061 ........ 0.0119
5-bit sint #1 ........ 0.0067 ........ 0.0126
5-bit sint #2 ........ 0.0064 ........ 0.0132
5-bit sint #3 ........ 0.0066 ........ 0.0135
8-bit uint #1 ........ 0.0078 ........ 0.0200
8-bit uint #2 ........ 0.0077 ........ 0.0212
8-bit uint #3 ........ 0.0086 ........ 0.0203
16-bit uint #1 ....... 0.0111 ........ 0.0271
16-bit uint #2 ....... 0.0115 ........ 0.0260
16-bit uint #3 ....... 0.0103 ........ 0.0273
32-bit uint #1 ....... 0.0116 ........ 0.0326
32-bit uint #2 ....... 0.0118 ........ 0.0332
32-bit uint #3 ....... 0.0127 ........ 0.0325
64-bit uint #1 ....... 0.0140 ........ 0.0277
64-bit uint #2 ....... 0.0134 ........ 0.0294
64-bit uint #3 ....... 0.0134 ........ 0.0281
8-bit int #1 ......... 0.0086 ........ 0.0241
8-bit int #2 ......... 0.0089 ........ 0.0225
8-bit int #3 ......... 0.0085 ........ 0.0229
16-bit int #1 ........ 0.0118 ........ 0.0280
16-bit int #2 ........ 0.0121 ........ 0.0270
16-bit int #3 ........ 0.0109 ........ 0.0274
32-bit int #1 ........ 0.0128 ........ 0.0346
32-bit int #2 ........ 0.0118 ........ 0.0339
32-bit int #3 ........ 0.0135 ........ 0.0368
64-bit int #1 ........ 0.0138 ........ 0.0276
64-bit int #2 ........ 0.0132 ........ 0.0286
64-bit int #3 ........ 0.0137 ........ 0.0274
64-bit int #4 ........ 0.0180 ........ 0.0285
64-bit float #1 ...... 0.0134 ........ 0.0284
64-bit float #2 ...... 0.0125 ........ 0.0275
64-bit float #3 ...... 0.0126 ........ 0.0283
fix string #1 ........ 0.0035 ........ 0.0133
fix string #2 ........ 0.0094 ........ 0.0216
fix string #3 ........ 0.0094 ........ 0.0222
fix string #4 ........ 0.0091 ........ 0.0241
8-bit string #1 ...... 0.0122 ........ 0.0301
8-bit string #2 ...... 0.0118 ........ 0.0304
8-bit string #3 ...... 0.0119 ........ 0.0315
16-bit string #1 ..... 0.0150 ........ 0.0388
16-bit string #2 ..... 0.1545 ........ 0.1665
32-bit string ........ 0.1570 ........ 0.1756
wide char string #1 .. 0.0091 ........ 0.0236
wide char string #2 .. 0.0122 ........ 0.0313
8-bit binary #1 ...... 0.0100 ........ 0.0302
8-bit binary #2 ...... 0.0123 ........ 0.0324
8-bit binary #3 ...... 0.0126 ........ 0.0327
16-bit binary ........ 0.0168 ........ 0.0372
32-bit binary ........ 0.1588 ........ 0.1754
fix array #1 ......... 0.0042 ........ 0.0131
fix array #2 ......... 0.0294 ........ 0.0367
fix array #3 ......... 0.0412 ........ 0.0472
16-bit array #1 ...... 0.1378 ........ 0.1596
16-bit array #2 ........... S ............. S
32-bit array .............. S ............. S
complex array ........ 0.1865 ........ 0.2283
fix map #1 ........... 0.0725 ........ 0.1048
fix map #2 ........... 0.0319 ........ 0.0405
fix map #3 ........... 0.0356 ........ 0.0665
fix map #4 ........... 0.0465 ........ 0.0497
16-bit map #1 ........ 0.2540 ........ 0.3028
16-bit map #2 ............. S ............. S
32-bit map ................ S ............. S
complex map .......... 0.2372 ........ 0.2710
fixext 1 ............. 0.0283 ........ 0.0358
fixext 2 ............. 0.0291 ........ 0.0371
fixext 4 ............. 0.0302 ........ 0.0355
fixext 8 ............. 0.0288 ........ 0.0384
fixext 16 ............ 0.0293 ........ 0.0359
8-bit ext ............ 0.0302 ........ 0.0439
16-bit ext ........... 0.0334 ........ 0.0499
32-bit ext ........... 0.1845 ........ 0.1888
32-bit timestamp #1 .. 0.0337 ........ 0.0547
32-bit timestamp #2 .. 0.0335 ........ 0.0560
64-bit timestamp #1 .. 0.0371 ........ 0.0575
64-bit timestamp #2 .. 0.0374 ........ 0.0542
64-bit timestamp #3 .. 0.0356 ........ 0.0533
96-bit timestamp #1 .. 0.0362 ........ 0.0699
96-bit timestamp #2 .. 0.0381 ........ 0.0701
96-bit timestamp #3 .. 0.0367 ........ 0.0687
=============================================
Total                  2.7618          4.0820
Skipped                     4               4
Failed                      0               0
Ignored                     0               0

With JIT:

php -n -dzend_extension=opcache.so \
-dpcre.jit=1 -dopcache.jit_buffer_size=64M -dopcache.jit=tracing -dopcache.enable=1 -dopcache.enable_cli=1 \
tests/bench.php

Example output

Filter: MessagePack\Tests\Perf\Filter\ListFilter
Rounds: 3
Iterations: 100000

=============================================
Test/Target            Packer  BufferUnpacker
---------------------------------------------
nil .................. 0.0005 ........ 0.0054
false ................ 0.0004 ........ 0.0059
true ................. 0.0004 ........ 0.0059
7-bit uint #1 ........ 0.0010 ........ 0.0047
7-bit uint #2 ........ 0.0010 ........ 0.0046
7-bit uint #3 ........ 0.0010 ........ 0.0046
5-bit sint #1 ........ 0.0025 ........ 0.0046
5-bit sint #2 ........ 0.0023 ........ 0.0046
5-bit sint #3 ........ 0.0024 ........ 0.0045
8-bit uint #1 ........ 0.0043 ........ 0.0081
8-bit uint #2 ........ 0.0043 ........ 0.0079
8-bit uint #3 ........ 0.0041 ........ 0.0080
16-bit uint #1 ....... 0.0064 ........ 0.0095
16-bit uint #2 ....... 0.0064 ........ 0.0091
16-bit uint #3 ....... 0.0064 ........ 0.0094
32-bit uint #1 ....... 0.0085 ........ 0.0114
32-bit uint #2 ....... 0.0077 ........ 0.0122
32-bit uint #3 ....... 0.0077 ........ 0.0120
64-bit uint #1 ....... 0.0085 ........ 0.0159
64-bit uint #2 ....... 0.0086 ........ 0.0157
64-bit uint #3 ....... 0.0086 ........ 0.0158
8-bit int #1 ......... 0.0042 ........ 0.0080
8-bit int #2 ......... 0.0042 ........ 0.0080
8-bit int #3 ......... 0.0042 ........ 0.0081
16-bit int #1 ........ 0.0065 ........ 0.0095
16-bit int #2 ........ 0.0065 ........ 0.0090
16-bit int #3 ........ 0.0056 ........ 0.0085
32-bit int #1 ........ 0.0067 ........ 0.0107
32-bit int #2 ........ 0.0066 ........ 0.0106
32-bit int #3 ........ 0.0063 ........ 0.0104
64-bit int #1 ........ 0.0072 ........ 0.0162
64-bit int #2 ........ 0.0073 ........ 0.0174
64-bit int #3 ........ 0.0072 ........ 0.0164
64-bit int #4 ........ 0.0077 ........ 0.0161
64-bit float #1 ...... 0.0053 ........ 0.0135
64-bit float #2 ...... 0.0053 ........ 0.0135
64-bit float #3 ...... 0.0052 ........ 0.0135
fix string #1 ....... -0.0002 ........ 0.0044
fix string #2 ........ 0.0035 ........ 0.0067
fix string #3 ........ 0.0035 ........ 0.0077
fix string #4 ........ 0.0033 ........ 0.0078
8-bit string #1 ...... 0.0059 ........ 0.0110
8-bit string #2 ...... 0.0063 ........ 0.0121
8-bit string #3 ...... 0.0064 ........ 0.0124
16-bit string #1 ..... 0.0099 ........ 0.0146
16-bit string #2 ..... 0.1522 ........ 0.1474
32-bit string ........ 0.1511 ........ 0.1483
wide char string #1 .. 0.0039 ........ 0.0084
wide char string #2 .. 0.0073 ........ 0.0123
8-bit binary #1 ...... 0.0040 ........ 0.0112
8-bit binary #2 ...... 0.0075 ........ 0.0123
8-bit binary #3 ...... 0.0077 ........ 0.0129
16-bit binary ........ 0.0096 ........ 0.0145
32-bit binary ........ 0.1535 ........ 0.1479
fix array #1 ......... 0.0008 ........ 0.0061
fix array #2 ......... 0.0121 ........ 0.0165
fix array #3 ......... 0.0193 ........ 0.0222
16-bit array #1 ...... 0.0607 ........ 0.0479
16-bit array #2 ........... S ............. S
32-bit array .............. S ............. S
complex array ........ 0.0749 ........ 0.0824
fix map #1 ........... 0.0329 ........ 0.0431
fix map #2 ........... 0.0161 ........ 0.0189
fix map #3 ........... 0.0205 ........ 0.0262
fix map #4 ........... 0.0252 ........ 0.0205
16-bit map #1 ........ 0.1016 ........ 0.0927
16-bit map #2 ............. S ............. S
32-bit map ................ S ............. S
complex map .......... 0.1096 ........ 0.1030
fixext 1 ............. 0.0157 ........ 0.0161
fixext 2 ............. 0.0175 ........ 0.0183
fixext 4 ............. 0.0156 ........ 0.0185
fixext 8 ............. 0.0163 ........ 0.0184
fixext 16 ............ 0.0164 ........ 0.0182
8-bit ext ............ 0.0158 ........ 0.0207
16-bit ext ........... 0.0203 ........ 0.0219
32-bit ext ........... 0.1614 ........ 0.1539
32-bit timestamp #1 .. 0.0195 ........ 0.0249
32-bit timestamp #2 .. 0.0188 ........ 0.0260
64-bit timestamp #1 .. 0.0207 ........ 0.0281
64-bit timestamp #2 .. 0.0212 ........ 0.0291
64-bit timestamp #3 .. 0.0207 ........ 0.0295
96-bit timestamp #1 .. 0.0222 ........ 0.0358
96-bit timestamp #2 .. 0.0228 ........ 0.0353
96-bit timestamp #3 .. 0.0210 ........ 0.0319
=============================================
Total                  1.6432          1.9674
Skipped                     4               4
Failed                      0               0
Ignored                     0               0

You may change default benchmark settings by defining the following environment variables:

NameDefault
MP_BENCH_TARGETSpure_p,pure_u, see a list of available targets
MP_BENCH_ITERATIONS100_000
MP_BENCH_DURATIONnot set
MP_BENCH_ROUNDS3
MP_BENCH_TESTS-@slow, see a list of available tests

For example:

export MP_BENCH_TARGETS=pure_p
export MP_BENCH_ITERATIONS=1000000
export MP_BENCH_ROUNDS=5
# a comma separated list of test names
export MP_BENCH_TESTS='complex array, complex map'
# or a group name
# export MP_BENCH_TESTS='-@slow' // @pecl_comp
# or a regexp
# export MP_BENCH_TESTS='/complex (array|map)/'

Another example, benchmarking both the library and the PECL extension:

MP_BENCH_TARGETS=pure_p,pure_u,pecl_p,pecl_u \
php -n -dextension=msgpack.so -dzend_extension=opcache.so \
-dpcre.jit=1 -dopcache.enable=1 -dopcache.enable_cli=1 \
tests/bench.php

Example output

Filter: MessagePack\Tests\Perf\Filter\ListFilter
Rounds: 3
Iterations: 100000

===========================================================================
Test/Target            Packer  BufferUnpacker  msgpack_pack  msgpack_unpack
---------------------------------------------------------------------------
nil .................. 0.0031 ........ 0.0141 ...... 0.0055 ........ 0.0064
false ................ 0.0039 ........ 0.0154 ...... 0.0056 ........ 0.0053
true ................. 0.0038 ........ 0.0139 ...... 0.0056 ........ 0.0044
7-bit uint #1 ........ 0.0061 ........ 0.0110 ...... 0.0059 ........ 0.0046
7-bit uint #2 ........ 0.0065 ........ 0.0119 ...... 0.0042 ........ 0.0029
7-bit uint #3 ........ 0.0054 ........ 0.0117 ...... 0.0045 ........ 0.0025
5-bit sint #1 ........ 0.0047 ........ 0.0103 ...... 0.0038 ........ 0.0022
5-bit sint #2 ........ 0.0048 ........ 0.0117 ...... 0.0038 ........ 0.0022
5-bit sint #3 ........ 0.0046 ........ 0.0102 ...... 0.0038 ........ 0.0023
8-bit uint #1 ........ 0.0063 ........ 0.0174 ...... 0.0039 ........ 0.0031
8-bit uint #2 ........ 0.0063 ........ 0.0167 ...... 0.0040 ........ 0.0029
8-bit uint #3 ........ 0.0063 ........ 0.0168 ...... 0.0039 ........ 0.0030
16-bit uint #1 ....... 0.0092 ........ 0.0222 ...... 0.0049 ........ 0.0030
16-bit uint #2 ....... 0.0096 ........ 0.0227 ...... 0.0042 ........ 0.0046
16-bit uint #3 ....... 0.0123 ........ 0.0274 ...... 0.0059 ........ 0.0051
32-bit uint #1 ....... 0.0136 ........ 0.0331 ...... 0.0060 ........ 0.0048
32-bit uint #2 ....... 0.0130 ........ 0.0336 ...... 0.0070 ........ 0.0048
32-bit uint #3 ....... 0.0127 ........ 0.0329 ...... 0.0051 ........ 0.0048
64-bit uint #1 ....... 0.0126 ........ 0.0268 ...... 0.0055 ........ 0.0049
64-bit uint #2 ....... 0.0135 ........ 0.0281 ...... 0.0052 ........ 0.0046
64-bit uint #3 ....... 0.0131 ........ 0.0274 ...... 0.0069 ........ 0.0044
8-bit int #1 ......... 0.0077 ........ 0.0236 ...... 0.0058 ........ 0.0044
8-bit int #2 ......... 0.0087 ........ 0.0244 ...... 0.0058 ........ 0.0048
8-bit int #3 ......... 0.0084 ........ 0.0241 ...... 0.0055 ........ 0.0049
16-bit int #1 ........ 0.0112 ........ 0.0271 ...... 0.0048 ........ 0.0045
16-bit int #2 ........ 0.0124 ........ 0.0292 ...... 0.0057 ........ 0.0049
16-bit int #3 ........ 0.0118 ........ 0.0270 ...... 0.0058 ........ 0.0050
32-bit int #1 ........ 0.0137 ........ 0.0366 ...... 0.0058 ........ 0.0051
32-bit int #2 ........ 0.0133 ........ 0.0366 ...... 0.0056 ........ 0.0049
32-bit int #3 ........ 0.0129 ........ 0.0350 ...... 0.0052 ........ 0.0048
64-bit int #1 ........ 0.0145 ........ 0.0254 ...... 0.0034 ........ 0.0025
64-bit int #2 ........ 0.0097 ........ 0.0214 ...... 0.0034 ........ 0.0025
64-bit int #3 ........ 0.0096 ........ 0.0287 ...... 0.0059 ........ 0.0050
64-bit int #4 ........ 0.0143 ........ 0.0277 ...... 0.0059 ........ 0.0046
64-bit float #1 ...... 0.0134 ........ 0.0281 ...... 0.0057 ........ 0.0052
64-bit float #2 ...... 0.0141 ........ 0.0281 ...... 0.0057 ........ 0.0050
64-bit float #3 ...... 0.0144 ........ 0.0282 ...... 0.0057 ........ 0.0050
fix string #1 ........ 0.0036 ........ 0.0143 ...... 0.0066 ........ 0.0053
fix string #2 ........ 0.0107 ........ 0.0222 ...... 0.0065 ........ 0.0068
fix string #3 ........ 0.0116 ........ 0.0245 ...... 0.0063 ........ 0.0069
fix string #4 ........ 0.0105 ........ 0.0253 ...... 0.0083 ........ 0.0077
8-bit string #1 ...... 0.0126 ........ 0.0318 ...... 0.0075 ........ 0.0088
8-bit string #2 ...... 0.0121 ........ 0.0295 ...... 0.0076 ........ 0.0086
8-bit string #3 ...... 0.0125 ........ 0.0293 ...... 0.0130 ........ 0.0093
16-bit string #1 ..... 0.0159 ........ 0.0368 ...... 0.0117 ........ 0.0086
16-bit string #2 ..... 0.1547 ........ 0.1686 ...... 0.1516 ........ 0.1373
32-bit string ........ 0.1558 ........ 0.1729 ...... 0.1511 ........ 0.1396
wide char string #1 .. 0.0098 ........ 0.0237 ...... 0.0066 ........ 0.0065
wide char string #2 .. 0.0128 ........ 0.0291 ...... 0.0061 ........ 0.0082
8-bit binary #1 ........... I ............. I ........... F ............. I
8-bit binary #2 ........... I ............. I ........... F ............. I
8-bit binary #3 ........... I ............. I ........... F ............. I
16-bit binary ............. I ............. I ........... F ............. I
32-bit binary ............. I ............. I ........... F ............. I
fix array #1 ......... 0.0040 ........ 0.0129 ...... 0.0120 ........ 0.0058
fix array #2 ......... 0.0279 ........ 0.0390 ...... 0.0143 ........ 0.0165
fix array #3 ......... 0.0415 ........ 0.0463 ...... 0.0162 ........ 0.0187
16-bit array #1 ...... 0.1349 ........ 0.1628 ...... 0.0334 ........ 0.0341
16-bit array #2 ........... S ............. S ........... S ............. S
32-bit array .............. S ............. S ........... S ............. S
complex array ............. I ............. I ........... F ............. F
fix map #1 ................ I ............. I ........... F ............. I
fix map #2 ........... 0.0345 ........ 0.0391 ...... 0.0143 ........ 0.0168
fix map #3 ................ I ............. I ........... F ............. I
fix map #4 ........... 0.0459 ........ 0.0473 ...... 0.0151 ........ 0.0163
16-bit map #1 ........ 0.2518 ........ 0.2962 ...... 0.0400 ........ 0.0490
16-bit map #2 ............. S ............. S ........... S ............. S
32-bit map ................ S ............. S ........... S ............. S
complex map .......... 0.2380 ........ 0.2682 ...... 0.0545 ........ 0.0579
fixext 1 .................. I ............. I ........... F ............. F
fixext 2 .................. I ............. I ........... F ............. F
fixext 4 .................. I ............. I ........... F ............. F
fixext 8 .................. I ............. I ........... F ............. F
fixext 16 ................. I ............. I ........... F ............. F
8-bit ext ................. I ............. I ........... F ............. F
16-bit ext ................ I ............. I ........... F ............. F
32-bit ext ................ I ............. I ........... F ............. F
32-bit timestamp #1 ....... I ............. I ........... F ............. F
32-bit timestamp #2 ....... I ............. I ........... F ............. F
64-bit timestamp #1 ....... I ............. I ........... F ............. F
64-bit timestamp #2 ....... I ............. I ........... F ............. F
64-bit timestamp #3 ....... I ............. I ........... F ............. F
96-bit timestamp #1 ....... I ............. I ........... F ............. F
96-bit timestamp #2 ....... I ............. I ........... F ............. F
96-bit timestamp #3 ....... I ............. I ........... F ............. F
===========================================================================
Total                  1.5625          2.3866        0.7735          0.7243
Skipped                     4               4             4               4
Failed                      0               0            24              17
Ignored                    24              24             0               7

With JIT:

MP_BENCH_TARGETS=pure_p,pure_u,pecl_p,pecl_u \
php -n -dextension=msgpack.so -dzend_extension=opcache.so \
-dpcre.jit=1 -dopcache.jit_buffer_size=64M -dopcache.jit=tracing -dopcache.enable=1 -dopcache.enable_cli=1 \
tests/bench.php

Example output

Filter: MessagePack\Tests\Perf\Filter\ListFilter
Rounds: 3
Iterations: 100000

===========================================================================
Test/Target            Packer  BufferUnpacker  msgpack_pack  msgpack_unpack
---------------------------------------------------------------------------
nil .................. 0.0001 ........ 0.0052 ...... 0.0053 ........ 0.0042
false ................ 0.0007 ........ 0.0060 ...... 0.0057 ........ 0.0043
true ................. 0.0008 ........ 0.0060 ...... 0.0056 ........ 0.0041
7-bit uint #1 ........ 0.0031 ........ 0.0046 ...... 0.0062 ........ 0.0041
7-bit uint #2 ........ 0.0021 ........ 0.0043 ...... 0.0062 ........ 0.0041
7-bit uint #3 ........ 0.0022 ........ 0.0044 ...... 0.0061 ........ 0.0040
5-bit sint #1 ........ 0.0030 ........ 0.0048 ...... 0.0062 ........ 0.0040
5-bit sint #2 ........ 0.0032 ........ 0.0046 ...... 0.0062 ........ 0.0040
5-bit sint #3 ........ 0.0031 ........ 0.0046 ...... 0.0062 ........ 0.0040
8-bit uint #1 ........ 0.0054 ........ 0.0079 ...... 0.0062 ........ 0.0050
8-bit uint #2 ........ 0.0051 ........ 0.0079 ...... 0.0064 ........ 0.0044
8-bit uint #3 ........ 0.0051 ........ 0.0082 ...... 0.0062 ........ 0.0044
16-bit uint #1 ....... 0.0077 ........ 0.0094 ...... 0.0065 ........ 0.0045
16-bit uint #2 ....... 0.0077 ........ 0.0094 ...... 0.0063 ........ 0.0045
16-bit uint #3 ....... 0.0077 ........ 0.0095 ...... 0.0064 ........ 0.0047
32-bit uint #1 ....... 0.0088 ........ 0.0119 ...... 0.0063 ........ 0.0043
32-bit uint #2 ....... 0.0089 ........ 0.0117 ...... 0.0062 ........ 0.0039
32-bit uint #3 ....... 0.0089 ........ 0.0118 ...... 0.0063 ........ 0.0044
64-bit uint #1 ....... 0.0097 ........ 0.0155 ...... 0.0063 ........ 0.0045
64-bit uint #2 ....... 0.0095 ........ 0.0153 ...... 0.0061 ........ 0.0045
64-bit uint #3 ....... 0.0096 ........ 0.0156 ...... 0.0063 ........ 0.0047
8-bit int #1 ......... 0.0053 ........ 0.0083 ...... 0.0062 ........ 0.0044
8-bit int #2 ......... 0.0052 ........ 0.0080 ...... 0.0062 ........ 0.0044
8-bit int #3 ......... 0.0052 ........ 0.0080 ...... 0.0062 ........ 0.0043
16-bit int #1 ........ 0.0089 ........ 0.0097 ...... 0.0069 ........ 0.0046
16-bit int #2 ........ 0.0075 ........ 0.0093 ...... 0.0063 ........ 0.0043
16-bit int #3 ........ 0.0075 ........ 0.0094 ...... 0.0062 ........ 0.0046
32-bit int #1 ........ 0.0086 ........ 0.0122 ...... 0.0063 ........ 0.0044
32-bit int #2 ........ 0.0087 ........ 0.0120 ...... 0.0066 ........ 0.0046
32-bit int #3 ........ 0.0086 ........ 0.0121 ...... 0.0060 ........ 0.0044
64-bit int #1 ........ 0.0096 ........ 0.0149 ...... 0.0060 ........ 0.0045
64-bit int #2 ........ 0.0096 ........ 0.0157 ...... 0.0062 ........ 0.0044
64-bit int #3 ........ 0.0096 ........ 0.0160 ...... 0.0063 ........ 0.0046
64-bit int #4 ........ 0.0097 ........ 0.0157 ...... 0.0061 ........ 0.0044
64-bit float #1 ...... 0.0079 ........ 0.0153 ...... 0.0056 ........ 0.0044
64-bit float #2 ...... 0.0079 ........ 0.0152 ...... 0.0057 ........ 0.0045
64-bit float #3 ...... 0.0079 ........ 0.0155 ...... 0.0057 ........ 0.0044
fix string #1 ........ 0.0010 ........ 0.0045 ...... 0.0071 ........ 0.0044
fix string #2 ........ 0.0048 ........ 0.0075 ...... 0.0070 ........ 0.0060
fix string #3 ........ 0.0048 ........ 0.0086 ...... 0.0068 ........ 0.0060
fix string #4 ........ 0.0050 ........ 0.0088 ...... 0.0070 ........ 0.0059
8-bit string #1 ...... 0.0081 ........ 0.0129 ...... 0.0069 ........ 0.0062
8-bit string #2 ...... 0.0086 ........ 0.0128 ...... 0.0069 ........ 0.0065
8-bit string #3 ...... 0.0086 ........ 0.0126 ...... 0.0115 ........ 0.0065
16-bit string #1 ..... 0.0105 ........ 0.0137 ...... 0.0128 ........ 0.0068
16-bit string #2 ..... 0.1510 ........ 0.1486 ...... 0.1526 ........ 0.1391
32-bit string ........ 0.1517 ........ 0.1475 ...... 0.1504 ........ 0.1370
wide char string #1 .. 0.0044 ........ 0.0085 ...... 0.0067 ........ 0.0057
wide char string #2 .. 0.0081 ........ 0.0125 ...... 0.0069 ........ 0.0063
8-bit binary #1 ........... I ............. I ........... F ............. I
8-bit binary #2 ........... I ............. I ........... F ............. I
8-bit binary #3 ........... I ............. I ........... F ............. I
16-bit binary ............. I ............. I ........... F ............. I
32-bit binary ............. I ............. I ........... F ............. I
fix array #1 ......... 0.0014 ........ 0.0059 ...... 0.0132 ........ 0.0055
fix array #2 ......... 0.0146 ........ 0.0156 ...... 0.0155 ........ 0.0148
fix array #3 ......... 0.0211 ........ 0.0229 ...... 0.0179 ........ 0.0180
16-bit array #1 ...... 0.0673 ........ 0.0498 ...... 0.0343 ........ 0.0388
16-bit array #2 ........... S ............. S ........... S ............. S
32-bit array .............. S ............. S ........... S ............. S
complex array ............. I ............. I ........... F ............. F
fix map #1 ................ I ............. I ........... F ............. I
fix map #2 ........... 0.0148 ........ 0.0180 ...... 0.0156 ........ 0.0179
fix map #3 ................ I ............. I ........... F ............. I
fix map #4 ........... 0.0252 ........ 0.0201 ...... 0.0214 ........ 0.0167
16-bit map #1 ........ 0.1027 ........ 0.0836 ...... 0.0388 ........ 0.0510
16-bit map #2 ............. S ............. S ........... S ............. S
32-bit map ................ S ............. S ........... S ............. S
complex map .......... 0.1104 ........ 0.1010 ...... 0.0556 ........ 0.0602
fixext 1 .................. I ............. I ........... F ............. F
fixext 2 .................. I ............. I ........... F ............. F
fixext 4 .................. I ............. I ........... F ............. F
fixext 8 .................. I ............. I ........... F ............. F
fixext 16 ................. I ............. I ........... F ............. F
8-bit ext ................. I ............. I ........... F ............. F
16-bit ext ................ I ............. I ........... F ............. F
32-bit ext ................ I ............. I ........... F ............. F
32-bit timestamp #1 ....... I ............. I ........... F ............. F
32-bit timestamp #2 ....... I ............. I ........... F ............. F
64-bit timestamp #1 ....... I ............. I ........... F ............. F
64-bit timestamp #2 ....... I ............. I ........... F ............. F
64-bit timestamp #3 ....... I ............. I ........... F ............. F
96-bit timestamp #1 ....... I ............. I ........... F ............. F
96-bit timestamp #2 ....... I ............. I ........... F ............. F
96-bit timestamp #3 ....... I ............. I ........... F ............. F
===========================================================================
Total                  0.9642          1.0909        0.8224          0.7213
Skipped                     4               4             4               4
Failed                      0               0            24              17
Ignored                    24              24             0               7

Note that the msgpack extension (v2.1.2) doesn't support ext, bin and UTF-8 str types.

License

The library is released under the MIT License. See the bundled LICENSE file for details.

Author: rybakit
Source Code: https://github.com/rybakit/msgpack.php
License: MIT License

#php 

A Wrapper for Sembast and SQFlite to Enable Easy

FHIR_DB

This is really just a wrapper around Sembast_SQFLite - so all of the heavy lifting was done by Alex Tekartik. I highly recommend that if you have any questions about working with this package that you take a look at Sembast. He's also just a super nice guy, and even answered a question for me when I was deciding which sembast version to use. As usual, ResoCoder also has a good tutorial.

I have an interest in low-resource settings and thus a specific reason to be able to store data offline. To encourage this use, there are a number of other packages I have created based around the data format FHIR. FHIR® is the registered trademark of HL7 and is used with the permission of HL7. Use of the FHIR trademark does not constitute endorsement of this product by HL7.

Using the Db

So, while not absolutely necessary, I highly recommend that you use some sort of interface class. This adds the benefit of more easily handling errors, plus if you change to a different database in the future, you don't have to change the rest of your app, just the interface.

I've used something like this in my projects:

class IFhirDb {
  IFhirDb();
  final ResourceDao resourceDao = ResourceDao();

  Future<Either<DbFailure, Resource>> save(Resource resource) async {
    Resource resultResource;
    try {
      resultResource = await resourceDao.save(resource);
    } catch (error) {
      return left(DbFailure.unableToSave(error: error.toString()));
    }
    return right(resultResource);
  }

  Future<Either<DbFailure, List<Resource>>> returnListOfSingleResourceType(
      String resourceType) async {
    List<Resource> resultList;
    try {
      resultList =
          await resourceDao.getAllSortedById(resourceType: resourceType);
    } catch (error) {
      return left(DbFailure.unableToObtainList(error: error.toString()));
    }
    return right(resultList);
  }

  Future<Either<DbFailure, List<Resource>>> searchFunction(
      String resourceType, String searchString, String reference) async {
    List<Resource> resultList;
    try {
      resultList =
          await resourceDao.searchFor(resourceType, searchString, reference);
    } catch (error) {
      return left(DbFailure.unableToObtainList(error: error.toString()));
    }
    return right(resultList);
  }
}

I like this because in case there's an i/o error or something, it won't crash your app. Then, you can call this interface in your app like the following:

final patient = Patient(
    resourceType: 'Patient',
    name: [HumanName(text: 'New Patient Name')],
    birthDate: Date(DateTime.now()),
);

final saveResult = await IFhirDb().save(patient);

This will save your newly created patient to the locally embedded database.

IMPORTANT: this database will expect that all previously created resources have an id. When you save a resource, it will check to see if that resource type has already been stored. (Each resource type is saved in it's own store in the database). It will then check if there is an ID. If there's no ID, it will create a new one for that resource (along with metadata on version number and creation time). It will save it, and return the resource. If it already has an ID, it will copy the the old version of the resource into a _history store. It will then update the metadata of the new resource and save that version into the appropriate store for that resource. If, for instance, we have a previously created patient:

{
    "resourceType": "Patient",
    "id": "fhirfli-294057507-6811107",
    "meta": {
        "versionId": "1",
        "lastUpdated": "2020-10-16T19:41:28.054369Z"
    },
    "name": [
        {
            "given": ["New"],
            "family": "Patient"
        }
    ],
    "birthDate": "2020-10-16"
}

And we update the last name to 'Provider'. The above version of the patient will be kept in _history, while in the 'Patient' store in the db, we will have the updated version:

{
    "resourceType": "Patient",
    "id": "fhirfli-294057507-6811107",
    "meta": {
        "versionId": "2",
        "lastUpdated": "2020-10-16T19:45:07.316698Z"
    },
    "name": [
        {
            "given": ["New"],
            "family": "Provider"
        }
    ],
    "birthDate": "2020-10-16"
}

This way we can keep track of all previous version of all resources (which is obviously important in medicine).

For most of the interactions (saving, deleting, etc), they work the way you'd expect. The only difference is search. Because Sembast is NoSQL, we can search on any of the fields in a resource. If in our interface class, we have the following function:

  Future<Either<DbFailure, List<Resource>>> searchFunction(
      String resourceType, String searchString, String reference) async {
    List<Resource> resultList;
    try {
      resultList =
          await resourceDao.searchFor(resourceType, searchString, reference);
    } catch (error) {
      return left(DbFailure.unableToObtainList(error: error.toString()));
    }
    return right(resultList);
  }

You can search for all immunizations of a certain patient:

searchFunction(
        'Immunization', 'patient.reference', 'Patient/$patientId');

This function will search through all entries in the 'Immunization' store. It will look at all 'patient.reference' fields, and return any that match 'Patient/$patientId'.

The last thing I'll mention is that this is a password protected db, using AES-256 encryption (although it can also use Salsa20). Anytime you use the db, you have the option of using a password for encryption/decryption. Remember, if you setup the database using encryption, you will only be able to access it using that same password. When you're ready to change the password, you will need to call the update password function. If we again assume we created a change password method in our interface, it might look something like this:

class IFhirDb {
  IFhirDb();
  final ResourceDao resourceDao = ResourceDao();
  ...
    Future<Either<DbFailure, Unit>> updatePassword(String oldPassword, String newPassword) async {
    try {
      await resourceDao.updatePw(oldPassword, newPassword);
    } catch (error) {
      return left(DbFailure.unableToUpdatePassword(error: error.toString()));
    }
    return right(Unit);
  }

You don't have to use a password, and in that case, it will save the db file as plain text. If you want to add a password later, it will encrypt it at that time.

General Store

After using this for a while in an app, I've realized that it needs to be able to store data apart from just FHIR resources, at least on occasion. For this, I've added a second class for all versions of the database called GeneralDao. This is similar to the ResourceDao, but fewer options. So, in order to save something, it would look like this:

await GeneralDao().save('password', {'new':'map'});
await GeneralDao().save('password', {'new':'map'}, 'key');

The difference between these two options is that the first one will generate a key for the map being stored, while the second will store the map using the key provided. Both will return the key after successfully storing the map.

Other functions available include:

// deletes everything in the general store
await GeneralDao().deleteAllGeneral('password'); 

// delete specific entry
await GeneralDao().delete('password','key'); 

// returns map with that key
await GeneralDao().find('password', 'key'); 

FHIR® is a registered trademark of Health Level Seven International (HL7) and its use does not constitute an endorsement of products by HL7®

Use this package as a library

Depend on it

Run this command:

With Flutter:

 $ flutter pub add fhir_db

This will add a line like this to your package's pubspec.yaml (and run an implicit flutter pub get):

dependencies:
  fhir_db: ^0.4.3

Alternatively, your editor might support or flutter pub get. Check the docs for your editor to learn more.

Import it

Now in your Dart code, you can use:

import 'package:fhir_db/dstu2.dart';
import 'package:fhir_db/dstu2/fhir_db.dart';
import 'package:fhir_db/dstu2/general_dao.dart';
import 'package:fhir_db/dstu2/resource_dao.dart';
import 'package:fhir_db/encrypt/aes.dart';
import 'package:fhir_db/encrypt/salsa.dart';
import 'package:fhir_db/r4.dart';
import 'package:fhir_db/r4/fhir_db.dart';
import 'package:fhir_db/r4/general_dao.dart';
import 'package:fhir_db/r4/resource_dao.dart';
import 'package:fhir_db/r5.dart';
import 'package:fhir_db/r5/fhir_db.dart';
import 'package:fhir_db/r5/general_dao.dart';
import 'package:fhir_db/r5/resource_dao.dart';
import 'package:fhir_db/stu3.dart';
import 'package:fhir_db/stu3/fhir_db.dart';
import 'package:fhir_db/stu3/general_dao.dart';
import 'package:fhir_db/stu3/resource_dao.dart'; 

example/lib/main.dart

import 'package:fhir/r4.dart';
import 'package:fhir_db/r4.dart';
import 'package:flutter/material.dart';
import 'package:test/test.dart';

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();

  final resourceDao = ResourceDao();

  // await resourceDao.updatePw('newPw', null);
  await resourceDao.deleteAllResources(null);

  group('Playing with passwords', () {
    test('Playing with Passwords', () async {
      final patient = Patient(id: Id('1'));

      final saved = await resourceDao.save(null, patient);

      await resourceDao.updatePw(null, 'newPw');
      final search1 = await resourceDao.find('newPw',
          resourceType: R4ResourceType.Patient, id: Id('1'));
      expect(saved, search1[0]);

      await resourceDao.updatePw('newPw', 'newerPw');
      final search2 = await resourceDao.find('newerPw',
          resourceType: R4ResourceType.Patient, id: Id('1'));
      expect(saved, search2[0]);

      await resourceDao.updatePw('newerPw', null);
      final search3 = await resourceDao.find(null,
          resourceType: R4ResourceType.Patient, id: Id('1'));
      expect(saved, search3[0]);

      await resourceDao.deleteAllResources(null);
    });
  });

  final id = Id('12345');
  group('Saving Things:', () {
    test('Save Patient', () async {
      final humanName = HumanName(family: 'Atreides', given: ['Duke']);
      final patient = Patient(id: id, name: [humanName]);
      final saved = await resourceDao.save(null, patient);

      expect(saved.id, id);

      expect((saved as Patient).name?[0], humanName);
    });

    test('Save Organization', () async {
      final organization = Organization(id: id, name: 'FhirFli');
      final saved = await resourceDao.save(null, organization);

      expect(saved.id, id);

      expect((saved as Organization).name, 'FhirFli');
    });

    test('Save Observation1', () async {
      final observation1 = Observation(
        id: Id('obs1'),
        code: CodeableConcept(text: 'Observation #1'),
        effectiveDateTime: FhirDateTime(DateTime(1981, 09, 18)),
      );
      final saved = await resourceDao.save(null, observation1);

      expect(saved.id, Id('obs1'));

      expect((saved as Observation).code.text, 'Observation #1');
    });

    test('Save Observation1 Again', () async {
      final observation1 = Observation(
          id: Id('obs1'),
          code: CodeableConcept(text: 'Observation #1 - Updated'));
      final saved = await resourceDao.save(null, observation1);

      expect(saved.id, Id('obs1'));

      expect((saved as Observation).code.text, 'Observation #1 - Updated');

      expect(saved.meta?.versionId, Id('2'));
    });

    test('Save Observation2', () async {
      final observation2 = Observation(
        id: Id('obs2'),
        code: CodeableConcept(text: 'Observation #2'),
        effectiveDateTime: FhirDateTime(DateTime(1981, 09, 18)),
      );
      final saved = await resourceDao.save(null, observation2);

      expect(saved.id, Id('obs2'));

      expect((saved as Observation).code.text, 'Observation #2');
    });

    test('Save Observation3', () async {
      final observation3 = Observation(
        id: Id('obs3'),
        code: CodeableConcept(text: 'Observation #3'),
        effectiveDateTime: FhirDateTime(DateTime(1981, 09, 18)),
      );
      final saved = await resourceDao.save(null, observation3);

      expect(saved.id, Id('obs3'));

      expect((saved as Observation).code.text, 'Observation #3');
    });
  });

  group('Finding Things:', () {
    test('Find 1st Patient', () async {
      final search = await resourceDao.find(null,
          resourceType: R4ResourceType.Patient, id: id);
      final humanName = HumanName(family: 'Atreides', given: ['Duke']);

      expect(search.length, 1);

      expect((search[0] as Patient).name?[0], humanName);
    });

    test('Find 3rd Observation', () async {
      final search = await resourceDao.find(null,
          resourceType: R4ResourceType.Observation, id: Id('obs3'));

      expect(search.length, 1);

      expect(search[0].id, Id('obs3'));

      expect((search[0] as Observation).code.text, 'Observation #3');
    });

    test('Find All Observations', () async {
      final search = await resourceDao.getResourceType(
        null,
        resourceTypes: [R4ResourceType.Observation],
      );

      expect(search.length, 3);

      final idList = [];
      for (final obs in search) {
        idList.add(obs.id.toString());
      }

      expect(idList.contains('obs1'), true);

      expect(idList.contains('obs2'), true);

      expect(idList.contains('obs3'), true);
    });

    test('Find All (non-historical) Resources', () async {
      final search = await resourceDao.getAll(null);

      expect(search.length, 5);
      final patList = search.toList();
      final orgList = search.toList();
      final obsList = search.toList();
      patList.retainWhere(
          (resource) => resource.resourceType == R4ResourceType.Patient);
      orgList.retainWhere(
          (resource) => resource.resourceType == R4ResourceType.Organization);
      obsList.retainWhere(
          (resource) => resource.resourceType == R4ResourceType.Observation);

      expect(patList.length, 1);

      expect(orgList.length, 1);

      expect(obsList.length, 3);
    });
  });

  group('Deleting Things:', () {
    test('Delete 2nd Observation', () async {
      await resourceDao.delete(
          null, null, R4ResourceType.Observation, Id('obs2'), null, null);

      final search = await resourceDao.getResourceType(
        null,
        resourceTypes: [R4ResourceType.Observation],
      );

      expect(search.length, 2);

      final idList = [];
      for (final obs in search) {
        idList.add(obs.id.toString());
      }

      expect(idList.contains('obs1'), true);

      expect(idList.contains('obs2'), false);

      expect(idList.contains('obs3'), true);
    });

    test('Delete All Observations', () async {
      await resourceDao.deleteSingleType(null,
          resourceType: R4ResourceType.Observation);

      final search = await resourceDao.getAll(null);

      expect(search.length, 2);

      final patList = search.toList();
      final orgList = search.toList();
      patList.retainWhere(
          (resource) => resource.resourceType == R4ResourceType.Patient);
      orgList.retainWhere(
          (resource) => resource.resourceType == R4ResourceType.Organization);

      expect(patList.length, 1);

      expect(patList.length, 1);
    });

    test('Delete All Resources', () async {
      await resourceDao.deleteAllResources(null);

      final search = await resourceDao.getAll(null);

      expect(search.length, 0);
    });
  });

  group('Password - Saving Things:', () {
    test('Save Patient', () async {
      await resourceDao.updatePw(null, 'newPw');
      final humanName = HumanName(family: 'Atreides', given: ['Duke']);
      final patient = Patient(id: id, name: [humanName]);
      final saved = await resourceDao.save('newPw', patient);

      expect(saved.id, id);

      expect((saved as Patient).name?[0], humanName);
    });

    test('Save Organization', () async {
      final organization = Organization(id: id, name: 'FhirFli');
      final saved = await resourceDao.save('newPw', organization);

      expect(saved.id, id);

      expect((saved as Organization).name, 'FhirFli');
    });

    test('Save Observation1', () async {
      final observation1 = Observation(
        id: Id('obs1'),
        code: CodeableConcept(text: 'Observation #1'),
        effectiveDateTime: FhirDateTime(DateTime(1981, 09, 18)),
      );
      final saved = await resourceDao.save('newPw', observation1);

      expect(saved.id, Id('obs1'));

      expect((saved as Observation).code.text, 'Observation #1');
    });

    test('Save Observation1 Again', () async {
      final observation1 = Observation(
          id: Id('obs1'),
          code: CodeableConcept(text: 'Observation #1 - Updated'));
      final saved = await resourceDao.save('newPw', observation1);

      expect(saved.id, Id('obs1'));

      expect((saved as Observation).code.text, 'Observation #1 - Updated');

      expect(saved.meta?.versionId, Id('2'));
    });

    test('Save Observation2', () async {
      final observation2 = Observation(
        id: Id('obs2'),
        code: CodeableConcept(text: 'Observation #2'),
        effectiveDateTime: FhirDateTime(DateTime(1981, 09, 18)),
      );
      final saved = await resourceDao.save('newPw', observation2);

      expect(saved.id, Id('obs2'));

      expect((saved as Observation).code.text, 'Observation #2');
    });

    test('Save Observation3', () async {
      final observation3 = Observation(
        id: Id('obs3'),
        code: CodeableConcept(text: 'Observation #3'),
        effectiveDateTime: FhirDateTime(DateTime(1981, 09, 18)),
      );
      final saved = await resourceDao.save('newPw', observation3);

      expect(saved.id, Id('obs3'));

      expect((saved as Observation).code.text, 'Observation #3');
    });
  });

  group('Password - Finding Things:', () {
    test('Find 1st Patient', () async {
      final search = await resourceDao.find('newPw',
          resourceType: R4ResourceType.Patient, id: id);
      final humanName = HumanName(family: 'Atreides', given: ['Duke']);

      expect(search.length, 1);

      expect((search[0] as Patient).name?[0], humanName);
    });

    test('Find 3rd Observation', () async {
      final search = await resourceDao.find('newPw',
          resourceType: R4ResourceType.Observation, id: Id('obs3'));

      expect(search.length, 1);

      expect(search[0].id, Id('obs3'));

      expect((search[0] as Observation).code.text, 'Observation #3');
    });

    test('Find All Observations', () async {
      final search = await resourceDao.getResourceType(
        'newPw',
        resourceTypes: [R4ResourceType.Observation],
      );

      expect(search.length, 3);

      final idList = [];
      for (final obs in search) {
        idList.add(obs.id.toString());
      }

      expect(idList.contains('obs1'), true);

      expect(idList.contains('obs2'), true);

      expect(idList.contains('obs3'), true);
    });

    test('Find All (non-historical) Resources', () async {
      final search = await resourceDao.getAll('newPw');

      expect(search.length, 5);
      final patList = search.toList();
      final orgList = search.toList();
      final obsList = search.toList();
      patList.retainWhere(
          (resource) => resource.resourceType == R4ResourceType.Patient);
      orgList.retainWhere(
          (resource) => resource.resourceType == R4ResourceType.Organization);
      obsList.retainWhere(
          (resource) => resource.resourceType == R4ResourceType.Observation);

      expect(patList.length, 1);

      expect(orgList.length, 1);

      expect(obsList.length, 3);
    });
  });

  group('Password - Deleting Things:', () {
    test('Delete 2nd Observation', () async {
      await resourceDao.delete(
          'newPw', null, R4ResourceType.Observation, Id('obs2'), null, null);

      final search = await resourceDao.getResourceType(
        'newPw',
        resourceTypes: [R4ResourceType.Observation],
      );

      expect(search.length, 2);

      final idList = [];
      for (final obs in search) {
        idList.add(obs.id.toString());
      }

      expect(idList.contains('obs1'), true);

      expect(idList.contains('obs2'), false);

      expect(idList.contains('obs3'), true);
    });

    test('Delete All Observations', () async {
      await resourceDao.deleteSingleType('newPw',
          resourceType: R4ResourceType.Observation);

      final search = await resourceDao.getAll('newPw');

      expect(search.length, 2);

      final patList = search.toList();
      final orgList = search.toList();
      patList.retainWhere(
          (resource) => resource.resourceType == R4ResourceType.Patient);
      orgList.retainWhere(
          (resource) => resource.resourceType == R4ResourceType.Organization);

      expect(patList.length, 1);

      expect(patList.length, 1);
    });

    test('Delete All Resources', () async {
      await resourceDao.deleteAllResources('newPw');

      final search = await resourceDao.getAll('newPw');

      expect(search.length, 0);

      await resourceDao.updatePw('newPw', null);
    });
  });
} 

Download Details:

Author: MayJuun

Source Code: https://github.com/MayJuun/fhir/tree/main/fhir_db

#sqflite  #dart  #flutter 

Garry Taylor

Garry Taylor

1669952228

Dijkstra's Algorithm Explained with Examples

In this tutorial, you'll learn: What is Dijkstra's Algorithm and how Dijkstra's algorithm works with the help of visual guides.

You can use algorithms in programming to solve specific problems through a set of precise instructions or procedures.

Dijkstra's algorithm is one of many graph algorithms you'll come across. It is used to find the shortest path from a fixed node to all other nodes in a graph.

There are different representations of Dijkstra's algorithm. You can either find the shortest path between two nodes, or the shortest path from a fixed node to the rest of the nodes in a graph.

In this article, you'll learn how Dijkstra's algorithm works with the help of visual guides.

How Does Dijkstra’s Algorithm Work?

Before we dive into more detailed visual examples, you need to understand how Dijkstra's algorithm works.

Although the theoretical explanation may seem a bit abstract, it'll help you understand the practical aspect better.

In a given graph containing different nodes, we are required to get the shortest path from a given node to the rest of the nodes.

These nodes can represent any object like the names of cities, letters, and so on.

Between each node is a number denoting the distance between two nodes, as you can see in the image below:

nodes-1

We usually work with two arrays – one for visited nodes, and another for unvisited nodes. You'll learn more about the arrays in the next section.

When a node is visited, the algorithm calculates how long it took to get to the node and stores the distance. If a shorter path to a node is found, the initial value assigned for the distance is updated.

Note that a node cannot be visited twice.

The algorithm runs recursively until all the nodes have been visited.

Dijkstra's Algorithm Example

In this section, we'll take a look at a practical example that shows how Dijkstra's algorithm works.

Here's the graph we'll be working with:

nodes

We'll use the table below to put down the visited nodes and their distance from the fixed node:

NODESHORTEST DISTANCE FROM FIXED NODE
A
B
C
D
E

Visited nodes = []
Unvisited nodes = [A,B,C,D,E]

Above, we have a table showing each node and the shortest distance from the that node to the fixed node. We are yet to choose the fixed node.

Note that the distance for each node in the table is currently denoted as infinity (∞). This is because we don't know the shortest distance yet.

We also have two arrays – visited and unvisited. Whenever a node is visited, it is added to the visited nodes array.

Let's get started!

To simplify things, I'll break the process down into iterations. You'll see what happens in each step with the aid of diagrams.

Iteration #1

The first iteration might seem confusing, but that's totally fine. Once we start repeating the process in each iteration, you'll have a clearer picture of how the algorithm works.

Step #1 - Pick an unvisited node

We'll choose A as the fixed node. So we'll find the shortest distance from A to every other node in the graph.

node1-1

We're going to give A a distance of 0 because it is the initial node. So the table would look like this:

NODESHORTEST DISTANCE FROM FIXED NODE
A0
B
C
D
E

Step #2 - Find the distance from current nodenode1a-3

The next thing to do after choosing a node is to find the distance from it to the unvisited nodes around it.

The two unvisited nodes directly linked to A are B and C.

To get the distance from A to B:

0 + 4 = 4

0 being the value of the current node (A), and 4 being the distance between A and B in the graph.

To get the distance from A to C:

0 + 2 = 2

Step #3 - Update table with known distances

In the last step, we got 4 and 2 as the values of B and C respectively. So we'll update the table with those values:

NODESHORTEST DISTANCE FROM FIXED NODE
A0
B4
C2
D
E

Step #4 - Update arrays

At this point, the first iteration is complete. We'll move node A to the visited nodes array:

Visited nodes = [A]
Unvisited nodes = [B,C,D,E]

Before we proceed to the next iteration, you should know the following:

  • Once a node has been visited, it cannot be linked to the current node. Refer to step #2 in the iteration above and step #2 in the next iteration.
  • A node cannot be visited twice.
  • You can only update the shortest known distance if you get a value smaller than the recorded distance.

Iteration #2

Step #1 - Pick an unvisited node

We have four unvisited nodes — [B,C,D,E]. So how do you know which node to pick for the next iteration?

Well, we pick the node with the smallest known distance recorded in the table. Here's the table:

NODESHORTEST DISTANCE FROM FIXED NODE
A0
B4
C2
D
E

So we're going with node C.

node2-2

Step #2 - Find the distance from current node

To find the distance from the current node to the fixed node, we have to consider the nodes linked to the current node.

The nodes linked to the current node are A and B.

But A has been visited in the previous iteration so it will not be linked to the current node. That is:

node2a-1

From the diagram above,

  • The green color denotes the current node.
  • The blue color denotes the visited nodes. We cannot link to them or visit them again.
  • The red color shows the link from the unvisited nodes to the current node.

To find the distance from C to B:

2 + 1 = 3

2 above is recorded distance for node C while 1 is the distance between C and B in the graph.

Step #3 - Update table with known distances

In the last step, we got the value of B to be 3. In the first iteration, it was 4.

We're going to update the distance in the table to 3.

NODESHORTEST DISTANCE FROM FIXED NODE
A0
B3
C2
D
E

So, A --> B = 4 (First iteration).

A --> C --> B = 3 (Second iteration).

The algorithm has helped us find the shortest path to B from A.

Step #4 - Update arrays

We're done with the last visited node. Let's add it to the visited nodes array:

Visited nodes = [A,C]
Unvisited nodes = [B,D,E]

Iteration #3

Step #1 - Pick an unvisited node

We're down to three unvisited nodes — [B,D,E]. From the array, B has the shortest known distance.

node3-2

To restate what is going on in the diagram above:

  • The green color denotes the current node.
  • The blue color denotes the visited nodes. We cannot link to them or visit them again.
  • The red color shows the link from the unvisited nodes to the current node.

Step #2 - Find the distance from current node

The nodes linked to the current node are D and E.

B (the current node) has a value of 3. Therefore,

For node D, 3 + 3 = 6.

For node E, 3 + 2 = 5.

Step #3 - Update table with known distances

NODESHORTEST DISTANCE FROM FIXED NODE
A0
B3
C2
D6
E5

Step #4 - Update arrays

Visited nodes = [A,C,B]
Unvisited nodes = [D,E]

Iteration #4

Step #1 - Pick an unvisited node

Like other iterations, we'll go with the unvisited node with the shortest known distance. That is E.

node4-1

Step #2 - Find the distance from current node

According to our table, E has a value of 5.

For D in the current iteration,

5 + 5 = 10.

The value gotten for D here is 10, which is greater than the recorded value of 6 in the previous iteration. For this reason, we'll not update the table.

Step #3 - Update table with known distances

Our table remains the same:

NODESHORTEST DISTANCE FROM FIXED NODE
A0
B3
C2
D6
E5

Step #4 - Update arrays

Visited nodes = [A,C,B,E]
Unvisited nodes = [D]

Iteration #5

Step #1 - Pick an unvisited node

We're currently left with one node in the unvisited array — D.

node5-1

Step #2 - Find the distance from current node

The algorithm has gotten to the last iteration. This is because all nodes linked to the current node have been visited already so we can't link to them.

Step #3 - Update table with known distances

Our table remains the same:

NODESHORTEST DISTANCE FROM FIXED NODE
A0
B3
C2
D6
E5

At this point, we have updated the table with the shortest distance from the fixed node to every other node in the graph.

Step #4 - Update arrays

Visited nodes = [A,C,B,E,D]
Unvisited nodes = []

As can be seen above, we have no nodes left to visit. Using Dijkstra's algorithm, we've found the shortest distance from the fixed node to others nodes in the graph.

Dijkstra's Algorithm Pseudocode Example

The pseudocode example in this section was gotten from Wikipedia. Here it is:

 1  function Dijkstra(Graph, source):
 2      
 3      for each vertex v in Graph.Vertices:
 4          dist[v] ← INFINITY
 5          prev[v] ← UNDEFINED
 6          add v to Q
 7      dist[source] ← 0
 8      
 9      while Q is not empty:
10          u ← vertex in Q with min dist[u]
11          remove u from Q
12          
13          for each neighbor v of u still in Q:
14              alt ← dist[u] + Graph.Edges(u, v)
15              if alt < dist[v]:
16                  dist[v] ← alt
17                  prev[v] ← u
18
19      return dist[], prev[]

Applications of Dijkstra's Algorithm

Here are some of the common applications of Dijkstra's algorithm:

  • In maps to get the shortest distance between locations. An example is Google Maps.
  • In telecommunications to determine transmission rate.
  • In robotic design to determine shortest path for automated robots.

Summary

In this article, we talked about Dijkstra's algorithm. It is used to find the shortest distance from a fixed node to all other nodes in a graph.

We started by giving a brief summary of how the algorithm works.

We then had a look at an example that further explained Dijkstra's algorithm in steps using visual guides.

We concluded with a pseudocode example and some of the applications of Dijkstra's algorithm.

Happy coding!

Original article source at https://www.freecodecamp.org

#algorithm #datastructures

Chatgpt-api: Node.js client for the official ChatGPT API

ChatGPT API

Node.js client for the official ChatGPT API.

Intro

This package is a Node.js wrapper around ChatGPT by OpenAI. TS batteries included. ✨

Example usage

Updates

March 1, 2023

The official OpenAI chat completions API has been released, and it is now the default for this package! 🔥

MethodFree?Robust?Quality?
ChatGPTAPI❌ No✅ Yes✅️ Real ChatGPT models
ChatGPTUnofficialProxyAPI✅ Yes☑️ Maybe✅ Real ChatGPT

Note: We strongly recommend using ChatGPTAPI since it uses the officially supported API from OpenAI. We may remove support for ChatGPTUnofficialProxyAPI in a future release.

  1. ChatGPTAPI - Uses the gpt-3.5-turbo-0301 model with the official OpenAI chat completions API (official, robust approach, but it's not free)
  2. ChatGPTUnofficialProxyAPI - Uses an unofficial proxy server to access ChatGPT's backend API in a way that circumvents Cloudflare (uses the real ChatGPT and is pretty lightweight, but relies on a third-party server and is rate-limited)

CLI

To run the CLI, you'll need an OpenAI API key:

export OPENAI_API_KEY="sk-TODO"
npx chatgpt "your prompt here"

By default, the response is streamed to stdout, the results are stored in a local config file, and every invocation starts a new conversation. You can use -c to continue the previous conversation and --no-stream to disable streaming.

Under the hood, the CLI uses ChatGPTAPI with text-davinci-003 to mimic ChatGPT.

Usage:
  $ chatgpt <prompt>

Commands:
  <prompt>  Ask ChatGPT a question
  rm-cache  Clears the local message cache
  ls-cache  Prints the local message cache path

For more info, run any command with the `--help` flag:
  $ chatgpt --help
  $ chatgpt rm-cache --help
  $ chatgpt ls-cache --help

Options:
  -c, --continue          Continue last conversation (default: false)
  -d, --debug             Enables debug logging (default: false)
  -s, --stream            Streams the response (default: true)
  -s, --store             Enables the local message cache (default: true)
  -t, --timeout           Timeout in milliseconds
  -k, --apiKey            OpenAI API key
  -n, --conversationName  Unique name for the conversation
  -h, --help              Display this message
  -v, --version           Display version number

Install

npm install chatgpt

Make sure you're using node >= 18 so fetch is available (or node >= 14 if you install a fetch polyfill).

Usage

To use this module from Node.js, you need to pick between two methods:

MethodFree?Robust?Quality?
ChatGPTAPI❌ No✅ Yes✅️ Real ChatGPT models
ChatGPTUnofficialProxyAPI✅ Yes☑️ Maybe✅ Real ChatGPT

ChatGPTAPI - Uses the gpt-3.5-turbo-0301 model with the official OpenAI chat completions API (official, robust approach, but it's not free). You can override the model, completion params, and system message to fully customize your assistant.

ChatGPTUnofficialProxyAPI - Uses an unofficial proxy server to access ChatGPT's backend API in a way that circumvents Cloudflare (uses the real ChatGPT and is pretty lightweight, but relies on a third-party server and is rate-limited)

Both approaches have very similar APIs, so it should be simple to swap between them.

Note: We strongly recommend using ChatGPTAPI since it uses the officially supported API from OpenAI. We may remove support for ChatGPTUnofficialProxyAPI in a future release.

Usage - ChatGPTAPI

Sign up for an OpenAI API key and store it in your environment.

import { ChatGPTAPI } from 'chatgpt'

async function example() {
  const api = new ChatGPTAPI({
    apiKey: process.env.OPENAI_API_KEY
  })

  const res = await api.sendMessage('Hello World!')
  console.log(res.text)
}

You can override the default model (gpt-3.5-turbo-0301) and any OpenAI chat completion params using completionParams:

const api = new ChatGPTAPI({
  apiKey: process.env.OPENAI_API_KEY,
  completionParams: {
    temperature: 0.5,
    top_p: 0.8
  }
})

If you want to track the conversation, you'll need to pass the parentMessageId like this:

const api = new ChatGPTAPI({ apiKey: process.env.OPENAI_API_KEY })

// send a message and wait for the response
let res = await api.sendMessage('What is OpenAI?')
console.log(res.text)

// send a follow-up
res = await api.sendMessage('Can you expand on that?', {
  parentMessageId: res.id
})
console.log(res.text)

// send another follow-up
res = await api.sendMessage('What were we talking about?', {
  parentMessageId: res.id
})
console.log(res.text)

You can add streaming via the onProgress handler:

const res = await api.sendMessage('Write a 500 word essay on frogs.', {
  // print the partial response as the AI is "typing"
  onProgress: (partialResponse) => console.log(partialResponse.text)
})

// print the full text at the end
console.log(res.text)

You can add a timeout using the timeoutMs option:

// timeout after 2 minutes (which will also abort the underlying HTTP request)
const response = await api.sendMessage(
  'write me a really really long essay on frogs',
  {
    timeoutMs: 2 * 60 * 1000
  }
)

If you want to see more info about what's actually being sent to OpenAI's chat completions API, set the debug: true option in the ChatGPTAPI constructor:

const api = new ChatGPTAPI({
  apiKey: process.env.OPENAI_API_KEY,
  debug: true
})

We default to a basic systemMessage. You can override this in either the ChatGPTAPI constructor or sendMessage:

const res = await api.sendMessage('what is the answer to the universe?', {
  systemMessage: `You are ChatGPT, a large language model trained by OpenAI. You answer as concisely as possible for each responseIf you are generating a list, do not have too many items.
Current date: ${new Date().toISOString()}\n\n`
})

Note that we automatically handle appending the previous messages to the prompt and attempt to optimize for the available tokens (which defaults to 4096).

Usage in CommonJS (Dynamic import)

async function example() {
  // To use ESM in CommonJS, you can use a dynamic import
  const { ChatGPTAPI } = await import('chatgpt')

  const api = new ChatGPTAPI({ apiKey: process.env.OPENAI_API_KEY })

  const res = await api.sendMessage('Hello World!')
  console.log(res.text)
}

Usage - ChatGPTUnofficialProxyAPI

The API for ChatGPTUnofficialProxyAPI is almost exactly the same. You just need to provide a ChatGPT accessToken instead of an OpenAI API key.

import { ChatGPTUnofficialProxyAPI } from 'chatgpt'

async function example() {
  const api = new ChatGPTUnofficialProxyAPI({
    accessToken: process.env.OPENAI_ACCESS_TOKEN
  })

  const res = await api.sendMessage('Hello World!')
  console.log(res.text)
}

See demos/demo-reverse-proxy for a full example:

npx tsx demos/demo-reverse-proxy.ts

ChatGPTUnofficialProxyAPI messages also contain a conversationid in addition to parentMessageId, since the ChatGPT webapp can't reference messages across

Reverse Proxy

You can override the reverse proxy by passing apiReverseProxyUrl:

const api = new ChatGPTUnofficialProxyAPI({
  accessToken: process.env.OPENAI_ACCESS_TOKEN,
  apiReverseProxyUrl: 'https://your-example-server.com/api/conversation'
})

Known reverse proxies run by community members include:

Reverse Proxy URLAuthorRate LimitsLast Checked
https://chat.duti.tech/api/conversation@acheong08120 req/min by IP2/19/2023
https://gpt.pawan.krd/backend-api/conversation@PawanOsman?2/19/2023

Note: info on how the reverse proxies work is not being published at this time in order to prevent OpenAI from disabling access.

Access Token

To use ChatGPTUnofficialProxyAPI, you'll need an OpenAI access token from the ChatGPT webapp. To do this, you can use any of the following methods which take an email and password and return an access token:

These libraries work with email + password accounts (e.g., they do not support accounts where you auth via Microsoft / Google).

Alternatively, you can manually get an accessToken by logging in to the ChatGPT webapp and then opening https://chat.openai.com/api/auth/session, which will return a JSON object containing your accessToken string.

Access tokens last for days.

Note: using a reverse proxy will expose your access token to a third-party. There shouldn't be any adverse effects possible from this, but please consider the risks before using this method.

Docs

See the auto-generated docs for more info on methods and parameters.

Demos

Most of the demos use ChatGPTAPI. It should be pretty easy to convert them to use ChatGPTUnofficialProxyAPI if you'd rather use that approach. The only thing that needs to change is how you initialize the api with an accessToken instead of an apiKey.

To run the included demos:

  1. clone repo
  2. install node deps
  3. set OPENAI_API_KEY in .env

A basic demo is included for testing purposes:

npx tsx demos/demo.ts

A demo showing on progress handler:

npx tsx demos/demo-on-progress.ts

The on progress demo uses the optional onProgress parameter to sendMessage to receive intermediary results as ChatGPT is "typing".

A conversation demo:

npx tsx demos/demo-conversation.ts

A persistence demo shows how to store messages in Redis for persistence:

npx tsx demos/demo-persistence.ts

Any keyv adaptor is supported for persistence, and there are overrides if you'd like to use a different way of storing / retrieving messages.

Note that persisting message is required for remembering the context of previous conversations beyond the scope of the current Node.js process, since by default, we only store messages in memory. Here's an external demo of using a completely custom database solution to persist messages.

Note: Persistence is handled automatically when using ChatGPTUnofficialProxyAPI because it is connecting indirectly to ChatGPT.

Projects

All of these awesome projects are built using the chatgpt package. 🤯

If you create a cool integration, feel free to open a PR and add it to the list.

Compatibility

  • This package is ESM-only.
  • This package supports node >= 14.
  • This module assumes that fetch is installed.
    • In node >= 18, it's installed by default.
    • In node < 18, you need to install a polyfill like unfetch/polyfill (guide) or isomorphic-fetch (guide).
  • If you want to build a website using chatgpt, we recommend using it only from your backend API

Credits


Previous Updates

Feb 19, 2023
 

We now provide three ways of accessing the unofficial ChatGPT API, all of which have tradeoffs:

MethodFree?Robust?Quality?
ChatGPTAPI❌ No✅ Yes☑️ Mimics ChatGPT
ChatGPTUnofficialProxyAPI✅ Yes☑️ Maybe✅ Real ChatGPT
ChatGPTAPIBrowser (v3)✅ Yes❌ No✅ Real ChatGPT

Note: I recommend that you use either ChatGPTAPI or ChatGPTUnofficialProxyAPI.

  1. ChatGPTAPI - Uses text-davinci-003 to mimic ChatGPT via the official OpenAI completions API (most robust approach, but it's not free and doesn't use a model fine-tuned for chat)
  2. ChatGPTUnofficialProxyAPI - Uses an unofficial proxy server to access ChatGPT's backend API in a way that circumvents Cloudflare (uses the real ChatGPT and is pretty lightweight, but relies on a third-party server and is rate-limited)
  3. ChatGPTAPIBrowser - (deprecated; v3.5.1 of this package) Uses Puppeteer to access the official ChatGPT webapp (uses the real ChatGPT, but very flaky, heavyweight, and error prone)

Feb 5, 2023
 

OpenAI has disabled the leaked chat model we were previously using, so we're now defaulting to text-davinci-003, which is not free.

We've found several other hidden, fine-tuned chat models, but OpenAI keeps disabling them, so we're searching for alternative workarounds.

Feb 1, 2023
 

This package no longer requires any browser hacks – it is now using the official OpenAI completions API with a leaked model that ChatGPT uses under the hood. 🔥

import { ChatGPTAPI } from 'chatgpt'

const api = new ChatGPTAPI({
  apiKey: process.env.OPENAI_API_KEY
})

const res = await api.sendMessage('Hello World!')
console.log(res.text)

Please upgrade to chatgpt@latest (at least v4.0.0). The updated version is significantly more lightweight and robust compared with previous versions. You also don't have to worry about IP issues or rate limiting.

Huge shoutout to @waylaidwanderer for discovering the leaked chat model!

If you run into any issues, we do have a pretty active Discord with a bunch of ChatGPT hackers from the Node.js & Python communities.

Lastly, please consider starring this repo and following me on twitter twitter to help support the project.

Thanks && cheers, Travis


Download Details:

Author: Transitive-bullshit
Source Code: https://github.com/transitive-bullshit/chatgpt-api 
License: MIT license

#chatgpt #api #node #AI #openai #chatbot 

Evolution in Web Design: A Case Study of 25 Years - Prismetric

The term web design simply encompasses a design process related to the front-end design of website that includes writing mark-up. Creative web design has a considerable impact on your perceived business credibility and quality. It taps onto the broader scopes of web development services.

Web designing is identified as a critical factor for the success of websites and eCommerce. The internet has completely changed the way businesses and brands operate. Web design and web development go hand-in-hand and the need for a professional web design and development company, offering a blend of creative designs and user-centric elements at an affordable rate, is growing at a significant rate.

In this blog, we have focused on the different areas of designing a website that covers all the trends, tools, and techniques coming up with time.

Web design
In 2020 itself, the number of smartphone users across the globe stands at 6.95 billion, with experts suggesting a high rise of 17.75 billion by 2024. On the other hand, the percentage of Gen Z web and internet users worldwide is up to 98%. This is not just a huge market but a ginormous one to boost your business and grow your presence online.

Web Design History
At a huge particle physics laboratory, CERN in Switzerland, the son of computer scientist Barner Lee published the first-ever website on August 6, 1991. He is not only the first web designer but also the creator of HTML (HyperText Markup Language). The worldwide web persisted and after two years, the world’s first search engine was born. This was just the beginning.

Evolution of Web Design over the years
With the release of the Internet web browser and Windows 95 in 1995, most trading companies at that time saw innumerable possibilities of instant worldwide information and public sharing of websites to increase their sales. This led to the prospect of eCommerce and worldwide group communications.

The next few years saw a soaring launch of the now-so-famous websites such as Yahoo, Amazon, eBay, Google, and substantially more. In 2004, by the time Facebook was launched, there were more than 50 million websites online.

Then came the era of Google, the ruler of all search engines introducing us to search engine optimization (SEO) and businesses sought their ways to improve their ranks. The world turned more towards mobile web experiences and responsive mobile-friendly web designs became requisite.

Let’s take a deep look at the evolution of illustrious brands to have a profound understanding of web design.

Here is a retrospection of a few widely acclaimed brands over the years.

Netflix
From a simple idea of renting DVDs online to a multi-billion-dollar business, saying that Netflix has come a long way is an understatement. A company that has sent shockwaves across Hollywood in the form of content delivery. Abundantly, Netflix (NFLX) is responsible for the rise in streaming services across 190 countries and meaningful changes in the entertainment industry.

1997-2000

The idea of Netflix was born when Reed Hastings and Marc Randolph decided to rent DVDs by mail. With 925 titles and a pay-per-rental model, Netflix.com debuts the first DVD rental and sales site with all novel features. It offered unlimited rentals without due dates or monthly rental limitations with a personalized movie recommendation system.

Netflix 1997-2000

2001-2005

Announcing its initial public offering (IPO) under the NASDAQ ticker NFLX, Netflix reached over 1 million subscribers in the United States by introducing a profile feature in their influential website design along with a free trial allowing members to create lists and rate their favorite movies. The user experience was quite engaging with the categorization of content, recommendations based on history, search engine, and a queue of movies to watch.

Netflix 2001-2005 -2003

2006-2010

They then unleashed streaming and partnering with electronic brands such as blu-ray, Xbox, and set-top boxes so that users can watch series and films straight away. Later in 2010, they also launched their sophisticated website on mobile devices with its iconic red and black themed background.

Netflix 2006-2010 -2007

2011-2015

In 2013, an eye-tracking test revealed that the users didn’t focus on the details of the movie or show in the existing interface and were perplexed with the flow of information. Hence, the professional web designers simply shifted the text from the right side to the top of the screen. With Daredevil, an audio description feature was also launched for the visually impaired ones.

Netflix 2011-2015

2016-2020

These years, Netflix came with a plethora of new features for their modern website design such as AutoPay, snippets of trailers, recommendations categorized by genre, percentage based on user experience, upcoming shows, top 10 lists, etc. These web application features yielded better results in visual hierarchy and flow of information across the website.

Netflix 2016-2020

2021

With a sleek logo in their iconic red N, timeless black background with a ‘Watch anywhere, Cancel anytime’ the color, the combination, the statement, and the leading ott platform for top video streaming service Netflix has overgrown into a revolutionary lifestyle of Netflix and Chill.

Netflix 2021

Contunue to read: Evolution in Web Design: A Case Study of 25 Years

#web #web-design #web-design-development #web-design-case-study #web-design-history #web-development