Πώς να δημιουργήσετε κλιμακωτά dApps και έξυπνες συμβάσεις στο Ethereum με State Channels βήμα προς βήμα. Μέρος 1

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

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

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

Ποια είναι τα κρατικά κανάλια;

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

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

Γιατί υπάρχουν;

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

Αυτό σημαίνει ελεύθερες και γρήγορες συναλλαγές.

Τι πρέπει να δημιουργήσουμε ένα κρατικό κανάλι;

  1. Τουλάχιστον 2 χρήστες που θα αλληλεπιδρούν μεταξύ τους. Ένα κανάλι πρέπει να ανοίξει μεταξύ 2 ή περισσότερων χρηστών. Παρόμοια με μια εφαρμογή συνομιλίας.
  2. Ένα έξυπνο συμβόλαιο με τη λογική του κρατικού καναλιού που θα το ανοίξει και θα το κλείσει.
  3. Εάν το κανάλι του κράτους θα χρησιμοποιηθεί σε ένα παιχνίδι, θα απαιτείται μια μεσεγγύηση και για τους δύο χρήστες. Αυτή η μεσεγγύηση στον αιθέρα θα αποθηκευτεί στο έξυπνο συμβόλαιο κατά το άνοιγμα του καναλιού.
  4. Μια εφαρμογή javascript που θα δημιουργήσει τα υπογεγραμμένα μηνύματα που θα ανταλλάσσονται εκτός αλυσίδας μεταξύ των χρηστών.
  5. Metamask ή ένα παρόμοιο εργαλείο για την υπογραφή μηνυμάτων. Τα μηνύματα υπογραφής δεν κοστίζουν αέριο και εκτελούνται αμέσως. Απαιτείται και από τους δύο χρήστες να υπογράψουν τα μηνύματα για να εγγυηθούν ότι είναι αυτά που δημιουργούν μια τέτοια συναλλαγή.
  6. Email ή οποιαδήποτε εξωτερική εφαρμογή για την ανταλλαγή αυτών των υπογεγραμμένων μηνυμάτων για να καταστεί δυνατή η εφαρμογή αυτή.

Πώς λειτουργούν;

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

  1. Σε ένα κρατικό κανάλι μεταξύ 2 χρηστών, το πρώτο εφαρμόζει το έξυπνο συμβόλαιο που θα "ανοίξει" το κανάλι.
  2. Ο δεύτερος εκτελεί μια λειτουργία αυτού του έξυπνου συμβολαίου για να «ενταχθεί» στο κράτος κανάλι "
  3. Στη συνέχεια, μπορούν να ξεκινήσουν την ανταλλαγή υπογεγραμμένων μηνυμάτων για την εφαρμογή. Και οι δύο χρήστες έχουν πρόσβαση σε μια προσαρμοσμένη εφαρμογή javascript για τη δημιουργία μηνυμάτων με τις πληροφορίες που θα έκαναν σε ένα έξυπνο συμβόλαιο, αλλά εκτός αλυσίδας.
  4. Η ταχύτητα των συναλλαγών εξαρτάται από το πόσο γρήγορα ο κάθε χρήστης μπορεί να δημιουργήσει και να υπογράψει αυτά τα μηνύματα. Συνεχίζουν να ανταλλάσσουν μηνύματα, παίζοντας εκτός αλυσίδας μέχρι να αποφασίσουν ότι το παιχνίδι τελείωσε.
  5. Όταν τελειώσουν το παιχνίδι, οποιοσδήποτε από αυτούς μπορεί να πάει στο έξυπνο συμβόλαιο και να εκτελέσει μια λειτουργία για να ολοκληρώσει αυτό που θα ξεκινήσει τη φάση της "διαπραγμάτευσης".
  6. Σε αυτή τη φάση, και οι δύο χρήστες έχουν ένα χρονικό όριο 1 ημέρας για να φορτώσουν τα τελευταία 2 μηνύματα που έχουν στο έξυπνο συμβόλαιο. Η έξυπνη σύμβαση ελέγχει τα τελευταία μηνύματα και απελευθερώνει τα χρήματα για να τελειώσει το παιχνίδι βάσει αυτών των πληροφοριών. Κάθε μήνυμα περιέχει τα αποτελέσματα των προηγούμενων αλληλεπιδράσεων, επομένως είναι ασφαλές να ελέγξετε μόνο τα πιο πρόσφατα.

Πώς μπορείτε να εφαρμόσετε αυτό σε μια πραγματική κατάσταση;

