Πρόταση μπλοκ
Τελευταία επεξεργασία: @corwintines, 17 Ιανουαρίου 2024
Τα μπλοκ είναι οι θεμελιώδεις μονάδες του blockchain. Τα μπλοκ είναι διακριτές μονάδες πληροφοριών που διαβιβάζονται μεταξύ κόμβων, γίνονται αντικείμενο συμφωνίας και προστίθενται στη βάση δεδομένων κάθε κόμβου. Αυτή η σελίδα εξηγεί πώς παράγονται.
Προαπαιτούμενα
Η πρόταση μπλοκ είναι μέρος του πρωτοκόλλου απόδειξης συμμετοχής. Για να κατανοήσετε καλύτερα αυτή τη σελίδα, σας συνιστούμε να διαβάσετε σχετικά με την απόδειξη συμμετοχής και την αρχιτεκτονική μπλοκ.
Ποιος παράγει μπλοκ;
Οι λογαριασμοί επικυρωτών προτείνουν μπλοκ. Τους λογαριασμούς επικυρωτών διαχειρίζονται χειριστές κόμβων που εκτελούν λογισμικό επικυρωτή ως μέρος των πελατών εκτέλεσης και συναίνεσης και έχουν καταθέσει τουλάχιστον 32 ETH στη σύμβαση κατάθεσης. Ωστόσο, κάθε επικυρωτής είναι υπεύθυνος μόνο περιστασιακά για την πρόταση ενός μπλοκ. Το Ethereum μετράει τον χρόνο σε χρονικά κενά και εποχές. Κάθε χρονικό κενό είναι δώδεκα δευτερόλεπτα και 32 χρονικά κενά (6,4 λεπτά) αποτελούν μια εποχή. Κάθε χρονικό κενό είναι μια ευκαιρία να προστεθεί ένα νέο μπλοκ στο Ethereum.
Τυχαία επιλογή
Ένας μεμονωμένος επικυρωτής επιλέγεται ψευδοτυχαία για να προτείνει ένα μπλοκ σε κάθε χρονικό κενό. Δεν υφίσταται πραγματική τυχαιότητα σε μια κρυπτοαλυσίδα, επειδή εάν κάθε κόμβος δημιουργούσε πραγματικά τυχαίους αριθμούς, δεν θα μπορούσαν να καταλήξουν σε συναίνεση. Αντίθετα, ο στόχος είναι να καταστεί η διαδικασία επιλογής επικυρωτή απρόβλεπτη. Η τυχαιότητα επιτυγχάνεται στο Ethereum μέσω ενός αλγορίθμου που ονομάζεται RANDAO και αναμειγνύει έναν κατακερματισμό από τον προτείνοντα μπλοκ με μια φράση ασφαλείας (seed) που ενημερώνεται σε κάθε μπλοκ. Αυτή η τιμή χρησιμοποιείται για την επιλογή ενός συγκεκριμένου επικυρωτή από το συνολικό σύνολο επικυρωτών. Η επιλογή επικυρωτή καθορίζεται δύο εποχές εκ των προτέρων, γεγονός που συμβάλλει στην προστασία από ορισμένους τύπους χειραγώγησης της φράσης ασφαλείας.
Αν και οι επικυρωτές προσθέτουν στο RANDAO σε κάθε χρονικό κενό, η ολική τιμή RANDAO ενημερώνεται μόνο μία φορά ανά εποχή. Για να υπολογιστεί ο δείκτης του επόμενου προτείνοντα μπλοκ, η τιμή RANDAO αναμειγνύεται με τον αριθμό χρονικού κενού για να δώσει μια μοναδική τιμή σε κάθε χρονικό κενό. Η πιθανότητα επιλογής ενός μεμονωμένου επικυρωτή δεν είναι απλώς 1/Ν
(όπου Ν
= συνολικοί ενεργοί επικυρωτές). Αντιθέτως, υπολογίζεται με το πραγματικό υπόλοιπο ETH κάθε επικυρωτή. Το μέγιστο πραγματικό υπόλοιπο είναι 32 ETH (αυτό σημαίνει ότι balance < 32 ETH
οδηγεί σε χαμηλότερη στάθμιση από balance == 32 ETH
, αλλά balance > 32 ETH
δεν οδηγεί σε υψηλότερη στάθμιση από balance == 32 ETH
).
Επιλέγεται μόνο ένας προτείνων μπλοκ σε κάθε χρονικό κενό. Υπό κανονικές συνθήκες, ένας μεμονωμένος παραγωγός μπλοκ δημιουργεί και απελευθερώνει ένα μεμονωμένο μπλοκ στο συγκεκριμένο χρονικό κενό του. Η δημιουργία δύο μπλοκ για το ίδιο χρονικό κενό συνιστά παράβαση που υπόκειται σε περικοπή, συχνά γνωστή ως «αμφιλογία».
Πώς δημιουργείται το μπλοκ;
Ο προτείνων μπλοκ αναμένεται να μεταδώσει ένα υπογεγραμμένο μπλοκ beacon που δημιουργείται πάνω στην πιο πρόσφατη κεφαλή της αλυσίδας κατά την άποψη του δικού του τοπικά εκτελούμενου αλγόριθμου επιλογής διακλάδωσης. Ο αλγόριθμος επιλογής διακλάδωσης εφαρμόζει όλες τις εκκρεμείς βεβαιώσεις επικύρωσης που απομένουν από το προηγούμενο χρονικό κενό, στη συνέχεια βρίσκει το μπλοκ με τον μεγαλύτερο συσσωρευμένο συντελεστή στάθμισης βεβαιώσεων επικύρωσης στο ιστορικό του. Αυτό το μπλοκ είναι το γονικό στοιχείο του νέου μπλοκ που δημιουργήθηκε από τον προτείνοντα.
Ο προτείνων μπλοκ δημιουργεί ένα μπλοκ συλλέγοντας δεδομένα από τη δική του τοπική βάση δεδομένων και την όψη της αλυσίδας. Το περιεχόμενο του μπλοκ εμφανίζεται στο παρακάτω απόσπασμα:
1class BeaconBlockBody(Container):2 randao_reveal: BLSSignature3 eth1_data: Eth1Data4 graffiti: Bytes325 proposer_slashings: List[ProposerSlashing, MAX_PROPOSER_SLASHINGS]6 attester_slashings: List[AttesterSlashing, MAX_ATTESTER_SLASHINGS]7 attestations: List[Attestation, MAX_ATTESTATIONS]8 deposits: List[Deposit, MAX_DEPOSITS]9 voluntary_exits: List[SignedVoluntaryExit, MAX_VOLUNTARY_EXITS]10 sync_aggregate: SyncAggregate11 execution_payload: ExecutionPayloadΕμφάνιση όλων
Το πεδίο randao_reveal
λαμβάνει μια επαληθεύσιμη τυχαία τιμή που δημιουργεί ο προτείνων του μπλοκ υπογράφοντας τον τρέχοντα αριθμό εποχής. Το eth1_data
είναι μια ψήφος για την άποψη του προτείνοντα του μπλοκ για τη σύμβαση κατάθεσης, που περιλαμβάνει τη ρίζα του Merkle trie κατάθεσης και τον συνολικό αριθμό καταθέσεων που επιτρέπουν την επαλήθευση νέων καταθέσεων. Το graffiti
είναι ένα προαιρετικό πεδίο που μπορεί να χρησιμοποιηθεί για την προσθήκη ενός μηνύματος στο μπλοκ. Τα proposer_slashings
και attester_slashings
είναι πεδία που περιέχουν απόδειξη ότι ορισμένοι επικυρωτές έχουν διαπράξει παραβάσεις περικοπής (slash) σύμφωνα με την άποψη που έχει ο προτείνων για την αλυσίδα. Το deposits
είναι μια λίστα νέων καταθέσεων επικυρωτών των οποίων έχει γνώση ο προτείνων του μπλοκ και το voluntary_exits
είναι μια λίστα επικυρωτών που επιθυμούν να εξέλθουν για τους οποίους ο προτείνων του μπλοκ άκουσε στο δίκτυο ενημέρωσης του επιπέδου συναίνεσης. Το sync_aggregate
είναι ένας φορέας που δείχνει ποιοι επικυρωτές είχαν προηγουμένως ανατεθεί σε μια επιτροπή συγχρονισμού (ένα υποσύνολο επικυρωτών που εξυπηρετούν δεδομένα ελαφρού πελάτη) και συμμετείχαν στην υπογραφή δεδομένων.
Το execution_payload
επιτρέπει τη μεταφορά πληροφοριών σχετικά με τις συναλλαγές μεταξύ των πελατών εκτέλεσης και συναίνεσης. Το execution_payload
είναι ένα μπλοκ δεδομένων εκτέλεσης που ενσωματώνεται σε ένα μπλοκ beacon. Τα πεδία μέσα στο execution_payload
αντικατοπτρίζουν τη δομή μπλοκ που περιγράφεται στο κίτρινο έγγραφο του Ethereum, εκτός από το ότι δεν υπάρχουν ommer και το prev_randao
υπάρχει στη θέση του difficulty
. Ο πελάτης εκτέλεσης έχει πρόσβαση σε μια τοπική συγκέντρωση συναλλαγών για την οποία έμαθε από το δικό του δίκτυο ενημέρωσης. Αυτές οι συναλλαγές εκτελούνται τοπικά για να δημιουργήσουν ένα ενημερωμένο trie κατάστασης γνωστό ως μετα-κατάσταση. Οι συναλλαγές περιλαμβάνονται στο execution_payload
ως μια λίστα που ονομάζεται transactions
και η μετα-κατάσταση παρέχεται στο πεδίο state-root
.
Όλα αυτά τα δεδομένα συλλέγονται σε ένα μπλοκ beacon, υπογράφονται και μεταδίδονται στους ομοτίμους του προτείνοντα του μπλοκ, οι οποίοι το διαδίδουν στους ομοτίμους τους και ούτω καθεξής.
Διαβάστε περισσότερα για την ανατομία των μπλοκ.
Τι γίνεται με το μπλοκ;
Το μπλοκ προστίθεται στην τοπική βάση δεδομένων του προτείνοντος το μπλοκ και μεταδίδεται στους ομοτίμους μέσω του δικτύου ενημέρωσης του επιπέδου συναίνεσης. Όταν ένας επικυρωτής λαμβάνει το μπλοκ, επαληθεύει τα δεδομένα μέσα σε αυτό και, μεταξύ άλλων, ελέγχει ότι το μπλοκ έχει το σωστό γονικό στοιχείο, αντιστοιχεί στο σωστό χρονικό κενό, ότι ο δείκτης προτείνοντος είναι ο αναμενόμενος, ότι η αποκάλυψη RANDAO είναι έγκυρη και ότι ο προτείνων δεν έχει περικοπεί. Το execution_payload
διαχωρίζεται και ο πελάτης εκτέλεσης του επικυρωτή εκτελεί ξανά τις συναλλαγές στη λίστα για να ελέγξει την προτεινόμενη αλλαγή κατάστασης. Υποθέτοντας ότι το μπλοκ περνάει όλους αυτούς τους ελέγχους, κάθε επικυρωτής προσθέτει το μπλοκ στη δική του κανονική αλυσίδα. Η διαδικασία ξεκινά ξανά στο επόμενο χρονικό κενό.
Επιβραβεύσεις μπλοκ
Ο προτείνων του μπλοκ λαμβάνει πληρωμή για την εργασία του. Υπάρχει μια base_reward
που υπολογίζεται ως συνάρτηση του αριθμού των ενεργών επικυρωτών και των πραγματικών υπολοίπων τους. Ο προτείνων του μπλοκ στη συνέχεια λαμβάνει ένα κλάσμα της base_reward
για κάθε έγκυρη βεβαίωση επικύρωσης που περιλαμβάνεται στο μπλοκ. Όσο περισσότεροι επικυρωτές βεβαιώνουν το μπλοκ, τόσο μεγαλύτερη είναι η ανταμοιβή του προτείνοντος το μπλοκ. Υπάρχει επίσης μια ανταμοιβή για την αναφορά επικυρωτών που πρέπει να περικοπούν, ίση με 1/512 * effective balance
για κάθε περικομμένο επικυρωτή.
Περισσότερα για ανταμοιβές και ποινές