From 773126d557f890ea8b80e7ef9f460af396bee8ec Mon Sep 17 00:00:00 2001 From: Ezerous Date: Thu, 26 Aug 2021 21:37:55 +0300 Subject: [PATCH 1/2] feature: init blockchain --- .../2.5.blockchain.tex | 18 +++++++++++------- thesis.pdf | Bin 571672 -> 573021 bytes 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/chapters/2.theoretical-background/2.5.blockchain.tex b/chapters/2.theoretical-background/2.5.blockchain.tex index 27a8930..3ba74d5 100644 --- a/chapters/2.theoretical-background/2.5.blockchain.tex +++ b/chapters/2.theoretical-background/2.5.blockchain.tex @@ -1,14 +1,18 @@ \section{Blockchain} -% Παλιό από Drive -Πρακτικά το blockchain είναι μία διανεμημένη δημόσια βάση δεδομένων που διατηρεί έναν αμετάβλητο κατάλογο (immutable ledger) ψηφιακών συναλλαγών (digital transactions) ενός νομίσματος (token). Ο κατάλογος αυτός παίρνει τη μορφή μιας αλυσίδας (chain) από blocks συναλλαγών που διαδέχονται το ένα το άλλο. +Το blockchain αποτελεί μία διανεμημένη δημόσια σειρά δεδομένων, που διατηρεί έναν αμετάβλητο ως προς το ιστορικό του κατάλογο (immutable ledger) ψηφιακών συναλλαγών (digital transactions) ενός αγαθού (asset), π.χ. ενός κρυπτονομίσματος (cryptocurrency). Περιγράφηκε για πρώτη φορά το 2008 από ένα άτομο (ή μία ομάδα ανθρώπων) γνωστό ως Satoshi Nakamoto, αποτελώντας τη βάση του κρυπτονομίσματος Bitcoin. +%TODO: add [https://bitcoin.org/bitcoin.pdf] -Ως προς την κυριότητα επί αυτής, η βάση δεν ελέγχεται από κάποια κεντρική οντότητα, αλλά αναπαράγεται σε όλους τους (πλήρεις) κόμβους (full nodes) που απαρτίζουν συλλογικά το δίκτυο. Με το δικό του κόμβο μπορεί να συμμετάσχει οποιοσδήποτε το επιθυμεί, ωστόσο δεν είναι αναγκαίο για τον χρήστη που θέλει απλά να συναλλαγεί στο δίκτυο να διαθέτει τον κόμβο του (διαθέτει απλά έναν light node). +Δομικό στοιχείο του blockchain είναι το μπλοκ (block), το οποίο περιέχει μία ομάδα έγκυρων συναλλαγών που έχουν κατακερματιστεί και κωδικοποιηθεί σε ένα δένδρο Merkle, το hash του προηγούμενου μπλοκ και μερικά ακόμα μεταδεδομένα (π.χ. nonce, timestamp). Έτσι, κάθε νέο μπλοκ "δείχνει" στο προηγούμενό του μέσω του hash, επιβεβαιώνοντας την ακεραιότητά του, με τα διαδεχόμενα μπλοκ να σχηματίζουν τελικά μία αλυσίδα, μέχρι το αρχικό μπλοκ, το οποίο είναι γνωστό ως το μπλοκ γένεσης (genesis block).[] +%TODO: add [https://en.wikipedia.org/wiki/Blockchain] +%TODO: add image like https://cdn.hackernoon.com/hn-images/1*qYKsqQ6aV-DgFD0REfcnig.png or https://ethereum.org/static/6f7d50fd4fab9f8abb94b5e610ade7e4/bf8c1/ethereum-blocks.png --- add that this is simplified -Η λειτουργία των κόμβων (ενν. full) είναι η επικύρωση των συναλλαγών που επιθυμούν να πραγματοποιήσουν οι χρήστες. Για την επικύρωση, ανταγωνίζονται ο ένας τον άλλον για το ποιος θα λύσει πρώτος ένα σύνθετο αλγοριθμικό πρόβλημα που συσχετίζεται με το εκάστοτε block. Το κίνητρο για τη δαπάνη της επεξεργαστικής ισχύος που απαιτείται για αυτό είναι η ανταμοιβή του κόμβου που θα καταλήξει πρώτος στη λύση του προβλήματος με ένα ποσό από tokens. Ανάλογα με τον αλγόριθμο που έχει προσυμφωνηθεί να χρησιμοποιείται στο εκάστοτε blockchain (Proof of Work, Proof of Stake κτλ.), οι κόμβοι του χαρακτηρίζονται ως miners/stakers/κ.ά. . +Ως προς την κυριότητα επί αυτού, το blockchain συνήθως* δεν ελέγχεται από κάποια κεντρική οντότητα, αλλά διατηρείται από ένα δημόσιο P2P δίκτυο. Οι κόμβοι (nodes) του δικτύου συμμορφώνονται συλλογικά με ένα πρωτόκολλο συναίνεσης (consensus) για την επικοινωνία και την επικύρωση νέων μπλοκ. Για παράδειγμα, στο Bitcoin, το consensus επιτυγχάνεται μέσω ενός Proof of Work (PoW) αλγορίθμου, όπου οι κόμβοι (miners) ανταγωνίζονται ο ένας τον άλλον για το ποιος θα λύσει πρώτος ένα σύνθετο αλγοριθμικό πρόβλημα που συσχετίζεται με το εκάστοτε block. Αυτός που θα τα καταφέρει επιβραβεύεται για την επεξεργαστική ισχύ που δαπάνησε με ένα ποσό από bitcoin. Εκείνα είναι εν μέρει νέα νομίσματα που κόβονται ή "εξορύσσονται" εκείνη τη στιγμή (όπως ορίζεται από το πρωτόκολλο), αλλά και όσα τέλη (fees) κατέβαλαν οι κόμβοι για να πραγματοποιήσουν τις συναλλαγές του μπλοκ. Αξίζει να σημειωθεί πως δεν είναι αναγκαίο να διαθέτει κανείς ολόκληρο το blockchain (το οποίο είναι ογκώδες) - δηλαδή έναν πλήρη κόμβο - για να επικοινωνήσει με το δίκτυο, αλλά αρκεί ένας light node που απλά αναμεταδίδει την συναλλαγή που επιθυμεί να πραγματοποιήσει ο χρήστης. +\\ +Η διευθυνσιοδότηση σε ένα blockchain επιτυγχάνεται αξιοποιώντας την κρυπτογραφία δημόσιου κλειδιού. Το πρωτόκολλο του εκάστοτε blockchain ορίζει έναν αλγόριθμο για την παραγωγή ζευγών κλειδιών (π.χ. ECDSA στο Bitcoin). Το δημόσιο από αυτά ορίζει τη διεύθυνση, ενώ το ιδιωτικό παραμένει μυστικό, υπό την κατοχή του χρήστη. Με αυτό τον τρόπο προκύπτει ένα πρακτικά ανεξάντλητο πλήθος πιθανών έγκυρων δημόσιων διευθύνσεων (π.χ. $2^{160}$ για το Bitcoin), στις οποίες οι χρήστες μπορούν να στέλνουν και να λαμβάνουν ποσά του εκάστοτε κρυπτονομίσματος. Για την αποστολή ενός ποσού, δηλώνουν το fee που επιθυμούν να καταβάλουν και υπογράφουν την επιθυμητή συναλλαγή με το ιδιωτικό τους κλειδί. Η συναλλαγή αναμεταδίδεται στο δίκτυο και παραμένει στο transaction pool μέχρις ότου να γίνει αποδεκτή και να συμπεριληφθεί στο επόμενο block. - Έτσι, με το που προκύψει λύση, δημιουργείται ένα νέο block στο οποίο καταγράφονται -μεταξύ άλλων- οι συναλλαγές που πραγματοποιούν οι χρήστες, μια παραπομπή στο προηγούμενο block και η λύση του αλγορίθμου. O κόμβος που επέλυσε πρώτος το πρόβλημα επιβραβεύεται με ένα ποσό νομισμάτων, που απαρτίζεται τόσο από μια προσυμφωνηθείσα ποσότητα νομισμάτων που δημιορυργείται σε κάθε block, όσο και με τα τέλη συναλλαγής (transaction fees) που κατέβαλαν στο δίκτυο οι χρήστες που πραγματοποίησαν τις συναλλαγές. +*Υπάρχουν και κάποιες υλοποιήσεις ιδιωτικών blockchain που, όμως, δε θα μας απασχολήσουν. -% TODO: insert diagram +Από τεχνική σκοπιά, το blockchain μπορεί να θεωρηθεί ως μία μηχανή καταστάσεων βασισμένη σε συναλλαγές (transaction-based state machine). Δηλαδή, ξεκινάει από μία αρχική κατάσταση (genesis state), η οποία τροποποιείται σταδιακά με κάθε block, και περιλαμβάνει ανά πάσα στιγμή τις διευθύνσεις με τα ποσά των νομισμάτων που τις αντιστοιχούν. -Η διευθυνσιοδότηση σε ένα blockchain επιτυγχάνεται αξιοποιώντας το PGP. Δηλαδή αποστολείς και παραλήπτες είναι πάντα κάτοχοι των ιδιωτικών κλειδιών κάποιων δημοσίων διευθύνσεων. Ο οποιοσδήποτε μπορεί να παράγει ανά πάσα στιγμή στον υπολογιστή του ένα valid PGP ζεύγος και να λαμβάνει tokens στην παραχθείσα δημόσια διεύθυνση (το πλήθος των έγκυρων δημοσίων διευθύνσεων είναι πρακτικά ανεξάντλητο π.χ. $2^{160}$ για το Bitcoin). +%TODO: add image like ethereum-evm-illustrated page 9 or https://ethereum.org/static/0aeff9bcdfb1f5fd002610b4a5cff197/460fa/ethereum-state-transition.png \ No newline at end of file diff --git a/thesis.pdf b/thesis.pdf index fd916c7be5ac9775ac4a5b2ebd0924c9e1b7f786..92da341815e540d0d4c7521099de62648635d6b1 100644 GIT binary patch delta 21048 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 delta 19836 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 Date: Fri, 27 Aug 2021 14:51:43 +0300 Subject: [PATCH 2/2] fix: minor corrections --- chapters/2.theoretical-background/2.5.blockchain.tex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/chapters/2.theoretical-background/2.5.blockchain.tex b/chapters/2.theoretical-background/2.5.blockchain.tex index 3ba74d5..0cbfe12 100644 --- a/chapters/2.theoretical-background/2.5.blockchain.tex +++ b/chapters/2.theoretical-background/2.5.blockchain.tex @@ -1,6 +1,6 @@ \section{Blockchain} -Το blockchain αποτελεί μία διανεμημένη δημόσια σειρά δεδομένων, που διατηρεί έναν αμετάβλητο ως προς το ιστορικό του κατάλογο (immutable ledger) ψηφιακών συναλλαγών (digital transactions) ενός αγαθού (asset), π.χ. ενός κρυπτονομίσματος (cryptocurrency). Περιγράφηκε για πρώτη φορά το 2008 από ένα άτομο (ή μία ομάδα ανθρώπων) γνωστό ως Satoshi Nakamoto, αποτελώντας τη βάση του κρυπτονομίσματος Bitcoin. +Το blockchain αποτελεί μία διανεμημένη δημόσια σειρά δεδομένων, που διατηρεί έναν αμετάβλητο ως προς το ιστορικό του κατάλογο (immutable ledger) ψηφιακών συναλλαγών (digital transactions) ενός αγαθού (asset), π.χ. ενός νομίσματος (token). Περιγράφηκε για πρώτη φορά το 2008 από ένα άτομο (ή μία ομάδα ανθρώπων) γνωστό ως Satoshi Nakamoto, αποτελώντας τη βάση του κρυπτονομίσματος (cryptocurrency) Bitcoin. %TODO: add [https://bitcoin.org/bitcoin.pdf] Δομικό στοιχείο του blockchain είναι το μπλοκ (block), το οποίο περιέχει μία ομάδα έγκυρων συναλλαγών που έχουν κατακερματιστεί και κωδικοποιηθεί σε ένα δένδρο Merkle, το hash του προηγούμενου μπλοκ και μερικά ακόμα μεταδεδομένα (π.χ. nonce, timestamp). Έτσι, κάθε νέο μπλοκ "δείχνει" στο προηγούμενό του μέσω του hash, επιβεβαιώνοντας την ακεραιότητά του, με τα διαδεχόμενα μπλοκ να σχηματίζουν τελικά μία αλυσίδα, μέχρι το αρχικό μπλοκ, το οποίο είναι γνωστό ως το μπλοκ γένεσης (genesis block).[] @@ -8,7 +8,7 @@ %TODO: add image like https://cdn.hackernoon.com/hn-images/1*qYKsqQ6aV-DgFD0REfcnig.png or https://ethereum.org/static/6f7d50fd4fab9f8abb94b5e610ade7e4/bf8c1/ethereum-blocks.png --- add that this is simplified Ως προς την κυριότητα επί αυτού, το blockchain συνήθως* δεν ελέγχεται από κάποια κεντρική οντότητα, αλλά διατηρείται από ένα δημόσιο P2P δίκτυο. Οι κόμβοι (nodes) του δικτύου συμμορφώνονται συλλογικά με ένα πρωτόκολλο συναίνεσης (consensus) για την επικοινωνία και την επικύρωση νέων μπλοκ. Για παράδειγμα, στο Bitcoin, το consensus επιτυγχάνεται μέσω ενός Proof of Work (PoW) αλγορίθμου, όπου οι κόμβοι (miners) ανταγωνίζονται ο ένας τον άλλον για το ποιος θα λύσει πρώτος ένα σύνθετο αλγοριθμικό πρόβλημα που συσχετίζεται με το εκάστοτε block. Αυτός που θα τα καταφέρει επιβραβεύεται για την επεξεργαστική ισχύ που δαπάνησε με ένα ποσό από bitcoin. Εκείνα είναι εν μέρει νέα νομίσματα που κόβονται ή "εξορύσσονται" εκείνη τη στιγμή (όπως ορίζεται από το πρωτόκολλο), αλλά και όσα τέλη (fees) κατέβαλαν οι κόμβοι για να πραγματοποιήσουν τις συναλλαγές του μπλοκ. Αξίζει να σημειωθεί πως δεν είναι αναγκαίο να διαθέτει κανείς ολόκληρο το blockchain (το οποίο είναι ογκώδες) - δηλαδή έναν πλήρη κόμβο - για να επικοινωνήσει με το δίκτυο, αλλά αρκεί ένας light node που απλά αναμεταδίδει την συναλλαγή που επιθυμεί να πραγματοποιήσει ο χρήστης. -\\ + Η διευθυνσιοδότηση σε ένα blockchain επιτυγχάνεται αξιοποιώντας την κρυπτογραφία δημόσιου κλειδιού. Το πρωτόκολλο του εκάστοτε blockchain ορίζει έναν αλγόριθμο για την παραγωγή ζευγών κλειδιών (π.χ. ECDSA στο Bitcoin). Το δημόσιο από αυτά ορίζει τη διεύθυνση, ενώ το ιδιωτικό παραμένει μυστικό, υπό την κατοχή του χρήστη. Με αυτό τον τρόπο προκύπτει ένα πρακτικά ανεξάντλητο πλήθος πιθανών έγκυρων δημόσιων διευθύνσεων (π.χ. $2^{160}$ για το Bitcoin), στις οποίες οι χρήστες μπορούν να στέλνουν και να λαμβάνουν ποσά του εκάστοτε κρυπτονομίσματος. Για την αποστολή ενός ποσού, δηλώνουν το fee που επιθυμούν να καταβάλουν και υπογράφουν την επιθυμητή συναλλαγή με το ιδιωτικό τους κλειδί. Η συναλλαγή αναμεταδίδεται στο δίκτυο και παραμένει στο transaction pool μέχρις ότου να γίνει αποδεκτή και να συμπεριληφθεί στο επόμενο block. *Υπάρχουν και κάποιες υλοποιήσεις ιδιωτικών blockchain που, όμως, δε θα μας απασχολήσουν.