Σε αυτόν τον οδηγό θα σας δείξω πώς να δημιουργήσετε ένα κανάλι κατάστασης μεταξύ 2 χρηστών για ένα παιχνίδι Ethereum. Θυμηθείτε ότι τα κανάλια κατάστασης μπορούν να χρησιμοποιηθούν για κάθε είδους εφαρμογή που έχει "κατάσταση" ή μετρητή. Γι 'αυτό τα παιχνίδια είναι ιδανικά. Επειδή μπορείτε να παρακολουθείτε ποιος κερδίζει κάθε παιχνίδι, υπάρχει μια κατάσταση για κάθε παιχνίδι που μπορεί να ενημερωθεί.

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

Αυτός είναι ο δείκτης που θα ακολουθήσουμε για να δημιουργήσουμε μια τέτοια αποκεντρωμένη εφαρμογή:

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

1. Δημιουργία της εφαρμογής οπτικής διαδικτύου

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

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

Έτσι το πλαίσιο θα είναι κάτι τέτοιο:

  1. Ο Παίκτης 1 πηγαίνει στην εφαρμογή Ιστού, κάνει κλικ σε ένα κουμπί που λέει "Έναρξη νέου παιχνιδιού", τότε κάνει μια συναλλαγή metamask για να αναπτύξει και να ρυθμίσει το έξυπνο συμβόλαιο. Λαμβάνει μια έξυπνη διεύθυνση συμβολαίου, την οποία μπορεί να στείλει στον άλλο παίκτη για να ξεκινήσει το παιχνίδι.
  2. Ο Παίκτης 2 πηγαίνει στην εφαρμογή Ιστού, κάνει κλικ σε ένα κουμπί που λέει "Συμμετοχή στο υπάρχον παιχνίδι" με τη διεύθυνση της σύμβασης που έλαβε από τον παίκτη 1, τότε πραγματοποιεί μια συναλλαγή metamask για να ρυθμίσει το ήδη υπάρχον παιχνίδι και στέλνει μια μεσεγγύηση.

Ας αρχίσουμε λοιπόν εκεί. Ας δημιουργήσουμε ένα κουτί στη μέση της εφαρμογής Ιστού με 2 κουμπιά. Δημιουργήστε ένα φάκελο που ονομάζεται ζάρια και ένα αρχείο μέσα στο όνομα index.html. Εδώ είναι ο κώδικας:

Έτσι φαίνονται τα 2 κουμπιά από προεπιλογή


    
        
         παιχνίδι Dice ethereum </ title>
    </ head>
    <body>
        <div class = "main-content">
            <κουμπί> Έναρξη νέου παιχνιδιού </ κουμπί>
            <κουμπί> Συμμετοχή στο υπάρχον παιχνίδι </ button>
        </ div>
    </ body>
</ html></pre><p>Σε αυτόν τον κώδικα δημιούργησα τη βασική δομή HTML με ένα div που περιέχει τα κουμπιά και έναν τίτλο. Σημειώστε ότι το div έχει μια κλάση που ονομάζεται κύριο περιεχόμενο που θα χρησιμοποιήσουμε σε μια στιγμή.</p><p>Ας κάνουμε αυτό το πιο όμορφο με κάποια css. Δημιουργήστε ένα αρχείο που ονομάζεται index.css με τον ακόλουθο κώδικα (μπορείτε να τον αντιγράψετε και να τον επικολλήσετε):</p><img alt="Δείτε πώς θα μοιάζει" src="https://imgstore.nyc3.cdn.digitaloceanspaces.com/chinthaka/1576416098899.png" /><pre>σώμα {
    γραμματοσειρά-οικογένεια: sans-serif;
}}</pre><pre>.κυρίως περιεχόμενο {
    περιθώριο: αυτόματη;
    μέγιστο πλάτος: 500px.
    φόντο-χρώμα: whitesmoke;
    padding: 50px;
    ακτίνα-ακτίνα: 10px;
    εμφάνιση: πλέγμα;
    πλέγμα-πρότυπο-σειρές: 1fr 1fr;
    πλέγμα-πρότυπο-στήλες: 1fr 1fr;
    πλέγμα-στήλη-χάσμα: 10px;
}}</pre><pre>.ελάχιστο περιεχόμενο h1 {
    πλέγμα-στήλη: 1 / span 2;
}}</pre><pre>. κουμπί βασικού περιεχομένου {
    σύνορα: κανένα ·
    άσπρο χρώμα;
    φόντο-χρώμα: # 007dff;
    padding: 20px;
    ακτίνα ακτίνων: 5px;
    δρομέας: δείκτης;
}}</pre><pre>. κουμπί βασικού περιεχομένου: μετακινήστε {
    αδιαφάνεια: 0,8.
}}</pre><pre>. κουμπί βασικού περιεχομένου: ενεργό {
    αδιαφάνεια: 0,6;
}}</pre><p>Προστέθηκα ένα h1 τίτλο στο html για να φανεί καλύτερα, φροντίστε να ενημερώσετε το html σας προσθέτοντας το σύνδεσμο στο css:</p><pre><! DOCTYPE html>
<html lang = "en" dir = "ltr">
    <head>
        <meta charset = "utf-8">
        <link rel = "style sheet" href = "index.css">
        <title> παιχνίδι Dice ethereum </ title>
    </ head>
    <body>
        <div class = "main-content">
            <h1> Αιθέρια Ζάρια </ h1>
            <κουμπί> Έναρξη νέου παιχνιδιού </ κουμπί>
            <κουμπί> Συμμετοχή στο υπάρχον παιχνίδι </ button>
        </ div>
    </ body>
