Συνοπτικά, το σύστημά σας θα πρέπει να υλοποιεί τις παρακάτω λειτουργίες:

Σχετικά έγγραφα
Εισαγωγή. Interface της εφαρμογής. Κ24: Προγραμματισμός Συστήματος - 1η Εργασία, Εαρινό Εξάμηνο 2019 Προθεσμία Υποβολής: Παρασκευή 15 Μαρτίου, 23:59

Bitcoin #1. Blockchain Course Dimitris Grigoriou, Christos Nasikas, Dionysis Zindros

Ψηφιακά Πιστοποιητικά Ψηφιακές Υπογραφές

1 η ΑΣΚΗΣΗ ΣΤΗΝ ΑΡΧΙΤΕΚΤΟΝΙΚΗ ΥΠΟΛΟΓΙΣΤΩΝ. Ακ. έτος , 5ο Εξάμηνο, Σχολή ΗΜ&ΜΥ

ΚΡΥΠΤΟΓΡΑΦΙΑ ΚΑΙ ΑΣΦΑΛΕΙΑ ΥΠΟΛΟΓΙΣΤΩΝ Δ Εξάμηνο. Ψηφιακή Υπογραφή και Αυθεντικοποίηση Μηνύματος

BITCOIN. Διαφάνειες: Δημήτρης Καρακώστας Διονύσης Ζήνδρος. Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών

CloudBox!: Ένα εργαλείο cloud αποθήκευσης αρχείων με κατανεμημένο τρόπο

ΚΡΥΠΤΟΓΡΑΦΙΑ ΚΑΙ ΑΣΦΑΛΕΙΑ ΥΠΟΛΟΓΙΣΤΩΝ Δ Εξάμηνο

ΗΥ486 - Αρχές Κατανεμημένου Υπολογισμού Εαρινό Εξάμηνο Δεύτερη Προγραμματιστική Εργασία

YΒΡΙΔΙΚΗ ΚΡΥΠΤΟΓΡΑΦΙΑ

Εισαγωγή στην επιστήμη της Πληροφορικής και των. Aσφάλεια

ΗY335: Δίκτυα Υπολογιστών Χειμερινό Εξάμηνο Τμήμα Επιστήμης Υπολογιστών Πανεπιστήμιο Κρήτης Διδάσκουσα: Μαρία Παπαδοπούλη

ΑΣΦΑΛΕΙΑ & ΔΙΑΧΕΙΡΙΣΗ ΔΙΚΤΥΩΝ(Θ)

Έξυπνα συμβόλαια και πληρωμές χρησιμοποιώντας Bitcoin και Ethereum

Εφαρμοσμένη Κρυπτογραφία Ι

Διονύσης Ζήνδρος Εθνικό Μετσόβιο Πολυτεχνείο Image carbonism

ΣΤΗΛΗ Β ΑΠΟΤΕΛΕΣΜΑ 1. float(10) α pow(2,3) β abs(-10) γ int(5.6) δ. 10 ε. 5.6 Μονάδες 8 ΣΤΗΛΗ Α ΣΥΝΑΡΤΗΣΗ

ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΤΟΜΕΑΣ ΤΕΧΝΟΛΟΓΙΑΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΥΠΟΛΟΓΙΣΤΩΝ

Εισαγωγή στην επιστήμη της Πληροφορικής και των Τηλεπικοινωνιών. Aσφάλεια

HY-486 Αρχές Κατανεμημένου Υπολογισμού Εαρινό Εξάμηνο

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΙΙ ΕΡΓΑΣΤΗΡΙΟ ΑΠΑΙΤΗΣΕΙΣ ΚΑΙ ΔΙΑΔΙΚΑΣΙΑ ΕΞΕΤΑΣΗΣ

Κρυπτογραφία. MAC - Γνησιότητα/Ακεραιότητα μηνύματος. Πέτρος Ποτίκας

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΗ ΑΣΚΗΣΗ 3

Αναλύσεις Προγραμμάτων και Ψηφιακά Νομίσματα. Γιάννης Σμαραγδάκης, ΕΚΠΑ

ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ

ΑΣΦΑΛΕΙΑ & ΔΙΑΧΕΙΡΙΣΗ ΔΙΚΤΥΩΝ(Θ)

