Ένας οδηγός για τα συμβάντα στο Solidity

0
Ένας οδηγός για τα συμβάντα στο Solidity

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

Η σταθερότητα ορίζει τα γεγονότα με το event λέξη-κλειδί. Μετά την κλήση των συμβάντων, τα ορίσματά τους τοποθετούνται στο blockchain. Με αυτόν τον τρόπο μπορούμε να το ρωτήσουμε αργότερα. Τα συμβάντα μπορούν επίσης να εγγραφούν από την εφαρμογή πελάτη διεπαφής.

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

Μπορείτε να προσθέσετε το χαρακτηριστικό ευρετηριασμένο σε έως και τρεις παραμέτρους που τις προσθέτουν σε μια ειδική δομή δεδομένων γνωστή ως „θέματα“ αντί για το τμήμα δεδομένων του αρχείου καταγραφής. Εάν χρησιμοποιείτε πίνακες (συμπεριλαμβανομένης της συμβολοσειράς και των byte) ως ορίσματα με ευρετήριο, ο κατακερματισμός Keccak-256 αποθηκεύεται ως θέμα, αυτό συμβαίνει επειδή ένα θέμα μπορεί να περιέχει μόνο μία λέξη (32 byte).

Παράδειγμα

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.21 <0.9.0;

contract ClientReceipt {
    event Deposit(
        address indexed _from,
        bytes32 indexed _id,
        uint _value
    );

    function deposit(bytes32 _id) public payable {
        // Events are emitted using `emit`, followed by
        // the name of the event and the arguments
        // (if any) in parentheses. Any such invocation
        // (even deeply nested) can be detected from
        // the JavaScript API by filtering for `Deposit`.
        emit Deposit(msg.sender, _id, msg.value);
    }
}

στο μπροστινό μέρος

var abi = /* abi as generated by the compiler */;
var ClientReceipt = web3.eth.contract(abi);
var clientReceipt = ClientReceipt.at("0x1234...ab67" /* address */);

var depositEvent = clientReceipt.Deposit();

// watch for changes
depositEvent.watch(function(error, result){
    // result contains non-indexed arguments and topics
    // given to the `Deposit` call.
    if (!error)
        console.log(result);
});


// Or pass a callback to start watching immediately
var depositEvent = clientReceipt.Deposit(function(error, result) {
    if (!error)
        console.log(result);
});

Αποτέλεσμα της εκδήλωσης:

{
   "returnValues": {
       "_from": "0x1111…FFFFCCCC",
       "_id": "0x50…sd5adb20",
       "_value": "0x420042"
   },
   "raw": {
       "data": "0x7f…91385",
       "topics": ["0xfd4…b4ead7", "0x7f…1a91385"]
   }
}

Schreibe einen Kommentar