</ html></pre><p>Μπορεί να έχετε παρατηρήσει ότι χρησιμοποιώ το νέο css πλέγμα. Αυτό συμβαίνει επειδή είναι συνήθως διαθέσιμο για τα μεγάλα προγράμματα περιήγησης, έτσι είναι αρκετά ασφαλές να το χρησιμοποιήσετε σε αυτό το σημείο, αφού οι περισσότεροι άνθρωποι θα δουν σωστά το css.</p><p>Αποφάσισα ότι ο καλύτερος τρόπος να εμφανιστεί η επόμενη ενέργεια που απαιτείται από το χρήστη είναι να εμφανιστεί ένα div στο javascript με τις απαιτούμενες πληροφορίες. Έτσι, όταν κάνει κλικ στο "Έναρξη νέου παιχνιδιού" θα δει ένα κουτί που θα του ζητάει πόση μεσεγγύηση θέλει να συστήσει για το παιχνίδι.</p><p>Κάνει κλικ στο "Συμμετοχή στο υπάρχον παιχνίδι" και θα του ζητηθεί η διεύθυνση μεσεγγύησης και σύμβασης του υπάρχοντος παιχνιδιού.</p><p>Δείτε πώς θα ανταποκριθούν οι ενέργειες των κουμπιών:</p><img alt="Πώς φαίνεται η εφαρμογή με απλό javascript" src="https://imgstore.nyc3.cdn.digitaloceanspaces.com/chinthaka/1576416159998.gif" /><p>Για να καταστεί αυτό δυνατό, δημιούργησα ένα αρχείο index.js με κάποια λογική javascript. Εδώ είναι το javascript, φροντίστε να το πληκτρολογήσετε με τα χέρια σας αν θέλετε να μάθετε καλύτερα αυτό:</p><p>Επιτρέψτε μου να εξηγήσω τι έκανα εκεί:</p><ul><li>Αρχικά δημιούργησα μια λειτουργία που ονομάζεται start (), η οποία θα εκτελεστεί αμέσως για να ολοκληρωθεί το περιεχόμενο έτσι ώστε να είναι συμπαθητικό και να περιέχεται σε μία μεγάλη λειτουργία.</li><li>Στη συνέχεια, δημιούργησα 2 ακροατές εκδηλώσεων που ενεργοποιούνται κάθε φορά που κάνω κλικ στο κουμπί εκκίνησης ή σύνδεσης στο αρχείο html. Ένα για το κουμπί # new-game και ένα για το κουμπί # join-game. Χρησιμοποιώ το document.querySelector () που είναι ένας από τους ισχυρότερους τρόπους για να επιλέξετε τίποτα στον κώδικα js.</li><li>Μέσα σε αυτούς τους ακροατές, εμφανίζω ή κρύβω το κιβώτιο div κάθε αντίστοιχου στοιχείου. Βασικά, επιλέγοντας το κουτί με querySelector και αφαιρώντας ή προσθέτοντας την κρυμμένη κλάση η οποία είναι ρυθμισμένη στο css για εμφάνιση: κανένας; .</li></ul><p>Στη συνέχεια μπορούμε να συνδέσουμε το αρχείο js με το modifie index.html:</p><pre><! DOCTYPE html>
<html lang = "en" dir = "ltr">
    <head>
        <meta charset = "utf-8">
        <link rel = "style sheet" href = "index.css">
        <title> παιχνίδι Dice ethereum </ title>
    </ head>
    <body>
        <div class = "main-content">
            <h1> Αιθέρια Ζάρια </ h1>
            <button id = "new-game"> Έναρξη νέου παιχνιδιού </ button>
            <button id = "Join-game"> Συμμετοχή στο υπάρχον παιχνίδι </ button></pre><pre>            <div class = "κρυφό νέο παιχνίδι-setup">
                <h3> Πόση μεσεγγύηση θα χρησιμοποιήσετε στο ETH; </ h3>
                <input type = "number" placeholder = "2 ...">
            </ div></pre><pre>            <div class = "κρυφό σύνδεση-game-setup">
                <h3> Ποια είναι η έξυπνη διεύθυνση συμβολαίου του υπάρχοντος παιχνιδιού; </ h3>
                <input type = "text" placeholder = "0x38dfj39 ...">
            </ div></pre><pre>            <button id = "κουμπί-συνέχεια" class = "hidden"> Συνέχεια </ κουμπί>
        </ div></pre><pre>        </ins><div class="neighbor-articles"><h4 class="ui header">Δείτε επίσης</h4><a href="/item/planning-your-perfect-sized-kickstarter-book-project-69e71e/" title="Σχεδιάζοντας το τέλειο βιβλίο έργου Kickstarter">Σχεδιάζοντας το τέλειο βιβλίο έργου Kickstarter</a><a href="/item/how-to-play-repop-world-64c3b3/" title="Πώς να παίξετε REPOP WORLD">Πώς να παίξετε REPOP WORLD</a><a href="/item/how-to-make-friends-and-believe-in-yourself-without-wearing-pants-d1177b/" title="Πώς να κάνετε φίλους και να πιστεύετε στον εαυτό σας χωρίς να φοράτε παντελόνι.">Πώς να κάνετε φίλους και να πιστεύετε στον εαυτό σας χωρίς να φοράτε παντελόνι.</a><a href="/item/how-to-go-from-good-to-great-a039a4/" title="Πώς να πάτε από το καλό στο μεγάλο">Πώς να πάτε από το καλό στο μεγάλο</a><a href="/item/how-to-talk-to-your-family-about-cryptocurrency-on-christmas-bed246/" title="Πώς να μιλήσετε στην οικογένειά σας για το Cryptocurrency τα Χριστούγεννα">Πώς να μιλήσετε στην οικογένειά σας για το Cryptocurrency τα Χριστούγεννα</a></div></main><div class="push"></div></div><footer><div class="flags-footer"><a href="https://vi.chinthaka.org/item/how-to-create-scalable-dapps-and-smart-contracts-in-ethereum-with-state-channels-step-by-step-4263be/"><i class="vn flag"></i></a><a href="https://uk.chinthaka.org/item/how-to-create-scalable-dapps-and-smart-contracts-in-ethereum-with-state-channels-step-by-step-4263be/"><i class="ua flag"></i></a><a href="https://tr.chinthaka.org/item/how-to-create-scalable-dapps-and-smart-contracts-in-ethereum-with-state-channels-step-by-step-4263be/"><i class="tr flag"></i></a><a href="https://th.chinthaka.org/item/how-to-create-scalable-dapps-and-smart-contracts-in-ethereum-with-state-channels-step-by-step-4263be/"><i class="th flag"></i></a><a href="https://sv.chinthaka.org/item/how-to-create-scalable-dapps-and-smart-contracts-in-ethereum-with-state-channels-step-by-step-4263be/"><i class="ch flag"></i></a><a href="https://sr.chinthaka.org/item/how-to-create-scalable-dapps-and-smart-contracts-in-ethereum-with-state-channels-step-by-step-4263be/"><i class="rs flag"></i></a><a href="https://sl.chinthaka.org/item/how-to-create-scalable-dapps-and-smart-contracts-in-ethereum-with-state-channels-step-by-step-4263be/"><i class="si flag"></i></a><a href="https://sk.chinthaka.org/item/how-to-create-scalable-dapps-and-smart-contracts-in-ethereum-with-state-channels-step-by-step-4263be/"><i class="sk flag"></i></a><a href="https://ru.chinthaka.org/item/how-to-create-scalable-dapps-and-smart-contracts-in-ethereum-with-state-channels-step-by-step-4263be/"><i class="ru flag"></i></a><a href="https://ro.chinthaka.org/item/how-to-create-scalable-dapps-and-smart-contracts-in-ethereum-with-state-channels-step-by-step-4263be/"><i class="ro flag"></i></a><a href="https://pt.chinthaka.org/item/how-to-create-scalable-dapps-and-smart-contracts-in-ethereum-with-state-channels-step-by-step-4263be/"><i class="pt flag"></i></a><a href="https://pl.chinthaka.org/item/how-to-create-scalable-dapps-and-smart-contracts-in-ethereum-with-state-channels-step-by-step-4263be/"><i class="pl flag"></i></a><a href="https://chinthaka.org/item/how-to-create-scalable-dapps-and-smart-contracts-in-ethereum-with-state-channels-step-by-step-4263be/"><i class="de flag"></i></a><a href="https://ar.chinthaka.org/item/how-to-create-scalable-dapps-and-smart-contracts-in-ethereum-with-state-channels-step-by-step-4263be/"><i class="sa flag"></i></a><a href="https://bg.chinthaka.org/item/how-to-create-scalable-dapps-and-smart-contracts-in-ethereum-with-state-channels-step-by-step-4263be/"><i class="bg flag"></i></a><a href="https://cs.chinthaka.org/item/how-to-create-scalable-dapps-and-smart-contracts-in-ethereum-with-state-channels-step-by-step-4263be/"><i class="cz flag"></i></a><a href="https://da.chinthaka.org/item/how-to-create-scalable-dapps-and-smart-contracts-in-ethereum-with-state-channels-step-by-step-4263be/"><i class="dk flag"></i></a><a href="https://es.chinthaka.org/item/how-to-create-scalable-dapps-and-smart-contracts-in-ethereum-with-state-channels-step-by-step-4263be/"><i class="es flag"></i></a><a href="https://et.chinthaka.org/item/how-to-create-scalable-dapps-and-smart-contracts-in-ethereum-with-state-channels-step-by-step-4263be/"><i class="ee flag"></i></a><a href="https://fi.chinthaka.org/item/how-to-create-scalable-dapps-and-smart-contracts-in-ethereum-with-state-channels-step-by-step-4263be/"><i class="fi flag"></i></a><a href="https://fr.chinthaka.org/item/how-to-create-scalable-dapps-and-smart-contracts-in-ethereum-with-state-channels-step-by-step-4263be/"><i class="fr flag"></i></a><a href="https://hi.chinthaka.org/item/how-to-create-scalable-dapps-and-smart-contracts-in-ethereum-with-state-channels-step-by-step-4263be/"><i class="in flag"></i></a><a href="https://hr.chinthaka.org/item/how-to-create-scalable-dapps-and-smart-contracts-in-ethereum-with-state-channels-step-by-step-4263be/"><i class="hr flag"></i></a><a href="https://hu.chinthaka.org/item/how-to-create-scalable-dapps-and-smart-contracts-in-ethereum-with-state-channels-step-by-step-4263be/"><i class="hu flag"></i></a><a href="https://id.chinthaka.org/item/how-to-create-scalable-dapps-and-smart-contracts-in-ethereum-with-state-channels-step-by-step-4263be/"><i class="id flag"></i></a><a href="https://it.chinthaka.org/item/how-to-create-scalable-dapps-and-smart-contracts-in-ethereum-with-state-channels-step-by-step-4263be/"><i class="it flag"></i></a><a href="https://ja.chinthaka.org/item/how-to-create-scalable-dapps-and-smart-contracts-in-ethereum-with-state-channels-step-by-step-4263be/"><i class="jp flag"></i></a><a href="https://ko.chinthaka.org/item/how-to-create-scalable-dapps-and-smart-contracts-in-ethereum-with-state-channels-step-by-step-4263be/"><i class="kr flag"></i></a><a href="https://lt.chinthaka.org/item/how-to-create-scalable-dapps-and-smart-contracts-in-ethereum-with-state-channels-step-by-step-4263be/"><i class="lt flag"></i></a><a href="https://lv.chinthaka.org/item/how-to-create-scalable-dapps-and-smart-contracts-in-ethereum-with-state-channels-step-by-step-4263be/"><i class="lv flag"></i></a><a href="https://ms.chinthaka.org/item/how-to-create-scalable-dapps-and-smart-contracts-in-ethereum-with-state-channels-step-by-step-4263be/"><i class="my flag"></i></a><a href="https://nl.chinthaka.org/item/how-to-create-scalable-dapps-and-smart-contracts-in-ethereum-with-state-channels-step-by-step-4263be/"><i class="nl flag"></i></a><a href="https://no.chinthaka.org/item/how-to-create-scalable-dapps-and-smart-contracts-in-ethereum-with-state-channels-step-by-step-4263be/"><i class="no flag"></i></a><a href="https://uz.chinthaka.org/item/how-to-create-scalable-dapps-and-smart-contracts-in-ethereum-with-state-channels-step-by-step-4263be/"><i class="uz flag"></i></a></div>chinthaka.org<!-- --> © <!-- -->2020<!-- --> </footer></div></div></div></body></html>