Συναλλαγές
Τελευταία επεξεργασία: @0xmike7(opens in a new tab), 16 Ιουλίου 2024
Οι συναλλαγές είναι κρυπτογραφικά υπογεγραμμένες από τον λογαριασμό. Ένας λογαριασμός θα ξεκινήσει μια συναλλαγή για να ενημερωθεί η κατάσταση του δικτύου του Ethereum. Η απλούστερη συναλλαγή είναι μεταφέροντας ETH από ένα λογαριασμό στον άλλο.
Προαπαιτούμενα
Για να σας βοηθήσουμε να κατανοήσετε καλύτερα αυτή τη σελίδα, σας συνιστούμε να διαβάσετε το λογαριασμός και τις οδηγίες εισαγωγής μας στο Ethereum.
Τι είναι μια συναλλαγή;
Μια συναλλαγή του Ethereum αναφέρεται σε μια ενέργεια που ξεκίνησε από ένα εξωτερικό λογαριασμό, δηλαδή με άλλα λόγια από έναν λογαριασμό τον οποίο διαχειρίζεται ένας άνθρωπος και όχι ένα συμβόλαιο. Για παράδειγμα, αν ο Bob στείλει στην Alice 1 ETH, ο λογαριασμός του πρέπει να χρεωθεί και της Alice θα πρέπει να πιστωθεί. Αυτή η ενέργεια αλλαγής ιδιοκτησίας πραγματοποιείται στο πλαίσιο μιας συναλλαγής.
Προσαρμοσμένο διάγραμμα εικονογραφημένο από Ethereum EVM(opens in a new tab)
Οι συναλλαγές, οι οποίες αλλάζουν την κατάσταση του EVM, πρέπει να μεταδίδονται σε ολόκληρο το δίκτυο. Οποιοσδήποτε κόμβος μπορεί να μεταδώσει ένα αίτημα για εκτέλεση συναλλαγής στο EVM. Αφού συμβεί αυτό, ένας επικυρωτής θα εκτελέσει τη συναλλαγή και θα διαδώσει την προκύπτουσα αλλαγή κατάστασης στο υπόλοιπο δίκτυο.
Οι συναλλαγές απαιτούν ένα τέλος και πρέπει να περιλαμβάνονται σε ένα επικυρωμένο μπλοκ. Για να απλοποιήσουμε αυτήν την επισκόπηση, θα καλύψουμε τα τέλη gas και την επικύρωση αλλού.
Μια υποβληθείσα συναλλαγή περιλαμβάνει τις παρακάτω πληροφορίες:
from
– τη διεύθυνση του αποστολέα, που θα υπογράψει τη συναλλαγή. Αυτός θα είναι εξωτερικά ελεγχόμενος λογαριασμός καθώς οι λογαριασμοί συμβολαίων δεν μπορούν να στείλουν συναλλαγές.to
-- η διεύθυνση λήψης (εάν είναι εξωτερικά ελεγχόμενος λογαριασμός, η συναλλαγή θα μεταφέρει αξία. Εάν είναι ένας λογαριασμός συμβολαίου, η συναλλαγή θα εκτελέσει τον κώδικα συμβολαίου)signature
– το αναγνωριστικό του αποστολέα. Δημιουργείται όταν υπογράφεται η συναλλαγή με το ιδιωτικό κλειδί του αποστολέα το οποίο επιβεβαιώνει ότι και την έγκριση της συναλλαγήςnonce
- ένας διαδοχικά αυξανόμενος μετρητής που υποδεικνύει τον αριθμό συναλλαγών από τον λογαριασμότιμή
– το ποσό ETH προς μεταφορά από τον αποστολέα στον παραλήπτη (σε WEI, όπου 1 ΕΤΗ ισούται με 1e+18wei)input data
– προαιρετικό πεδίο για συμπερίληψη αυθαίρετων δεδομένωνgasLimit
– η μέγιστη ποσότητα μονάδων αερίου που μπορούν να καταναλωθούν από τη συναλλαγή. Το EVM καθορίζει τις μονάδες gas που απαιτούνται για κάθε υπολογιστικό βήμαmaxPriorityFeePerGas
- η μέγιστη τιμή του gas που καταναλώθηκε που θα συμπεριληφθεί ως φιλοδώρημα στον επικυρωτήmaxFeePerGas
- η μέγιστη χρέωση ανά μονάδα gas που είναι διατεθειμένη να καταβληθεί για τη συναλλαγή (συμπεριλαμβανομένων τωνbaseFeePerGas
καιmaxPriorityFeePerGas
)
Το gas είναι μια αναφορά στον υπολογισμό που απαιτείται για την επεξεργασία της συναλλαγής από έναν επικυρωτή. Οι χρήστες πρέπει να καταβάλουν ένα τέλος για αυτόν τον υπολογισμό. Το gasLimit
και το maxPriorityFeePerGas
καθορίζουν το μέγιστο κόστος συναλλαγής που αποδίδεται στον επικυρωτή. Περισσότερα για τις κρατήσεις gas.
Το αποτέλεσμα της συναλλαγής θα μοιάζει κάπως έτσι:
1{2 from: "0xEA674fdDe714fd979de3EdF0F56AA9716B898ec8",3 to: "0xac03bb73b6a9e108530aff4df5077c2b3d481e5a",4 gasLimit: "21000",5 maxFeePerGas: "300"6 maxPriorityFeePerGas: "10"7 nonce: "0",8 value: "10000000000",9}Εμφάνιση όλωνΑντιγραφή
Αλλά ένα αντικείμενο συναλλαγής θα πρέπει να υπογραφεί χρησιμοποιώντας το ιδιωτικό κλειδί του αποστολέα. Έτσι αποδεικνύεται ότι η συναλλαγή προέρχεται μόνο από τον αποστολέα και δεν είχε σταλεί κακόβουλα.
Ένα λογισμικό πελάτη του Ethereum όπως το Geth, χειρίζεται αυτή τη διαδικασία της υπογραφής.
Παράδειγμα κλήσης JSON-RPC:
1{2 "id": 2,3 "jsonrpc": "2.0",4 "method": "account_signTransaction",5 "params": [6 {7 "from": "0x1923f626bb8dc025849e00f99c25fe2b2f7fb0db",8 "gas": "0x55555",9 "maxFeePerGas": "0x1234",10 "maxPriorityFeePerGas": "0x1234",11 "input": "0xabcd",12 "nonce": "0x0",13 "to": "0x07a565b7ed7d7a678680a4c162885bedbb695fe0",14 "value": "0x1234"15 }16 ]17}Εμφάνιση όλωνΑντιγραφή
Παράδειγμα απάντησης:
1{2 "jsonrpc": "2.0",3 "id": 2,4 "result": {5 "raw": "0xf88380018203339407a565b7ed7d7a678680a4c162885bedbb695fe080a44401a6e4000000000000000000000000000000000000000000000000000000000000001226a0223a7c9bcf5531c99be5ea7082183816eb20cfe0bbc322e97cc5c7f71ab8b20ea02aadee6b34b45bb15bc42d9c09de4a6754e7000908da72d48cc7704971491663",6 "tx": {7 "nonce": "0x0",8 "maxFeePerGas": "0x1234",9 "maxPriorityFeePerGas": "0x1234",10 "gas": "0x55555",11 "to": "0x07a565b7ed7d7a678680a4c162885bedbb695fe0",12 "value": "0x1234",13 "input": "0xabcd",14 "v": "0x26",15 "r": "0x223a7c9bcf5531c99be5ea7082183816eb20cfe0bbc322e97cc5c7f71ab8b20e",16 "s": "0x2aadee6b34b45bb15bc42d9c09de4a6754e7000908da72d48cc7704971491663",17 "hash": "0xeba2df809e7a612a0a0d444ccfa5c839624bdc00dd29e3340d46df3870f8a30e"18 }19 }20}Εμφάνιση όλωνΑντιγραφή
- η
raw
είναι η υπογεγραμμένη συναλλαγή σε κωδικοποιημένη μορφή Recursive Length Prefix (RLP) - Το
tx
είναι η υπογεγραμμένη συναλλαγή σε μορφή JSON
Με το αναγνωριστικό της υπογραφής, η συναλλαγή μπορεί να εξακριβωθεί κρυπτογραφικά ότι προήλθε από τον αποστολέα και έχει υποβληθεί στο δίκτυο.
Το πεδίο δεδομένων
Η μεγαλύτερη πλειονότητα των συναλλαγών έχει πρόσβαση σε ένα συμβόλαιο από έναν εξωτερικό ελεγχόμενο λογαριασμό. Τα περισσότερα συμβόλαια είναι γραμμένα σε Solidity και ερμηνεύουν το πεδίο δεδομένων τους σύμφωνα με το .
Τα πρώτα τέσσερα bytes καθορίζουν ποια συνάρτηση θα κληθεί, χρησιμοποιώντας το hash του ονόματος και των ορισμάτων της συνάρτησης. Μερικές φορές μπορείτε να αναγνωρίσετε τη συνάρτηση από τον επιλογέα χρησιμοποιώντας αυτή τη βάση δεδομένων(opens in a new tab).
Τα υπόλοιπα δεδομένα κλήσης είναι τα ορίσματα, encoded as specified in the ABI specs(opens in a new tab).
Για παράδειγμα, ας δούμε αυτή τη συναλλαγή(opens in a new tab). Χρησιμοποιήστε το Click to see More για να δείτε τα δεδομένα κλήσεων.
Ο εκλέκτορας λειτουργίας είναι 0xa9059cbb
. Υπάρχουν πολλές γνωστές λειτουργίες με αυτήν την υπογραφή(opens in a new tab). Σε αυτήν την περίπτωση <0>ο πηγαίος κώδικας της συμβολαίου(opens in a new tab) έχει μεταφορτωθεί στο Etherscan, επομένως γνωρίζουμε ότι η λειτουργία είναι transfer(address,uint256)
.
Τα υπόλοιπα στοιχεία είναι:
10000000000000000000000004f6742badb049791cd9a37ea913f2bac38d012792000000000000000000000000000000000000000000000000000000003b0559f4
Σύμφωνα με τις προδιαγραφές του ABI, οι ακέραιες τιμές (όπως οι διευθύνσεις, οι οποίες είναι ακέραιοι αριθμοί 20-byte) εμφανίζονται στο ABI ως λέξεις 32-byte, συμπληρωμένες με μηδενικά στο μπροστινό μέρος. Γνωρίζουμε λοιπόν ότι η διεύθυνση προς
είναι 4f6742badb049791cd9a37ea913f2bac38d01279
(opens in a new tab). Το value
είναι 0x3b0559f4 = 990206452.
Τύποι συναλλαγών
Στο Ethereum υπάρχουν μερικοί διαφορετικοί τύποι συναλλαγών:
- Κανονικές συναλλαγές: συναλλαγή από έναν λογαριασμό σε άλλο.
- Συναλλαγές ανάπτυξης συμβολαίων: συναλλαγή χωρίς διεύθυνση «προς», όπου το πεδίο δεδομένων χρησιμοποιείται για τον κώδικα σύμβασης.
- Εκτέλεση συμβολαίου: μια συναλλαγή που αλληλεπιδρά με ένα αναπτυγμένο έξυπνο συμβόλαιο. Σε αυτήν την περίπτωση, η διεύθυνση «προς» είναι η διεύθυνση έξυπνου συμβολαίου.
Σχετικά με τις κρατήσεις
Όπως αναφέρθηκε παραπάνω, οι συναλλαγές για να εκτελεστούν κοστίζουν Gas. Οι απλές συναλλαγές μεταφοράς απαιτούν 21000 μονάδες Gas.
Έτσι, για να στείλει ο Bob στην Alice 1 ETH με baseFeePerGas
190 gwei και maxPriorityFeePerGas
10 gwei, ο Bob θα πρέπει να πληρώσει την ακόλουθη χρέωση:
1(190 + 10) * 21000 = 4,200,000 gwei2--ή--30.0042 ETH
Ο λογαριασμός του Bob θα χρεωθεί -1.0042 ETH (1 ETH για την Alice + 0.0042 ETH σε χρεώσεις gas)
Ο λογαριασμός της Alice θα πιστωθεί +1.0 ETH
Η βασική χρέωση θα καεί -0.00399 ETH
Ο επικυρωτής διατηρεί το φιλοδώρημα +0.000210 ETH
Διάγραμμα προσαρμοσμένο από το Ethereum EVM που απεικονίζεται(opens in a new tab)
Τυχών υπόλοιπο του gas που δε θα χρησιμοποιηθεί στη συναλλαγή, επιστρέφεται στον λογαριασμό χρήστη.
Αλληλεπιδράσεις έξυπνων συμβολαίων
Το gas απαιτείται για κάθε συναλλαγή που περιλαμβάνει έξυπνο συμβόλαιο.
Τα έξυπνα συμβόλαια μπορούν επίσης να περιέχουν λειτουργίες γνωστές ως λειτουργίες < view
(opens in a new tab) ή pure
(opens in a new tab), οι οποίες δεν αλλάζουν την κατάσταση της συμβολαίου. Ως εκ τούτου, η κλήση αυτών των λειτουργιών από έναν EOA δεν απαιτεί gas. Η υποκείμενη κλήση RPC για αυτό το σενάριο είναι eth_call
Σε αντίθεση με την πρόσβαση μέσω του eth_call
, αυτές οι συναρτήσεις view
ή pure
καλούνται επίσης συνήθως εσωτερικά (δηλαδή από το ίδιο το συμβόλαιο ή από άλλο συμβόλαιο) το οποίο κοστίζει gas.
Διάρκεια ζωής της συναλλαγής
Μόλις υποβληθεί μια συναλλαγή θα συμβούν τα παρακάτω:
- Ένα κρυπτογραφημένο αναγνωριστικό συναλλαγής:
0x97d99bc7729211111a21b12c933c949d4f31684f1d6954ff477d0477538ff017
- Στη συνέχεια, η συναλλαγή μεταδίδεται στο δίκτυο και προστίθεται σε μια ομάδα συναλλαγών που αποτελείται από όλες τις άλλες εκκρεμείς συναλλαγές του δικτύου.
- Ένας επικυρωτής πρέπει να επιλέξει τη συναλλαγή σας και να την συμπεριλάβει σε ένα μπλοκ, προκειμένου να επαληθεύσει τη συναλλαγή και να τη θεωρήσει "επιτυχημένη".
- Με την πάροδο του χρόνου το μπλοκ που περιέχει τη συναλλαγή σας θα αναβαθμιστεί σε "δικαιολογημένο" και στη συνέχεια "οριστικοποιημένο". Αυτές οι αναβαθμίσεις το κάνουν πολύ πιο σίγουρο ότι η συναλλαγή σας ήταν επιτυχής και δεν θα αλλάξει ποτέ. Μόλις ένα μπλοκ "οριστικοποιηθεί" θα μπορούσε μόνο να αλλάξει από μια επίθεση σε επίπεδο δικτύου που θα κόστιζε πολλά δισεκατομμύρια δολάρια.
Μια εικονική επίδειξη
Παρακολουθήστε τον Austin να σας ξεναγήσει μέσα από τις συναλλαγές, το gas, και την εξόρυξη.
Τυποποιημένος τρόπος συναλλαγών
Το Ethereum είχε αρχικά μια μορφή για συναλλαγές. Κάθε συναλλαγή περιείχε ένα nonce, τιμή gas, όριο gas, προς διεύθυνση, αξία, δεδομένα, v, r και s. Αυτά τα πεδία είναι κωδικοποιημένα με RLP, για να φαίνονται κάπως έτσι:
RLP([nonce, gasPrice, gasLimit, to, value, data, v, r, s])
Το Ethereum έχει εξελιχθεί ώστε να υποστηρίζει πολλαπλούς τύπους συναλλαγών, επιτρέποντας την υλοποίηση νέων λειτουργιών όπως οι λίστες πρόσβασης και το EIP-1559(opens in a new tab) χωρίς να επηρεάζονται οι παλιές μορφές συναλλαγών.
Το EIP-2718(opens in a new tab) είναι αυτό που επιτρέπει αυτήν τη συμπεριφορά. Οι συναλλαγές ερμηνεύονται ως:
TransactionType || TransactionPayload
Όπου τα πεδία ορίζονται ως:
TransactionType
- ένας αριθμός μεταξύ του 0 και 0x7f, για συνολικά 128 πιθανούς τύπους συναλλαγών.TransactionPayload
- ένας αυθαίρετος πίνακας byte που ορίζεται από τον τύπο συναλλαγής.
Με βάση την αξία TransactionType
, μια συναλλαγή μπορεί να ταξινομηθεί ως
Συναλλαγές τύπου 0 (παλαιού τύπου): Η αρχική μορφή συναλλαγής που χρησιμοποιήθηκε από την κυκλοφορία του Ethereum. Δεν περιλαμβάνουν λειτουργίες από το EIP-1559(opens in a new tab), όπως υπολογισμούς δυναμικών κρατήσεων gas ή λίστες πρόσβασης για έξυπνα συμβόλαια. Οι συναλλαγές παλαιού τύπου δεν διαθέτουν συγκεκριμένο πρόθεμα που υποδεικνύει τον τύπο τους στη σειριακή τους μορφή, ξεκινώντας με το byte
0xf8
όταν χρησιμοποιείται η κωδικοποίηση Recursive Length Prefix (RLP). Η αξία TransactionType για αυτές τις συναλλαγές είναι0x0
.Συναλλαγές τύπου 1: Παρουσιάστηκαν στο EIP-2930(opens in a new tab) ως μέρος της αναβάθμισης Berlin του Ethereum, αυτές οι συναλλαγές περιλαμβάνουν μια παράμετρο
accessList
. Αυτή η λίστα καθορίζει διευθύνσεις και κλειδιά αποθήκευσης στα οποία αναμένεται να αποκτήσει πρόσβαση η συναλλαγή, συμβάλλοντας στη δυνητική μείωση του κόστους gas για πολύπλοκες συναλλαγές που περιλαμβάνουν έξυπνα συμβόλαια. Οι αλλαγές στην αγορά χρεώσεων EIP-1559 δεν περιλαμβάνονται στις συναλλαγές τύπου 1. Οι συναλλαγές τύπου 1 περιλαμβάνουν επίσης μια παράμετροyParity
, η οποία μπορεί να είναι0x0
ή0x1
, υποδεικνύοντας την ισοτιμία της τιμής y της υπογραφής secp256k1. Αναγνωρίζονται επειδή ξεκινάνε με το byte0x01
και η αξία του TransactionType τους είναι0x1
.Οι Συναλλαγές τύπου 2, που συνήθως αναφέρονται ως συναλλαγές EIP-1559, είναι συναλλαγές που εισάγονται στο EIP-1559(opens in a new tab), στην αναβάθμιση London του Ethereum. Έχουν γίνει ο συνήθης τύπος συναλλαγής στο δίκτυο του Ethereum. Αυτές οι συναλλαγές εισάγουν έναν νέο μηχανισμό αγοράς τελών που βελτιώνει την προβλεψιμότητα διαχωρίζοντας τα τέλη συναλλαγής σε βασικό τέλος και σε τέλος προτεραιότητας. Ξεκινούν με το byte
0x02
και περιλαμβάνουν πεδία, όπωςmaxPriorityFeePerGas
καιmaxFeePerGas
. Οι συναλλαγές τύπου 2 είναι πλέον οι προεπιλογμένες λόγω της ευελιξίας και της αποτελεσματικότητάς τους, ιδιαίτερα ευνοημένες σε περιόδους υψηλής συμφόρησης δικτύου για την ικανότητά τους να βοηθούν τους χρήστες να διαχειρίζονται πιο προβλέψιμα τα τέλη συναλλαγών. Η αξία TransactionType για αυτές τις συναλλαγές είναι0x2
.
Περισσότερες πληροφορίες
Γνωρίζετε κάποιο πόρο της κοινότητας που σας βοήθησε; Επεξεργαστείτε αυτή τη σελίδα και προσθέστε το!