Δυναμικός Κατακερματισμός. Βάσεις Δεδομένων Ευαγγελία Πιτουρά 1

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

Τι είναι το πρωτόκολλο Διαδικτύου (Internet Protocol, IP);

Λειτουργικά Συστήματα 7ο εξάμηνο, Ακαδημαϊκή περίοδος

Διακριτά Μαθηματικά ΙΙ Χρήστος Νομικός Τμήμα Μηχανικών Η/Υ και Πληροφορικής Πανεπιστήμιο Ιωαννίνων 2018 Χρήστος Νομικός ( Τμήμα Μηχανικών Η/Υ Διακριτά

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας

Εργαστήριο Λειτουργικών Συστήματων 8ο εξάμηνο, Ακαδημαϊκή περίοδος

Εργαστήριο Ασφάλεια Πληροφοριακών Συστημάτων. PGP (Pretty Good Privacy)

Ψηφιακά Πιστοποιητικά Ψηφιακές Υπογραφές

Σύστημα Διαμοιρασμού Βιβλιογραφικών Αναφορών. Κοντοτάσιου Ιωάννα ΑΜ 3125 Μπέσσας Απόστολος ΑΜ 3171

Κατανεμημένα Συστήματα Ι

Β.1. i. Να εξηγήσετε τι εννοούμε με τον όρο μεταφερσιμότητα των προγραμμάτων. Μονάδες 3

Διαχείριση Δικτύων με τη χρήση SNMP (5η άσκηση) Διαχείριση Δικτύων - Ευφυή Δίκτυα, 9 ο Εξάμηνο,

Κατανεμημένα Συστήματα Ασκήσεις.

Ηλεκτρονικό εμπόριο. HE 7 Τεχνολογίες ασφάλειας

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας

8.3.4 Τεχνικές Ασφάλειας Συμμετρική Κρυπτογράφηση Ασυμμετρική Κρυπτογράφηση Ψηφιακές Υπογραφές

Συμμετρικά κρυπτοσυστήματα

ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΤΟΜΕΑΣ ΤΕΧΝΟΛΟΓΙΑΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΥΠΟΛΟΓΙΣΤΩΝ

σας φύλλο τον αριθμό της ερώτησης ακολουθούμενη από το γράμμα Σ (Σωστή) ή το γράμμα Λ (Λάθος).

ΕΚΦΩΝΗΣΕΙΣ ΘΕΜΑ Α. α. Πριν εμφανιστεί η τεχνολογία ISDN οι υπηρεσίες φωνής, εικόνας και δεδομένων απαιτούσαν διαφορετικά δίκτυα.

Εργαστήριο Ασφάλεια Πληροφοριακών Συστημάτων. Συναρτήσεις Κατακερματισμού

Κρυπτογραφία. MAC - Γνησιότητα/Ακεραιότητα μηνύματος. Πέτρος Ποτίκας

Εισαγωγή στην επιστήμη της Πληροφορικής και των Τηλεπικοινωνιών. Aσφάλεια

7.5 Πρωτόκολλο IP. & Ερωτήσεις

Λειτουργικά Συστήματα 7ο εξάμηνο, Ακαδημαϊκή περίοδος

Προγραμματισμός Η/Υ. Συναρτήσεις & Υποπρογράμματα. ΤΕΙ Ιονίων Νήσων Τμήμα Τεχνολόγων Περιβάλλοντος Κατεύθυνση Τεχνολογιών Φυσικού Περιβάλλοντος

Κρυπτογραφία. Κεφάλαιο 4 Αλγόριθμοι Δημοσίου Κλειδιού (ή ασύμμετροι αλγόριθμοι)

Τεχνολογικό Εκπαιδευτικό Ίδρυμα Ηπείρου Τμήμα Τηλεπληροφορικής & Διοίκησης

Δυναμικός Κατακερματισμός. Βάσεις Δεδομένων Ευαγγελία Πιτουρά 1

Σχέδια μαθημάτων για την δημιουργία συναρτήσεων υπολογισμού του ΜΚΔ και του ΕΚΠ στην MSWLogo

Εργαστήριο Λειτουργικών Συστήματων 8ο εξάμηνο, Ακαδημαϊκή περίοδος

7.5 Πρωτόκολλο IP. Τεχνολογία ικτύων Επικοινωνιών ΙΙ

ΟΙΚΟΝΟΜΙΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ Εαρινό Εξάμηνο

Κατανεμημένα Συστήματα Ι

ΤΕΛΟΣ 1ΗΣ ΑΠΟ 6 ΣΕΛΙΔΕΣ

Δυναμικός Κατακερματισμός. Βάσεις Δεδομένων Ευαγγελία Πιτουρά 1

Βάσεις Δεδομένων ΙΙ Ενότητα 1

Δυναμικός Κατακερματισμός. Βάσεις Δεδομένων Ευαγγελία Πιτουρά 1

Απαντήσεις. Απάντηση. Απάντηση

Προγραμματισμός Η/Υ. Αλγόριθμοι. ΤΕΙ Ιονίων Νήσων Τμήμα Τεχνολόγων Περιβάλλοντος Κατεύθυνση Τεχνολογιών Φυσικού Περιβάλλοντος

ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΤΟΜΕΑΣ ΤΕΧΝΟΛΟΓΙΑΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΥΠΟΛΟΓΙΣΤΩΝ

Bitcoin: Ένα Peer-to-Peer Ηλεκτρονικό Σύστημα Μετρητών

Εισαγωγή στους Υπολογιστές

ΥΣ02 Τεχνητή Νοημοσύνη Χειμερινό Εξάμηνο

ΗΥ240: οµές εδοµένων Χειµερινό Εξάµηνο Ακαδηµαϊκό Έτος Παναγιώτα Φατούρου. Προγραµµατιστική Εργασία 3 ο Μέρος

ΠΡΟΤΕΙΝΟΜΕΝΑ ΘΕΜΑΤΑ ΣΤΑ ΔΙΚΤΥΑ ΥΠΟΛΟΓΙΣΤΩΝ ΙΙ Γ Τάξη Ε.Π.Α.Λ.

Ενδεικτικές Λύσεις 1ου Σετ Ασκήσεων

Σύντομη παρουσίαση των εργαλείων/εντολών telnet, ping, traceroute nslookup και nmap, zenmap

Παράδειγμα 2. Λύση & Επεξηγήσεις. Τέλος_επανάληψης Εμφάνισε "Ναι" Τέλος Α2

Κεφάλαιο 10 Υποπρογράμματα. Καραμαούνας Πολύκαρπος

α. Το πλαίσιο Ethernet ξεκινά με ένα προοίμιο επτά byte εναλλασσόμενων άσων και μηδενικών.

ΘΕΜΑ Α ΑΡΧΗ 1ΗΣ ΣΕΛΙ ΑΣ

Α2. Να γράψετε στο τετράδιο σας τον αριθμό 1-4 κάθε πρότασης και δίπλα το γράμμα που δίνει τη σωστή επιλογή.

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ Τ Μ Η Μ Α Π Λ Η Ρ Ο Φ Ο Ρ Ι Κ Η Σ

Διαχείριση Δικτύων με τη χρήση SNMP (5 η άσκηση)

Εφαρμογή Μεθοδολογίας ICONIX

ΚΕΦΑΛΑΙΟ 10 ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ

ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ. Κάθε υποπρόγραμμα έχει μόνο μία είσοδο και μία έξοδο. Κάθε υποπρόγραμμα πρέπει να είναι ανεξάρτητο από τα άλλα.

ΑΡΧΗ 1ΗΣ ΣΕΛΙΔΑΣ Γ ΗΜΕΡΗΣΙΩΝ

4.1.1 Πρωτόκολλο TCP - Δομή πακέτου

Λειτουργικά Συστήματα 7ο εξάμηνο, Ακαδημαϊκή περίοδος

ΗΥ335 - Δίκτυα Υπολογιστών Χειμερινό εξάμηνο Φροντιστήριο Ασκήσεις στο TCP

Αννα Νταγιου ΑΕΜ: 432. Εξαμηνο 8. Ερώτηση 1. Πληκτρολογήστε την εντολή: openssl help Παρατηρήστε τις πληροφορίες που λαµβάνετε.

HY-252 Αντικειμενοστραφής Προγραμματισμός. Χειμερινό Εξάμηνο 2012 Διδάσκων: Χριστοφίδης Βασίλης. Ημερομηνία Παράδοσης: 16/11/2012

Κατανεμημένα Συστήματα Ι

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ ΟΝΟΜΑΤΕΠΩΝΥΜΟ:

Τεχνολογία Πολυμέσων. Ενότητα # 16: Πολυεκπομπή Διδάσκων: Γεώργιος Ξυλωμένος Τμήμα: Πληροφορικής

7.9 ροµολόγηση. Ερωτήσεις

ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΗΛΕΚΤΡΟΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΚΑΙ ΠΛΗΡΟΦΟΡΙΚΗΣ

ΑΡΧΗ 1ΗΣ ΣΕΛΙ ΑΣ Γ ΤΑΞΗ

Εισαγωγή στην πληροφορική

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

Κατανεμημένα Συστήματα με Java. Ενότητα # 4: Αμοιβαίος αποκλεισμός Διδάσκων: Γεώργιος Ξυλωμένος Τμήμα: Πληροφορικής

Transcript:

ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ & ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΤΟΜΕΑΣ ΤΕΧΝΟΛΟΓΙΑΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΥΠΟΛΟΓΙΣΤΩΝ ΕΡΓΑΣΤΗΡΙΟ ΥΠΟΛΟΓΙΣΤΙΚΩΝ ΣΥΣΤΗΜΑΤΩΝ www. c slab.ec e. ntua.gr ΕΞΑΜΗΝΙΑΙΑ ΕΡΓΑΣΙΑ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ Ακ. έτος 2018-2019, 9ο Εξάμηνο, Σχολή ΗΜ&ΜΥ Τελική Ημερομηνία Παράδοσης: 2 εβδομάδες μετά το τέλος της εξεταστικής Εισαγωγή - Σκοπός Το blockchain είναι η τεχνολογία πίσω από τα περισσότερα κρυπτονομίσματα και αποτελεί στην πραγματικότητα μια κατανεμημένη βάση που επιτρέπει στους χρήστες της να κάνουν δοσοληψίες (transactions) μεταξύ τους με ασφάλεια, χωρίς να χρειάζονται κάποια κεντρική αρχή (π.χ. τράπεζα). Σκοπός της εργασίας είναι να φτάξετε το noobcash, ένα απλό σύστημα blockchain, όπου θα καταγράφονται οι δοσοληψίες μεταξύ των συμμετεχόντων και θα εξασφαλίζεται το consensus με χρήση Proof-of-Work. Συνοπτικά, το σύστημά σας θα πρέπει να υλοποιεί τις παρακάτω λειτουργίες: 1. Ο κάθε χρήστης του noobcash (το κάθε process δηλαδή) θα έχει ένα noobcash wallet για να να πραγματοποιεί transactions. Το κάθε wallet αποτελείται από: (α) ένα private key γνωστό μόνο στον χρήστη-κάτοχο του wallet, που του επιτρέπει να ξοδέυει χρήματα (να στείλει δλδ χρήματα σε άλλο wallet) και (β) το αντίτοιχο public key, που απαιτείται για να λάβει ο κάτοχος του wallet χρήματα από άλλον χρήστη. Το public key είναι και η διεύθυνση του wallet του χρήστη. 2. Ο κάθε κάτοχος wallet μπορεί να κάνει συναλλαγές ξοδεύοντας NBC (noobcash coins). Αν η Αλίκη θέλει να στείλει 1 NBC στον Μπόμπ, τότε θα δημιουργήσει ένα transaction που θα περιέχει το ποσό που θέλει να στείλει και τη διεύθυνση του wallet του Μπομπ, δλδ το public key του Μπομπ. Το transaction αυτό θα το υπογράψει χρησιμοποιώντας το private key της. 3. Το κάθε transaction που δημιουργείται γίνεται broadcast σε όλο το δίκτυο noobcash. 4. Οι miners που λαμβάνουν το νέο transaction το επικυρώνουν: Στο παράδειγμά μας, πρώτα ελέγχουν ότι το transaction προήλθε από την Αλίκη χρησιμοποιώντας το public key της, πιστοποιούν ότι η Αλίκη έχει αρκετά χρήματα στο wallet της για να εκτελέσει το transaction (1 ΝΒC στην περίπτωσή μας) και αν όλοι οι έλεγχοι επιτύχουν, προσθέτουν το transaction στο τρέχον block. Για την παρούσα άσκηση θεωρούμε ότι όλοι οι χρήστες είναι και miners. 5. Όταν το τρέχον block γεμίσει, τότε οι miners ξεκινούν τη διαδικασία mining με proof-of-work. Όποιος βρει το σωστό nonce κάνει broadcast το επικυρωμένο block σε όλο το δίκτυο, ώστε να γίνει γνωστό σε όλους τους nodes που συμμετέχουν.

6. Σε περίπτωση που 2 ή περισσότεροι miners κάνουν ταυτόχρονα mine ένα block, οι παραλήπτες των διαφορετικών αυτών blocks προσθέτουν στην αλυσίδα τους το πρώτο block που λαμβάνουν. Αυτό μπορεί να οδηγήσει σε 2 ή περισσότερες διακλαδώσεις της αλυσίδας. Για να καταλήξουν τελικά όλοι οι κόμβοι με την ίδια αλυσίδα του blockchain, τρέχουν τον αλγόριθμο consensus, σύμφωνα με τον οποίον σε περίπτωση conflict υιοθετούν την αλυσίδα με το μεγαλύτερο μέγεθος. Δίκτυο Υποθέτουμε ότι το δίκτυό μας έχει μέγεθος n, δηλαδή n κόμβοι συμμετέχουν στο δίκτυο με ids από 0 έως n-1. Ο κάθε κόμβος του δικτύου μας θα πρέπει να μπορεί να ανταλλάσει μηνύματα με όλους τους υπόλοιπους κόμβους του συστήματος γνωρίζοντας την ip address και το port στο οποίο ακούνε. Για λόγους απλότητας, θεωρούμε ότι κάθε κόμβος διατηρεί λίστα με όλους τους υπόλοιπους κόμβους που συμμετέχουν κάθε στιγμή στο noobcash σύστημα. Η επικοινωνία μπορεί να υλοποιηθεί είτε με sockets (TCP ή UDP) είτε με REST api, χρησιμοποιώντας όποια βιβλιοθήκη θέλετε. Ο πρώτος κόμβος του δικτύου, ο bootstrap node (id 0), είναι και ο κόμβος που δημιουργεί το genesis block, το πρώτο δλδ block του blockchain μας. Στο genesis block θέτουμε previous_hash=1, nonce=0 και η λίστα από transactions περιλαμβάνει μόνο ένα transaction που δίνει στον bootsrap κόμβο 100*n ΝΒC coins από την wallet διεύθυνση 0. Αυτό είναι το μοναδικό block που δεν επαληθεύεται. Σταδιακά προστίθενται οι υπόλοιποι n-1 κόμβοι του δικτύου. Για να εισαχθεί ένας νέος κόμβος στο σύστημα επικοινωνεί πρώτα με τον bootstrap κόμβο, του οποίου θεωρούμε γνωστά σε όλους τα στοιχεία επικοινωνίας ip address/port, και του στέλνει το public key του wallet του. Από τον bootstrap κόμβο λαμβάνει το μοναδικό id του (ο πρώτος το id 1, ο δεύτερος το id 2 κ.ο.κ). Όταν εισαχθούν όλοι οι κόμβοι, ο bootstrap κάνει broadcast σε όλους τα ζεύγη ip address/port καθώς και τα public keys των wallets όλων των κόμβων που συμμετέχουν στο σύστημα. Θεωρείστε ότι από εδώ και πέρα δεν υπάρχουν εισαγωγές ή αποχωρήσεις κόμβων από το σύστημα. Επιπλέον, κάθε νέος κόμβος λαμβάνει από τον bootstrap κόμβο το blockchain όπως έχει διαμορφωθεί μέχρι εκείνη τη στιγμή, το κάνει validate και μετά από αυτό το σημείο μπορεί να κάνει transactions. O bootstrap κόμβος, όπως αναφέρθηκε παραπάνω, έχει 100*n NBC coins από το genesis block. Μετά τη σύνδεση κάθε νέου κόμβου στο δίκτυο, ο bootstrap κόμβος εκτελεί ένα transaction όπου του μεταφέρει 100 NBC. Έτσι, μετά την εισαγωγή όλων των κόμβων, ο καθένας τους έχει 100 NBC στο wallet του. Noobcash backend Στο noobcash backend υλοποιείται όλη η λογική του blockchain. Τα βασικά συστατικά στοιχεία του noobcash blockchain είναι τα παρακάτω: Block To κάθε noobcash block έχει τις εξής πληροφορίες

index: o αύξων αριθμός του block, timestamp: το timestamp της δημιουργίας του block transactions: Η λίστα με τα transactions που περιέχονται στο block nonce: η λύση του proof-of-work current_hash: το hash του block previous_hash: το hash του προηγούμενου block στο blockchain. Θεωρούμε ότι το κάθε block έχει συγκεριμένη χωρητικότητα σε αριθμό από transaction. Η χωρητικότητα καθορίζεται από τη σταθερά capacity. Blockchain H λίστα από blocks που έχουν επαληθευτεί. Wallet Ένα wallet συνδέεται με ένα ζεύγος public/private key. To public key δρα ως διεύθυνση του wallet, την οποία μπορεί κανείς να μοιραστεί με οποιονδήποτε προκειμένου να μπορεί να δεχτεί πληρωμές. Το private key χρησιμοποιείται για να υπογράφονται τα transactions, ώστε να εξασφαλίζεται ότι μόνο o κάτοχος του wallet (δλδ ο κάτοχος του αντίστοιχου private key) μπορεί να ξοδέψει χρήματα από το wallet. Αυτό γίνεται με τη συνάρτηση sign_transaction(). Οποιοσδήποτε γνωρίζει το public key ενός wallet μπορεί να επαληθεύσει ότι ένα transaction που ξοδεύει χρήματα από το wallet αυτό έχει δημιουργηθεί από τον κάτοχό του με την verify_transaction(). Transaction Κάθε transaction περιέχει πληροφορίες για μεταφορά χρημάτων από ένα wallet σε ένα άλλο. Οι πληροφορίες που περιλαμβάνει είναι sender_address: To public key του wallet από το οποίο προέρχονται τα χρήματα receiver_address: To public key του wallet στο οποίο θα καταλήξουν τα χρήματα amount: το ποσό που θα μεταφερθεί transaction_id: το hash του transaction transaction_inputs: λίστα από Transaction Input (βλέπε παρακάτω) transaction_outputs: λίστα από Transaction Output (βλέπε παρακάτω) Signature: Υπογραφή που αποδεικνύει ότι ο κάτοχος του wallet δημιούργησε αυτό το transaction. Ένα transaction μπορεί να δημιουργηθεί από τον κάτοχο του wallet από όπου θα μεταφερθούν τα χρήματα. Κάθε transaction γίνεται broadcast σε όλα τα μέλη του blockchain. Κατά τη λήψη ενός transaction από οποιονδήποτε node, καλείται η συνάρτηση validate_transaction που ελέγχει την ορθότητά του.

Transaction Inputs/Transaction Outputs/Unspent Transactions Κάθε transaction περιέχει πληροφορία που δείχνει από ποιο/α προηγούμενο/α transaction προήλθαν τα χρήματα που μεταφέρονται. Αυτή η πληροφορία περιέχεται στο transaction input. Επίσης, κάθε transaction δημιουργεί outputs, που περιέχουν πληροφορία για το ποσό που έστειλε κάθε transaction στους εμπλεκόμενους. Στην περίπτωσή μας, θεωρούμε μόνο transactions που γίνονται ανάμεσα σε 2 wallets, επομένως κάθε transaction καταλήγει σε 2 transaction outputs: Ένα output για το receiver_address wallet με το ποσό του transaction κι ένα output για τον sender, με τα ρεστα, το ποσό δηλαδή που περίσσεψε. Μόνο unspent transaction outputs (UTXO), δηλαδή transaction outputs που δεν έχουν ξοδευτεί ήδη, μπορούν να χρησιμοποίηθούν ως input σε άλλο transaction προκειμένου να αποφευχθεί double spending. Επομένως πάντα χρειάζονται UTXOs για να γίνει ένα transaction. Σύμφωνα με τα παραπάνω, το Transaction Input αποτελείται απο τo πεδία previousoutputid που είναι το id του Transaction Output από όπου προήλθε το ποσό που μεταφέρεται. Το Transaction Output περιλαμβάνει: ένα μοναδικό αναγνωριστικό id, το id του transaction από το οποίο προέρχεται, τον recipient του transaction (τον νέο κάτοχο των coins) και το ποσό που μεταφέρθηκε. Τελικά το υπόλοιπο του wallet ενός χρήστη είναι το άθροισμα όλων των unspent transaction outputs που έχουν ως recipient το συγκεκριμένο wallet. Για να μη χρειάζεται να διατρέχουμε όλο το blockchain για να ελέγξουμε αν τα inputs ενός transaction είναι πράγματι unspent transaction ouputs προηγούμενων, κάθε node κρατάει επιπλέον το σύνολο των UTXOs για κάθε wallet. Βασικές συναρτήσεις Οι βασικές λειτουργίες του συστήματος περιλαμβάνουν: generate_wallet() Δημιουργεί νέο wallet, δλδ ξεύγος public/private key χρησιμοποιώντας τον κρυπτογραφικό αλγόριθμο RSA. create_transaction() Δημιουργείται ένα νέο transaction που περιέχει όλα τα στοιχεία που απαιτούνται. Εδώ το πεδίο transaction_inputs γεμίζει με τα Transaction Input που περιέχουν τα ids των UTXOs που απαιτούνται για να συμπληρωθεί το ποσό που θέλουμενα ξοέψουμε. sign_transaction() Υπογράφεται το transaction με το private key του wallet. broadcast_transaction() Το transaction αποστέλλεται με broadcast σε όλους τους κόμβους verify_signature() Επαληθεύεται η υπογραφή του transaction αμέσως μετά τη λήψη του

validate_transaction() Eπαληθεύεται η ορθότητα του transaction που έχει ληφθεί. Η επαλήθευση περιλαμβάνει (α) την επαλήθευση της υπογραφής (verify_signature) και (β) τον έλεγχο των transaction inputs/outputs για να εξασφαλίσουμε ότι το wallet αποστολέας έχει το ποσό amount που μεταφέρει στον παραλήπτη. Για να επιτευχθεί το (β) ελέγχεται αν τα transaction inputs είναι πράγματι unspent transactions, αν είναι αφαιρούνται από τη λίστα των UTXO του κόμβου. Δημιουργούνται τα δύο Transaction Outputs και προστίθενται στη λίστα στη λίστα UTXO του node μας. wallet_balance() Μπορούμενα βρούμε το υπόλοιπο οποιουδήποτε wallet προσθέτοντας όλα τα UTXOs που έχουν παραλήπτη το συγκεκριμένο wallet. mine_block() Η συνάρτηση αυτή καλείται μόλις capacity transactions έχουν ληφθεί και επαληθευτεί από κάποιον κόμβο και υλοποιεί το proof of work δοκιμάζοντας διαφορετικές τιμές της μεταβλητής nonce και hashάροντας το block μέχρι το hash που θα προκύψει να αρχίζει από έναν συγκεκριμένο αριθμό από μηδενικά. Ο αριθμός αυτός καθορίζεται από τη σταθερά difficulty. broadcast_block() Μόλις βρεθεί ο κατάλληλος nonce, ο κόμβος κάνει broadcast το επαληθευμένο block σε όλους τους υπόλοιπους κόμβους. validate_block() Αυτή η συνάρτηση καλείται από τους nodes κατά τη λήψη ενός νέου block (εκτός του genesis block). Επαληθεύεται ότι (a) το πεδίο current_hash είναι πράγματι σωστό και ότι (b) το πεδίο previous_hash ισούται πράγματι με το hash του προηγούμενου block. validate_chain() Αυτή η συνάρτηση καλείται από τους νεοεισερχόμενους κόμβους, οι οποίοι επαληθεύουν την ορθότητα του blockchain που λαμβάνουν από τον bootstrap κόμβο. Στην πραγματικότητα καλείται η validate_block για όλα τα blocks εκτός του genesis. resolve_conflict() Αυτή η συνάρτηση καλείται όταν ένα κόμβος λάβει ένα block το οποίο δεν μπορεί να κάνει validate γιατί το πεδίο previous_hash δεν ισούται με το hash του προηγούμενου block. Αυτό μπορεί να σημαίνει ότι έχει δημιουργηθεί κάποια διακλάδωση, η οποία πρέπει να επιλυθεί. Ο κόμβος ρωτάει τους υπόλοιπους για το μήκος του blockchain και επιλέγει να υιοθετήσει αυτό με το μεγαλύτερο μήκος. Noobcash client Θα πρέπει να υλοποιήσετε έναν client (ένα απλό cli αρκεί, αλλά αν θέλετε να είστε πιο fancy θα μετρήσει θετικά) που θα δίνει στον χρήστη τη δυνατότητα να εκτελεί τα παρακάτω: t <recipient_address> <amount>

New transaction: Στείλε στο recipient_address wallet το ποσό amount από NBC coins που θα πάρει από το wallet sender_address. Θα καλεί συνάρτηση create_transaction στο backend που θα υλοποιεί την παραπάνω λειτουργία. view View last transactions: Τύπωσε τα transactions που περιέχονται στο τελευταίο επικυρωμένο block του noobcash blockchain. Καλεί τη συνάρτηση view_transactions() στο backend που υλοποιεί την παραπάνω λειτουργία. balance Show balance: Τύπωσε το υπόλοιπο του wallet. help Επεξήγηση των παραπάνω εντολών. Πειράματα Θα αναπτύξετε το noobcash σε όποια γλώσσα προγραμματισμού θέλετε. Θα το στήσετε σε υποδομή του εργαστηρίου (θα σας δοθούν ακριβείς οδηγίες). Για την αναφορά θα εκτελέσετε τα παρακάτω πειράματα: 1) Απόδοση του συστήματος Θα στήσετε ένα noobcash με 5 clients. Αφού όλοι εισέλθουν στο σύστημα, o καθένας θα διαβάσει το αρχείο transactionx.txt, όπου Χ το node id του κόμβου. Το κάθε αρχείο περιέχει transactions προς άλλους κόμβους με τη μορφή < recipient_node_id> <amount> Έτσι ο κάθε κόμβος δημιουργεί και στέλνει στο δίκτυο ένα transaction ανά γραμμή. Η διαδικασία αυτή θα γίνει ταυτόχρονα για όλους τους clients. Για (a) capacity 1, 5 και 10 και (b) difficulty 4 και 5 θα καταγράψετε τα παρακάτω: Throughput (ρυθμαπόδοση) του συστήματός σας, δηλαδή πόσα transactions εξυπηρετούνται στην μονάδα του χρόνου. Block time, δλδ τον μέσο χρόνο που απαιτείται για να προστεθεί ένα νέο block στο blockchain. 2) Κλιμακωσιμότητα του συστήματος Θα επαναλάβετε το πείραμα για 10 clients και θα συγκρίνετε με τα προηγούμενα αποτελέσματα παρουσιάζοντας σε γράφημα τις μετρικές του προηγούμενου πειράματος (άξονας y) σε σχέση με τον αριθμό των clients (άξονας x). Παραδοτέο της άσκησης θα είναι ο πηγαίος κώδικας (tarball με τα σχετικά αρχεία) καθώς και ένα ηλεκτρονικό κείμενο (pdf, docx ή odt) που θα παρουσιάζει τον σχεδιασμό του συστήματός σας και τα

αποτελέσματα των πειραμάτων. Επίδειξη της άσκησης θα γίνει σε συνεννόηση με τους διδάσκοντες μετά τη λήξη της προθεσμίας για το παραδοτέο. Στο ηλεκτρονικό κείμενο να αναφέρετε στην αρχή τα στοιχεία σας (Όνομα, Επώνυμο, ΑΜ). Ο κώδικας και η αναφορά θα παραδοθούν ηλεκτρονικά στην ιστοσελίδα: http://www.cslab.ece.ntua.gr/courses/distrib/submit Δουλέψτε σε ομάδες 2-3 ατόμων. Έχει ιδιαίτερη αξία για την κατανόηση του μαθήματος να κάνετε μόνοι σας την εργασία. Μην προσπαθήσετε να την αντιγράψετε από άλλους συμφοιτητές σας.